]> granicus.if.org Git - clang/commitdiff
Handle parsing of templates in member declarations. Pass the AccessSpecifier all...
authorAnders Carlsson <andersca@mac.com>
Thu, 26 Mar 2009 00:52:18 +0000 (00:52 +0000)
committerAnders Carlsson <andersca@mac.com>
Thu, 26 Mar 2009 00:52:18 +0000 (00:52 +0000)
Doug, Sebastian: Plz review! :)

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@67723 91177308-0d34-0410-b5e6-96231b3b80d8

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

index 288e9a2cad56ad1f4dc80d08eb7baf3dda2c5b97..c75a209d3312140bf8a01286497150949faf5640 100644 (file)
@@ -1175,7 +1175,8 @@ public:
                      SourceLocation KWLoc, const CXXScopeSpec &SS,
                      IdentifierInfo *Name, SourceLocation NameLoc,
                      AttributeList *Attr,
-                     MultiTemplateParamsArg TemplateParameterLists) {
+                     MultiTemplateParamsArg TemplateParameterLists,
+                     AccessSpecifier AS) {
     return 0;
   }
 
index f49f7bd598070b4d9bc390c6eb9ea2330c8a2da1..630b7ea49975b89033b9ef93914c334e10637d39 100644 (file)
@@ -549,7 +549,9 @@ private:
   // 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 @@ private:
   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, 
index 1bbf41187477d5ebba2496d62bf99ab1ff5e3306..61182ef9cd4eb7383cd3b773851300846a0dbdec 100644 (file)
@@ -460,7 +460,8 @@ void Parser::ParseClassSpecifier(DeclSpec &DS,
                                                  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 @@ AccessSpecifier Parser::getAccessSpecifierIfPresent() const
 ///         ::[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 @@ Parser::DeclTy *Parser::ParseCXXClassMemberDeclaration(AccessSpecifier AS) {
   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.
index 2aeb182dbdf94bf6c940acf1fe79a12d3508a177..2c07823aba2bc0655387a8609d35752d57d2e8e2 100644 (file)
@@ -35,7 +35,8 @@ using namespace clang;
 ///       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 @@ Parser::ParseTemplateDeclarationOrSpecialization(unsigned Context) {
   } 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
index 135faf4e9c9faa77799c5c0b5467069c8e3043b0..7a221d007c30c3a26f1df52a91d57db11ac34dcc 100644 (file)
@@ -442,10 +442,11 @@ Parser::DeclTy *Parser::ParseExternalDeclaration() {
 ///
 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] ';'
index 974404cbbdc423ae5f31757ae778bb2565b8b843..7f2f1097343c2f2888dbc9e284c5d6519c9028ed 100644 (file)
@@ -1715,7 +1715,8 @@ public:
                      SourceLocation KWLoc, const CXXScopeSpec &SS,
                      IdentifierInfo *Name, SourceLocation NameLoc,
                      AttributeList *Attr,
-                     MultiTemplateParamsArg TemplateParameterLists);
+                     MultiTemplateParamsArg TemplateParameterLists,
+                     AccessSpecifier AS);
 
   QualType CheckClassTemplateId(ClassTemplateDecl *ClassTemplate,
                                 SourceLocation TemplateLoc,
index c0476a8d3fdc9fda106002962c75da5d555eab1f..b8b1f3a5bb58753849fae2100696050708d8a7c0 100644 (file)
@@ -388,7 +388,8 @@ Sema::ActOnClassTemplate(Scope *S, unsigned TagSpec, TagKind TK,
                          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;