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