[cfe-commits] r142928 - in /cfe/trunk: include/clang/Parse/Parser.h lib/Parse/ParseDeclCXX.cpp test/CXX/class.derived/p1.cpp

Douglas Gregor dgregor at apple.com
Tue Oct 25 10:40:30 PDT 2011


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
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits




More information about the cfe-commits mailing list