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