| // RUN: %clang_cc1 -fsyntax-only -verify %s -std=c++1y -DCXX1Y |
| // RUN: %clang_cc1 -fsyntax-only -verify %s -std=c++11 -Wno-c++1y-extensions |
| |
| // FIXME: This is in p11 (?) in C++1y. |
| void f() { |
| decltype(auto) a = a; // expected-error{{variable 'a' declared with deduced type 'decltype(auto)' cannot appear in its own initializer}} |
| if (decltype(auto) b = b) {} // expected-error {{variable 'b' declared with deduced type 'decltype(auto)' cannot appear in its own initializer}} |
| decltype(auto) c = ({ decltype(auto) d = c; 0; }); // expected-error {{variable 'c' declared with deduced type 'decltype(auto)' cannot appear in its own initializer}} |
| } |
| |
| void g() { |
| decltype(auto) a; // expected-error{{declaration of variable 'a' with deduced type 'decltype(auto)' requires an initializer}} |
| |
| decltype(auto) *b; // expected-error{{cannot form pointer to 'decltype(auto)'}} expected-error{{declaration of variable 'b' with deduced type 'decltype(auto) *' requires an initializer}} |
| |
| if (decltype(auto) b) {} // expected-error {{must have an initializer}} |
| for (;decltype(auto) b;) {} // expected-error {{must have an initializer}} |
| while (decltype(auto) b) {} // expected-error {{must have an initializer}} |
| if (decltype(auto) b = true) { (void)b; } |
| } |
| |
| decltype(auto) n(1,2,3); // expected-error{{initializer for variable 'n' with type 'decltype(auto)' contains multiple expressions}} |
| |
| namespace N |
| { |
| // All of these are references, because a string literal is an lvalue. |
| decltype(auto) a = "const char (&)[19]", b = a, c = (a); |
| } |
| |
| void h() { |
| decltype(auto) b = 42ULL; |
| |
| for (decltype(auto) c = 0; c < b; ++c) { |
| } |
| } |
| |
| template<typename T, typename U> struct same; |
| template<typename T> struct same<T, T> {}; |
| |
| void i() { |
| decltype(auto) x = 5; |
| decltype(auto) int r; // expected-error {{cannot combine with previous 'decltype(auto)' declaration specifier}} expected-error {{requires an initializer}} |
| } |
| |
| namespace p3_example { |
| template<typename T, typename U> struct is_same_impl { |
| static const bool value = false; |
| }; |
| template<typename T> struct is_same_impl<T, T> { |
| static const bool value = true; |
| }; |
| template<typename T, typename U> constexpr bool is_same() { |
| return is_same_impl<T,U>::value; |
| } |
| |
| auto x = 5; |
| const auto *v = &x, u = 6; |
| static auto y = 0.0; |
| auto int r; // expected-warning {{storage class}} expected-error {{file-scope}} |
| |
| static_assert(is_same<decltype(x), int>(), ""); |
| static_assert(is_same<decltype(v), const int*>(), ""); |
| static_assert(is_same<decltype(u), const int>(), ""); |
| static_assert(is_same<decltype(y), double>(), ""); |
| |
| #ifdef CXX1Y |
| auto f() -> int; |
| auto g() { return 0.0; } |
| auto h(); |
| |
| static_assert(is_same<decltype(f), int()>(), ""); |
| static_assert(is_same<decltype(g), double()>(), ""); |
| #endif |
| } |