Home | History | Annotate | Download | only in Parse
      1 //===--- ParseDeclCXX.cpp - C++ Declaration Parsing -----------------------===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 //
     10 //  This file implements the C++ Declaration portions of the Parser interfaces.
     11 //
     12 //===----------------------------------------------------------------------===//
     13 
     14 #include "clang/Basic/OperatorKinds.h"
     15 #include "clang/Parse/Parser.h"
     16 #include "clang/Parse/ParseDiagnostic.h"
     17 #include "clang/Sema/DeclSpec.h"
     18 #include "clang/Sema/Scope.h"
     19 #include "clang/Sema/ParsedTemplate.h"
     20 #include "clang/Sema/PrettyDeclStackTrace.h"
     21 #include "RAIIObjectsForParser.h"
     22 using namespace clang;
     23 
     24 /// ParseNamespace - We know that the current token is a namespace keyword. This
     25 /// may either be a top level namespace or a block-level namespace alias. If
     26 /// there was an inline keyword, it has already been parsed.
     27 ///
     28 ///       namespace-definition: [C++ 7.3: basic.namespace]
     29 ///         named-namespace-definition
     30 ///         unnamed-namespace-definition
     31 ///
     32 ///       unnamed-namespace-definition:
     33 ///         'inline'[opt] 'namespace' attributes[opt] '{' namespace-body '}'
     34 ///
     35 ///       named-namespace-definition:
     36 ///         original-namespace-definition
     37 ///         extension-namespace-definition
     38 ///
     39 ///       original-namespace-definition:
     40 ///         'inline'[opt] 'namespace' identifier attributes[opt]
     41 ///             '{' namespace-body '}'
     42 ///
     43 ///       extension-namespace-definition:
     44 ///         'inline'[opt] 'namespace' original-namespace-name
     45 ///             '{' namespace-body '}'
     46 ///
     47 ///       namespace-alias-definition:  [C++ 7.3.2: namespace.alias]
     48 ///         'namespace' identifier '=' qualified-namespace-specifier ';'
     49 ///
     50 Decl *Parser::ParseNamespace(unsigned Context,
     51                              SourceLocation &DeclEnd,
     52                              SourceLocation InlineLoc) {
     53   assert(Tok.is(tok::kw_namespace) && "Not a namespace!");
     54   SourceLocation NamespaceLoc = ConsumeToken();  // eat the 'namespace'.
     55 
     56   if (Tok.is(tok::code_completion)) {
     57     Actions.CodeCompleteNamespaceDecl(getCurScope());
     58     ConsumeCodeCompletionToken();
     59   }
     60 
     61   SourceLocation IdentLoc;
     62   IdentifierInfo *Ident = 0;
     63   std::vector<SourceLocation> ExtraIdentLoc;
     64   std::vector<IdentifierInfo*> ExtraIdent;
     65   std::vector<SourceLocation> ExtraNamespaceLoc;
     66 
     67   Token attrTok;
     68 
     69   if (Tok.is(tok::identifier)) {
     70     Ident = Tok.getIdentifierInfo();
     71     IdentLoc = ConsumeToken();  // eat the identifier.
     72     while (Tok.is(tok::coloncolon) && NextToken().is(tok::identifier)) {
     73       ExtraNamespaceLoc.push_back(ConsumeToken());
     74       ExtraIdent.push_back(Tok.getIdentifierInfo());
     75       ExtraIdentLoc.push_back(ConsumeToken());
     76     }
     77   }
     78 
     79   // Read label attributes, if present.
     80   ParsedAttributes attrs(AttrFactory);
     81   if (Tok.is(tok::kw___attribute)) {
     82     attrTok = Tok;
     83     ParseGNUAttributes(attrs);
     84   }
     85 
     86   if (Tok.is(tok::equal)) {
     87     if (!attrs.empty())
     88       Diag(attrTok, diag::err_unexpected_namespace_attributes_alias);
     89     if (InlineLoc.isValid())
     90       Diag(InlineLoc, diag::err_inline_namespace_alias)
     91           << FixItHint::CreateRemoval(InlineLoc);
     92 
     93     return ParseNamespaceAlias(NamespaceLoc, IdentLoc, Ident, DeclEnd);
     94   }
     95 
     96 
     97   if (Tok.isNot(tok::l_brace)) {
     98     if (!ExtraIdent.empty()) {
     99       Diag(ExtraNamespaceLoc[0], diag::err_nested_namespaces_with_double_colon)
    100           << SourceRange(ExtraNamespaceLoc.front(), ExtraIdentLoc.back());
    101     }
    102     Diag(Tok, Ident ? diag::err_expected_lbrace :
    103          diag::err_expected_ident_lbrace);
    104     return 0;
    105   }
    106 
    107   SourceLocation LBrace = ConsumeBrace();
    108 
    109   if (getCurScope()->isClassScope() || getCurScope()->isTemplateParamScope() ||
    110       getCurScope()->isInObjcMethodScope() || getCurScope()->getBlockParent() ||
    111       getCurScope()->getFnParent()) {
    112     if (!ExtraIdent.empty()) {
    113       Diag(ExtraNamespaceLoc[0], diag::err_nested_namespaces_with_double_colon)
    114           << SourceRange(ExtraNamespaceLoc.front(), ExtraIdentLoc.back());
    115     }
    116     Diag(LBrace, diag::err_namespace_nonnamespace_scope);
    117     SkipUntil(tok::r_brace, false);
    118     return 0;
    119   }
    120 
    121   if (!ExtraIdent.empty()) {
    122     TentativeParsingAction TPA(*this);
    123     SkipUntil(tok::r_brace, /*StopAtSemi*/false, /*DontConsume*/true);
    124     Token rBraceToken = Tok;
    125     TPA.Revert();
    126 
    127     if (!rBraceToken.is(tok::r_brace)) {
    128       Diag(ExtraNamespaceLoc[0], diag::err_nested_namespaces_with_double_colon)
    129           << SourceRange(ExtraNamespaceLoc.front(), ExtraIdentLoc.back());
    130     } else {
    131       std::string NamespaceFix;
    132       for (std::vector<IdentifierInfo*>::iterator I = ExtraIdent.begin(),
    133            E = ExtraIdent.end(); I != E; ++I) {
    134         NamespaceFix += " { namespace ";
    135         NamespaceFix += (*I)->getName();
    136       }
    137 
    138       std::string RBraces;
    139       for (unsigned i = 0, e = ExtraIdent.size(); i != e; ++i)
    140         RBraces +=  "} ";
    141 
    142       Diag(ExtraNamespaceLoc[0], diag::err_nested_namespaces_with_double_colon)
    143           << FixItHint::CreateReplacement(SourceRange(ExtraNamespaceLoc.front(),
    144                                                       ExtraIdentLoc.back()),
    145                                           NamespaceFix)
    146           << FixItHint::CreateInsertion(rBraceToken.getLocation(), RBraces);
    147     }
    148   }
    149 
    150   // If we're still good, complain about inline namespaces in non-C++0x now.
    151   if (!getLang().CPlusPlus0x && InlineLoc.isValid())
    152     Diag(InlineLoc, diag::ext_inline_namespace);
    153 
    154   // Enter a scope for the namespace.
    155   ParseScope NamespaceScope(this, Scope::DeclScope);
    156 
    157   Decl *NamespcDecl =
    158     Actions.ActOnStartNamespaceDef(getCurScope(), InlineLoc, NamespaceLoc,
    159                                    IdentLoc, Ident, LBrace, attrs.getList());
    160 
    161   PrettyDeclStackTraceEntry CrashInfo(Actions, NamespcDecl, NamespaceLoc,
    162                                       "parsing namespace");
    163 
    164   SourceLocation RBraceLoc;
    165   // Parse the contents of the namespace.  This includes parsing recovery on
    166   // any improperly nested namespaces.
    167   ParseInnerNamespace(ExtraIdentLoc, ExtraIdent, ExtraNamespaceLoc, 0,
    168                       InlineLoc, LBrace, attrs, RBraceLoc);
    169 
    170   // Leave the namespace scope.
    171   NamespaceScope.Exit();
    172 
    173   Actions.ActOnFinishNamespaceDef(NamespcDecl, RBraceLoc);
    174 
    175   DeclEnd = RBraceLoc;
    176   return NamespcDecl;
    177 }
    178 
    179 /// ParseInnerNamespace - Parse the contents of a namespace.
    180 void Parser::ParseInnerNamespace(std::vector<SourceLocation>& IdentLoc,
    181                                  std::vector<IdentifierInfo*>& Ident,
    182                                  std::vector<SourceLocation>& NamespaceLoc,
    183                                  unsigned int index, SourceLocation& InlineLoc,
    184                                  SourceLocation& LBrace,
    185                                  ParsedAttributes& attrs,
    186                                  SourceLocation& RBraceLoc) {
    187   if (index == Ident.size()) {
    188     while (Tok.isNot(tok::r_brace) && Tok.isNot(tok::eof)) {
    189       ParsedAttributesWithRange attrs(AttrFactory);
    190       MaybeParseCXX0XAttributes(attrs);
    191       MaybeParseMicrosoftAttributes(attrs);
    192       ParseExternalDeclaration(attrs);
    193     }
    194     RBraceLoc = MatchRHSPunctuation(tok::r_brace, LBrace);
    195 
    196     return;
    197   }
    198 
    199   // Parse improperly nested namespaces.
    200   ParseScope NamespaceScope(this, Scope::DeclScope);
    201   Decl *NamespcDecl =
    202     Actions.ActOnStartNamespaceDef(getCurScope(), SourceLocation(),
    203                                    NamespaceLoc[index], IdentLoc[index],
    204                                    Ident[index], LBrace, attrs.getList());
    205 
    206   ParseInnerNamespace(IdentLoc, Ident, NamespaceLoc, ++index, InlineLoc,
    207                       LBrace, attrs, RBraceLoc);
    208 
    209   NamespaceScope.Exit();
    210 
    211   Actions.ActOnFinishNamespaceDef(NamespcDecl, RBraceLoc);
    212 }
    213 
    214 /// ParseNamespaceAlias - Parse the part after the '=' in a namespace
    215 /// alias definition.
    216 ///
    217 Decl *Parser::ParseNamespaceAlias(SourceLocation NamespaceLoc,
    218                                   SourceLocation AliasLoc,
    219                                   IdentifierInfo *Alias,
    220                                   SourceLocation &DeclEnd) {
    221   assert(Tok.is(tok::equal) && "Not equal token");
    222 
    223   ConsumeToken(); // eat the '='.
    224 
    225   if (Tok.is(tok::code_completion)) {
    226     Actions.CodeCompleteNamespaceAliasDecl(getCurScope());
    227     ConsumeCodeCompletionToken();
    228   }
    229 
    230   CXXScopeSpec SS;
    231   // Parse (optional) nested-name-specifier.
    232   ParseOptionalCXXScopeSpecifier(SS, ParsedType(), false);
    233 
    234   if (SS.isInvalid() || Tok.isNot(tok::identifier)) {
    235     Diag(Tok, diag::err_expected_namespace_name);
    236     // Skip to end of the definition and eat the ';'.
    237     SkipUntil(tok::semi);
    238     return 0;
    239   }
    240 
    241   // Parse identifier.
    242   IdentifierInfo *Ident = Tok.getIdentifierInfo();
    243   SourceLocation IdentLoc = ConsumeToken();
    244 
    245   // Eat the ';'.
    246   DeclEnd = Tok.getLocation();
    247   ExpectAndConsume(tok::semi, diag::err_expected_semi_after_namespace_name,
    248                    "", tok::semi);
    249 
    250   return Actions.ActOnNamespaceAliasDef(getCurScope(), NamespaceLoc, AliasLoc, Alias,
    251                                         SS, IdentLoc, Ident);
    252 }
    253 
    254 /// ParseLinkage - We know that the current token is a string_literal
    255 /// and just before that, that extern was seen.
    256 ///
    257 ///       linkage-specification: [C++ 7.5p2: dcl.link]
    258 ///         'extern' string-literal '{' declaration-seq[opt] '}'
    259 ///         'extern' string-literal declaration
    260 ///
    261 Decl *Parser::ParseLinkage(ParsingDeclSpec &DS, unsigned Context) {
    262   assert(Tok.is(tok::string_literal) && "Not a string literal!");
    263   llvm::SmallString<8> LangBuffer;
    264   bool Invalid = false;
    265   llvm::StringRef Lang = PP.getSpelling(Tok, LangBuffer, &Invalid);
    266   if (Invalid)
    267     return 0;
    268 
    269   SourceLocation Loc = ConsumeStringToken();
    270 
    271   ParseScope LinkageScope(this, Scope::DeclScope);
    272   Decl *LinkageSpec
    273     = Actions.ActOnStartLinkageSpecification(getCurScope(),
    274                                              DS.getSourceRange().getBegin(),
    275                                              Loc, Lang,
    276                                       Tok.is(tok::l_brace) ? Tok.getLocation()
    277                                                            : SourceLocation());
    278 
    279   ParsedAttributesWithRange attrs(AttrFactory);
    280   MaybeParseCXX0XAttributes(attrs);
    281   MaybeParseMicrosoftAttributes(attrs);
    282 
    283   if (Tok.isNot(tok::l_brace)) {
    284     // Reset the source range in DS, as the leading "extern"
    285     // does not really belong to the inner declaration ...
    286     DS.SetRangeStart(SourceLocation());
    287     DS.SetRangeEnd(SourceLocation());
    288     // ... but anyway remember that such an "extern" was seen.
    289     DS.setExternInLinkageSpec(true);
    290     ParseExternalDeclaration(attrs, &DS);
    291     return Actions.ActOnFinishLinkageSpecification(getCurScope(), LinkageSpec,
    292                                                    SourceLocation());
    293   }
    294 
    295   DS.abort();
    296 
    297   ProhibitAttributes(attrs);
    298 
    299   SourceLocation LBrace = ConsumeBrace();
    300   while (Tok.isNot(tok::r_brace) && Tok.isNot(tok::eof)) {
    301     ParsedAttributesWithRange attrs(AttrFactory);
    302     MaybeParseCXX0XAttributes(attrs);
    303     MaybeParseMicrosoftAttributes(attrs);
    304     ParseExternalDeclaration(attrs);
    305   }
    306 
    307   SourceLocation RBrace = MatchRHSPunctuation(tok::r_brace, LBrace);
    308   return Actions.ActOnFinishLinkageSpecification(getCurScope(), LinkageSpec,
    309                                                  RBrace);
    310 }
    311 
    312 /// ParseUsingDirectiveOrDeclaration - Parse C++ using using-declaration or
    313 /// using-directive. Assumes that current token is 'using'.
    314 Decl *Parser::ParseUsingDirectiveOrDeclaration(unsigned Context,
    315                                          const ParsedTemplateInfo &TemplateInfo,
    316                                                SourceLocation &DeclEnd,
    317                                              ParsedAttributesWithRange &attrs,
    318                                                Decl **OwnedType) {
    319   assert(Tok.is(tok::kw_using) && "Not using token");
    320 
    321   // Eat 'using'.
    322   SourceLocation UsingLoc = ConsumeToken();
    323 
    324   if (Tok.is(tok::code_completion)) {
    325     Actions.CodeCompleteUsing(getCurScope());
    326     ConsumeCodeCompletionToken();
    327   }
    328 
    329   // 'using namespace' means this is a using-directive.
    330   if (Tok.is(tok::kw_namespace)) {
    331     // Template parameters are always an error here.
    332     if (TemplateInfo.Kind) {
    333       SourceRange R = TemplateInfo.getSourceRange();
    334       Diag(UsingLoc, diag::err_templated_using_directive)
    335         << R << FixItHint::CreateRemoval(R);
    336     }
    337 
    338     return ParseUsingDirective(Context, UsingLoc, DeclEnd, attrs);
    339   }
    340 
    341   // Otherwise, it must be a using-declaration or an alias-declaration.
    342 
    343   // Using declarations can't have attributes.
    344   ProhibitAttributes(attrs);
    345 
    346   return ParseUsingDeclaration(Context, TemplateInfo, UsingLoc, DeclEnd,
    347                                AS_none, OwnedType);
    348 }
    349 
    350 /// ParseUsingDirective - Parse C++ using-directive, assumes
    351 /// that current token is 'namespace' and 'using' was already parsed.
    352 ///
    353 ///       using-directive: [C++ 7.3.p4: namespace.udir]
    354 ///        'using' 'namespace' ::[opt] nested-name-specifier[opt]
    355 ///                 namespace-name ;
    356 /// [GNU] using-directive:
    357 ///        'using' 'namespace' ::[opt] nested-name-specifier[opt]
    358 ///                 namespace-name attributes[opt] ;
    359 ///
    360 Decl *Parser::ParseUsingDirective(unsigned Context,
    361                                   SourceLocation UsingLoc,
    362                                   SourceLocation &DeclEnd,
    363                                   ParsedAttributes &attrs) {
    364   assert(Tok.is(tok::kw_namespace) && "Not 'namespace' token");
    365 
    366   // Eat 'namespace'.
    367   SourceLocation NamespcLoc = ConsumeToken();
    368 
    369   if (Tok.is(tok::code_completion)) {
    370     Actions.CodeCompleteUsingDirective(getCurScope());
    371     ConsumeCodeCompletionToken();
    372   }
    373 
    374   CXXScopeSpec SS;
    375   // Parse (optional) nested-name-specifier.
    376   ParseOptionalCXXScopeSpecifier(SS, ParsedType(), false);
    377 
    378   IdentifierInfo *NamespcName = 0;
    379   SourceLocation IdentLoc = SourceLocation();
    380 
    381   // Parse namespace-name.
    382   if (SS.isInvalid() || Tok.isNot(tok::identifier)) {
    383     Diag(Tok, diag::err_expected_namespace_name);
    384     // If there was invalid namespace name, skip to end of decl, and eat ';'.
    385     SkipUntil(tok::semi);
    386     // FIXME: Are there cases, when we would like to call ActOnUsingDirective?
    387     return 0;
    388   }
    389 
    390   // Parse identifier.
    391   NamespcName = Tok.getIdentifierInfo();
    392   IdentLoc = ConsumeToken();
    393 
    394   // Parse (optional) attributes (most likely GNU strong-using extension).
    395   bool GNUAttr = false;
    396   if (Tok.is(tok::kw___attribute)) {
    397     GNUAttr = true;
    398     ParseGNUAttributes(attrs);
    399   }
    400 
    401   // Eat ';'.
    402   DeclEnd = Tok.getLocation();
    403   ExpectAndConsume(tok::semi,
    404                    GNUAttr ? diag::err_expected_semi_after_attribute_list
    405                            : diag::err_expected_semi_after_namespace_name,
    406                    "", tok::semi);
    407 
    408   return Actions.ActOnUsingDirective(getCurScope(), UsingLoc, NamespcLoc, SS,
    409                                      IdentLoc, NamespcName, attrs.getList());
    410 }
    411 
    412 /// ParseUsingDeclaration - Parse C++ using-declaration or alias-declaration.
    413 /// Assumes that 'using' was already seen.
    414 ///
    415 ///     using-declaration: [C++ 7.3.p3: namespace.udecl]
    416 ///       'using' 'typename'[opt] ::[opt] nested-name-specifier
    417 ///               unqualified-id
    418 ///       'using' :: unqualified-id
    419 ///
    420 ///     alias-declaration: C++0x [decl.typedef]p2
    421 ///       'using' identifier = type-id ;
    422 ///
    423 Decl *Parser::ParseUsingDeclaration(unsigned Context,
    424                                     const ParsedTemplateInfo &TemplateInfo,
    425                                     SourceLocation UsingLoc,
    426                                     SourceLocation &DeclEnd,
    427                                     AccessSpecifier AS,
    428                                     Decl **OwnedType) {
    429   CXXScopeSpec SS;
    430   SourceLocation TypenameLoc;
    431   bool IsTypeName;
    432 
    433   // Ignore optional 'typename'.
    434   // FIXME: This is wrong; we should parse this as a typename-specifier.
    435   if (Tok.is(tok::kw_typename)) {
    436     TypenameLoc = Tok.getLocation();
    437     ConsumeToken();
    438     IsTypeName = true;
    439   }
    440   else
    441     IsTypeName = false;
    442 
    443   // Parse nested-name-specifier.
    444   ParseOptionalCXXScopeSpecifier(SS, ParsedType(), false);
    445 
    446   // Check nested-name specifier.
    447   if (SS.isInvalid()) {
    448     SkipUntil(tok::semi);
    449     return 0;
    450   }
    451 
    452   // Parse the unqualified-id. We allow parsing of both constructor and
    453   // destructor names and allow the action module to diagnose any semantic
    454   // errors.
    455   UnqualifiedId Name;
    456   if (ParseUnqualifiedId(SS,
    457                          /*EnteringContext=*/false,
    458                          /*AllowDestructorName=*/true,
    459                          /*AllowConstructorName=*/true,
    460                          ParsedType(),
    461                          Name)) {
    462     SkipUntil(tok::semi);
    463     return 0;
    464   }
    465 
    466   ParsedAttributes attrs(AttrFactory);
    467 
    468   // Maybe this is an alias-declaration.
    469   bool IsAliasDecl = Tok.is(tok::equal);
    470   TypeResult TypeAlias;
    471   if (IsAliasDecl) {
    472     // TODO: Attribute support. C++0x attributes may appear before the equals.
    473     // Where can GNU attributes appear?
    474     ConsumeToken();
    475 
    476     if (!getLang().CPlusPlus0x)
    477       Diag(Tok.getLocation(), diag::ext_alias_declaration);
    478 
    479     // Type alias templates cannot be specialized.
    480     int SpecKind = -1;
    481     if (TemplateInfo.Kind == ParsedTemplateInfo::Template &&
    482         Name.getKind() == UnqualifiedId::IK_TemplateId)
    483       SpecKind = 0;
    484     if (TemplateInfo.Kind == ParsedTemplateInfo::ExplicitSpecialization)
    485       SpecKind = 1;
    486     if (TemplateInfo.Kind == ParsedTemplateInfo::ExplicitInstantiation)
    487       SpecKind = 2;
    488     if (SpecKind != -1) {
    489       SourceRange Range;
    490       if (SpecKind == 0)
    491         Range = SourceRange(Name.TemplateId->LAngleLoc,
    492                             Name.TemplateId->RAngleLoc);
    493       else
    494         Range = TemplateInfo.getSourceRange();
    495       Diag(Range.getBegin(), diag::err_alias_declaration_specialization)
    496         << SpecKind << Range;
    497       SkipUntil(tok::semi);
    498       return 0;
    499     }
    500 
    501     // Name must be an identifier.
    502     if (Name.getKind() != UnqualifiedId::IK_Identifier) {
    503       Diag(Name.StartLocation, diag::err_alias_declaration_not_identifier);
    504       // No removal fixit: can't recover from this.
    505       SkipUntil(tok::semi);
    506       return 0;
    507     } else if (IsTypeName)
    508       Diag(TypenameLoc, diag::err_alias_declaration_not_identifier)
    509         << FixItHint::CreateRemoval(SourceRange(TypenameLoc,
    510                              SS.isNotEmpty() ? SS.getEndLoc() : TypenameLoc));
    511     else if (SS.isNotEmpty())
    512       Diag(SS.getBeginLoc(), diag::err_alias_declaration_not_identifier)
    513         << FixItHint::CreateRemoval(SS.getRange());
    514 
    515     TypeAlias = ParseTypeName(0, TemplateInfo.Kind ?
    516                               Declarator::AliasTemplateContext :
    517                               Declarator::AliasDeclContext, 0, AS, OwnedType);
    518   } else
    519     // Parse (optional) attributes (most likely GNU strong-using extension).
    520     MaybeParseGNUAttributes(attrs);
    521 
    522   // Eat ';'.
    523   DeclEnd = Tok.getLocation();
    524   ExpectAndConsume(tok::semi, diag::err_expected_semi_after,
    525                    !attrs.empty() ? "attributes list" :
    526                    IsAliasDecl ? "alias declaration" : "using declaration",
    527                    tok::semi);
    528 
    529   // Diagnose an attempt to declare a templated using-declaration.
    530   // In C++0x, alias-declarations can be templates:
    531   //   template <...> using id = type;
    532   if (TemplateInfo.Kind && !IsAliasDecl) {
    533     SourceRange R = TemplateInfo.getSourceRange();
    534     Diag(UsingLoc, diag::err_templated_using_declaration)
    535       << R << FixItHint::CreateRemoval(R);
    536 
    537     // Unfortunately, we have to bail out instead of recovering by
    538     // ignoring the parameters, just in case the nested name specifier
    539     // depends on the parameters.
    540     return 0;
    541   }
    542 
    543   if (IsAliasDecl) {
    544     TemplateParameterLists *TemplateParams = TemplateInfo.TemplateParams;
    545     MultiTemplateParamsArg TemplateParamsArg(Actions,
    546       TemplateParams ? TemplateParams->data() : 0,
    547       TemplateParams ? TemplateParams->size() : 0);
    548     return Actions.ActOnAliasDeclaration(getCurScope(), AS, TemplateParamsArg,
    549                                          UsingLoc, Name, TypeAlias);
    550   }
    551 
    552   return Actions.ActOnUsingDeclaration(getCurScope(), AS, true, UsingLoc, SS,
    553                                        Name, attrs.getList(),
    554                                        IsTypeName, TypenameLoc);
    555 }
    556 
    557 /// ParseStaticAssertDeclaration - Parse C++0x or C1X static_assert-declaration.
    558 ///
    559 /// [C++0x] static_assert-declaration:
    560 ///           static_assert ( constant-expression  ,  string-literal  ) ;
    561 ///
    562 /// [C1X]   static_assert-declaration:
    563 ///           _Static_assert ( constant-expression  ,  string-literal  ) ;
    564 ///
    565 Decl *Parser::ParseStaticAssertDeclaration(SourceLocation &DeclEnd){
    566   assert((Tok.is(tok::kw_static_assert) || Tok.is(tok::kw__Static_assert)) &&
    567          "Not a static_assert declaration");
    568 
    569   if (Tok.is(tok::kw__Static_assert) && !getLang().C1X)
    570     Diag(Tok, diag::ext_c1x_static_assert);
    571 
    572   SourceLocation StaticAssertLoc = ConsumeToken();
    573 
    574   if (Tok.isNot(tok::l_paren)) {
    575     Diag(Tok, diag::err_expected_lparen);
    576     return 0;
    577   }
    578 
    579   SourceLocation LParenLoc = ConsumeParen();
    580 
    581   ExprResult AssertExpr(ParseConstantExpression());
    582   if (AssertExpr.isInvalid()) {
    583     SkipUntil(tok::semi);
    584     return 0;
    585   }
    586 
    587   if (ExpectAndConsume(tok::comma, diag::err_expected_comma, "", tok::semi))
    588     return 0;
    589 
    590   if (Tok.isNot(tok::string_literal)) {
    591     Diag(Tok, diag::err_expected_string_literal);
    592     SkipUntil(tok::semi);
    593     return 0;
    594   }
    595 
    596   ExprResult AssertMessage(ParseStringLiteralExpression());
    597   if (AssertMessage.isInvalid())
    598     return 0;
    599 
    600   SourceLocation RParenLoc = MatchRHSPunctuation(tok::r_paren, LParenLoc);
    601 
    602   DeclEnd = Tok.getLocation();
    603   ExpectAndConsumeSemi(diag::err_expected_semi_after_static_assert);
    604 
    605   return Actions.ActOnStaticAssertDeclaration(StaticAssertLoc,
    606                                               AssertExpr.take(),
    607                                               AssertMessage.take(),
    608                                               RParenLoc);
    609 }
    610 
    611 /// ParseDecltypeSpecifier - Parse a C++0x decltype specifier.
    612 ///
    613 /// 'decltype' ( expression )
    614 ///
    615 void Parser::ParseDecltypeSpecifier(DeclSpec &DS) {
    616   assert(Tok.is(tok::kw_decltype) && "Not a decltype specifier");
    617 
    618   SourceLocation StartLoc = ConsumeToken();
    619   SourceLocation LParenLoc = Tok.getLocation();
    620 
    621   if (ExpectAndConsume(tok::l_paren, diag::err_expected_lparen_after,
    622                        "decltype")) {
    623     SkipUntil(tok::r_paren);
    624     return;
    625   }
    626 
    627   // Parse the expression
    628 
    629   // C++0x [dcl.type.simple]p4:
    630   //   The operand of the decltype specifier is an unevaluated operand.
    631   EnterExpressionEvaluationContext Unevaluated(Actions,
    632                                                Sema::Unevaluated);
    633   ExprResult Result = ParseExpression();
    634   if (Result.isInvalid()) {
    635     SkipUntil(tok::r_paren);
    636     return;
    637   }
    638 
    639   // Match the ')'
    640   SourceLocation RParenLoc;
    641   if (Tok.is(tok::r_paren))
    642     RParenLoc = ConsumeParen();
    643   else
    644     MatchRHSPunctuation(tok::r_paren, LParenLoc);
    645 
    646   if (RParenLoc.isInvalid())
    647     return;
    648 
    649   const char *PrevSpec = 0;
    650   unsigned DiagID;
    651   // Check for duplicate type specifiers (e.g. "int decltype(a)").
    652   if (DS.SetTypeSpecType(DeclSpec::TST_decltype, StartLoc, PrevSpec,
    653                          DiagID, Result.release()))
    654     Diag(StartLoc, DiagID) << PrevSpec;
    655 }
    656 
    657 void Parser::ParseUnderlyingTypeSpecifier(DeclSpec &DS) {
    658   assert(Tok.is(tok::kw___underlying_type) &&
    659          "Not an underlying type specifier");
    660 
    661   SourceLocation StartLoc = ConsumeToken();
    662   SourceLocation LParenLoc = Tok.getLocation();
    663 
    664   if (ExpectAndConsume(tok::l_paren, diag::err_expected_lparen_after,
    665                        "__underlying_type")) {
    666     SkipUntil(tok::r_paren);
    667     return;
    668   }
    669 
    670   TypeResult Result = ParseTypeName();
    671   if (Result.isInvalid()) {
    672     SkipUntil(tok::r_paren);
    673     return;
    674   }
    675 
    676   // Match the ')'
    677   SourceLocation RParenLoc;
    678   if (Tok.is(tok::r_paren))
    679     RParenLoc = ConsumeParen();
    680   else
    681     MatchRHSPunctuation(tok::r_paren, LParenLoc);
    682 
    683   if (RParenLoc.isInvalid())
    684     return;
    685 
    686   const char *PrevSpec = 0;
    687   unsigned DiagID;
    688   if (DS.SetTypeSpecType(DeclSpec::TST_underlyingType, StartLoc, PrevSpec,
    689                          DiagID, Result.release()))
    690     Diag(StartLoc, DiagID) << PrevSpec;
    691 }
    692 
    693 /// ParseClassName - Parse a C++ class-name, which names a class. Note
    694 /// that we only check that the result names a type; semantic analysis
    695 /// will need to verify that the type names a class. The result is
    696 /// either a type or NULL, depending on whether a type name was
    697 /// found.
    698 ///
    699 ///       class-name: [C++ 9.1]
    700 ///         identifier
    701 ///         simple-template-id
    702 ///
    703 Parser::TypeResult Parser::ParseClassName(SourceLocation &EndLocation,
    704                                           CXXScopeSpec &SS) {
    705   // Check whether we have a template-id that names a type.
    706   if (Tok.is(tok::annot_template_id)) {
    707     TemplateIdAnnotation *TemplateId = takeTemplateIdAnnotation(Tok);
    708     if (TemplateId->Kind == TNK_Type_template ||
    709         TemplateId->Kind == TNK_Dependent_template_name) {
    710       AnnotateTemplateIdTokenAsType();
    711 
    712       assert(Tok.is(tok::annot_typename) && "template-id -> type failed");
    713       ParsedType Type = getTypeAnnotation(Tok);
    714       EndLocation = Tok.getAnnotationEndLoc();
    715       ConsumeToken();
    716 
    717       if (Type)
    718         return Type;
    719       return true;
    720     }
    721 
    722     // Fall through to produce an error below.
    723   }
    724 
    725   if (Tok.isNot(tok::identifier)) {
    726     Diag(Tok, diag::err_expected_class_name);
    727     return true;
    728   }
    729 
    730   IdentifierInfo *Id = Tok.getIdentifierInfo();
    731   SourceLocation IdLoc = ConsumeToken();
    732 
    733   if (Tok.is(tok::less)) {
    734     // It looks the user intended to write a template-id here, but the
    735     // template-name was wrong. Try to fix that.
    736     TemplateNameKind TNK = TNK_Type_template;
    737     TemplateTy Template;
    738     if (!Actions.DiagnoseUnknownTemplateName(*Id, IdLoc, getCurScope(),
    739                                              &SS, Template, TNK)) {
    740       Diag(IdLoc, diag::err_unknown_template_name)
    741         << Id;
    742     }
    743 
    744     if (!Template)
    745       return true;
    746 
    747     // Form the template name
    748     UnqualifiedId TemplateName;
    749     TemplateName.setIdentifier(Id, IdLoc);
    750 
    751     // Parse the full template-id, then turn it into a type.
    752     if (AnnotateTemplateIdToken(Template, TNK, SS, TemplateName,
    753                                 SourceLocation(), true))
    754       return true;
    755     if (TNK == TNK_Dependent_template_name)
    756       AnnotateTemplateIdTokenAsType();
    757 
    758     // If we didn't end up with a typename token, there's nothing more we
    759     // can do.
    760     if (Tok.isNot(tok::annot_typename))
    761       return true;
    762 
    763     // Retrieve the type from the annotation token, consume that token, and
    764     // return.
    765     EndLocation = Tok.getAnnotationEndLoc();
    766     ParsedType Type = getTypeAnnotation(Tok);
    767     ConsumeToken();
    768     return Type;
    769   }
    770 
    771   // We have an identifier; check whether it is actually a type.
    772   ParsedType Type = Actions.getTypeName(*Id, IdLoc, getCurScope(), &SS, true,
    773                                         false, ParsedType(),
    774                                         /*NonTrivialTypeSourceInfo=*/true);
    775   if (!Type) {
    776     Diag(IdLoc, diag::err_expected_class_name);
    777     return true;
    778   }
    779 
    780   // Consume the identifier.
    781   EndLocation = IdLoc;
    782 
    783   // Fake up a Declarator to use with ActOnTypeName.
    784   DeclSpec DS(AttrFactory);
    785   DS.SetRangeStart(IdLoc);
    786   DS.SetRangeEnd(EndLocation);
    787   DS.getTypeSpecScope() = SS;
    788 
    789   const char *PrevSpec = 0;
    790   unsigned DiagID;
    791   DS.SetTypeSpecType(TST_typename, IdLoc, PrevSpec, DiagID, Type);
    792 
    793   Declarator DeclaratorInfo(DS, Declarator::TypeNameContext);
    794   return Actions.ActOnTypeName(getCurScope(), DeclaratorInfo);
    795 }
    796 
    797 /// ParseClassSpecifier - Parse a C++ class-specifier [C++ class] or
    798 /// elaborated-type-specifier [C++ dcl.type.elab]; we can't tell which
    799 /// until we reach the start of a definition or see a token that
    800 /// cannot start a definition. If SuppressDeclarations is true, we do know.
    801 ///
    802 ///       class-specifier: [C++ class]
    803 ///         class-head '{' member-specification[opt] '}'
    804 ///         class-head '{' member-specification[opt] '}' attributes[opt]
    805 ///       class-head:
    806 ///         class-key identifier[opt] base-clause[opt]
    807 ///         class-key nested-name-specifier identifier base-clause[opt]
    808 ///         class-key nested-name-specifier[opt] simple-template-id
    809 ///                          base-clause[opt]
    810 /// [GNU]   class-key attributes[opt] identifier[opt] base-clause[opt]
    811 /// [GNU]   class-key attributes[opt] nested-name-specifier
    812 ///                          identifier base-clause[opt]
    813 /// [GNU]   class-key attributes[opt] nested-name-specifier[opt]
    814 ///                          simple-template-id base-clause[opt]
    815 ///       class-key:
    816 ///         'class'
    817 ///         'struct'
    818 ///         'union'
    819 ///
    820 ///       elaborated-type-specifier: [C++ dcl.type.elab]
    821 ///         class-key ::[opt] nested-name-specifier[opt] identifier
    822 ///         class-key ::[opt] nested-name-specifier[opt] 'template'[opt]
    823 ///                          simple-template-id
    824 ///
    825 ///  Note that the C++ class-specifier and elaborated-type-specifier,
    826 ///  together, subsume the C99 struct-or-union-specifier:
    827 ///
    828 ///       struct-or-union-specifier: [C99 6.7.2.1]
    829 ///         struct-or-union identifier[opt] '{' struct-contents '}'
    830 ///         struct-or-union identifier
    831 /// [GNU]   struct-or-union attributes[opt] identifier[opt] '{' struct-contents
    832 ///                                                         '}' attributes[opt]
    833 /// [GNU]   struct-or-union attributes[opt] identifier
    834 ///       struct-or-union:
    835 ///         'struct'
    836 ///         'union'
    837 void Parser::ParseClassSpecifier(tok::TokenKind TagTokKind,
    838                                  SourceLocation StartLoc, DeclSpec &DS,
    839                                  const ParsedTemplateInfo &TemplateInfo,
    840                                  AccessSpecifier AS, bool SuppressDeclarations){
    841   DeclSpec::TST TagType;
    842   if (TagTokKind == tok::kw_struct)
    843     TagType = DeclSpec::TST_struct;
    844   else if (TagTokKind == tok::kw_class)
    845     TagType = DeclSpec::TST_class;
    846   else {
    847     assert(TagTokKind == tok::kw_union && "Not a class specifier");
    848     TagType = DeclSpec::TST_union;
    849   }
    850 
    851   if (Tok.is(tok::code_completion)) {
    852     // Code completion for a struct, class, or union name.
    853     Actions.CodeCompleteTag(getCurScope(), TagType);
    854     ConsumeCodeCompletionToken();
    855   }
    856 
    857   // C++03 [temp.explicit] 14.7.2/8:
    858   //   The usual access checking rules do not apply to names used to specify
    859   //   explicit instantiations.
    860   //
    861   // As an extension we do not perform access checking on the names used to
    862   // specify explicit specializations either. This is important to allow
    863   // specializing traits classes for private types.
    864   bool SuppressingAccessChecks = false;
    865   if (TemplateInfo.Kind == ParsedTemplateInfo::ExplicitInstantiation ||
    866       TemplateInfo.Kind == ParsedTemplateInfo::ExplicitSpecialization) {
    867     Actions.ActOnStartSuppressingAccessChecks();
    868     SuppressingAccessChecks = true;
    869   }
    870 
    871   ParsedAttributes attrs(AttrFactory);
    872   // If attributes exist after tag, parse them.
    873   if (Tok.is(tok::kw___attribute))
    874     ParseGNUAttributes(attrs);
    875 
    876   // If declspecs exist after tag, parse them.
    877   while (Tok.is(tok::kw___declspec))
    878     ParseMicrosoftDeclSpec(attrs);
    879 
    880   // If C++0x attributes exist here, parse them.
    881   // FIXME: Are we consistent with the ordering of parsing of different
    882   // styles of attributes?
    883   MaybeParseCXX0XAttributes(attrs);
    884 
    885   if (TagType == DeclSpec::TST_struct &&
    886       !Tok.is(tok::identifier) &&
    887       Tok.getIdentifierInfo() &&
    888       (Tok.is(tok::kw___is_arithmetic) ||
    889        Tok.is(tok::kw___is_convertible) ||
    890        Tok.is(tok::kw___is_empty) ||
    891        Tok.is(tok::kw___is_floating_point) ||
    892        Tok.is(tok::kw___is_function) ||
    893        Tok.is(tok::kw___is_fundamental) ||
    894        Tok.is(tok::kw___is_integral) ||
    895        Tok.is(tok::kw___is_member_function_pointer) ||
    896        Tok.is(tok::kw___is_member_pointer) ||
    897        Tok.is(tok::kw___is_pod) ||
    898        Tok.is(tok::kw___is_pointer) ||
    899        Tok.is(tok::kw___is_same) ||
    900        Tok.is(tok::kw___is_scalar) ||
    901        Tok.is(tok::kw___is_signed) ||
    902        Tok.is(tok::kw___is_unsigned) ||
    903        Tok.is(tok::kw___is_void))) {
    904     // GNU libstdc++ 4.2 and libc++ uaw certain intrinsic names as the
    905     // name of struct templates, but some are keywords in GCC >= 4.3
    906     // and Clang. Therefore, when we see the token sequence "struct
    907     // X", make X into a normal identifier rather than a keyword, to
    908     // allow libstdc++ 4.2 and libc++ to work properly.
    909     Tok.getIdentifierInfo()->RevertTokenIDToIdentifier();
    910     Tok.setKind(tok::identifier);
    911   }
    912 
    913   // Parse the (optional) nested-name-specifier.
    914   CXXScopeSpec &SS = DS.getTypeSpecScope();
    915   if (getLang().CPlusPlus) {
    916     // "FOO : BAR" is not a potential typo for "FOO::BAR".
    917     ColonProtectionRAIIObject X(*this);
    918 
    919     if (ParseOptionalCXXScopeSpecifier(SS, ParsedType(), true))
    920       DS.SetTypeSpecError();
    921     if (SS.isSet())
    922       if (Tok.isNot(tok::identifier) && Tok.isNot(tok::annot_template_id))
    923         Diag(Tok, diag::err_expected_ident);
    924   }
    925 
    926   TemplateParameterLists *TemplateParams = TemplateInfo.TemplateParams;
    927 
    928   // Parse the (optional) class name or simple-template-id.
    929   IdentifierInfo *Name = 0;
    930   SourceLocation NameLoc;
    931   TemplateIdAnnotation *TemplateId = 0;
    932   if (Tok.is(tok::identifier)) {
    933     Name = Tok.getIdentifierInfo();
    934     NameLoc = ConsumeToken();
    935 
    936     if (Tok.is(tok::less) && getLang().CPlusPlus) {
    937       // The name was supposed to refer to a template, but didn't.
    938       // Eat the template argument list and try to continue parsing this as
    939       // a class (or template thereof).
    940       TemplateArgList TemplateArgs;
    941       SourceLocation LAngleLoc, RAngleLoc;
    942       if (ParseTemplateIdAfterTemplateName(TemplateTy(), NameLoc, SS,
    943                                            true, LAngleLoc,
    944                                            TemplateArgs, RAngleLoc)) {
    945         // We couldn't parse the template argument list at all, so don't
    946         // try to give any location information for the list.
    947         LAngleLoc = RAngleLoc = SourceLocation();
    948       }
    949 
    950       Diag(NameLoc, diag::err_explicit_spec_non_template)
    951         << (TemplateInfo.Kind == ParsedTemplateInfo::ExplicitInstantiation)
    952         << (TagType == DeclSpec::TST_class? 0
    953             : TagType == DeclSpec::TST_struct? 1
    954             : 2)
    955         << Name
    956         << SourceRange(LAngleLoc, RAngleLoc);
    957 
    958       // Strip off the last template parameter list if it was empty, since
    959       // we've removed its template argument list.
    960       if (TemplateParams && TemplateInfo.LastParameterListWasEmpty) {
    961         if (TemplateParams && TemplateParams->size() > 1) {
    962           TemplateParams->pop_back();
    963         } else {
    964           TemplateParams = 0;
    965           const_cast<ParsedTemplateInfo&>(TemplateInfo).Kind
    966             = ParsedTemplateInfo::NonTemplate;
    967         }
    968       } else if (TemplateInfo.Kind
    969                                 == ParsedTemplateInfo::ExplicitInstantiation) {
    970         // Pretend this is just a forward declaration.
    971         TemplateParams = 0;
    972         const_cast<ParsedTemplateInfo&>(TemplateInfo).Kind
    973           = ParsedTemplateInfo::NonTemplate;
    974         const_cast<ParsedTemplateInfo&>(TemplateInfo).TemplateLoc
    975           = SourceLocation();
    976         const_cast<ParsedTemplateInfo&>(TemplateInfo).ExternLoc
    977           = SourceLocation();
    978       }
    979     }
    980   } else if (Tok.is(tok::annot_template_id)) {
    981     TemplateId = takeTemplateIdAnnotation(Tok);
    982     NameLoc = ConsumeToken();
    983 
    984     if (TemplateId->Kind != TNK_Type_template &&
    985         TemplateId->Kind != TNK_Dependent_template_name) {
    986       // The template-name in the simple-template-id refers to
    987       // something other than a class template. Give an appropriate
    988       // error message and skip to the ';'.
    989       SourceRange Range(NameLoc);
    990       if (SS.isNotEmpty())
    991         Range.setBegin(SS.getBeginLoc());
    992 
    993       Diag(TemplateId->LAngleLoc, diag::err_template_spec_syntax_non_template)
    994         << Name << static_cast<int>(TemplateId->Kind) << Range;
    995 
    996       DS.SetTypeSpecError();
    997       SkipUntil(tok::semi, false, true);
    998       if (SuppressingAccessChecks)
    999         Actions.ActOnStopSuppressingAccessChecks();
   1000 
   1001       return;
   1002     }
   1003   }
   1004 
   1005   // As soon as we're finished parsing the class's template-id, turn access
   1006   // checking back on.
   1007   if (SuppressingAccessChecks)
   1008     Actions.ActOnStopSuppressingAccessChecks();
   1009 
   1010   // There are four options here.  If we have 'struct foo;', then this
   1011   // is either a forward declaration or a friend declaration, which
   1012   // have to be treated differently.  If we have 'struct foo {...',
   1013   // 'struct foo :...' or 'struct foo final[opt]' then this is a
   1014   // definition. Otherwise we have something like 'struct foo xyz', a reference.
   1015   // However, in some contexts, things look like declarations but are just
   1016   // references, e.g.
   1017   // new struct s;
   1018   // or
   1019   // &T::operator struct s;
   1020   // For these, SuppressDeclarations is true.
   1021   Sema::TagUseKind TUK;
   1022   if (SuppressDeclarations)
   1023     TUK = Sema::TUK_Reference;
   1024   else if (Tok.is(tok::l_brace) ||
   1025            (getLang().CPlusPlus && Tok.is(tok::colon)) ||
   1026            isCXX0XFinalKeyword()) {
   1027     if (DS.isFriendSpecified()) {
   1028       // C++ [class.friend]p2:
   1029       //   A class shall not be defined in a friend declaration.
   1030       Diag(Tok.getLocation(), diag::err_friend_decl_defines_class)
   1031         << SourceRange(DS.getFriendSpecLoc());
   1032 
   1033       // Skip everything up to the semicolon, so that this looks like a proper
   1034       // friend class (or template thereof) declaration.
   1035       SkipUntil(tok::semi, true, true);
   1036       TUK = Sema::TUK_Friend;
   1037     } else {
   1038       // Okay, this is a class definition.
   1039       TUK = Sema::TUK_Definition;
   1040     }
   1041   } else if (Tok.is(tok::semi))
   1042     TUK = DS.isFriendSpecified() ? Sema::TUK_Friend : Sema::TUK_Declaration;
   1043   else
   1044     TUK = Sema::TUK_Reference;
   1045 
   1046   if (!Name && !TemplateId && (DS.getTypeSpecType() == DeclSpec::TST_error ||
   1047                                TUK != Sema::TUK_Definition)) {
   1048     if (DS.getTypeSpecType() != DeclSpec::TST_error) {
   1049       // We have a declaration or reference to an anonymous class.
   1050       Diag(StartLoc, diag::err_anon_type_definition)
   1051         << DeclSpec::getSpecifierName(TagType);
   1052     }
   1053 
   1054     SkipUntil(tok::comma, true);
   1055     return;
   1056   }
   1057 
   1058   // Create the tag portion of the class or class template.
   1059   DeclResult TagOrTempResult = true; // invalid
   1060   TypeResult TypeResult = true; // invalid
   1061 
   1062   bool Owned = false;
   1063   if (TemplateId) {
   1064     // Explicit specialization, class template partial specialization,
   1065     // or explicit instantiation.
   1066     ASTTemplateArgsPtr TemplateArgsPtr(Actions,
   1067                                        TemplateId->getTemplateArgs(),
   1068                                        TemplateId->NumArgs);
   1069     if (TemplateInfo.Kind == ParsedTemplateInfo::ExplicitInstantiation &&
   1070         TUK == Sema::TUK_Declaration) {
   1071       // This is an explicit instantiation of a class template.
   1072       TagOrTempResult
   1073         = Actions.ActOnExplicitInstantiation(getCurScope(),
   1074                                              TemplateInfo.ExternLoc,
   1075                                              TemplateInfo.TemplateLoc,
   1076                                              TagType,
   1077                                              StartLoc,
   1078                                              SS,
   1079                                              TemplateId->Template,
   1080                                              TemplateId->TemplateNameLoc,
   1081                                              TemplateId->LAngleLoc,
   1082                                              TemplateArgsPtr,
   1083                                              TemplateId->RAngleLoc,
   1084                                              attrs.getList());
   1085 
   1086     // Friend template-ids are treated as references unless
   1087     // they have template headers, in which case they're ill-formed
   1088     // (FIXME: "template <class T> friend class A<T>::B<int>;").
   1089     // We diagnose this error in ActOnClassTemplateSpecialization.
   1090     } else if (TUK == Sema::TUK_Reference ||
   1091                (TUK == Sema::TUK_Friend &&
   1092                 TemplateInfo.Kind == ParsedTemplateInfo::NonTemplate)) {
   1093       TypeResult = Actions.ActOnTagTemplateIdType(TUK, TagType,
   1094                                                   StartLoc,
   1095                                                   TemplateId->SS,
   1096                                                   TemplateId->Template,
   1097                                                   TemplateId->TemplateNameLoc,
   1098                                                   TemplateId->LAngleLoc,
   1099                                                   TemplateArgsPtr,
   1100                                                   TemplateId->RAngleLoc);
   1101     } else {
   1102       // This is an explicit specialization or a class template
   1103       // partial specialization.
   1104       TemplateParameterLists FakedParamLists;
   1105 
   1106       if (TemplateInfo.Kind == ParsedTemplateInfo::ExplicitInstantiation) {
   1107         // This looks like an explicit instantiation, because we have
   1108         // something like
   1109         //
   1110         //   template class Foo<X>
   1111         //
   1112         // but it actually has a definition. Most likely, this was
   1113         // meant to be an explicit specialization, but the user forgot
   1114         // the '<>' after 'template'.
   1115         assert(TUK == Sema::TUK_Definition && "Expected a definition here");
   1116 
   1117         SourceLocation LAngleLoc
   1118           = PP.getLocForEndOfToken(TemplateInfo.TemplateLoc);
   1119         Diag(TemplateId->TemplateNameLoc,
   1120              diag::err_explicit_instantiation_with_definition)
   1121           << SourceRange(TemplateInfo.TemplateLoc)
   1122           << FixItHint::CreateInsertion(LAngleLoc, "<>");
   1123 
   1124         // Create a fake template parameter list that contains only
   1125         // "template<>", so that we treat this construct as a class
   1126         // template specialization.
   1127         FakedParamLists.push_back(
   1128           Actions.ActOnTemplateParameterList(0, SourceLocation(),
   1129                                              TemplateInfo.TemplateLoc,
   1130                                              LAngleLoc,
   1131                                              0, 0,
   1132                                              LAngleLoc));
   1133         TemplateParams = &FakedParamLists;
   1134       }
   1135 
   1136       // Build the class template specialization.
   1137       TagOrTempResult
   1138         = Actions.ActOnClassTemplateSpecialization(getCurScope(), TagType, TUK,
   1139                        StartLoc, SS,
   1140                        TemplateId->Template,
   1141                        TemplateId->TemplateNameLoc,
   1142                        TemplateId->LAngleLoc,
   1143                        TemplateArgsPtr,
   1144                        TemplateId->RAngleLoc,
   1145                        attrs.getList(),
   1146                        MultiTemplateParamsArg(Actions,
   1147                                     TemplateParams? &(*TemplateParams)[0] : 0,
   1148                                  TemplateParams? TemplateParams->size() : 0));
   1149     }
   1150   } else if (TemplateInfo.Kind == ParsedTemplateInfo::ExplicitInstantiation &&
   1151              TUK == Sema::TUK_Declaration) {
   1152     // Explicit instantiation of a member of a class template
   1153     // specialization, e.g.,
   1154     //
   1155     //   template struct Outer<int>::Inner;
   1156     //
   1157     TagOrTempResult
   1158       = Actions.ActOnExplicitInstantiation(getCurScope(),
   1159                                            TemplateInfo.ExternLoc,
   1160                                            TemplateInfo.TemplateLoc,
   1161                                            TagType, StartLoc, SS, Name,
   1162                                            NameLoc, attrs.getList());
   1163   } else if (TUK == Sema::TUK_Friend &&
   1164              TemplateInfo.Kind != ParsedTemplateInfo::NonTemplate) {
   1165     TagOrTempResult =
   1166       Actions.ActOnTemplatedFriendTag(getCurScope(), DS.getFriendSpecLoc(),
   1167                                       TagType, StartLoc, SS,
   1168                                       Name, NameLoc, attrs.getList(),
   1169                                       MultiTemplateParamsArg(Actions,
   1170                                     TemplateParams? &(*TemplateParams)[0] : 0,
   1171                                  TemplateParams? TemplateParams->size() : 0));
   1172   } else {
   1173     if (TemplateInfo.Kind == ParsedTemplateInfo::ExplicitInstantiation &&
   1174         TUK == Sema::TUK_Definition) {
   1175       // FIXME: Diagnose this particular error.
   1176     }
   1177 
   1178     bool IsDependent = false;
   1179 
   1180     // Don't pass down template parameter lists if this is just a tag
   1181     // reference.  For example, we don't need the template parameters here:
   1182     //   template <class T> class A *makeA(T t);
   1183     MultiTemplateParamsArg TParams;
   1184     if (TUK != Sema::TUK_Reference && TemplateParams)
   1185       TParams =
   1186         MultiTemplateParamsArg(&(*TemplateParams)[0], TemplateParams->size());
   1187 
   1188     // Declaration or definition of a class type
   1189     TagOrTempResult = Actions.ActOnTag(getCurScope(), TagType, TUK, StartLoc,
   1190                                        SS, Name, NameLoc, attrs.getList(), AS,
   1191                                        TParams, Owned, IsDependent, false,
   1192                                        false, clang::TypeResult());
   1193 
   1194     // If ActOnTag said the type was dependent, try again with the
   1195     // less common call.
   1196     if (IsDependent) {
   1197       assert(TUK == Sema::TUK_Reference || TUK == Sema::TUK_Friend);
   1198       TypeResult = Actions.ActOnDependentTag(getCurScope(), TagType, TUK,
   1199                                              SS, Name, StartLoc, NameLoc);
   1200     }
   1201   }
   1202 
   1203   // If there is a body, parse it and inform the actions module.
   1204   if (TUK == Sema::TUK_Definition) {
   1205     assert(Tok.is(tok::l_brace) ||
   1206            (getLang().CPlusPlus && Tok.is(tok::colon)) ||
   1207            isCXX0XFinalKeyword());
   1208     if (getLang().CPlusPlus)
   1209       ParseCXXMemberSpecification(StartLoc, TagType, TagOrTempResult.get());
   1210     else
   1211       ParseStructUnionBody(StartLoc, TagType, TagOrTempResult.get());
   1212   }
   1213 
   1214   const char *PrevSpec = 0;
   1215   unsigned DiagID;
   1216   bool Result;
   1217   if (!TypeResult.isInvalid()) {
   1218     Result = DS.SetTypeSpecType(DeclSpec::TST_typename, StartLoc,
   1219                                 NameLoc.isValid() ? NameLoc : StartLoc,
   1220                                 PrevSpec, DiagID, TypeResult.get());
   1221   } else if (!TagOrTempResult.isInvalid()) {
   1222     Result = DS.SetTypeSpecType(TagType, StartLoc,
   1223                                 NameLoc.isValid() ? NameLoc : StartLoc,
   1224                                 PrevSpec, DiagID, TagOrTempResult.get(), Owned);
   1225   } else {
   1226     DS.SetTypeSpecError();
   1227     return;
   1228   }
   1229 
   1230   if (Result)
   1231     Diag(StartLoc, DiagID) << PrevSpec;
   1232 
   1233   // At this point, we've successfully parsed a class-specifier in 'definition'
   1234   // form (e.g. "struct foo { int x; }".  While we could just return here, we're
   1235   // going to look at what comes after it to improve error recovery.  If an
   1236   // impossible token occurs next, we assume that the programmer forgot a ; at
   1237   // the end of the declaration and recover that way.
   1238   //
   1239   // This switch enumerates the valid "follow" set for definition.
   1240   if (TUK == Sema::TUK_Definition) {
   1241     bool ExpectedSemi = true;
   1242     switch (Tok.getKind()) {
   1243     default: break;
   1244     case tok::semi:               // struct foo {...} ;
   1245     case tok::star:               // struct foo {...} *         P;
   1246     case tok::amp:                // struct foo {...} &         R = ...
   1247     case tok::identifier:         // struct foo {...} V         ;
   1248     case tok::r_paren:            //(struct foo {...} )         {4}
   1249     case tok::annot_cxxscope:     // struct foo {...} a::       b;
   1250     case tok::annot_typename:     // struct foo {...} a         ::b;
   1251     case tok::annot_template_id:  // struct foo {...} a<int>    ::b;
   1252     case tok::l_paren:            // struct foo {...} (         x);
   1253     case tok::comma:              // __builtin_offsetof(struct foo{...} ,
   1254       ExpectedSemi = false;
   1255       break;
   1256     // Type qualifiers
   1257     case tok::kw_const:           // struct foo {...} const     x;
   1258     case tok::kw_volatile:        // struct foo {...} volatile  x;
   1259     case tok::kw_restrict:        // struct foo {...} restrict  x;
   1260     case tok::kw_inline:          // struct foo {...} inline    foo() {};
   1261     // Storage-class specifiers
   1262     case tok::kw_static:          // struct foo {...} static    x;
   1263     case tok::kw_extern:          // struct foo {...} extern    x;
   1264     case tok::kw_typedef:         // struct foo {...} typedef   x;
   1265     case tok::kw_register:        // struct foo {...} register  x;
   1266     case tok::kw_auto:            // struct foo {...} auto      x;
   1267     case tok::kw_mutable:         // struct foo {...} mutable      x;
   1268       // As shown above, type qualifiers and storage class specifiers absolutely
   1269       // can occur after class specifiers according to the grammar.  However,
   1270       // almost no one actually writes code like this.  If we see one of these,
   1271       // it is much more likely that someone missed a semi colon and the
   1272       // type/storage class specifier we're seeing is part of the *next*
   1273       // intended declaration, as in:
   1274       //
   1275       //   struct foo { ... }
   1276       //   typedef int X;
   1277       //
   1278       // We'd really like to emit a missing semicolon error instead of emitting
   1279       // an error on the 'int' saying that you can't have two type specifiers in
   1280       // the same declaration of X.  Because of this, we look ahead past this
   1281       // token to see if it's a type specifier.  If so, we know the code is
   1282       // otherwise invalid, so we can produce the expected semi error.
   1283       if (!isKnownToBeTypeSpecifier(NextToken()))
   1284         ExpectedSemi = false;
   1285       break;
   1286 
   1287     case tok::r_brace:  // struct bar { struct foo {...} }
   1288       // Missing ';' at end of struct is accepted as an extension in C mode.
   1289       if (!getLang().CPlusPlus)
   1290         ExpectedSemi = false;
   1291       break;
   1292     }
   1293 
   1294     // C++ [temp]p3 In a template-declaration which defines a class, no
   1295     // declarator is permitted.
   1296     if (TemplateInfo.Kind)
   1297       ExpectedSemi = true;
   1298 
   1299     if (ExpectedSemi) {
   1300       ExpectAndConsume(tok::semi, diag::err_expected_semi_after_tagdecl,
   1301                        TagType == DeclSpec::TST_class ? "class"
   1302                        : TagType == DeclSpec::TST_struct? "struct" : "union");
   1303       // Push this token back into the preprocessor and change our current token
   1304       // to ';' so that the rest of the code recovers as though there were an
   1305       // ';' after the definition.
   1306       PP.EnterToken(Tok);
   1307       Tok.setKind(tok::semi);
   1308     }
   1309   }
   1310 }
   1311 
   1312 /// ParseBaseClause - Parse the base-clause of a C++ class [C++ class.derived].
   1313 ///
   1314 ///       base-clause : [C++ class.derived]
   1315 ///         ':' base-specifier-list
   1316 ///       base-specifier-list:
   1317 ///         base-specifier '...'[opt]
   1318 ///         base-specifier-list ',' base-specifier '...'[opt]
   1319 void Parser::ParseBaseClause(Decl *ClassDecl) {
   1320   assert(Tok.is(tok::colon) && "Not a base clause");
   1321   ConsumeToken();
   1322 
   1323   // Build up an array of parsed base specifiers.
   1324   llvm::SmallVector<CXXBaseSpecifier *, 8> BaseInfo;
   1325 
   1326   while (true) {
   1327     // Parse a base-specifier.
   1328     BaseResult Result = ParseBaseSpecifier(ClassDecl);
   1329     if (Result.isInvalid()) {
   1330       // Skip the rest of this base specifier, up until the comma or
   1331       // opening brace.
   1332       SkipUntil(tok::comma, tok::l_brace, true, true);
   1333     } else {
   1334       // Add this to our array of base specifiers.
   1335       BaseInfo.push_back(Result.get());
   1336     }
   1337 
   1338     // If the next token is a comma, consume it and keep reading
   1339     // base-specifiers.
   1340     if (Tok.isNot(tok::comma)) break;
   1341 
   1342     // Consume the comma.
   1343     ConsumeToken();
   1344   }
   1345 
   1346   // Attach the base specifiers
   1347   Actions.ActOnBaseSpecifiers(ClassDecl, BaseInfo.data(), BaseInfo.size());
   1348 }
   1349 
   1350 /// ParseBaseSpecifier - Parse a C++ base-specifier. A base-specifier is
   1351 /// one entry in the base class list of a class specifier, for example:
   1352 ///    class foo : public bar, virtual private baz {
   1353 /// 'public bar' and 'virtual private baz' are each base-specifiers.
   1354 ///
   1355 ///       base-specifier: [C++ class.derived]
   1356 ///         ::[opt] nested-name-specifier[opt] class-name
   1357 ///         'virtual' access-specifier[opt] ::[opt] nested-name-specifier[opt]
   1358 ///                        class-name
   1359 ///         access-specifier 'virtual'[opt] ::[opt] nested-name-specifier[opt]
   1360 ///                        class-name
   1361 Parser::BaseResult Parser::ParseBaseSpecifier(Decl *ClassDecl) {
   1362   bool IsVirtual = false;
   1363   SourceLocation StartLoc = Tok.getLocation();
   1364 
   1365   // Parse the 'virtual' keyword.
   1366   if (Tok.is(tok::kw_virtual))  {
   1367     ConsumeToken();
   1368     IsVirtual = true;
   1369   }
   1370 
   1371   // Parse an (optional) access specifier.
   1372   AccessSpecifier Access = getAccessSpecifierIfPresent();
   1373   if (Access != AS_none)
   1374     ConsumeToken();
   1375 
   1376   // Parse the 'virtual' keyword (again!), in case it came after the
   1377   // access specifier.
   1378   if (Tok.is(tok::kw_virtual))  {
   1379     SourceLocation VirtualLoc = ConsumeToken();
   1380     if (IsVirtual) {
   1381       // Complain about duplicate 'virtual'
   1382       Diag(VirtualLoc, diag::err_dup_virtual)
   1383         << FixItHint::CreateRemoval(VirtualLoc);
   1384     }
   1385 
   1386     IsVirtual = true;
   1387   }
   1388 
   1389   // Parse optional '::' and optional nested-name-specifier.
   1390   CXXScopeSpec SS;
   1391   ParseOptionalCXXScopeSpecifier(SS, ParsedType(), /*EnteringContext=*/false);
   1392 
   1393   // The location of the base class itself.
   1394   SourceLocation BaseLoc = Tok.getLocation();
   1395 
   1396   // Parse the class-name.
   1397   SourceLocation EndLocation;
   1398   TypeResult BaseType = ParseClassName(EndLocation, SS);
   1399   if (BaseType.isInvalid())
   1400     return true;
   1401 
   1402   // Parse the optional ellipsis (for a pack expansion). The ellipsis is
   1403   // actually part of the base-specifier-list grammar productions, but we
   1404   // parse it here for convenience.
   1405   SourceLocation EllipsisLoc;
   1406   if (Tok.is(tok::ellipsis))
   1407     EllipsisLoc = ConsumeToken();
   1408 
   1409   // Find the complete source range for the base-specifier.
   1410   SourceRange Range(StartLoc, EndLocation);
   1411 
   1412   // Notify semantic analysis that we have parsed a complete
   1413   // base-specifier.
   1414   return Actions.ActOnBaseSpecifier(ClassDecl, Range, IsVirtual, Access,
   1415                                     BaseType.get(), BaseLoc, EllipsisLoc);
   1416 }
   1417 
   1418 /// getAccessSpecifierIfPresent - Determine whether the next token is
   1419 /// a C++ access-specifier.
   1420 ///
   1421 ///       access-specifier: [C++ class.derived]
   1422 ///         'private'
   1423 ///         'protected'
   1424 ///         'public'
   1425 AccessSpecifier Parser::getAccessSpecifierIfPresent() const {
   1426   switch (Tok.getKind()) {
   1427   default: return AS_none;
   1428   case tok::kw_private: return AS_private;
   1429   case tok::kw_protected: return AS_protected;
   1430   case tok::kw_public: return AS_public;
   1431   }
   1432 }
   1433 
   1434 void Parser::HandleMemberFunctionDefaultArgs(Declarator& DeclaratorInfo,
   1435                                              Decl *ThisDecl) {
   1436   // We just declared a member function. If this member function
   1437   // has any default arguments, we'll need to parse them later.
   1438   LateParsedMethodDeclaration *LateMethod = 0;
   1439   DeclaratorChunk::FunctionTypeInfo &FTI
   1440     = DeclaratorInfo.getFunctionTypeInfo();
   1441   for (unsigned ParamIdx = 0; ParamIdx < FTI.NumArgs; ++ParamIdx) {
   1442     if (LateMethod || FTI.ArgInfo[ParamIdx].DefaultArgTokens) {
   1443       if (!LateMethod) {
   1444         // Push this method onto the stack of late-parsed method
   1445         // declarations.
   1446         LateMethod = new LateParsedMethodDeclaration(this, ThisDecl);
   1447         getCurrentClass().LateParsedDeclarations.push_back(LateMethod);
   1448         LateMethod->TemplateScope = getCurScope()->isTemplateParamScope();
   1449 
   1450         // Add all of the parameters prior to this one (they don't
   1451         // have default arguments).
   1452         LateMethod->DefaultArgs.reserve(FTI.NumArgs);
   1453         for (unsigned I = 0; I < ParamIdx; ++I)
   1454           LateMethod->DefaultArgs.push_back(
   1455                              LateParsedDefaultArgument(FTI.ArgInfo[I].Param));
   1456       }
   1457 
   1458       // Add this parameter to the list of parameters (it or may
   1459       // not have a default argument).
   1460       LateMethod->DefaultArgs.push_back(
   1461         LateParsedDefaultArgument(FTI.ArgInfo[ParamIdx].Param,
   1462                                   FTI.ArgInfo[ParamIdx].DefaultArgTokens));
   1463     }
   1464   }
   1465 }
   1466 
   1467 /// isCXX0XVirtSpecifier - Determine whether the next token is a C++0x
   1468 /// virt-specifier.
   1469 ///
   1470 ///       virt-specifier:
   1471 ///         override
   1472 ///         final
   1473 VirtSpecifiers::Specifier Parser::isCXX0XVirtSpecifier() const {
   1474   if (!getLang().CPlusPlus)
   1475     return VirtSpecifiers::VS_None;
   1476 
   1477   if (Tok.is(tok::identifier)) {
   1478     IdentifierInfo *II = Tok.getIdentifierInfo();
   1479 
   1480     // Initialize the contextual keywords.
   1481     if (!Ident_final) {
   1482       Ident_final = &PP.getIdentifierTable().get("final");
   1483       Ident_override = &PP.getIdentifierTable().get("override");
   1484     }
   1485 
   1486     if (II == Ident_override)
   1487       return VirtSpecifiers::VS_Override;
   1488 
   1489     if (II == Ident_final)
   1490       return VirtSpecifiers::VS_Final;
   1491   }
   1492 
   1493   return VirtSpecifiers::VS_None;
   1494 }
   1495 
   1496 /// ParseOptionalCXX0XVirtSpecifierSeq - Parse a virt-specifier-seq.
   1497 ///
   1498 ///       virt-specifier-seq:
   1499 ///         virt-specifier
   1500 ///         virt-specifier-seq virt-specifier
   1501 void Parser::ParseOptionalCXX0XVirtSpecifierSeq(VirtSpecifiers &VS) {
   1502   while (true) {
   1503     VirtSpecifiers::Specifier Specifier = isCXX0XVirtSpecifier();
   1504     if (Specifier == VirtSpecifiers::VS_None)
   1505       return;
   1506 
   1507     // C++ [class.mem]p8:
   1508     //   A virt-specifier-seq shall contain at most one of each virt-specifier.
   1509     const char *PrevSpec = 0;
   1510     if (VS.SetSpecifier(Specifier, Tok.getLocation(), PrevSpec))
   1511       Diag(Tok.getLocation(), diag::err_duplicate_virt_specifier)
   1512         << PrevSpec
   1513         << FixItHint::CreateRemoval(Tok.getLocation());
   1514 
   1515     if (!getLang().CPlusPlus0x)
   1516       Diag(Tok.getLocation(), diag::ext_override_control_keyword)
   1517         << VirtSpecifiers::getSpecifierName(Specifier);
   1518     ConsumeToken();
   1519   }
   1520 }
   1521 
   1522 /// isCXX0XFinalKeyword - Determine whether the next token is a C++0x
   1523 /// contextual 'final' keyword.
   1524 bool Parser::isCXX0XFinalKeyword() const {
   1525   if (!getLang().CPlusPlus)
   1526     return false;
   1527 
   1528   if (!Tok.is(tok::identifier))
   1529     return false;
   1530 
   1531   // Initialize the contextual keywords.
   1532   if (!Ident_final) {
   1533     Ident_final = &PP.getIdentifierTable().get("final");
   1534     Ident_override = &PP.getIdentifierTable().get("override");
   1535   }
   1536 
   1537   return Tok.getIdentifierInfo() == Ident_final;
   1538 }
   1539 
   1540 /// ParseCXXClassMemberDeclaration - Parse a C++ class member declaration.
   1541 ///
   1542 ///       member-declaration:
   1543 ///         decl-specifier-seq[opt] member-declarator-list[opt] ';'
   1544 ///         function-definition ';'[opt]
   1545 ///         ::[opt] nested-name-specifier template[opt] unqualified-id ';'[TODO]
   1546 ///         using-declaration                                            [TODO]
   1547 /// [C++0x] static_assert-declaration
   1548 ///         template-declaration
   1549 /// [GNU]   '__extension__' member-declaration
   1550 ///
   1551 ///       member-declarator-list:
   1552 ///         member-declarator
   1553 ///         member-declarator-list ',' member-declarator
   1554 ///
   1555 ///       member-declarator:
   1556 ///         declarator virt-specifier-seq[opt] pure-specifier[opt]
   1557 ///         declarator constant-initializer[opt]
   1558 /// [C++11] declarator brace-or-equal-initializer[opt]
   1559 ///         identifier[opt] ':' constant-expression
   1560 ///
   1561 ///       virt-specifier-seq:
   1562 ///         virt-specifier
   1563 ///         virt-specifier-seq virt-specifier
   1564 ///
   1565 ///       virt-specifier:
   1566 ///         override
   1567 ///         final
   1568 ///         new
   1569 ///
   1570 ///       pure-specifier:
   1571 ///         '= 0'
   1572 ///
   1573 ///       constant-initializer:
   1574 ///         '=' constant-expression
   1575 ///
   1576 void Parser::ParseCXXClassMemberDeclaration(AccessSpecifier AS,
   1577                                        const ParsedTemplateInfo &TemplateInfo,
   1578                                        ParsingDeclRAIIObject *TemplateDiags) {
   1579   if (Tok.is(tok::at)) {
   1580     if (getLang().ObjC1 && NextToken().isObjCAtKeyword(tok::objc_defs))
   1581       Diag(Tok, diag::err_at_defs_cxx);
   1582     else
   1583       Diag(Tok, diag::err_at_in_class);
   1584 
   1585     ConsumeToken();
   1586     SkipUntil(tok::r_brace);
   1587     return;
   1588   }
   1589 
   1590   // Access declarations.
   1591   if (!TemplateInfo.Kind &&
   1592       (Tok.is(tok::identifier) || Tok.is(tok::coloncolon)) &&
   1593       !TryAnnotateCXXScopeToken() &&
   1594       Tok.is(tok::annot_cxxscope)) {
   1595     bool isAccessDecl = false;
   1596     if (NextToken().is(tok::identifier))
   1597       isAccessDecl = GetLookAheadToken(2).is(tok::semi);
   1598     else
   1599       isAccessDecl = NextToken().is(tok::kw_operator);
   1600 
   1601     if (isAccessDecl) {
   1602       // Collect the scope specifier token we annotated earlier.
   1603       CXXScopeSpec SS;
   1604       ParseOptionalCXXScopeSpecifier(SS, ParsedType(), false);
   1605 
   1606       // Try to parse an unqualified-id.
   1607       UnqualifiedId Name;
   1608       if (ParseUnqualifiedId(SS, false, true, true, ParsedType(), Name)) {
   1609         SkipUntil(tok::semi);
   1610         return;
   1611       }
   1612 
   1613       // TODO: recover from mistakenly-qualified operator declarations.
   1614       if (ExpectAndConsume(tok::semi,
   1615                            diag::err_expected_semi_after,
   1616                            "access declaration",
   1617                            tok::semi))
   1618         return;
   1619 
   1620       Actions.ActOnUsingDeclaration(getCurScope(), AS,
   1621                                     false, SourceLocation(),
   1622                                     SS, Name,
   1623                                     /* AttrList */ 0,
   1624                                     /* IsTypeName */ false,
   1625                                     SourceLocation());
   1626       return;
   1627     }
   1628   }
   1629 
   1630   // static_assert-declaration
   1631   if (Tok.is(tok::kw_static_assert) || Tok.is(tok::kw__Static_assert)) {
   1632     // FIXME: Check for templates
   1633     SourceLocation DeclEnd;
   1634     ParseStaticAssertDeclaration(DeclEnd);
   1635     return;
   1636   }
   1637 
   1638   if (Tok.is(tok::kw_template)) {
   1639     assert(!TemplateInfo.TemplateParams &&
   1640            "Nested template improperly parsed?");
   1641     SourceLocation DeclEnd;
   1642     ParseDeclarationStartingWithTemplate(Declarator::MemberContext, DeclEnd,
   1643                                          AS);
   1644     return;
   1645   }
   1646 
   1647   // Handle:  member-declaration ::= '__extension__' member-declaration
   1648   if (Tok.is(tok::kw___extension__)) {
   1649     // __extension__ silences extension warnings in the subexpression.
   1650     ExtensionRAIIObject O(Diags);  // Use RAII to do this.
   1651     ConsumeToken();
   1652     return ParseCXXClassMemberDeclaration(AS, TemplateInfo, TemplateDiags);
   1653   }
   1654 
   1655   // Don't parse FOO:BAR as if it were a typo for FOO::BAR, in this context it
   1656   // is a bitfield.
   1657   ColonProtectionRAIIObject X(*this);
   1658 
   1659   ParsedAttributesWithRange attrs(AttrFactory);
   1660   // Optional C++0x attribute-specifier
   1661   MaybeParseCXX0XAttributes(attrs);
   1662   MaybeParseMicrosoftAttributes(attrs);
   1663 
   1664   if (Tok.is(tok::kw_using)) {
   1665     ProhibitAttributes(attrs);
   1666 
   1667     // Eat 'using'.
   1668     SourceLocation UsingLoc = ConsumeToken();
   1669 
   1670     if (Tok.is(tok::kw_namespace)) {
   1671       Diag(UsingLoc, diag::err_using_namespace_in_class);
   1672       SkipUntil(tok::semi, true, true);
   1673     } else {
   1674       SourceLocation DeclEnd;
   1675       // Otherwise, it must be a using-declaration or an alias-declaration.
   1676       ParseUsingDeclaration(Declarator::MemberContext, TemplateInfo,
   1677                             UsingLoc, DeclEnd, AS);
   1678     }
   1679     return;
   1680   }
   1681 
   1682   // decl-specifier-seq:
   1683   // Parse the common declaration-specifiers piece.
   1684   ParsingDeclSpec DS(*this, TemplateDiags);
   1685   DS.takeAttributesFrom(attrs);
   1686   ParseDeclarationSpecifiers(DS, TemplateInfo, AS, DSC_class);
   1687 
   1688   MultiTemplateParamsArg TemplateParams(Actions,
   1689       TemplateInfo.TemplateParams? TemplateInfo.TemplateParams->data() : 0,
   1690       TemplateInfo.TemplateParams? TemplateInfo.TemplateParams->size() : 0);
   1691 
   1692   if (Tok.is(tok::semi)) {
   1693     ConsumeToken();
   1694     Decl *TheDecl =
   1695       Actions.ParsedFreeStandingDeclSpec(getCurScope(), AS, DS, TemplateParams);
   1696     DS.complete(TheDecl);
   1697     return;
   1698   }
   1699 
   1700   ParsingDeclarator DeclaratorInfo(*this, DS, Declarator::MemberContext);
   1701   VirtSpecifiers VS;
   1702   ExprResult Init;
   1703 
   1704   if (Tok.isNot(tok::colon)) {
   1705     // Don't parse FOO:BAR as if it were a typo for FOO::BAR.
   1706     ColonProtectionRAIIObject X(*this);
   1707 
   1708     // Parse the first declarator.
   1709     ParseDeclarator(DeclaratorInfo);
   1710     // Error parsing the declarator?
   1711     if (!DeclaratorInfo.hasName()) {
   1712       // If so, skip until the semi-colon or a }.
   1713       SkipUntil(tok::r_brace, true, true);
   1714       if (Tok.is(tok::semi))
   1715         ConsumeToken();
   1716       return;
   1717     }
   1718 
   1719     ParseOptionalCXX0XVirtSpecifierSeq(VS);
   1720 
   1721     // If attributes exist after the declarator, but before an '{', parse them.
   1722     MaybeParseGNUAttributes(DeclaratorInfo);
   1723 
   1724     // MSVC permits pure specifier on inline functions declared at class scope.
   1725     // Hence check for =0 before checking for function definition.
   1726     if (getLang().Microsoft && Tok.is(tok::equal) &&
   1727         DeclaratorInfo.isFunctionDeclarator() &&
   1728         NextToken().is(tok::numeric_constant)) {
   1729       ConsumeToken();
   1730       Init = ParseInitializer();
   1731       if (Init.isInvalid())
   1732         SkipUntil(tok::comma, true, true);
   1733     }
   1734 
   1735     bool IsDefinition = false;
   1736     // function-definition:
   1737     //
   1738     // In C++11, a non-function declarator followed by an open brace is a
   1739     // braced-init-list for an in-class member initialization, not an
   1740     // erroneous function definition.
   1741     if (Tok.is(tok::l_brace) && !getLang().CPlusPlus0x) {
   1742       IsDefinition = true;
   1743     } else if (DeclaratorInfo.isFunctionDeclarator()) {
   1744       if (Tok.is(tok::l_brace) || Tok.is(tok::colon) || Tok.is(tok::kw_try)) {
   1745         IsDefinition = true;
   1746       } else if (Tok.is(tok::equal)) {
   1747         const Token &KW = NextToken();
   1748         if (KW.is(tok::kw_default) || KW.is(tok::kw_delete))
   1749           IsDefinition = true;
   1750       }
   1751     }
   1752 
   1753     if (IsDefinition) {
   1754       if (!DeclaratorInfo.isFunctionDeclarator()) {
   1755         Diag(Tok, diag::err_func_def_no_params);
   1756         ConsumeBrace();
   1757         SkipUntil(tok::r_brace, true);
   1758 
   1759         // Consume the optional ';'
   1760         if (Tok.is(tok::semi))
   1761           ConsumeToken();
   1762         return;
   1763       }
   1764 
   1765       if (DS.getStorageClassSpec() == DeclSpec::SCS_typedef) {
   1766         Diag(Tok, diag::err_function_declared_typedef);
   1767         // This recovery skips the entire function body. It would be nice
   1768         // to simply call ParseCXXInlineMethodDef() below, however Sema
   1769         // assumes the declarator represents a function, not a typedef.
   1770         ConsumeBrace();
   1771         SkipUntil(tok::r_brace, true);
   1772 
   1773         // Consume the optional ';'
   1774         if (Tok.is(tok::semi))
   1775           ConsumeToken();
   1776         return;
   1777       }
   1778 
   1779       ParseCXXInlineMethodDef(AS, DeclaratorInfo, TemplateInfo, VS, Init);
   1780 
   1781       // Consume the ';' - it's optional unless we have a delete or default
   1782       if (Tok.is(tok::semi)) {
   1783         ConsumeToken();
   1784       }
   1785 
   1786       return;
   1787     }
   1788   }
   1789 
   1790   // member-declarator-list:
   1791   //   member-declarator
   1792   //   member-declarator-list ',' member-declarator
   1793 
   1794   llvm::SmallVector<Decl *, 8> DeclsInGroup;
   1795   ExprResult BitfieldSize;
   1796 
   1797   while (1) {
   1798     // member-declarator:
   1799     //   declarator pure-specifier[opt]
   1800     //   declarator brace-or-equal-initializer[opt]
   1801     //   identifier[opt] ':' constant-expression
   1802     if (Tok.is(tok::colon)) {
   1803       ConsumeToken();
   1804       BitfieldSize = ParseConstantExpression();
   1805       if (BitfieldSize.isInvalid())
   1806         SkipUntil(tok::comma, true, true);
   1807     }
   1808 
   1809     // If a simple-asm-expr is present, parse it.
   1810     if (Tok.is(tok::kw_asm)) {
   1811       SourceLocation Loc;
   1812       ExprResult AsmLabel(ParseSimpleAsm(&Loc));
   1813       if (AsmLabel.isInvalid())
   1814         SkipUntil(tok::comma, true, true);
   1815 
   1816       DeclaratorInfo.setAsmLabel(AsmLabel.release());
   1817       DeclaratorInfo.SetRangeEnd(Loc);
   1818     }
   1819 
   1820     // If attributes exist after the declarator, parse them.
   1821     MaybeParseGNUAttributes(DeclaratorInfo);
   1822 
   1823     // FIXME: When g++ adds support for this, we'll need to check whether it
   1824     // goes before or after the GNU attributes and __asm__.
   1825     ParseOptionalCXX0XVirtSpecifierSeq(VS);
   1826 
   1827     bool HasDeferredInitializer = false;
   1828     if (Tok.is(tok::equal) || Tok.is(tok::l_brace)) {
   1829       if (BitfieldSize.get()) {
   1830         Diag(Tok, diag::err_bitfield_member_init);
   1831         SkipUntil(tok::comma, true, true);
   1832       } else {
   1833         HasDeferredInitializer = !DeclaratorInfo.isDeclarationOfFunction() &&
   1834           DeclaratorInfo.getDeclSpec().getStorageClassSpec()
   1835             != DeclSpec::SCS_static &&
   1836           DeclaratorInfo.getDeclSpec().getStorageClassSpec()
   1837             != DeclSpec::SCS_typedef;
   1838 
   1839         if (!HasDeferredInitializer) {
   1840           SourceLocation EqualLoc;
   1841           Init = ParseCXXMemberInitializer(
   1842             DeclaratorInfo.isDeclarationOfFunction(), EqualLoc);
   1843           if (Init.isInvalid())
   1844             SkipUntil(tok::comma, true, true);
   1845         }
   1846       }
   1847     }
   1848 
   1849     // NOTE: If Sema is the Action module and declarator is an instance field,
   1850     // this call will *not* return the created decl; It will return null.
   1851     // See Sema::ActOnCXXMemberDeclarator for details.
   1852 
   1853     Decl *ThisDecl = 0;
   1854     if (DS.isFriendSpecified()) {
   1855       // TODO: handle initializers, bitfields, 'delete'
   1856       ThisDecl = Actions.ActOnFriendFunctionDecl(getCurScope(), DeclaratorInfo,
   1857                                                  /*IsDefinition*/ false,
   1858                                                  move(TemplateParams));
   1859     } else {
   1860       ThisDecl = Actions.ActOnCXXMemberDeclarator(getCurScope(), AS,
   1861                                                   DeclaratorInfo,
   1862                                                   move(TemplateParams),
   1863                                                   BitfieldSize.release(),
   1864                                                   VS, Init.release(),
   1865                                                   HasDeferredInitializer,
   1866                                                   /*IsDefinition*/ false);
   1867     }
   1868     if (ThisDecl)
   1869       DeclsInGroup.push_back(ThisDecl);
   1870 
   1871     if (DeclaratorInfo.isFunctionDeclarator() &&
   1872         DeclaratorInfo.getDeclSpec().getStorageClassSpec()
   1873           != DeclSpec::SCS_typedef) {
   1874       HandleMemberFunctionDefaultArgs(DeclaratorInfo, ThisDecl);
   1875     }
   1876 
   1877     DeclaratorInfo.complete(ThisDecl);
   1878 
   1879     if (HasDeferredInitializer) {
   1880       if (!getLang().CPlusPlus0x)
   1881         Diag(Tok, diag::warn_nonstatic_member_init_accepted_as_extension);
   1882 
   1883       if (DeclaratorInfo.isArrayOfUnknownBound()) {
   1884         // C++0x [dcl.array]p3: An array bound may also be omitted when the
   1885         // declarator is followed by an initializer.
   1886         //
   1887         // A brace-or-equal-initializer for a member-declarator is not an
   1888         // initializer in the gramamr, so this is ill-formed.
   1889         Diag(Tok, diag::err_incomplete_array_member_init);
   1890         SkipUntil(tok::comma, true, true);
   1891         // Avoid later warnings about a class member of incomplete type.
   1892         ThisDecl->setInvalidDecl();
   1893       } else
   1894         ParseCXXNonStaticMemberInitializer(ThisDecl);
   1895     }
   1896 
   1897     // If we don't have a comma, it is either the end of the list (a ';')
   1898     // or an error, bail out.
   1899     if (Tok.isNot(tok::comma))
   1900       break;
   1901 
   1902     // Consume the comma.
   1903     ConsumeToken();
   1904 
   1905     // Parse the next declarator.
   1906     DeclaratorInfo.clear();
   1907     VS.clear();
   1908     BitfieldSize = 0;
   1909     Init = 0;
   1910 
   1911     // Attributes are only allowed on the second declarator.
   1912     MaybeParseGNUAttributes(DeclaratorInfo);
   1913 
   1914     if (Tok.isNot(tok::colon))
   1915       ParseDeclarator(DeclaratorInfo);
   1916   }
   1917 
   1918   if (ExpectAndConsume(tok::semi, diag::err_expected_semi_decl_list)) {
   1919     // Skip to end of block or statement.
   1920     SkipUntil(tok::r_brace, true, true);
   1921     // If we stopped at a ';', eat it.
   1922     if (Tok.is(tok::semi)) ConsumeToken();
   1923     return;
   1924   }
   1925 
   1926   Actions.FinalizeDeclaratorGroup(getCurScope(), DS, DeclsInGroup.data(),
   1927                                   DeclsInGroup.size());
   1928 }
   1929 
   1930 /// ParseCXXMemberInitializer - Parse the brace-or-equal-initializer or
   1931 /// pure-specifier. Also detect and reject any attempted defaulted/deleted
   1932 /// function definition. The location of the '=', if any, will be placed in
   1933 /// EqualLoc.
   1934 ///
   1935 ///   pure-specifier:
   1936 ///     '= 0'
   1937 ///
   1938 ///   brace-or-equal-initializer:
   1939 ///     '=' initializer-expression
   1940 ///     braced-init-list                       [TODO]
   1941 ///
   1942 ///   initializer-clause:
   1943 ///     assignment-expression
   1944 ///     braced-init-list                       [TODO]
   1945 ///
   1946 ///   defaulted/deleted function-definition:
   1947 ///     '=' 'default'
   1948 ///     '=' 'delete'
   1949 ///
   1950 /// Prior to C++0x, the assignment-expression in an initializer-clause must
   1951 /// be a constant-expression.
   1952 ExprResult Parser::ParseCXXMemberInitializer(bool IsFunction,
   1953                                              SourceLocation &EqualLoc) {
   1954   assert((Tok.is(tok::equal) || Tok.is(tok::l_brace))
   1955          && "Data member initializer not starting with '=' or '{'");
   1956 
   1957   if (Tok.is(tok::equal)) {
   1958     EqualLoc = ConsumeToken();
   1959     if (Tok.is(tok::kw_delete)) {
   1960       // In principle, an initializer of '= delete p;' is legal, but it will
   1961       // never type-check. It's better to diagnose it as an ill-formed expression
   1962       // than as an ill-formed deleted non-function member.
   1963       // An initializer of '= delete p, foo' will never be parsed, because
   1964       // a top-level comma always ends the initializer expression.
   1965       const Token &Next = NextToken();
   1966       if (IsFunction || Next.is(tok::semi) || Next.is(tok::comma) ||
   1967            Next.is(tok::eof)) {
   1968         if (IsFunction)
   1969           Diag(ConsumeToken(), diag::err_default_delete_in_multiple_declaration)
   1970             << 1 /* delete */;
   1971         else
   1972           Diag(ConsumeToken(), diag::err_deleted_non_function);
   1973         return ExprResult();
   1974       }
   1975     } else if (Tok.is(tok::kw_default)) {
   1976       Diag(ConsumeToken(), diag::err_default_special_members);
   1977       if (IsFunction)
   1978         Diag(Tok, diag::err_default_delete_in_multiple_declaration)
   1979           << 0 /* default */;
   1980       else
   1981         Diag(ConsumeToken(), diag::err_default_special_members);
   1982       return ExprResult();
   1983     }
   1984 
   1985     return ParseInitializer();
   1986   } else
   1987     return ExprError(Diag(Tok, diag::err_generalized_initializer_lists));
   1988 }
   1989 
   1990 /// ParseCXXMemberSpecification - Parse the class definition.
   1991 ///
   1992 ///       member-specification:
   1993 ///         member-declaration member-specification[opt]
   1994 ///         access-specifier ':' member-specification[opt]
   1995 ///
   1996 void Parser::ParseCXXMemberSpecification(SourceLocation RecordLoc,
   1997                                          unsigned TagType, Decl *TagDecl) {
   1998   assert((TagType == DeclSpec::TST_struct ||
   1999          TagType == DeclSpec::TST_union  ||
   2000          TagType == DeclSpec::TST_class) && "Invalid TagType!");
   2001 
   2002   PrettyDeclStackTraceEntry CrashInfo(Actions, TagDecl, RecordLoc,
   2003                                       "parsing struct/union/class body");
   2004 
   2005   // Determine whether this is a non-nested class. Note that local
   2006   // classes are *not* considered to be nested classes.
   2007   bool NonNestedClass = true;
   2008   if (!ClassStack.empty()) {
   2009     for (const Scope *S = getCurScope(); S; S = S->getParent()) {
   2010       if (S->isClassScope()) {
   2011         // We're inside a class scope, so this is a nested class.
   2012         NonNestedClass = false;
   2013         break;
   2014       }
   2015 
   2016       if ((S->getFlags() & Scope::FnScope)) {
   2017         // If we're in a function or function template declared in the
   2018         // body of a class, then this is a local class rather than a
   2019         // nested class.
   2020         const Scope *Parent = S->getParent();
   2021         if (Parent->isTemplateParamScope())
   2022           Parent = Parent->getParent();
   2023         if (Parent->isClassScope())
   2024           break;
   2025       }
   2026     }
   2027   }
   2028 
   2029   // Enter a scope for the class.
   2030   ParseScope ClassScope(this, Scope::ClassScope|Scope::DeclScope);
   2031 
   2032   // Note that we are parsing a new (potentially-nested) class definition.
   2033   ParsingClassDefinition ParsingDef(*this, TagDecl, NonNestedClass);
   2034 
   2035   if (TagDecl)
   2036     Actions.ActOnTagStartDefinition(getCurScope(), TagDecl);
   2037 
   2038   SourceLocation FinalLoc;
   2039 
   2040   // Parse the optional 'final' keyword.
   2041   if (getLang().CPlusPlus && Tok.is(tok::identifier)) {
   2042     IdentifierInfo *II = Tok.getIdentifierInfo();
   2043 
   2044     // Initialize the contextual keywords.
   2045     if (!Ident_final) {
   2046       Ident_final = &PP.getIdentifierTable().get("final");
   2047       Ident_override = &PP.getIdentifierTable().get("override");
   2048     }
   2049 
   2050     if (II == Ident_final)
   2051       FinalLoc = ConsumeToken();
   2052 
   2053     if (!getLang().CPlusPlus0x)
   2054       Diag(FinalLoc, diag::ext_override_control_keyword) << "final";
   2055   }
   2056 
   2057   if (Tok.is(tok::colon)) {
   2058     ParseBaseClause(TagDecl);
   2059 
   2060     if (!Tok.is(tok::l_brace)) {
   2061       Diag(Tok, diag::err_expected_lbrace_after_base_specifiers);
   2062 
   2063       if (TagDecl)
   2064         Actions.ActOnTagDefinitionError(getCurScope(), TagDecl);
   2065       return;
   2066     }
   2067   }
   2068 
   2069   assert(Tok.is(tok::l_brace));
   2070 
   2071   SourceLocation LBraceLoc = ConsumeBrace();
   2072 
   2073   if (TagDecl)
   2074     Actions.ActOnStartCXXMemberDeclarations(getCurScope(), TagDecl, FinalLoc,
   2075                                             LBraceLoc);
   2076 
   2077   // C++ 11p3: Members of a class defined with the keyword class are private
   2078   // by default. Members of a class defined with the keywords struct or union
   2079   // are public by default.
   2080   AccessSpecifier CurAS;
   2081   if (TagType == DeclSpec::TST_class)
   2082     CurAS = AS_private;
   2083   else
   2084     CurAS = AS_public;
   2085 
   2086   SourceLocation RBraceLoc;
   2087   if (TagDecl) {
   2088     // While we still have something to read, read the member-declarations.
   2089     while (Tok.isNot(tok::r_brace) && Tok.isNot(tok::eof)) {
   2090       // Each iteration of this loop reads one member-declaration.
   2091 
   2092       if (getLang().Microsoft && (Tok.is(tok::kw___if_exists) ||
   2093           Tok.is(tok::kw___if_not_exists))) {
   2094         ParseMicrosoftIfExistsClassDeclaration((DeclSpec::TST)TagType, CurAS);
   2095         continue;
   2096       }
   2097 
   2098       // Check for extraneous top-level semicolon.
   2099       if (Tok.is(tok::semi)) {
   2100         Diag(Tok, diag::ext_extra_struct_semi)
   2101           << DeclSpec::getSpecifierName((DeclSpec::TST)TagType)
   2102           << FixItHint::CreateRemoval(Tok.getLocation());
   2103         ConsumeToken();
   2104         continue;
   2105       }
   2106 
   2107       AccessSpecifier AS = getAccessSpecifierIfPresent();
   2108       if (AS != AS_none) {
   2109         // Current token is a C++ access specifier.
   2110         CurAS = AS;
   2111         SourceLocation ASLoc = Tok.getLocation();
   2112         ConsumeToken();
   2113         if (Tok.is(tok::colon))
   2114           Actions.ActOnAccessSpecifier(AS, ASLoc, Tok.getLocation());
   2115         else
   2116           Diag(Tok, diag::err_expected_colon);
   2117         ConsumeToken();
   2118         continue;
   2119       }
   2120 
   2121       // FIXME: Make sure we don't have a template here.
   2122 
   2123       // Parse all the comma separated declarators.
   2124       ParseCXXClassMemberDeclaration(CurAS);
   2125     }
   2126 
   2127     RBraceLoc = MatchRHSPunctuation(tok::r_brace, LBraceLoc);
   2128   } else {
   2129     SkipUntil(tok::r_brace, false, false);
   2130   }
   2131 
   2132   // If attributes exist after class contents, parse them.
   2133   ParsedAttributes attrs(AttrFactory);
   2134   MaybeParseGNUAttributes(attrs);
   2135 
   2136   if (TagDecl)
   2137     Actions.ActOnFinishCXXMemberSpecification(getCurScope(), RecordLoc, TagDecl,
   2138                                               LBraceLoc, RBraceLoc,
   2139                                               attrs.getList());
   2140 
   2141   // C++0x [class.mem]p2: Within the class member-specification, the class is
   2142   // regarded as complete within function bodies, default arguments, exception-
   2143   // specifications, and brace-or-equal-initializers for non-static data
   2144   // members (including such things in nested classes).
   2145   //
   2146   // FIXME: Only function bodies and brace-or-equal-initializers are currently
   2147   // handled. Fix the others!
   2148   if (TagDecl && NonNestedClass) {
   2149     // We are not inside a nested class. This class and its nested classes
   2150     // are complete and we can parse the delayed portions of method
   2151     // declarations and the lexed inline method definitions.
   2152     SourceLocation SavedPrevTokLocation = PrevTokLocation;
   2153     ParseLexedMethodDeclarations(getCurrentClass());
   2154     ParseLexedMemberInitializers(getCurrentClass());
   2155     ParseLexedMethodDefs(getCurrentClass());
   2156     PrevTokLocation = SavedPrevTokLocation;
   2157   }
   2158 
   2159   if (TagDecl)
   2160     Actions.ActOnTagFinishDefinition(getCurScope(), TagDecl, RBraceLoc);
   2161 
   2162   // Leave the class scope.
   2163   ParsingDef.Pop();
   2164   ClassScope.Exit();
   2165 }
   2166 
   2167 /// ParseConstructorInitializer - Parse a C++ constructor initializer,
   2168 /// which explicitly initializes the members or base classes of a
   2169 /// class (C++ [class.base.init]). For example, the three initializers
   2170 /// after the ':' in the Derived constructor below:
   2171 ///
   2172 /// @code
   2173 /// class Base { };
   2174 /// class Derived : Base {
   2175 ///   int x;
   2176 ///   float f;
   2177 /// public:
   2178 ///   Derived(float f) : Base(), x(17), f(f) { }
   2179 /// };
   2180 /// @endcode
   2181 ///
   2182 /// [C++]  ctor-initializer:
   2183 ///          ':' mem-initializer-list
   2184 ///
   2185 /// [C++]  mem-initializer-list:
   2186 ///          mem-initializer ...[opt]
   2187 ///          mem-initializer ...[opt] , mem-initializer-list
   2188 void Parser::ParseConstructorInitializer(Decl *ConstructorDecl) {
   2189   assert(Tok.is(tok::colon) && "Constructor initializer always starts with ':'");
   2190 
   2191   // Poison the SEH identifiers so they are flagged as illegal in constructor initializers
   2192   PoisonSEHIdentifiersRAIIObject PoisonSEHIdentifiers(*this, true);
   2193   SourceLocation ColonLoc = ConsumeToken();
   2194 
   2195   llvm::SmallVector<CXXCtorInitializer*, 4> MemInitializers;
   2196   bool AnyErrors = false;
   2197 
   2198   do {
   2199     if (Tok.is(tok::code_completion)) {
   2200       Actions.CodeCompleteConstructorInitializer(ConstructorDecl,
   2201                                                  MemInitializers.data(),
   2202                                                  MemInitializers.size());
   2203       ConsumeCodeCompletionToken();
   2204     } else {
   2205       MemInitResult MemInit = ParseMemInitializer(ConstructorDecl);
   2206       if (!MemInit.isInvalid())
   2207         MemInitializers.push_back(MemInit.get());
   2208       else
   2209         AnyErrors = true;
   2210     }
   2211 
   2212     if (Tok.is(tok::comma))
   2213       ConsumeToken();
   2214     else if (Tok.is(tok::l_brace))
   2215       break;
   2216     // If the next token looks like a base or member initializer, assume that
   2217     // we're just missing a comma.
   2218     else if (Tok.is(tok::identifier) || Tok.is(tok::coloncolon)) {
   2219       SourceLocation Loc = PP.getLocForEndOfToken(PrevTokLocation);
   2220       Diag(Loc, diag::err_ctor_init_missing_comma)
   2221         << FixItHint::CreateInsertion(Loc, ", ");
   2222     } else {
   2223       // Skip over garbage, until we get to '{'.  Don't eat the '{'.
   2224       Diag(Tok.getLocation(), diag::err_expected_lbrace_or_comma);
   2225       SkipUntil(tok::l_brace, true, true);
   2226       break;
   2227     }
   2228   } while (true);
   2229 
   2230   Actions.ActOnMemInitializers(ConstructorDecl, ColonLoc,
   2231                                MemInitializers.data(), MemInitializers.size(),
   2232                                AnyErrors);
   2233 }
   2234 
   2235 /// ParseMemInitializer - Parse a C++ member initializer, which is
   2236 /// part of a constructor initializer that explicitly initializes one
   2237 /// member or base class (C++ [class.base.init]). See
   2238 /// ParseConstructorInitializer for an example.
   2239 ///
   2240 /// [C++] mem-initializer:
   2241 ///         mem-initializer-id '(' expression-list[opt] ')'
   2242 /// [C++0x] mem-initializer-id braced-init-list
   2243 ///
   2244 /// [C++] mem-initializer-id:
   2245 ///         '::'[opt] nested-name-specifier[opt] class-name
   2246 ///         identifier
   2247 Parser::MemInitResult Parser::ParseMemInitializer(Decl *ConstructorDecl) {
   2248   // parse '::'[opt] nested-name-specifier[opt]
   2249   CXXScopeSpec SS;
   2250   ParseOptionalCXXScopeSpecifier(SS, ParsedType(), false);
   2251   ParsedType TemplateTypeTy;
   2252   if (Tok.is(tok::annot_template_id)) {
   2253     TemplateIdAnnotation *TemplateId = takeTemplateIdAnnotation(Tok);
   2254     if (TemplateId->Kind == TNK_Type_template ||
   2255         TemplateId->Kind == TNK_Dependent_template_name) {
   2256       AnnotateTemplateIdTokenAsType();
   2257       assert(Tok.is(tok::annot_typename) && "template-id -> type failed");
   2258       TemplateTypeTy = getTypeAnnotation(Tok);
   2259     }
   2260   }
   2261   if (!TemplateTypeTy && Tok.isNot(tok::identifier)) {
   2262     Diag(Tok, diag::err_expected_member_or_base_name);
   2263     return true;
   2264   }
   2265 
   2266   // Get the identifier. This may be a member name or a class name,
   2267   // but we'll let the semantic analysis determine which it is.
   2268   IdentifierInfo *II = Tok.is(tok::identifier) ? Tok.getIdentifierInfo() : 0;
   2269   SourceLocation IdLoc = ConsumeToken();
   2270 
   2271   // Parse the '('.
   2272   if (getLang().CPlusPlus0x && Tok.is(tok::l_brace)) {
   2273     // FIXME: Do something with the braced-init-list.
   2274     ParseBraceInitializer();
   2275     return true;
   2276   } else if(Tok.is(tok::l_paren)) {
   2277     SourceLocation LParenLoc = ConsumeParen();
   2278 
   2279     // Parse the optional expression-list.
   2280     ExprVector ArgExprs(Actions);
   2281     CommaLocsTy CommaLocs;
   2282     if (Tok.isNot(tok::r_paren) && ParseExpressionList(ArgExprs, CommaLocs)) {
   2283       SkipUntil(tok::r_paren);
   2284       return true;
   2285     }
   2286 
   2287     SourceLocation RParenLoc = MatchRHSPunctuation(tok::r_paren, LParenLoc);
   2288 
   2289     SourceLocation EllipsisLoc;
   2290     if (Tok.is(tok::ellipsis))
   2291       EllipsisLoc = ConsumeToken();
   2292 
   2293     return Actions.ActOnMemInitializer(ConstructorDecl, getCurScope(), SS, II,
   2294                                        TemplateTypeTy, IdLoc,
   2295                                        LParenLoc, ArgExprs.take(),
   2296                                        ArgExprs.size(), RParenLoc,
   2297                                        EllipsisLoc);
   2298   }
   2299 
   2300   Diag(Tok, getLang().CPlusPlus0x ? diag::err_expected_lparen_or_lbrace
   2301                                   : diag::err_expected_lparen);
   2302   return true;
   2303 }
   2304 
   2305 /// \brief Parse a C++ exception-specification if present (C++0x [except.spec]).
   2306 ///
   2307 ///       exception-specification:
   2308 ///         dynamic-exception-specification
   2309 ///         noexcept-specification
   2310 ///
   2311 ///       noexcept-specification:
   2312 ///         'noexcept'
   2313 ///         'noexcept' '(' constant-expression ')'
   2314 ExceptionSpecificationType
   2315 Parser::MaybeParseExceptionSpecification(SourceRange &SpecificationRange,
   2316                     llvm::SmallVectorImpl<ParsedType> &DynamicExceptions,
   2317                     llvm::SmallVectorImpl<SourceRange> &DynamicExceptionRanges,
   2318                     ExprResult &NoexceptExpr) {
   2319   ExceptionSpecificationType Result = EST_None;
   2320 
   2321   // See if there's a dynamic specification.
   2322   if (Tok.is(tok::kw_throw)) {
   2323     Result = ParseDynamicExceptionSpecification(SpecificationRange,
   2324                                                 DynamicExceptions,
   2325                                                 DynamicExceptionRanges);
   2326     assert(DynamicExceptions.size() == DynamicExceptionRanges.size() &&
   2327            "Produced different number of exception types and ranges.");
   2328   }
   2329 
   2330   // If there's no noexcept specification, we're done.
   2331   if (Tok.isNot(tok::kw_noexcept))
   2332     return Result;
   2333 
   2334   // If we already had a dynamic specification, parse the noexcept for,
   2335   // recovery, but emit a diagnostic and don't store the results.
   2336   SourceRange NoexceptRange;
   2337   ExceptionSpecificationType NoexceptType = EST_None;
   2338 
   2339   SourceLocation KeywordLoc = ConsumeToken();
   2340   if (Tok.is(tok::l_paren)) {
   2341     // There is an argument.
   2342     SourceLocation LParenLoc = ConsumeParen();
   2343     NoexceptType = EST_ComputedNoexcept;
   2344     NoexceptExpr = ParseConstantExpression();
   2345     // The argument must be contextually convertible to bool. We use
   2346     // ActOnBooleanCondition for this purpose.
   2347     if (!NoexceptExpr.isInvalid())
   2348       NoexceptExpr = Actions.ActOnBooleanCondition(getCurScope(), KeywordLoc,
   2349                                                    NoexceptExpr.get());
   2350     SourceLocation RParenLoc = MatchRHSPunctuation(tok::r_paren, LParenLoc);
   2351     NoexceptRange = SourceRange(KeywordLoc, RParenLoc);
   2352   } else {
   2353     // There is no argument.
   2354     NoexceptType = EST_BasicNoexcept;
   2355     NoexceptRange = SourceRange(KeywordLoc, KeywordLoc);
   2356   }
   2357 
   2358   if (Result == EST_None) {
   2359     SpecificationRange = NoexceptRange;
   2360     Result = NoexceptType;
   2361 
   2362     // If there's a dynamic specification after a noexcept specification,
   2363     // parse that and ignore the results.
   2364     if (Tok.is(tok::kw_throw)) {
   2365       Diag(Tok.getLocation(), diag::err_dynamic_and_noexcept_specification);
   2366       ParseDynamicExceptionSpecification(NoexceptRange, DynamicExceptions,
   2367                                          DynamicExceptionRanges);
   2368     }
   2369   } else {
   2370     Diag(Tok.getLocation(), diag::err_dynamic_and_noexcept_specification);
   2371   }
   2372 
   2373   return Result;
   2374 }
   2375 
   2376 /// ParseDynamicExceptionSpecification - Parse a C++
   2377 /// dynamic-exception-specification (C++ [except.spec]).
   2378 ///
   2379 ///       dynamic-exception-specification:
   2380 ///         'throw' '(' type-id-list [opt] ')'
   2381 /// [MS]    'throw' '(' '...' ')'
   2382 ///
   2383 ///       type-id-list:
   2384 ///         type-id ... [opt]
   2385 ///         type-id-list ',' type-id ... [opt]
   2386 ///
   2387 ExceptionSpecificationType Parser::ParseDynamicExceptionSpecification(
   2388                                   SourceRange &SpecificationRange,
   2389                                   llvm::SmallVectorImpl<ParsedType> &Exceptions,
   2390                                   llvm::SmallVectorImpl<SourceRange> &Ranges) {
   2391   assert(Tok.is(tok::kw_throw) && "expected throw");
   2392 
   2393   SpecificationRange.setBegin(ConsumeToken());
   2394 
   2395   if (!Tok.is(tok::l_paren)) {
   2396     Diag(Tok, diag::err_expected_lparen_after) << "throw";
   2397     SpecificationRange.setEnd(SpecificationRange.getBegin());
   2398     return EST_DynamicNone;
   2399   }
   2400   SourceLocation LParenLoc = ConsumeParen();
   2401 
   2402   // Parse throw(...), a Microsoft extension that means "this function
   2403   // can throw anything".
   2404   if (Tok.is(tok::ellipsis)) {
   2405     SourceLocation EllipsisLoc = ConsumeToken();
   2406     if (!getLang().Microsoft)
   2407       Diag(EllipsisLoc, diag::ext_ellipsis_exception_spec);
   2408     SourceLocation RParenLoc = MatchRHSPunctuation(tok::r_paren, LParenLoc);
   2409     SpecificationRange.setEnd(RParenLoc);
   2410     return EST_MSAny;
   2411   }
   2412 
   2413   // Parse the sequence of type-ids.
   2414   SourceRange Range;
   2415   while (Tok.isNot(tok::r_paren)) {
   2416     TypeResult Res(ParseTypeName(&Range));
   2417 
   2418     if (Tok.is(tok::ellipsis)) {
   2419       // C++0x [temp.variadic]p5:
   2420       //   - In a dynamic-exception-specification (15.4); the pattern is a
   2421       //     type-id.
   2422       SourceLocation Ellipsis = ConsumeToken();
   2423       Range.setEnd(Ellipsis);
   2424       if (!Res.isInvalid())
   2425         Res = Actions.ActOnPackExpansion(Res.get(), Ellipsis);
   2426     }
   2427 
   2428     if (!Res.isInvalid()) {
   2429       Exceptions.push_back(Res.get());
   2430       Ranges.push_back(Range);
   2431     }
   2432 
   2433     if (Tok.is(tok::comma))
   2434       ConsumeToken();
   2435     else
   2436       break;
   2437   }
   2438 
   2439   SpecificationRange.setEnd(MatchRHSPunctuation(tok::r_paren, LParenLoc));
   2440   return Exceptions.empty() ? EST_DynamicNone : EST_Dynamic;
   2441 }
   2442 
   2443 /// ParseTrailingReturnType - Parse a trailing return type on a new-style
   2444 /// function declaration.
   2445 TypeResult Parser::ParseTrailingReturnType() {
   2446   assert(Tok.is(tok::arrow) && "expected arrow");
   2447 
   2448   ConsumeToken();
   2449 
   2450   // FIXME: Need to suppress declarations when parsing this typename.
   2451   // Otherwise in this function definition:
   2452   //
   2453   //   auto f() -> struct X {}
   2454   //
   2455   // struct X is parsed as class definition because of the trailing
   2456   // brace.
   2457 
   2458   SourceRange Range;
   2459   return ParseTypeName(&Range);
   2460 }
   2461 
   2462 /// \brief We have just started parsing the definition of a new class,
   2463 /// so push that class onto our stack of classes that is currently
   2464 /// being parsed.
   2465 Sema::ParsingClassState
   2466 Parser::PushParsingClass(Decl *ClassDecl, bool NonNestedClass) {
   2467   assert((NonNestedClass || !ClassStack.empty()) &&
   2468          "Nested class without outer class");
   2469   ClassStack.push(new ParsingClass(ClassDecl, NonNestedClass));
   2470   return Actions.PushParsingClass();
   2471 }
   2472 
   2473 /// \brief Deallocate the given parsed class and all of its nested
   2474 /// classes.
   2475 void Parser::DeallocateParsedClasses(Parser::ParsingClass *Class) {
   2476   for (unsigned I = 0, N = Class->LateParsedDeclarations.size(); I != N; ++I)
   2477     delete Class->LateParsedDeclarations[I];
   2478   delete Class;
   2479 }
   2480 
   2481 /// \brief Pop the top class of the stack of classes that are
   2482 /// currently being parsed.
   2483 ///
   2484 /// This routine should be called when we have finished parsing the
   2485 /// definition of a class, but have not yet popped the Scope
   2486 /// associated with the class's definition.
   2487 ///
   2488 /// \returns true if the class we've popped is a top-level class,
   2489 /// false otherwise.
   2490 void Parser::PopParsingClass(Sema::ParsingClassState state) {
   2491   assert(!ClassStack.empty() && "Mismatched push/pop for class parsing");
   2492 
   2493   Actions.PopParsingClass(state);
   2494 
   2495   ParsingClass *Victim = ClassStack.top();
   2496   ClassStack.pop();
   2497   if (Victim->TopLevelClass) {
   2498     // Deallocate all of the nested classes of this class,
   2499     // recursively: we don't need to keep any of this information.
   2500     DeallocateParsedClasses(Victim);
   2501     return;
   2502   }
   2503   assert(!ClassStack.empty() && "Missing top-level class?");
   2504 
   2505   if (Victim->LateParsedDeclarations.empty()) {
   2506     // The victim is a nested class, but we will not need to perform
   2507     // any processing after the definition of this class since it has
   2508     // no members whose handling was delayed. Therefore, we can just
   2509     // remove this nested class.
   2510     DeallocateParsedClasses(Victim);
   2511     return;
   2512   }
   2513 
   2514   // This nested class has some members that will need to be processed
   2515   // after the top-level class is completely defined. Therefore, add
   2516   // it to the list of nested classes within its parent.
   2517   assert(getCurScope()->isClassScope() && "Nested class outside of class scope?");
   2518   ClassStack.top()->LateParsedDeclarations.push_back(new LateParsedClass(this, Victim));
   2519   Victim->TemplateScope = getCurScope()->getParent()->isTemplateParamScope();
   2520 }
   2521 
   2522 /// ParseCXX0XAttributes - Parse a C++0x attribute-specifier. Currently only
   2523 /// parses standard attributes.
   2524 ///
   2525 /// [C++0x] attribute-specifier:
   2526 ///         '[' '[' attribute-list ']' ']'
   2527 ///
   2528 /// [C++0x] attribute-list:
   2529 ///         attribute[opt]
   2530 ///         attribute-list ',' attribute[opt]
   2531 ///
   2532 /// [C++0x] attribute:
   2533 ///         attribute-token attribute-argument-clause[opt]
   2534 ///
   2535 /// [C++0x] attribute-token:
   2536 ///         identifier
   2537 ///         attribute-scoped-token
   2538 ///
   2539 /// [C++0x] attribute-scoped-token:
   2540 ///         attribute-namespace '::' identifier
   2541 ///
   2542 /// [C++0x] attribute-namespace:
   2543 ///         identifier
   2544 ///
   2545 /// [C++0x] attribute-argument-clause:
   2546 ///         '(' balanced-token-seq ')'
   2547 ///
   2548 /// [C++0x] balanced-token-seq:
   2549 ///         balanced-token
   2550 ///         balanced-token-seq balanced-token
   2551 ///
   2552 /// [C++0x] balanced-token:
   2553 ///         '(' balanced-token-seq ')'
   2554 ///         '[' balanced-token-seq ']'
   2555 ///         '{' balanced-token-seq '}'
   2556 ///         any token but '(', ')', '[', ']', '{', or '}'
   2557 void Parser::ParseCXX0XAttributes(ParsedAttributesWithRange &attrs,
   2558                                   SourceLocation *endLoc) {
   2559   assert(Tok.is(tok::l_square) && NextToken().is(tok::l_square)
   2560       && "Not a C++0x attribute list");
   2561 
   2562   SourceLocation StartLoc = Tok.getLocation(), Loc;
   2563 
   2564   ConsumeBracket();
   2565   ConsumeBracket();
   2566 
   2567   if (Tok.is(tok::comma)) {
   2568     Diag(Tok.getLocation(), diag::err_expected_ident);
   2569     ConsumeToken();
   2570   }
   2571 
   2572   while (Tok.is(tok::identifier) || Tok.is(tok::comma)) {
   2573     // attribute not present
   2574     if (Tok.is(tok::comma)) {
   2575       ConsumeToken();
   2576       continue;
   2577     }
   2578 
   2579     IdentifierInfo *ScopeName = 0, *AttrName = Tok.getIdentifierInfo();
   2580     SourceLocation ScopeLoc, AttrLoc = ConsumeToken();
   2581 
   2582     // scoped attribute
   2583     if (Tok.is(tok::coloncolon)) {
   2584       ConsumeToken();
   2585 
   2586       if (!Tok.is(tok::identifier)) {
   2587         Diag(Tok.getLocation(), diag::err_expected_ident);
   2588         SkipUntil(tok::r_square, tok::comma, true, true);
   2589         continue;
   2590       }
   2591 
   2592       ScopeName = AttrName;
   2593       ScopeLoc = AttrLoc;
   2594 
   2595       AttrName = Tok.getIdentifierInfo();
   2596       AttrLoc = ConsumeToken();
   2597     }
   2598 
   2599     bool AttrParsed = false;
   2600     // No scoped names are supported; ideally we could put all non-standard
   2601     // attributes into namespaces.
   2602     if (!ScopeName) {
   2603       switch(AttributeList::getKind(AttrName))
   2604       {
   2605       // No arguments
   2606       case AttributeList::AT_carries_dependency:
   2607       case AttributeList::AT_noreturn: {
   2608         if (Tok.is(tok::l_paren)) {
   2609           Diag(Tok.getLocation(), diag::err_cxx0x_attribute_forbids_arguments)
   2610             << AttrName->getName();
   2611           break;
   2612         }
   2613 
   2614         attrs.addNew(AttrName, AttrLoc, 0, AttrLoc, 0,
   2615                      SourceLocation(), 0, 0, false, true);
   2616         AttrParsed = true;
   2617         break;
   2618       }
   2619 
   2620       // One argument; must be a type-id or assignment-expression
   2621       case AttributeList::AT_aligned: {
   2622         if (Tok.isNot(tok::l_paren)) {
   2623           Diag(Tok.getLocation(), diag::err_cxx0x_attribute_requires_arguments)
   2624             << AttrName->getName();
   2625           break;
   2626         }
   2627         SourceLocation ParamLoc = ConsumeParen();
   2628 
   2629         ExprResult ArgExpr = ParseCXX0XAlignArgument(ParamLoc);
   2630 
   2631         MatchRHSPunctuation(tok::r_paren, ParamLoc);
   2632 
   2633         ExprVector ArgExprs(Actions);
   2634         ArgExprs.push_back(ArgExpr.release());
   2635         attrs.addNew(AttrName, AttrLoc, 0, AttrLoc,
   2636                      0, ParamLoc, ArgExprs.take(), 1,
   2637                      false, true);
   2638 
   2639         AttrParsed = true;
   2640         break;
   2641       }
   2642 
   2643       // Silence warnings
   2644       default: break;
   2645       }
   2646     }
   2647 
   2648     // Skip the entire parameter clause, if any
   2649     if (!AttrParsed && Tok.is(tok::l_paren)) {
   2650       ConsumeParen();
   2651       // SkipUntil maintains the balancedness of tokens.
   2652       SkipUntil(tok::r_paren, false);
   2653     }
   2654   }
   2655 
   2656   if (ExpectAndConsume(tok::r_square, diag::err_expected_rsquare))
   2657     SkipUntil(tok::r_square, false);
   2658   Loc = Tok.getLocation();
   2659   if (ExpectAndConsume(tok::r_square, diag::err_expected_rsquare))
   2660     SkipUntil(tok::r_square, false);
   2661 
   2662   attrs.Range = SourceRange(StartLoc, Loc);
   2663 }
   2664 
   2665 /// ParseCXX0XAlignArgument - Parse the argument to C++0x's [[align]]
   2666 /// attribute.
   2667 ///
   2668 /// FIXME: Simply returns an alignof() expression if the argument is a
   2669 /// type. Ideally, the type should be propagated directly into Sema.
   2670 ///
   2671 /// [C++0x] 'align' '(' type-id ')'
   2672 /// [C++0x] 'align' '(' assignment-expression ')'
   2673 ExprResult Parser::ParseCXX0XAlignArgument(SourceLocation Start) {
   2674   if (isTypeIdInParens()) {
   2675     EnterExpressionEvaluationContext Unevaluated(Actions, Sema::Unevaluated);
   2676     SourceLocation TypeLoc = Tok.getLocation();
   2677     ParsedType Ty = ParseTypeName().get();
   2678     SourceRange TypeRange(Start, Tok.getLocation());
   2679     return Actions.ActOnUnaryExprOrTypeTraitExpr(TypeLoc, UETT_AlignOf, true,
   2680                                                 Ty.getAsOpaquePtr(), TypeRange);
   2681   } else
   2682     return ParseConstantExpression();
   2683 }
   2684 
   2685 /// ParseMicrosoftAttributes - Parse a Microsoft attribute [Attr]
   2686 ///
   2687 /// [MS] ms-attribute:
   2688 ///             '[' token-seq ']'
   2689 ///
   2690 /// [MS] ms-attribute-seq:
   2691 ///             ms-attribute[opt]
   2692 ///             ms-attribute ms-attribute-seq
   2693 void Parser::ParseMicrosoftAttributes(ParsedAttributes &attrs,
   2694                                       SourceLocation *endLoc) {
   2695   assert(Tok.is(tok::l_square) && "Not a Microsoft attribute list");
   2696 
   2697   while (Tok.is(tok::l_square)) {
   2698     ConsumeBracket();
   2699     SkipUntil(tok::r_square, true, true);
   2700     if (endLoc) *endLoc = Tok.getLocation();
   2701     ExpectAndConsume(tok::r_square, diag::err_expected_rsquare);
   2702   }
   2703 }
   2704 
   2705 void Parser::ParseMicrosoftIfExistsClassDeclaration(DeclSpec::TST TagType,
   2706                                                     AccessSpecifier& CurAS) {
   2707   bool Result;
   2708   if (ParseMicrosoftIfExistsCondition(Result))
   2709     return;
   2710 
   2711   if (Tok.isNot(tok::l_brace)) {
   2712     Diag(Tok, diag::err_expected_lbrace);
   2713     return;
   2714   }
   2715   ConsumeBrace();
   2716 
   2717   // Condition is false skip all inside the {}.
   2718   if (!Result) {
   2719     SkipUntil(tok::r_brace, false);
   2720     return;
   2721   }
   2722 
   2723   // Condition is true, parse the declaration.
   2724   while (Tok.isNot(tok::r_brace)) {
   2725 
   2726     // __if_exists, __if_not_exists can nest.
   2727     if ((Tok.is(tok::kw___if_exists) || Tok.is(tok::kw___if_not_exists))) {
   2728       ParseMicrosoftIfExistsClassDeclaration((DeclSpec::TST)TagType, CurAS);
   2729       continue;
   2730     }
   2731 
   2732     // Check for extraneous top-level semicolon.
   2733     if (Tok.is(tok::semi)) {
   2734       Diag(Tok, diag::ext_extra_struct_semi)
   2735         << DeclSpec::getSpecifierName((DeclSpec::TST)TagType)
   2736         << FixItHint::CreateRemoval(Tok.getLocation());
   2737       ConsumeToken();
   2738       continue;
   2739     }
   2740 
   2741     AccessSpecifier AS = getAccessSpecifierIfPresent();
   2742     if (AS != AS_none) {
   2743       // Current token is a C++ access specifier.
   2744       CurAS = AS;
   2745       SourceLocation ASLoc = Tok.getLocation();
   2746       ConsumeToken();
   2747       if (Tok.is(tok::colon))
   2748         Actions.ActOnAccessSpecifier(AS, ASLoc, Tok.getLocation());
   2749       else
   2750         Diag(Tok, diag::err_expected_colon);
   2751       ConsumeToken();
   2752       continue;
   2753     }
   2754 
   2755     // Parse all the comma separated declarators.
   2756     ParseCXXClassMemberDeclaration(CurAS);
   2757   }
   2758 
   2759   if (Tok.isNot(tok::r_brace)) {
   2760     Diag(Tok, diag::err_expected_rbrace);
   2761     return;
   2762   }
   2763   ConsumeBrace();
   2764 }
   2765