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