Perhaps we should drop the qualifier in the parser in this case; this doesn't match the grammar and it doesn't make a lot of sense to propagate this weird broken state all the way into the AST. On 29 Dec 2014 05:21, "David Majnemer" <[email protected]> wrote:
> Author: majnemer > Date: Sun Dec 28 23:17:46 2014 > New Revision: 224912 > > URL: http://llvm.org/viewvc/llvm-project?rev=224912&view=rev > Log: > Sema: Don't crash when solitary :: token appears before { in struct def > > hasDeclaratorForAnonDecl, getDeclaratorForAnonDecl and > getTypedefNameForAnonDecl are expected to handle the case where > NamedDeclOrQualifier holds the wrong type or nothing at all. > > Modified: > cfe/trunk/include/clang/AST/Decl.h > cfe/trunk/lib/Sema/SemaDecl.cpp > cfe/trunk/test/CXX/dcl.decl/dcl.meaning/p1.cpp > > Modified: cfe/trunk/include/clang/AST/Decl.h > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/Decl.h?rev=224912&r1=224911&r2=224912&view=diff > > ============================================================================== > --- cfe/trunk/include/clang/AST/Decl.h (original) > +++ cfe/trunk/include/clang/AST/Decl.h Sun Dec 28 23:17:46 2014 > @@ -2823,16 +2823,18 @@ public: > > bool hasDeclaratorForAnonDecl() const { > return dyn_cast_or_null<DeclaratorDecl>( > - NamedDeclOrQualifier.get<NamedDecl *>()); > + NamedDeclOrQualifier.dyn_cast<NamedDecl *>()); > } > DeclaratorDecl *getDeclaratorForAnonDecl() const { > - return hasExtInfo() ? nullptr : dyn_cast_or_null<DeclaratorDecl>( > - NamedDeclOrQualifier.get<NamedDecl > *>()); > + return hasExtInfo() ? nullptr > + : dyn_cast_or_null<DeclaratorDecl>( > + NamedDeclOrQualifier.dyn_cast<NamedDecl > *>()); > } > > TypedefNameDecl *getTypedefNameForAnonDecl() const { > - return hasExtInfo() ? nullptr : dyn_cast_or_null<TypedefNameDecl>( > - NamedDeclOrQualifier.get<NamedDecl > *>()); > + return hasExtInfo() ? nullptr > + : dyn_cast_or_null<TypedefNameDecl>( > + NamedDeclOrQualifier.dyn_cast<NamedDecl > *>()); > } > > void setDeclaratorForAnonDecl(DeclaratorDecl *DD) { > NamedDeclOrQualifier = DD; } > > Modified: cfe/trunk/lib/Sema/SemaDecl.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDecl.cpp?rev=224912&r1=224911&r2=224912&view=diff > > ============================================================================== > --- cfe/trunk/lib/Sema/SemaDecl.cpp (original) > +++ cfe/trunk/lib/Sema/SemaDecl.cpp Sun Dec 28 23:17:46 2014 > @@ -11790,7 +11790,7 @@ CreateNewDecl: > // CheckMemberSpecialization, below. > if (!isExplicitSpecialization && > (TUK == TUK_Definition || TUK == TUK_Declaration) && > - diagnoseQualifiedDeclaration(SS, DC, OrigName, NameLoc)) > + diagnoseQualifiedDeclaration(SS, DC, OrigName, Loc)) > Invalid = true; > > New->setQualifierInfo(SS.getWithLocInContext(Context)); > > Modified: cfe/trunk/test/CXX/dcl.decl/dcl.meaning/p1.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CXX/dcl.decl/dcl.meaning/p1.cpp?rev=224912&r1=224911&r2=224912&view=diff > > ============================================================================== > --- cfe/trunk/test/CXX/dcl.decl/dcl.meaning/p1.cpp (original) > +++ cfe/trunk/test/CXX/dcl.decl/dcl.meaning/p1.cpp Sun Dec 28 23:17:46 2014 > @@ -43,3 +43,6 @@ namespace NS { > template<typename T> struct NS::Y { }; // expected-warning{{extra > qualification on member 'Y'}} > template<typename T> void NS::wibble(T) { } // expected-warning{{extra > qualification on member 'wibble'}} > } > + > +// expected-warning@+1{{extra qualification on member}} > +struct ::{} a; // expected-error{{expected identifier}} > > > _______________________________________________ > cfe-commits mailing list > [email protected] > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits >
_______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
