On Oct 25, 2011, at 10:10 AM, David Blaikie wrote: > Author: dblaikie > Date: Tue Oct 25 12:10:12 2011 > New Revision: 142928 > > URL: http://llvm.org/viewvc/llvm-project?rev=142928&view=rev > Log: > Fix cases where the optional nested-name-specifier erroneously preceeded a > decltype-specification when specifying a base type.
> Modified: > cfe/trunk/include/clang/Parse/Parser.h > cfe/trunk/lib/Parse/ParseDeclCXX.cpp > cfe/trunk/test/CXX/class.derived/p1.cpp > > Modified: cfe/trunk/include/clang/Parse/Parser.h > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Parse/Parser.h?rev=142928&r1=142927&r2=142928&view=diff > ============================================================================== > --- cfe/trunk/include/clang/Parse/Parser.h (original) > +++ cfe/trunk/include/clang/Parse/Parser.h Tue Oct 25 12:10:12 2011 > @@ -2012,8 +2012,8 @@ > > > //===--------------------------------------------------------------------===// > // C++ 10: Derived classes [class.derived] > - TypeResult ParseBaseTypeSpecifier(SourceLocation &EndLocation, > - CXXScopeSpec &SS); > + TypeResult ParseBaseTypeSpecifier(SourceLocation &BaseLoc, > + SourceLocation &EndLocation); > void ParseBaseClause(Decl *ClassDecl); > BaseResult ParseBaseSpecifier(Decl *ClassDecl); > AccessSpecifier getAccessSpecifierIfPresent() const; > > Modified: cfe/trunk/lib/Parse/ParseDeclCXX.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/ParseDeclCXX.cpp?rev=142928&r1=142927&r2=142928&view=diff > ============================================================================== > --- cfe/trunk/lib/Parse/ParseDeclCXX.cpp (original) > +++ cfe/trunk/lib/Parse/ParseDeclCXX.cpp Tue Oct 25 12:10:12 2011 > @@ -711,8 +711,26 @@ > /// identifier > /// simple-template-id > /// > -Parser::TypeResult Parser::ParseBaseTypeSpecifier(SourceLocation > &EndLocation, > - CXXScopeSpec &SS) { > +Parser::TypeResult Parser::ParseBaseTypeSpecifier(SourceLocation &BaseLoc, > + SourceLocation > &EndLocation) { > + // Parse decltype-specifier > + if (Tok.is(tok::kw_decltype)) { > + // Fake up a Declarator to use with ActOnTypeName. > + DeclSpec DS(AttrFactory); > + > + ParseDecltypeSpecifier(DS); > + EndLocation = DS.getSourceRange().getEnd(); > + > + Declarator DeclaratorInfo(DS, Declarator::TypeNameContext); > + return Actions.ActOnTypeName(getCurScope(), DeclaratorInfo); > + } > + > + // Parse optional nested-name-specifier > + CXXScopeSpec SS; > + ParseOptionalCXXScopeSpecifier(SS, ParsedType(), > /*EnteringContext=*/false); > + > + BaseLoc = Tok.getLocation(); I'm not convinced that this is the right fix, especially because ParseOptionalCXXScopeSpecifier *should* eventually be parsing decltype(blah):: as a nested-name-specifier. Why not just diagnose a non-empty nested-name-specifier when we're parsing a decltype()? - Doug > // Check whether we have a template-id that names a type. > if (Tok.is(tok::annot_template_id)) { > TemplateIdAnnotation *TemplateId = takeTemplateIdAnnotation(Tok); > @@ -733,17 +751,6 @@ > // Fall through to produce an error below. > } > > - if (Tok.is(tok::kw_decltype)) { > - // Fake up a Declarator to use with ActOnTypeName. > - DeclSpec DS(AttrFactory); > - > - ParseDecltypeSpecifier(DS); > - EndLocation = DS.getSourceRange().getEnd(); > - > - Declarator DeclaratorInfo(DS, Declarator::TypeNameContext); > - return Actions.ActOnTypeName(getCurScope(), DeclaratorInfo); > - } > - > if (Tok.isNot(tok::identifier)) { > Diag(Tok, diag::err_expected_class_name); > return true; > @@ -1410,16 +1417,10 @@ > IsVirtual = true; > } > > - // Parse optional '::' and optional nested-name-specifier. > - CXXScopeSpec SS; > - ParseOptionalCXXScopeSpecifier(SS, ParsedType(), > /*EnteringContext=*/false); > - > - // The location of the base class itself. > - SourceLocation BaseLoc = Tok.getLocation(); > - > // Parse the class-name. > SourceLocation EndLocation; > - TypeResult BaseType = ParseBaseTypeSpecifier(EndLocation, SS); > + SourceLocation BaseLoc; > + TypeResult BaseType = ParseBaseTypeSpecifier(BaseLoc, EndLocation); > if (BaseType.isInvalid()) > return true; > > > Modified: cfe/trunk/test/CXX/class.derived/p1.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CXX/class.derived/p1.cpp?rev=142928&r1=142927&r2=142928&view=diff > ============================================================================== > --- cfe/trunk/test/CXX/class.derived/p1.cpp (original) > +++ cfe/trunk/test/CXX/class.derived/p1.cpp Tue Oct 25 12:10:12 2011 > @@ -30,4 +30,8 @@ > struct Derived3 : decltype(T().foo()) { }; > struct Foo { Base foo(); }; > Derived3<Foo> d; > + > + struct Derived4 : :: decltype(Base()) { }; // expected-error {{expected > class name}} > + > + struct Derived5 : PR11216:: decltype(Base()) { }; // expected-error > {{expected class name}} > } > > > _______________________________________________ > 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
