p3.cpp revision 5c27ee0c9499fa6a2ee728cb8ca4311a1f2ab675
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// RUN: %clang_cc1 -fsyntax-only -verify %s -std=c++11
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// RUN: %clang_cc1 -fsyntax-only -verify %s -std=c++98 -Wno-c++11-extensions -Wc++11-compat
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void f() {
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  auto a = a; // expected-error{{variable 'a' declared with 'auto' type cannot appear in its own initializer}}
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  auto *b = b; // expected-error{{variable 'b' declared with 'auto' type cannot appear in its own initializer}}
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const auto c = c; // expected-error{{variable 'c' declared with 'auto' type cannot appear in its own initializer}}
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (auto d = d) {} // expected-error {{variable 'd' declared with 'auto' type cannot appear in its own initializer}}
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  auto e = ({ auto f = e; 0; }); // expected-error {{variable 'e' declared with 'auto' type cannot appear in its own initializer}}
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)void g() {
125e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)  auto a; // expected-error{{declaration of variable 'a' with type 'auto' requires an initializer}}
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  auto *b; // expected-error{{declaration of variable 'b' with type 'auto *' requires an initializer}}
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (auto b) {} // expected-error {{expected '='}}
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (;auto b;) {} // expected-error {{expected '='}}
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  while (auto b) {} // expected-error {{expected '='}}
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (auto b = true) { (void)b; }
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)auto n(1,2,3); // expected-error{{initializer for variable 'n' with type 'auto' contains multiple expressions}}
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace N
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  auto a = "const char [16]", *p = &a;
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void h() {
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  auto b = 42ULL;
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (auto c = 0; c < b; ++c) {
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template<typename T, typename U> struct same;
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template<typename T> struct same<T, T> {};
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void p3example() {
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  auto x = 5;
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const auto *v = &x, u = 6;
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static auto y = 0.0;
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // In C++98: 'auto' storage class specifier is redundant and incompatible with C++0x
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // In C++0x: 'auto' storage class specifier is not permitted in C++0x, and will not be supported in future releases
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  auto int r; // expected-warning {{'auto' storage class specifier}}
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  same<__typeof(x), int> xHasTypeInt;
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  same<__typeof(v), const int*> vHasTypeConstIntPtr;
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  same<__typeof(u), const int> uHasTypeConstInt;
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  same<__typeof(y), double> yHasTypeDouble;
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)