diff options
-rw-r--r-- | clang/lib/Sema/SemaDecl.cpp | 24 | ||||
-rw-r--r-- | clang/test/CXX/dcl.decl/dcl.meaning/p1-0x.cpp | 6 |
2 files changed, 16 insertions, 14 deletions
diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp index 63a1b8034e9..238dbd46792 100644 --- a/clang/lib/Sema/SemaDecl.cpp +++ b/clang/lib/Sema/SemaDecl.cpp @@ -3203,16 +3203,6 @@ Decl *Sema::HandleDeclarator(Scope *S, Declarator &D, (S->getFlags() & Scope::TemplateParamScope) != 0) S = S->getParent(); - if (NestedNameSpecifierLoc SpecLoc = - D.getCXXScopeSpec().getWithLocInContext(Context)) { - while (SpecLoc.getPrefix()) - SpecLoc = SpecLoc.getPrefix(); - if (dyn_cast_or_null<DecltypeType>( - SpecLoc.getNestedNameSpecifier()->getAsType())) - Diag(SpecLoc.getBeginLoc(), diag::err_decltype_in_declarator) - << SpecLoc.getTypeLoc().getSourceRange(); - } - DeclContext *DC = CurContext; if (D.getCXXScopeSpec().isInvalid()) D.setInvalidType(); @@ -3377,6 +3367,20 @@ Decl *Sema::HandleDeclarator(Scope *S, Declarator &D, << Name << cast<NamedDecl>(DC) << R; D.setInvalidType(); } + + // C++11 8.3p1: + // ... "The nested-name-specifier of the qualified declarator-id shall + // not begin with a decltype-specifer" + NestedNameSpecifierLoc SpecLoc = + D.getCXXScopeSpec().getWithLocInContext(Context); + assert(SpecLoc && "A non-empty CXXScopeSpec should have a non-empty " + "NestedNameSpecifierLoc"); + while (SpecLoc.getPrefix()) + SpecLoc = SpecLoc.getPrefix(); + if (dyn_cast_or_null<DecltypeType>( + SpecLoc.getNestedNameSpecifier()->getAsType())) + Diag(SpecLoc.getBeginLoc(), diag::err_decltype_in_declarator) + << SpecLoc.getTypeLoc().getSourceRange(); } } diff --git a/clang/test/CXX/dcl.decl/dcl.meaning/p1-0x.cpp b/clang/test/CXX/dcl.decl/dcl.meaning/p1-0x.cpp index 8dcbaf8381d..99334b845ab 100644 --- a/clang/test/CXX/dcl.decl/dcl.meaning/p1-0x.cpp +++ b/clang/test/CXX/dcl.decl/dcl.meaning/p1-0x.cpp @@ -18,9 +18,7 @@ class tfoo { }; template<typename T> -int decltype(tfoo<T>())::i; // expected-error{{'decltype' cannot be used to name a declaration}} \ - expected-error{{nested name specifier 'decltype(tfoo<T>())::' for declaration does not refer into a class, class template or class template partial specialization}} +int decltype(tfoo<T>())::i; // expected-error{{nested name specifier 'decltype(tfoo<T>())::' for declaration does not refer into a class, class template or class template partial specialization}} template<typename T> -void decltype(tfoo<T>())::func() { // expected-error{{'decltype' cannot be used to name a declaration}} \ - expected-error{{nested name specifier 'decltype(tfoo<T>())::' for declaration does not refer into a class, class template or class template partial specialization}} +void decltype(tfoo<T>())::func() { // expected-error{{nested name specifier 'decltype(tfoo<T>())::' for declaration does not refer into a class, class template or class template partial specialization}} } |