1a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith// RUN: %clang_cc1 -verify -std=c++1y %s 2a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith 3a2c3646c35dd09d21b74826240aa916545b1873fRichard Smithnamespace std { 4a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith template<typename T> struct initializer_list { 5a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith const T *p; 6a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith unsigned long n; 7a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith initializer_list(const T *p, unsigned long n); 8a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith }; 9a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith} 10a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith 11a2c3646c35dd09d21b74826240aa916545b1873fRichard Smithint i; 12a2c3646c35dd09d21b74826240aa916545b1873fRichard Smithint &&f(); 13a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith 14a2c3646c35dd09d21b74826240aa916545b1873fRichard Smithusing Int = int; 15a2c3646c35dd09d21b74826240aa916545b1873fRichard Smithusing IntLRef = int&; 16a2c3646c35dd09d21b74826240aa916545b1873fRichard Smithusing IntRRef = int&&; 17a2c3646c35dd09d21b74826240aa916545b1873fRichard Smithusing InitListInt = std::initializer_list<int>; 18a2c3646c35dd09d21b74826240aa916545b1873fRichard Smithusing IntPtr = int*; 19a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith 20a2c3646c35dd09d21b74826240aa916545b1873fRichard Smithauto x3a = i; 21a2c3646c35dd09d21b74826240aa916545b1873fRichard Smithdecltype(auto) x3d = i; 22a2c3646c35dd09d21b74826240aa916545b1873fRichard Smithusing Int = decltype(x3a); 23a2c3646c35dd09d21b74826240aa916545b1873fRichard Smithusing Int = decltype(x3d); 24a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith 25a2c3646c35dd09d21b74826240aa916545b1873fRichard Smithauto x4a = (i); 26a2c3646c35dd09d21b74826240aa916545b1873fRichard Smithdecltype(auto) x4d = (i); 27a2c3646c35dd09d21b74826240aa916545b1873fRichard Smithusing Int = decltype(x4a); 28a2c3646c35dd09d21b74826240aa916545b1873fRichard Smithusing IntLRef = decltype(x4d); 29a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith 30a2c3646c35dd09d21b74826240aa916545b1873fRichard Smithauto x5a = f(); 31a2c3646c35dd09d21b74826240aa916545b1873fRichard Smithdecltype(auto) x5d = f(); 32a2c3646c35dd09d21b74826240aa916545b1873fRichard Smithusing Int = decltype(x5a); 33a2c3646c35dd09d21b74826240aa916545b1873fRichard Smithusing IntRRef = decltype(x5d); 34a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith 35a2c3646c35dd09d21b74826240aa916545b1873fRichard Smithauto x6a = { 1, 2 }; 36a2c3646c35dd09d21b74826240aa916545b1873fRichard Smithdecltype(auto) x6d = { 1, 2 }; // expected-error {{cannot deduce 'decltype(auto)' from initializer list}} 37a2c3646c35dd09d21b74826240aa916545b1873fRichard Smithusing InitListInt = decltype(x6a); 38a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith 39a2c3646c35dd09d21b74826240aa916545b1873fRichard Smithauto *x7a = &i; 40a2c3646c35dd09d21b74826240aa916545b1873fRichard Smithdecltype(auto) *x7d = &i; // expected-error {{cannot form pointer to 'decltype(auto)'}} 41a2c3646c35dd09d21b74826240aa916545b1873fRichard Smithusing IntPtr = decltype(x7a); 42a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith 43a2c3646c35dd09d21b74826240aa916545b1873fRichard Smithstruct S {}; 44a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith 45a2c3646c35dd09d21b74826240aa916545b1873fRichard Smithdecltype(auto) f1(); 46a2c3646c35dd09d21b74826240aa916545b1873fRichard Smithdecltype(auto) (*f2)(); // expected-error {{'decltype(auto)' can only be used as a return type in a function declaration}} expected-error {{requires an initializer}} 47a2c3646c35dd09d21b74826240aa916545b1873fRichard Smithdecltype(auto) *f3(); // expected-error {{cannot form pointer to 'decltype(auto)'}} 48a2c3646c35dd09d21b74826240aa916545b1873fRichard Smithconst decltype(auto) f4(); // expected-error {{'decltype(auto)' cannot be combined with other type specifiers}} 49a2c3646c35dd09d21b74826240aa916545b1873fRichard Smithtypedef decltype(auto) f5(); // expected-error {{'decltype(auto)' can only be used as a return type in a function declaration}} 50a2c3646c35dd09d21b74826240aa916545b1873fRichard Smithdecltype(auto) ((((((f6))))())); // ok 51a2c3646c35dd09d21b74826240aa916545b1873fRichard Smithdecltype(auto) f7()(); // expected-error {{'decltype(auto)' can only be used as a return type in a function declaration}} expected-error {{function cannot return function type}} 52a2c3646c35dd09d21b74826240aa916545b1873fRichard Smithdecltype(auto) (S::*f8)(); // expected-error {{'decltype(auto)' can only be used as a return type in a function declaration}} expected-error {{requires an initializer}} 53a2c3646c35dd09d21b74826240aa916545b1873fRichard Smithdecltype(auto) &f9(); // expected-error {{cannot form reference to 'decltype(auto)'}} 54a2c3646c35dd09d21b74826240aa916545b1873fRichard Smithdecltype(auto) (&f10())[10]; // expected-error {{cannot form array of 'decltype(auto)'}} 55a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith 56a2c3646c35dd09d21b74826240aa916545b1873fRichard Smithdecltype(auto) ((((((v1)))))) = 0; // ok 57a2c3646c35dd09d21b74826240aa916545b1873fRichard Smithdecltype(auto) v2[1] = { 0 }; // expected-error {{cannot form array of 'decltype(auto)'}} 58a2c3646c35dd09d21b74826240aa916545b1873fRichard Smithdecltype(auto) &v3 = { 0 }; // expected-error {{cannot form reference to 'decltype(auto)'}} 59a2c3646c35dd09d21b74826240aa916545b1873fRichard Smithdecltype(auto) *v4 = { 0 }; // expected-error {{cannot form pointer to 'decltype(auto)'}} 60ffd015e316fff53f23e9ffd4907b88b8706e4183Richard Smith 61ffd015e316fff53f23e9ffd4907b88b8706e4183Richard Smithauto multi1a = 0, &multi1b = multi1a; 62ffd015e316fff53f23e9ffd4907b88b8706e4183Richard Smithauto multi1c = multi1a, multi1d = multi1b; 63ffd015e316fff53f23e9ffd4907b88b8706e4183Richard Smithdecltype(auto) multi1e = multi1a, multi1f = multi1b; // expected-error {{'decltype(auto)' deduced as 'int' in declaration of 'multi1e' and deduced as 'int &' in declaration of 'multi1f'}} 6460e141e1f87211ca831de6821003d80fe20a06f3Richard Smith 6560e141e1f87211ca831de6821003d80fe20a06f3Richard Smithauto f1a() { return 0; } 6660e141e1f87211ca831de6821003d80fe20a06f3Richard Smithdecltype(auto) f1d() { return 0; } 6760e141e1f87211ca831de6821003d80fe20a06f3Richard Smithusing Int = decltype(f1a()); 6860e141e1f87211ca831de6821003d80fe20a06f3Richard Smithusing Int = decltype(f1d()); 6960e141e1f87211ca831de6821003d80fe20a06f3Richard Smith 7060e141e1f87211ca831de6821003d80fe20a06f3Richard Smithauto f2a(int n) { return n; } 7160e141e1f87211ca831de6821003d80fe20a06f3Richard Smithdecltype(auto) f2d(int n) { return n; } 7260e141e1f87211ca831de6821003d80fe20a06f3Richard Smithusing Int = decltype(f2a(0)); 7360e141e1f87211ca831de6821003d80fe20a06f3Richard Smithusing Int = decltype(f2d(0)); 7460e141e1f87211ca831de6821003d80fe20a06f3Richard Smith 7560e141e1f87211ca831de6821003d80fe20a06f3Richard Smithauto f3a(int n) { return (n); } 7660e141e1f87211ca831de6821003d80fe20a06f3Richard Smithdecltype(auto) f3d(int n) { return (n); } // expected-warning {{reference to stack memory}} 7760e141e1f87211ca831de6821003d80fe20a06f3Richard Smithusing Int = decltype(f3a(0)); 7860e141e1f87211ca831de6821003d80fe20a06f3Richard Smithusing IntLRef = decltype(f3d(0)); 7960e141e1f87211ca831de6821003d80fe20a06f3Richard Smith 8060e141e1f87211ca831de6821003d80fe20a06f3Richard Smithauto f4a(int n) { return f(); } 8160e141e1f87211ca831de6821003d80fe20a06f3Richard Smithdecltype(auto) f4d(int n) { return f(); } 8260e141e1f87211ca831de6821003d80fe20a06f3Richard Smithusing Int = decltype(f4a(0)); 8360e141e1f87211ca831de6821003d80fe20a06f3Richard Smithusing IntRRef = decltype(f4d(0)); 8460e141e1f87211ca831de6821003d80fe20a06f3Richard Smith 8560e141e1f87211ca831de6821003d80fe20a06f3Richard Smithauto f5aa(int n) { auto x = f(); return x; } 8660e141e1f87211ca831de6821003d80fe20a06f3Richard Smithauto f5ad(int n) { decltype(auto) x = f(); return x; } 8760e141e1f87211ca831de6821003d80fe20a06f3Richard Smithdecltype(auto) f5da(int n) { auto x = f(); return x; } 8860e141e1f87211ca831de6821003d80fe20a06f3Richard Smithdecltype(auto) f5dd(int n) { decltype(auto) x = f(); return x; } // expected-error {{rvalue reference to type 'int' cannot bind to lvalue}} 8960e141e1f87211ca831de6821003d80fe20a06f3Richard Smithusing Int = decltype(f5aa(0)); 9060e141e1f87211ca831de6821003d80fe20a06f3Richard Smithusing Int = decltype(f5ad(0)); 9160e141e1f87211ca831de6821003d80fe20a06f3Richard Smithusing Int = decltype(f5da(0)); 9260e141e1f87211ca831de6821003d80fe20a06f3Richard Smith 9360e141e1f87211ca831de6821003d80fe20a06f3Richard Smithauto init_list_1() { return { 1, 2, 3 }; } // expected-error {{cannot deduce return type from initializer list}} 9460e141e1f87211ca831de6821003d80fe20a06f3Richard Smithdecltype(auto) init_list_2() { return { 1, 2, 3 }; } // expected-error {{cannot deduce return type from initializer list}} 95