[cfe-commits] r67723 - in /cfe/trunk: include/clang/Parse/Action.h include/clang/Parse/Parser.h lib/Parse/ParseDeclCXX.cpp lib/Parse/ParseTemplate.cpp lib/Parse/Parser.cpp lib/Sema/Sema.h lib/Sema/SemaTemplate.cpp

Douglas Gregor dgregor at apple.com
Wed Mar 25 18:01:42 PDT 2009


  Mar 25, 2009, at 5:52 PM, Anders Carlsson <andersca at mac.com> wrote:

> Author: andersca
> Date: Wed Mar 25 19:52:18 2009
> New Revision: 67723
>
> URL: http://llvm.org/viewvc/llvm-project?rev=67723&view=rev
> Log:
> Handle parsing of templates in member declarations. Pass the  
> AccessSpecifier all the way down to ActOnClassTemplate.
>
> Doug, Sebastian: Plz review! :)

This looks fine to me. Do you have a test case to commit?

> Modified:
>    cfe/trunk/include/clang/Parse/Action.h
>    cfe/trunk/include/clang/Parse/Parser.h
>    cfe/trunk/lib/Parse/ParseDeclCXX.cpp
>    cfe/trunk/lib/Parse/ParseTemplate.cpp
>    cfe/trunk/lib/Parse/Parser.cpp
>    cfe/trunk/lib/Sema/Sema.h
>    cfe/trunk/lib/Sema/SemaTemplate.cpp
>
> Modified: cfe/trunk/include/clang/Parse/Action.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Parse/Action.h?rev=67723&r1=67722&r2=67723&view=diff
>
> === 
> === 
> === 
> =====================================================================
> --- cfe/trunk/include/clang/Parse/Action.h (original)
> +++ cfe/trunk/include/clang/Parse/Action.h Wed Mar 25 19:52:18 2009
> @@ -1175,7 +1175,8 @@
>                      SourceLocation KWLoc, const CXXScopeSpec &SS,
>                      IdentifierInfo *Name, SourceLocation NameLoc,
>                      AttributeList *Attr,
> -                     MultiTemplateParamsArg TemplateParameterLists) {
> +                     MultiTemplateParamsArg TemplateParameterLists,
> +                     AccessSpecifier AS) {
>     return 0;
>   }
>
>
> Modified: cfe/trunk/include/clang/Parse/Parser.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Parse/Parser.h?rev=67723&r1=67722&r2=67723&view=diff
>
> === 
> === 
> === 
> =====================================================================
> --- cfe/trunk/include/clang/Parse/Parser.h (original)
> +++ cfe/trunk/include/clang/Parse/Parser.h Wed Mar 25 19:52:18 2009
> @@ -549,7 +549,9 @@
>   // C99 6.9: External Definitions.
>   DeclTy *ParseExternalDeclaration();
>   DeclTy *ParseDeclarationOrFunctionDefinition(
> -            TemplateParameterLists *TemplateParams = 0);
> +            TemplateParameterLists *TemplateParams = 0,
> +            AccessSpecifier AS = AS_none);
> +
>   DeclTy *ParseFunctionDefinition(Declarator &D);
>   void ParseKNRParamDeclarations(Declarator &D);
>   // EndLoc, if non-NULL, is filled with the location of the last  
> token of
> @@ -1027,7 +1029,8 @@
>   typedef llvm::SmallVector<DeclTy *, 4> TemplateParameterList;
>
>   // C++ 14.1: Template Parameters [temp.param]
> -  DeclTy *ParseTemplateDeclarationOrSpecialization(unsigned Context);
> +  DeclTy *ParseTemplateDeclarationOrSpecialization(unsigned Context,
> +                                                   AccessSpecifier  
> AS=AS_none);
>   bool ParseTemplateParameters(unsigned Depth,
>                                TemplateParameterList &TemplateParams,
>                                SourceLocation &LAngleLoc,
>
> Modified: cfe/trunk/lib/Parse/ParseDeclCXX.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/ParseDeclCXX.cpp?rev=67723&r1=67722&r2=67723&view=diff
>
> === 
> === 
> === 
> =====================================================================
> --- cfe/trunk/lib/Parse/ParseDeclCXX.cpp (original)
> +++ cfe/trunk/lib/Parse/ParseDeclCXX.cpp Wed Mar 25 19:52:18 2009
> @@ -460,7 +460,8 @@
>                                                  Attr,
>                        Action::MultiTemplateParamsArg(Actions,
>                                                       & 
> (*TemplateParams)[0],
> -                                                       
> TemplateParams->size()));
> +                                                       
> TemplateParams->size()),
> +                                                 AS);
>   else
>     TagOrTempResult = Actions.ActOnTag(CurScope, TagType, TK,  
> StartLoc, SS, Name,
>                                        NameLoc, Attr, AS);
> @@ -615,7 +616,7 @@
> ///         ::[opt] nested-name-specifier template[opt] unqualified- 
> id ';'[TODO]
> ///         using- 
> declaration                                            [TODO]
> /// [C++0x] static_assert-declaration
> -///         template- 
> declaration                                         [TODO]
> +///         template-declaration
> /// [GNU]   '__extension__' member-declaration
> ///
> ///       member-declarator-list:
> @@ -638,6 +639,10 @@
>   if (Tok.is(tok::kw_static_assert))
>     return ParseStaticAssertDeclaration();
>
> +  if (Tok.is(tok::kw_template))
> +    return ParseTemplateDeclarationOrSpecialization 
> (Declarator::MemberContext,
> +                                                    AS);
> +
>   // Handle:  member-declaration ::= '__extension__' member- 
> declaration
>   if (Tok.is(tok::kw___extension__)) {
>     // __extension__ silences extension warnings in the subexpression.
>
> Modified: cfe/trunk/lib/Parse/ParseTemplate.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/ParseTemplate.cpp?rev=67723&r1=67722&r2=67723&view=diff
>
> === 
> === 
> === 
> =====================================================================
> --- cfe/trunk/lib/Parse/ParseTemplate.cpp (original)
> +++ cfe/trunk/lib/Parse/ParseTemplate.cpp Wed Mar 25 19:52:18 2009
> @@ -35,7 +35,8 @@
> ///       explicit-specialization: [ C++ temp.expl.spec]
> ///         'template' '<' '>' declaration
> Parser::DeclTy *
> -Parser::ParseTemplateDeclarationOrSpecialization(unsigned Context) {
> +Parser::ParseTemplateDeclarationOrSpecialization(unsigned Context,
> +                                                 AccessSpecifier  
> AS) {
>   assert((Tok.is(tok::kw_export) || Tok.is(tok::kw_template)) &&
>     "Token does not start a template declaration.");
>
> @@ -94,7 +95,7 @@
>   } while (Tok.is(tok::kw_export) || Tok.is(tok::kw_template));
>
>   // Parse the actual template declaration.
> -  return ParseDeclarationOrFunctionDefinition(&ParamLists);
> +  return ParseDeclarationOrFunctionDefinition(&ParamLists, AS);
> }
>
> /// ParseTemplateParameters - Parses a template-parameter-list  
> enclosed in
>
> Modified: cfe/trunk/lib/Parse/Parser.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/Parser.cpp?rev=67723&r1=67722&r2=67723&view=diff
>
> === 
> === 
> === 
> =====================================================================
> --- cfe/trunk/lib/Parse/Parser.cpp (original)
> +++ cfe/trunk/lib/Parse/Parser.cpp Wed Mar 25 19:52:18 2009
> @@ -442,10 +442,11 @@
> ///
> Parser::DeclTy *
> Parser::ParseDeclarationOrFunctionDefinition(
> -                                  TemplateParameterLists  
> *TemplateParams) {
> +                                  TemplateParameterLists  
> *TemplateParams,
> +                                  AccessSpecifier AS) {
>   // Parse the common declaration-specifiers piece.
>   DeclSpec DS;
> -  ParseDeclarationSpecifiers(DS, TemplateParams);
> +  ParseDeclarationSpecifiers(DS, TemplateParams, AS);
>
>   // C99 6.7.2.3p6: Handle "struct-or-union identifier;", "enum  
> { X };"
>   // declaration-specifiers init-declarator-list[opt] ';'
>
> Modified: cfe/trunk/lib/Sema/Sema.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/Sema.h?rev=67723&r1=67722&r2=67723&view=diff
>
> === 
> === 
> === 
> =====================================================================
> --- cfe/trunk/lib/Sema/Sema.h (original)
> +++ cfe/trunk/lib/Sema/Sema.h Wed Mar 25 19:52:18 2009
> @@ -1715,7 +1715,8 @@
>                      SourceLocation KWLoc, const CXXScopeSpec &SS,
>                      IdentifierInfo *Name, SourceLocation NameLoc,
>                      AttributeList *Attr,
> -                     MultiTemplateParamsArg TemplateParameterLists);
> +                     MultiTemplateParamsArg TemplateParameterLists,
> +                     AccessSpecifier AS);
>
>   QualType CheckClassTemplateId(ClassTemplateDecl *ClassTemplate,
>                                 SourceLocation TemplateLoc,
>
> Modified: cfe/trunk/lib/Sema/SemaTemplate.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaTemplate.cpp?rev=67723&r1=67722&r2=67723&view=diff
>
> === 
> === 
> === 
> =====================================================================
> --- cfe/trunk/lib/Sema/SemaTemplate.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaTemplate.cpp Wed Mar 25 19:52:18 2009
> @@ -388,7 +388,8 @@
>                          SourceLocation KWLoc, const CXXScopeSpec &SS,
>                          IdentifierInfo *Name, SourceLocation NameLoc,
>                          AttributeList *Attr,
> -                         MultiTemplateParamsArg  
> TemplateParameterLists) {
> +                         MultiTemplateParamsArg  
> TemplateParameterLists,
> +                         AccessSpecifier AS) {
>   assert(TemplateParameterLists.size() > 0 && "No template parameter  
> lists?");
>   assert(TK != TK_Reference && "Can only declare or define class  
> templates");
>   bool Invalid = false;
>
>
> _______________________________________________
> 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