Index: lib/Sema/SemaCXXScopeSpec.cpp =================================================================== --- lib/Sema/SemaCXXScopeSpec.cpp +++ lib/Sema/SemaCXXScopeSpec.cpp @@ -817,6 +817,12 @@ if (SS.isInvalid() || DS.getTypeSpecType() == DeclSpec::TST_error) return true; + if (DS.getTypeSpecType() == DeclSpec::TST_decltype_auto) { + Diag(DS.getTypeSpecTypeLoc(), diag::err_auto_not_allowed) + << 1 /* decltype(auto) */ << 15 /* here */; + return true; + } + assert(DS.getTypeSpecType() == DeclSpec::TST_decltype); QualType T = BuildDecltypeType(DS.getRepAsExpr(), DS.getTypeSpecTypeLoc()); Index: test/CXX/dcl.dcl/dcl.spec/dcl.type/dcl.spec.auto/p6-14.cpp =================================================================== --- /dev/null +++ test/CXX/dcl.dcl/dcl.spec/dcl.type/dcl.spec.auto/p6-14.cpp @@ -0,0 +1,59 @@ +// RUN: %clang_cc1 -fcxx-exceptions -fexceptions -fsyntax-only -verify %s -std=c++14 + +struct S { + virtual ~S(); + + decltype(auto) a; // expected-error{{'decltype(auto)' not allowed in non-static struct member}} + decltype(auto) *b; // expected-error{{'decltype(auto)' not allowed in non-static struct member}} + + void f() throw (decltype(auto)); // expected-error{{'decltype(auto)' not allowed here}} + + friend decltype(auto); // expected-error{{'decltype(auto)' not allowed in non-static struct member}} +}; + +// PR 9278: decltype(auto) is not allowed in typedefs, except with a trailing return type. +typedef decltype(auto) *AutoPtr; // expected-error{{'decltype(auto)' not allowed in typedef}} +typedef decltype(auto) (*PFun)(int a); // expected-error{{'decltype(auto)' not allowed in typedef}} +typedef auto Fun(int a) -> decltype(a + a); + +void g(decltype(auto) a) { // expected-error{{'decltype(auto)' not allowed in function prototype}} + try { } + catch (decltype(auto) &a) { } // expected-error{{'decltype(auto)' not allowed in exception declaration}} + try { } catch (decltype(auto) a) { } // expected-error{{'decltype(auto)' not allowed in exception declaration}} +} + +void h(decltype(auto) a[10]) { // expected-error{{'decltype(auto)' not allowed in function prototype}} +} + +namespace std { + class type_info; +} + +template struct U {}; + +void j() { + (void)typeid(decltype(auto)); // expected-error{{'decltype(auto)' not allowed here}} + (void)sizeof(decltype(auto)); // expected-error{{'decltype(auto)' not allowed here}} + (void)__alignof(decltype(auto)); // expected-error{{'decltype(auto)' not allowed here}} + + U v; // expected-error{{'decltype(auto)' not allowed in template argument}} + + int n; + (void)dynamic_cast(n); // expected-error{{'decltype(auto)' not allowed here}} + (void)static_cast(&n); // expected-error{{'decltype(auto)' not allowed here}} + (void)reinterpret_cast(&n); // expected-error{{'decltype(auto)' not allowed here}} + (void)const_cast(n); // expected-error{{'decltype(auto)' not allowed here}} + (void)*(decltype(auto)*)(&n); // expected-error{{'decltype(auto)' not allowed here}} + (void)decltype(auto)(n); // expected-error{{'decltype(auto)' not allowed here}} + (void)decltype(auto){n}; // expected-error{{'decltype(auto)' not allowed here}} +} + +template class C { }; // expected-error{{'decltype(auto)' not allowed in template parameter}} +int ints[] = {1, 2, 3}; +enum E : decltype(auto) {}; // expected-error{{'decltype(auto)' not allowed here}} +struct F : decltype(auto) {}; // expected-error{{'decltype(auto)' not allowed here}} +template struct G { }; // expected-error{{'decltype(auto)' not allowed in template argument}} + +using A = decltype(auto); // expected-error{{'decltype(auto)' not allowed in type alias}} + +typedef &decltype(auto)::x T; // expected-error{{'decltype(auto)' not allowed here}}