Home | History | Annotate | Download | only in dcl.spec.auto
      1 // RUN: %clang_cc1 -std=c++1z -verify %s
      2 
      3 template<typename T, typename U> constexpr bool same = false;
      4 template<typename T> constexpr bool same<T, T> = true;
      5 
      6 auto a() {
      7   if constexpr (false)
      8     return 0;
      9 }
     10 static_assert(same<decltype(a()), void>);
     11 
     12 auto b() {
     13   if constexpr (false)
     14     return 0;
     15   else
     16     return 0.0;
     17 }
     18 static_assert(same<decltype(b()), double>);
     19 
     20 auto c() {
     21   if constexpr (true)
     22     return "foo";
     23   else
     24     return 'x';
     25   if constexpr (false)
     26     return 7.6;
     27   else
     28     return 5; // expected-error {{deduced as 'int' here but deduced as 'const char *' in earlier}}
     29 }
     30 
     31 template<int k> auto d() {
     32   if constexpr(k == 0)
     33     return 0;
     34   if constexpr(k == 1)
     35     return "foo";
     36   else if constexpr (k == 2)
     37     return 1.0;
     38 }
     39 static_assert(same<decltype(d<0>()), int>);
     40 static_assert(same<decltype(d<1>()), const char *>);
     41 static_assert(same<decltype(d<2>()), double>);
     42 static_assert(same<decltype(d<3>()), void>);
     43 
     44 auto e = []{ if constexpr (false) return 0; }(); // expected-error {{variable has incomplete type 'void'}}
     45 
     46 auto f = []{ if constexpr (true) return 0; }();
     47 static_assert(same<decltype(e), int>);
     48