| // RUN: %clang_cc1 -std=c++1z -verify %s |
| |
| template<typename T, typename U> constexpr bool same = false; |
| template<typename T> constexpr bool same<T, T> = true; |
| |
| auto a() { |
| if constexpr (false) |
| return 0; |
| } |
| static_assert(same<decltype(a()), void>); |
| |
| auto b() { |
| if constexpr (false) |
| return 0; |
| else |
| return 0.0; |
| } |
| static_assert(same<decltype(b()), double>); |
| |
| auto c() { |
| if constexpr (true) |
| return "foo"; |
| else |
| return 'x'; |
| if constexpr (false) |
| return 7.6; |
| else |
| return 5; // expected-error {{deduced as 'int' here but deduced as 'const char *' in earlier}} |
| } |
| |
| template<int k> auto d() { |
| if constexpr(k == 0) |
| return 0; |
| if constexpr(k == 1) |
| return "foo"; |
| else if constexpr (k == 2) |
| return 1.0; |
| } |
| static_assert(same<decltype(d<0>()), int>); |
| static_assert(same<decltype(d<1>()), const char *>); |
| static_assert(same<decltype(d<2>()), double>); |
| static_assert(same<decltype(d<3>()), void>); |
| |
| auto e = []{ if constexpr (false) return 0; }(); // expected-error {{variable has incomplete type 'void'}} |
| |
| auto f = []{ if constexpr (true) return 0; }(); |
| static_assert(same<decltype(e), int>); |