Home | History | Annotate | Download | only in Parse
      1 //===--- ParseDecl.cpp - 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 Declaration portions of the Parser interfaces.
     11 //
     12 //===----------------------------------------------------------------------===//
     13 
     14 #include "clang/Parse/Parser.h"
     15 #include "clang/Parse/ParseDiagnostic.h"
     16 #include "clang/Basic/OpenCL.h"
     17 #include "clang/Sema/Lookup.h"
     18 #include "clang/Sema/Scope.h"
     19 #include "clang/Sema/ParsedTemplate.h"
     20 #include "clang/Sema/PrettyDeclStackTrace.h"
     21 #include "RAIIObjectsForParser.h"
     22 #include "llvm/ADT/SmallSet.h"
     23 #include "llvm/ADT/SmallString.h"
     24 #include "llvm/ADT/StringSwitch.h"
     25 using namespace clang;
     26 
     27 //===----------------------------------------------------------------------===//
     28 // C99 6.7: Declarations.
     29 //===----------------------------------------------------------------------===//
     30 
     31 /// ParseTypeName
     32 ///       type-name: [C99 6.7.6]
     33 ///         specifier-qualifier-list abstract-declarator[opt]
     34 ///
     35 /// Called type-id in C++.
     36 TypeResult Parser::ParseTypeName(SourceRange *Range,
     37                                  Declarator::TheContext Context,
     38                                  AccessSpecifier AS,
     39                                  Decl **OwnedType) {
     40   DeclSpecContext DSC = getDeclSpecContextFromDeclaratorContext(Context);
     41   if (DSC == DSC_normal)
     42     DSC = DSC_type_specifier;
     43 
     44   // Parse the common declaration-specifiers piece.
     45   DeclSpec DS(AttrFactory);
     46   ParseSpecifierQualifierList(DS, AS, DSC);
     47   if (OwnedType)
     48     *OwnedType = DS.isTypeSpecOwned() ? DS.getRepAsDecl() : 0;
     49 
     50   // Parse the abstract-declarator, if present.
     51   Declarator DeclaratorInfo(DS, Context);
     52   ParseDeclarator(DeclaratorInfo);
     53   if (Range)
     54     *Range = DeclaratorInfo.getSourceRange();
     55 
     56   if (DeclaratorInfo.isInvalidType())
     57     return true;
     58 
     59   return Actions.ActOnTypeName(getCurScope(), DeclaratorInfo);
     60 }
     61 
     62 
     63 /// isAttributeLateParsed - Return true if the attribute has arguments that
     64 /// require late parsing.
     65 static bool isAttributeLateParsed(const IdentifierInfo &II) {
     66     return llvm::StringSwitch<bool>(II.getName())
     67 #include "clang/Parse/AttrLateParsed.inc"
     68         .Default(false);
     69 }
     70 
     71 /// ParseGNUAttributes - Parse a non-empty attributes list.
     72 ///
     73 /// [GNU] attributes:
     74 ///         attribute
     75 ///         attributes attribute
     76 ///
     77 /// [GNU]  attribute:
     78 ///          '__attribute__' '(' '(' attribute-list ')' ')'
     79 ///
     80 /// [GNU]  attribute-list:
     81 ///          attrib
     82 ///          attribute_list ',' attrib
     83 ///
     84 /// [GNU]  attrib:
     85 ///          empty
     86 ///          attrib-name
     87 ///          attrib-name '(' identifier ')'
     88 ///          attrib-name '(' identifier ',' nonempty-expr-list ')'
     89 ///          attrib-name '(' argument-expression-list [C99 6.5.2] ')'
     90 ///
     91 /// [GNU]  attrib-name:
     92 ///          identifier
     93 ///          typespec
     94 ///          typequal
     95 ///          storageclass
     96 ///
     97 /// FIXME: The GCC grammar/code for this construct implies we need two
     98 /// token lookahead. Comment from gcc: "If they start with an identifier
     99 /// which is followed by a comma or close parenthesis, then the arguments
    100 /// start with that identifier; otherwise they are an expression list."
    101 ///
    102 /// GCC does not require the ',' between attribs in an attribute-list.
    103 ///
    104 /// At the moment, I am not doing 2 token lookahead. I am also unaware of
    105 /// any attributes that don't work (based on my limited testing). Most
    106 /// attributes are very simple in practice. Until we find a bug, I don't see
    107 /// a pressing need to implement the 2 token lookahead.
    108 
    109 void Parser::ParseGNUAttributes(ParsedAttributes &attrs,
    110                                 SourceLocation *endLoc,
    111                                 LateParsedAttrList *LateAttrs) {
    112   assert(Tok.is(tok::kw___attribute) && "Not a GNU attribute list!");
    113 
    114   while (Tok.is(tok::kw___attribute)) {
    115     ConsumeToken();
    116     if (ExpectAndConsume(tok::l_paren, diag::err_expected_lparen_after,
    117                          "attribute")) {
    118       SkipUntil(tok::r_paren, true); // skip until ) or ;
    119       return;
    120     }
    121     if (ExpectAndConsume(tok::l_paren, diag::err_expected_lparen_after, "(")) {
    122       SkipUntil(tok::r_paren, true); // skip until ) or ;
    123       return;
    124     }
    125     // Parse the attribute-list. e.g. __attribute__(( weak, alias("__f") ))
    126     while (Tok.is(tok::identifier) || isDeclarationSpecifier() ||
    127            Tok.is(tok::comma)) {
    128       if (Tok.is(tok::comma)) {
    129         // allows for empty/non-empty attributes. ((__vector_size__(16),,,,))
    130         ConsumeToken();
    131         continue;
    132       }
    133       // we have an identifier or declaration specifier (const, int, etc.)
    134       IdentifierInfo *AttrName = Tok.getIdentifierInfo();
    135       SourceLocation AttrNameLoc = ConsumeToken();
    136 
    137       if (Tok.is(tok::l_paren)) {
    138         // handle "parameterized" attributes
    139         if (LateAttrs && isAttributeLateParsed(*AttrName)) {
    140           LateParsedAttribute *LA =
    141             new LateParsedAttribute(this, *AttrName, AttrNameLoc);
    142           LateAttrs->push_back(LA);
    143 
    144           // Attributes in a class are parsed at the end of the class, along
    145           // with other late-parsed declarations.
    146           if (!ClassStack.empty())
    147             getCurrentClass().LateParsedDeclarations.push_back(LA);
    148 
    149           // consume everything up to and including the matching right parens
    150           ConsumeAndStoreUntil(tok::r_paren, LA->Toks, true, false);
    151 
    152           Token Eof;
    153           Eof.startToken();
    154           Eof.setLocation(Tok.getLocation());
    155           LA->Toks.push_back(Eof);
    156         } else {
    157           ParseGNUAttributeArgs(AttrName, AttrNameLoc, attrs, endLoc);
    158         }
    159       } else {
    160         attrs.addNew(AttrName, AttrNameLoc, 0, AttrNameLoc,
    161                      0, SourceLocation(), 0, 0, AttributeList::AS_GNU);
    162       }
    163     }
    164     if (ExpectAndConsume(tok::r_paren, diag::err_expected_rparen))
    165       SkipUntil(tok::r_paren, false);
    166     SourceLocation Loc = Tok.getLocation();
    167     if (ExpectAndConsume(tok::r_paren, diag::err_expected_rparen)) {
    168       SkipUntil(tok::r_paren, false);
    169     }
    170     if (endLoc)
    171       *endLoc = Loc;
    172   }
    173 }
    174 
    175 
    176 /// Parse the arguments to a parameterized GNU attribute
    177 void Parser::ParseGNUAttributeArgs(IdentifierInfo *AttrName,
    178                                    SourceLocation AttrNameLoc,
    179                                    ParsedAttributes &Attrs,
    180                                    SourceLocation *EndLoc) {
    181 
    182   assert(Tok.is(tok::l_paren) && "Attribute arg list not starting with '('");
    183 
    184   // Availability attributes have their own grammar.
    185   if (AttrName->isStr("availability")) {
    186     ParseAvailabilityAttribute(*AttrName, AttrNameLoc, Attrs, EndLoc);
    187     return;
    188   }
    189   // Thread safety attributes fit into the FIXME case above, so we
    190   // just parse the arguments as a list of expressions
    191   if (IsThreadSafetyAttribute(AttrName->getName())) {
    192     ParseThreadSafetyAttribute(*AttrName, AttrNameLoc, Attrs, EndLoc);
    193     return;
    194   }
    195   // Type safety attributes have their own grammar.
    196   if (AttrName->isStr("type_tag_for_datatype")) {
    197     ParseTypeTagForDatatypeAttribute(*AttrName, AttrNameLoc, Attrs, EndLoc);
    198     return;
    199   }
    200 
    201   ConsumeParen(); // ignore the left paren loc for now
    202 
    203   IdentifierInfo *ParmName = 0;
    204   SourceLocation ParmLoc;
    205   bool BuiltinType = false;
    206 
    207   switch (Tok.getKind()) {
    208   case tok::kw_char:
    209   case tok::kw_wchar_t:
    210   case tok::kw_char16_t:
    211   case tok::kw_char32_t:
    212   case tok::kw_bool:
    213   case tok::kw_short:
    214   case tok::kw_int:
    215   case tok::kw_long:
    216   case tok::kw___int64:
    217   case tok::kw___int128:
    218   case tok::kw_signed:
    219   case tok::kw_unsigned:
    220   case tok::kw_float:
    221   case tok::kw_double:
    222   case tok::kw_void:
    223   case tok::kw_typeof:
    224     // __attribute__(( vec_type_hint(char) ))
    225     // FIXME: Don't just discard the builtin type token.
    226     ConsumeToken();
    227     BuiltinType = true;
    228     break;
    229 
    230   case tok::identifier:
    231     ParmName = Tok.getIdentifierInfo();
    232     ParmLoc = ConsumeToken();
    233     break;
    234 
    235   default:
    236     break;
    237   }
    238 
    239   ExprVector ArgExprs;
    240 
    241   if (!BuiltinType &&
    242       (ParmLoc.isValid() ? Tok.is(tok::comma) : Tok.isNot(tok::r_paren))) {
    243     // Eat the comma.
    244     if (ParmLoc.isValid())
    245       ConsumeToken();
    246 
    247     // Parse the non-empty comma-separated list of expressions.
    248     while (1) {
    249       ExprResult ArgExpr(ParseAssignmentExpression());
    250       if (ArgExpr.isInvalid()) {
    251         SkipUntil(tok::r_paren);
    252         return;
    253       }
    254       ArgExprs.push_back(ArgExpr.release());
    255       if (Tok.isNot(tok::comma))
    256         break;
    257       ConsumeToken(); // Eat the comma, move to the next argument
    258     }
    259   }
    260   else if (Tok.is(tok::less) && AttrName->isStr("iboutletcollection")) {
    261     if (!ExpectAndConsume(tok::less, diag::err_expected_less_after, "<",
    262                           tok::greater)) {
    263       while (Tok.is(tok::identifier)) {
    264         ConsumeToken();
    265         if (Tok.is(tok::greater))
    266           break;
    267         if (Tok.is(tok::comma)) {
    268           ConsumeToken();
    269           continue;
    270         }
    271       }
    272       if (Tok.isNot(tok::greater))
    273         Diag(Tok, diag::err_iboutletcollection_with_protocol);
    274       SkipUntil(tok::r_paren, false, true); // skip until ')'
    275     }
    276   }
    277 
    278   SourceLocation RParen = Tok.getLocation();
    279   if (!ExpectAndConsume(tok::r_paren, diag::err_expected_rparen)) {
    280     AttributeList *attr =
    281       Attrs.addNew(AttrName, SourceRange(AttrNameLoc, RParen), 0, AttrNameLoc,
    282                    ParmName, ParmLoc, ArgExprs.data(), ArgExprs.size(),
    283                    AttributeList::AS_GNU);
    284     if (BuiltinType && attr->getKind() == AttributeList::AT_IBOutletCollection)
    285       Diag(Tok, diag::err_iboutletcollection_builtintype);
    286   }
    287 }
    288 
    289 /// \brief Parses a single argument for a declspec, including the
    290 /// surrounding parens.
    291 void Parser::ParseMicrosoftDeclSpecWithSingleArg(IdentifierInfo *AttrName,
    292                                                  SourceLocation AttrNameLoc,
    293                                                  ParsedAttributes &Attrs)
    294 {
    295   BalancedDelimiterTracker T(*this, tok::l_paren);
    296   if (T.expectAndConsume(diag::err_expected_lparen_after,
    297                          AttrName->getNameStart(), tok::r_paren))
    298     return;
    299 
    300   ExprResult ArgExpr(ParseConstantExpression());
    301   if (ArgExpr.isInvalid()) {
    302     T.skipToEnd();
    303     return;
    304   }
    305   Expr *ExprList = ArgExpr.take();
    306   Attrs.addNew(AttrName, AttrNameLoc, 0, AttrNameLoc, 0, SourceLocation(),
    307                &ExprList, 1, AttributeList::AS_Declspec);
    308 
    309   T.consumeClose();
    310 }
    311 
    312 /// \brief Determines whether a declspec is a "simple" one requiring no
    313 /// arguments.
    314 bool Parser::IsSimpleMicrosoftDeclSpec(IdentifierInfo *Ident) {
    315   return llvm::StringSwitch<bool>(Ident->getName())
    316     .Case("dllimport", true)
    317     .Case("dllexport", true)
    318     .Case("noreturn", true)
    319     .Case("nothrow", true)
    320     .Case("noinline", true)
    321     .Case("naked", true)
    322     .Case("appdomain", true)
    323     .Case("process", true)
    324     .Case("jitintrinsic", true)
    325     .Case("noalias", true)
    326     .Case("restrict", true)
    327     .Case("novtable", true)
    328     .Case("selectany", true)
    329     .Case("thread", true)
    330     .Default(false);
    331 }
    332 
    333 /// \brief Attempts to parse a declspec which is not simple (one that takes
    334 /// parameters).  Will return false if we properly handled the declspec, or
    335 /// true if it is an unknown declspec.
    336 void Parser::ParseComplexMicrosoftDeclSpec(IdentifierInfo *Ident,
    337                                            SourceLocation Loc,
    338                                            ParsedAttributes &Attrs) {
    339   // Try to handle the easy case first -- these declspecs all take a single
    340   // parameter as their argument.
    341   if (llvm::StringSwitch<bool>(Ident->getName())
    342       .Case("uuid", true)
    343       .Case("align", true)
    344       .Case("allocate", true)
    345       .Default(false)) {
    346     ParseMicrosoftDeclSpecWithSingleArg(Ident, Loc, Attrs);
    347   } else if (Ident->getName() == "deprecated") {
    348     // The deprecated declspec has an optional single argument, so we will
    349     // check for a l-paren to decide whether we should parse an argument or
    350     // not.
    351     if (Tok.getKind() == tok::l_paren)
    352       ParseMicrosoftDeclSpecWithSingleArg(Ident, Loc, Attrs);
    353     else
    354       Attrs.addNew(Ident, Loc, 0, Loc, 0, SourceLocation(), 0, 0,
    355                    AttributeList::AS_Declspec);
    356   } else if (Ident->getName() == "property") {
    357     // The property declspec is more complex in that it can take one or two
    358     // assignment expressions as a parameter, but the lhs of the assignment
    359     // must be named get or put.
    360     //
    361     // For right now, we will just skip to the closing right paren of the
    362     // property expression.
    363     //
    364     // FIXME: we should deal with __declspec(property) at some point because it
    365     // is used in the platform SDK headers for the Parallel Patterns Library
    366     // and ATL.
    367     BalancedDelimiterTracker T(*this, tok::l_paren);
    368     if (T.expectAndConsume(diag::err_expected_lparen_after,
    369                            Ident->getNameStart(), tok::r_paren))
    370       return;
    371     T.skipToEnd();
    372   } else {
    373     // We don't recognize this as a valid declspec, but instead of creating the
    374     // attribute and allowing sema to warn about it, we will warn here instead.
    375     // This is because some attributes have multiple spellings, but we need to
    376     // disallow that for declspecs (such as align vs aligned).  If we made the
    377     // attribute, we'd have to split the valid declspec spelling logic into
    378     // both locations.
    379     Diag(Loc, diag::warn_ms_declspec_unknown) << Ident;
    380 
    381     // If there's an open paren, we should eat the open and close parens under
    382     // the assumption that this unknown declspec has parameters.
    383     BalancedDelimiterTracker T(*this, tok::l_paren);
    384     if (!T.consumeOpen())
    385       T.skipToEnd();
    386   }
    387 }
    388 
    389 /// [MS] decl-specifier:
    390 ///             __declspec ( extended-decl-modifier-seq )
    391 ///
    392 /// [MS] extended-decl-modifier-seq:
    393 ///             extended-decl-modifier[opt]
    394 ///             extended-decl-modifier extended-decl-modifier-seq
    395 void Parser::ParseMicrosoftDeclSpec(ParsedAttributes &Attrs) {
    396   assert(Tok.is(tok::kw___declspec) && "Not a declspec!");
    397 
    398   ConsumeToken();
    399   BalancedDelimiterTracker T(*this, tok::l_paren);
    400   if (T.expectAndConsume(diag::err_expected_lparen_after, "__declspec",
    401                          tok::r_paren))
    402     return;
    403 
    404   // An empty declspec is perfectly legal and should not warn.  Additionally,
    405   // you can specify multiple attributes per declspec.
    406   while (Tok.getKind() != tok::r_paren) {
    407     // We expect either a well-known identifier or a generic string.  Anything
    408     // else is a malformed declspec.
    409     bool IsString = Tok.getKind() == tok::string_literal ? true : false;
    410     if (!IsString && Tok.getKind() != tok::identifier &&
    411         Tok.getKind() != tok::kw_restrict) {
    412       Diag(Tok, diag::err_ms_declspec_type);
    413       T.skipToEnd();
    414       return;
    415     }
    416 
    417     IdentifierInfo *AttrName;
    418     SourceLocation AttrNameLoc;
    419     if (IsString) {
    420       SmallString<8> StrBuffer;
    421       bool Invalid = false;
    422       StringRef Str = PP.getSpelling(Tok, StrBuffer, &Invalid);
    423       if (Invalid) {
    424         T.skipToEnd();
    425         return;
    426       }
    427       AttrName = PP.getIdentifierInfo(Str);
    428       AttrNameLoc = ConsumeStringToken();
    429     } else {
    430       AttrName = Tok.getIdentifierInfo();
    431       AttrNameLoc = ConsumeToken();
    432     }
    433 
    434     if (IsString || IsSimpleMicrosoftDeclSpec(AttrName))
    435       // If we have a generic string, we will allow it because there is no
    436       // documented list of allowable string declspecs, but we know they exist
    437       // (for instance, SAL declspecs in older versions of MSVC).
    438       //
    439       // Alternatively, if the identifier is a simple one, then it requires no
    440       // arguments and can be turned into an attribute directly.
    441       Attrs.addNew(AttrName, AttrNameLoc, 0, AttrNameLoc, 0, SourceLocation(),
    442                    0, 0, AttributeList::AS_Declspec);
    443     else
    444       ParseComplexMicrosoftDeclSpec(AttrName, AttrNameLoc, Attrs);
    445   }
    446   T.consumeClose();
    447 }
    448 
    449 void Parser::ParseMicrosoftTypeAttributes(ParsedAttributes &attrs) {
    450   // Treat these like attributes
    451   while (Tok.is(tok::kw___fastcall) || Tok.is(tok::kw___stdcall) ||
    452          Tok.is(tok::kw___thiscall) || Tok.is(tok::kw___cdecl)   ||
    453          Tok.is(tok::kw___ptr64) || Tok.is(tok::kw___w64) ||
    454          Tok.is(tok::kw___ptr32) ||
    455          Tok.is(tok::kw___unaligned)) {
    456     IdentifierInfo *AttrName = Tok.getIdentifierInfo();
    457     SourceLocation AttrNameLoc = ConsumeToken();
    458     attrs.addNew(AttrName, AttrNameLoc, 0, AttrNameLoc, 0,
    459                  SourceLocation(), 0, 0, AttributeList::AS_MSTypespec);
    460   }
    461 }
    462 
    463 void Parser::ParseBorlandTypeAttributes(ParsedAttributes &attrs) {
    464   // Treat these like attributes
    465   while (Tok.is(tok::kw___pascal)) {
    466     IdentifierInfo *AttrName = Tok.getIdentifierInfo();
    467     SourceLocation AttrNameLoc = ConsumeToken();
    468     attrs.addNew(AttrName, AttrNameLoc, 0, AttrNameLoc, 0,
    469                  SourceLocation(), 0, 0, AttributeList::AS_MSTypespec);
    470   }
    471 }
    472 
    473 void Parser::ParseOpenCLAttributes(ParsedAttributes &attrs) {
    474   // Treat these like attributes
    475   while (Tok.is(tok::kw___kernel)) {
    476     SourceLocation AttrNameLoc = ConsumeToken();
    477     attrs.addNew(PP.getIdentifierInfo("opencl_kernel_function"),
    478                  AttrNameLoc, 0, AttrNameLoc, 0,
    479                  SourceLocation(), 0, 0, AttributeList::AS_GNU);
    480   }
    481 }
    482 
    483 void Parser::ParseOpenCLQualifiers(DeclSpec &DS) {
    484   SourceLocation Loc = Tok.getLocation();
    485   switch(Tok.getKind()) {
    486     // OpenCL qualifiers:
    487     case tok::kw___private:
    488     case tok::kw_private:
    489       DS.getAttributes().addNewInteger(
    490           Actions.getASTContext(),
    491           PP.getIdentifierInfo("address_space"), Loc, 0);
    492       break;
    493 
    494     case tok::kw___global:
    495       DS.getAttributes().addNewInteger(
    496           Actions.getASTContext(),
    497           PP.getIdentifierInfo("address_space"), Loc, LangAS::opencl_global);
    498       break;
    499 
    500     case tok::kw___local:
    501       DS.getAttributes().addNewInteger(
    502           Actions.getASTContext(),
    503           PP.getIdentifierInfo("address_space"), Loc, LangAS::opencl_local);
    504       break;
    505 
    506     case tok::kw___constant:
    507       DS.getAttributes().addNewInteger(
    508           Actions.getASTContext(),
    509           PP.getIdentifierInfo("address_space"), Loc, LangAS::opencl_constant);
    510       break;
    511 
    512     case tok::kw___read_only:
    513       DS.getAttributes().addNewInteger(
    514           Actions.getASTContext(),
    515           PP.getIdentifierInfo("opencl_image_access"), Loc, CLIA_read_only);
    516       break;
    517 
    518     case tok::kw___write_only:
    519       DS.getAttributes().addNewInteger(
    520           Actions.getASTContext(),
    521           PP.getIdentifierInfo("opencl_image_access"), Loc, CLIA_write_only);
    522       break;
    523 
    524     case tok::kw___read_write:
    525       DS.getAttributes().addNewInteger(
    526           Actions.getASTContext(),
    527           PP.getIdentifierInfo("opencl_image_access"), Loc, CLIA_read_write);
    528       break;
    529     default: break;
    530   }
    531 }
    532 
    533 /// \brief Parse a version number.
    534 ///
    535 /// version:
    536 ///   simple-integer
    537 ///   simple-integer ',' simple-integer
    538 ///   simple-integer ',' simple-integer ',' simple-integer
    539 VersionTuple Parser::ParseVersionTuple(SourceRange &Range) {
    540   Range = Tok.getLocation();
    541 
    542   if (!Tok.is(tok::numeric_constant)) {
    543     Diag(Tok, diag::err_expected_version);
    544     SkipUntil(tok::comma, tok::r_paren, true, true, true);
    545     return VersionTuple();
    546   }
    547 
    548   // Parse the major (and possibly minor and subminor) versions, which
    549   // are stored in the numeric constant. We utilize a quirk of the
    550   // lexer, which is that it handles something like 1.2.3 as a single
    551   // numeric constant, rather than two separate tokens.
    552   SmallString<512> Buffer;
    553   Buffer.resize(Tok.getLength()+1);
    554   const char *ThisTokBegin = &Buffer[0];
    555 
    556   // Get the spelling of the token, which eliminates trigraphs, etc.
    557   bool Invalid = false;
    558   unsigned ActualLength = PP.getSpelling(Tok, ThisTokBegin, &Invalid);
    559   if (Invalid)
    560     return VersionTuple();
    561 
    562   // Parse the major version.
    563   unsigned AfterMajor = 0;
    564   unsigned Major = 0;
    565   while (AfterMajor < ActualLength && isdigit(ThisTokBegin[AfterMajor])) {
    566     Major = Major * 10 + ThisTokBegin[AfterMajor] - '0';
    567     ++AfterMajor;
    568   }
    569 
    570   if (AfterMajor == 0) {
    571     Diag(Tok, diag::err_expected_version);
    572     SkipUntil(tok::comma, tok::r_paren, true, true, true);
    573     return VersionTuple();
    574   }
    575 
    576   if (AfterMajor == ActualLength) {
    577     ConsumeToken();
    578 
    579     // We only had a single version component.
    580     if (Major == 0) {
    581       Diag(Tok, diag::err_zero_version);
    582       return VersionTuple();
    583     }
    584 
    585     return VersionTuple(Major);
    586   }
    587 
    588   if (ThisTokBegin[AfterMajor] != '.' || (AfterMajor + 1 == ActualLength)) {
    589     Diag(Tok, diag::err_expected_version);
    590     SkipUntil(tok::comma, tok::r_paren, true, true, true);
    591     return VersionTuple();
    592   }
    593 
    594   // Parse the minor version.
    595   unsigned AfterMinor = AfterMajor + 1;
    596   unsigned Minor = 0;
    597   while (AfterMinor < ActualLength && isdigit(ThisTokBegin[AfterMinor])) {
    598     Minor = Minor * 10 + ThisTokBegin[AfterMinor] - '0';
    599     ++AfterMinor;
    600   }
    601 
    602   if (AfterMinor == ActualLength) {
    603     ConsumeToken();
    604 
    605     // We had major.minor.
    606     if (Major == 0 && Minor == 0) {
    607       Diag(Tok, diag::err_zero_version);
    608       return VersionTuple();
    609     }
    610 
    611     return VersionTuple(Major, Minor);
    612   }
    613 
    614   // If what follows is not a '.', we have a problem.
    615   if (ThisTokBegin[AfterMinor] != '.') {
    616     Diag(Tok, diag::err_expected_version);
    617     SkipUntil(tok::comma, tok::r_paren, true, true, true);
    618     return VersionTuple();
    619   }
    620 
    621   // Parse the subminor version.
    622   unsigned AfterSubminor = AfterMinor + 1;
    623   unsigned Subminor = 0;
    624   while (AfterSubminor < ActualLength && isdigit(ThisTokBegin[AfterSubminor])) {
    625     Subminor = Subminor * 10 + ThisTokBegin[AfterSubminor] - '0';
    626     ++AfterSubminor;
    627   }
    628 
    629   if (AfterSubminor != ActualLength) {
    630     Diag(Tok, diag::err_expected_version);
    631     SkipUntil(tok::comma, tok::r_paren, true, true, true);
    632     return VersionTuple();
    633   }
    634   ConsumeToken();
    635   return VersionTuple(Major, Minor, Subminor);
    636 }
    637 
    638 /// \brief Parse the contents of the "availability" attribute.
    639 ///
    640 /// availability-attribute:
    641 ///   'availability' '(' platform ',' version-arg-list, opt-message')'
    642 ///
    643 /// platform:
    644 ///   identifier
    645 ///
    646 /// version-arg-list:
    647 ///   version-arg
    648 ///   version-arg ',' version-arg-list
    649 ///
    650 /// version-arg:
    651 ///   'introduced' '=' version
    652 ///   'deprecated' '=' version
    653 ///   'obsoleted' = version
    654 ///   'unavailable'
    655 /// opt-message:
    656 ///   'message' '=' <string>
    657 void Parser::ParseAvailabilityAttribute(IdentifierInfo &Availability,
    658                                         SourceLocation AvailabilityLoc,
    659                                         ParsedAttributes &attrs,
    660                                         SourceLocation *endLoc) {
    661   SourceLocation PlatformLoc;
    662   IdentifierInfo *Platform = 0;
    663 
    664   enum { Introduced, Deprecated, Obsoleted, Unknown };
    665   AvailabilityChange Changes[Unknown];
    666   ExprResult MessageExpr;
    667 
    668   // Opening '('.
    669   BalancedDelimiterTracker T(*this, tok::l_paren);
    670   if (T.consumeOpen()) {
    671     Diag(Tok, diag::err_expected_lparen);
    672     return;
    673   }
    674 
    675   // Parse the platform name,
    676   if (Tok.isNot(tok::identifier)) {
    677     Diag(Tok, diag::err_availability_expected_platform);
    678     SkipUntil(tok::r_paren);
    679     return;
    680   }
    681   Platform = Tok.getIdentifierInfo();
    682   PlatformLoc = ConsumeToken();
    683 
    684   // Parse the ',' following the platform name.
    685   if (ExpectAndConsume(tok::comma, diag::err_expected_comma, "", tok::r_paren))
    686     return;
    687 
    688   // If we haven't grabbed the pointers for the identifiers
    689   // "introduced", "deprecated", and "obsoleted", do so now.
    690   if (!Ident_introduced) {
    691     Ident_introduced = PP.getIdentifierInfo("introduced");
    692     Ident_deprecated = PP.getIdentifierInfo("deprecated");
    693     Ident_obsoleted = PP.getIdentifierInfo("obsoleted");
    694     Ident_unavailable = PP.getIdentifierInfo("unavailable");
    695     Ident_message = PP.getIdentifierInfo("message");
    696   }
    697 
    698   // Parse the set of introductions/deprecations/removals.
    699   SourceLocation UnavailableLoc;
    700   do {
    701     if (Tok.isNot(tok::identifier)) {
    702       Diag(Tok, diag::err_availability_expected_change);
    703       SkipUntil(tok::r_paren);
    704       return;
    705     }
    706     IdentifierInfo *Keyword = Tok.getIdentifierInfo();
    707     SourceLocation KeywordLoc = ConsumeToken();
    708 
    709     if (Keyword == Ident_unavailable) {
    710       if (UnavailableLoc.isValid()) {
    711         Diag(KeywordLoc, diag::err_availability_redundant)
    712           << Keyword << SourceRange(UnavailableLoc);
    713       }
    714       UnavailableLoc = KeywordLoc;
    715 
    716       if (Tok.isNot(tok::comma))
    717         break;
    718 
    719       ConsumeToken();
    720       continue;
    721     }
    722 
    723     if (Tok.isNot(tok::equal)) {
    724       Diag(Tok, diag::err_expected_equal_after)
    725         << Keyword;
    726       SkipUntil(tok::r_paren);
    727       return;
    728     }
    729     ConsumeToken();
    730     if (Keyword == Ident_message) {
    731       if (!isTokenStringLiteral()) {
    732         Diag(Tok, diag::err_expected_string_literal);
    733         SkipUntil(tok::r_paren);
    734         return;
    735       }
    736       MessageExpr = ParseStringLiteralExpression();
    737       break;
    738     }
    739 
    740     SourceRange VersionRange;
    741     VersionTuple Version = ParseVersionTuple(VersionRange);
    742 
    743     if (Version.empty()) {
    744       SkipUntil(tok::r_paren);
    745       return;
    746     }
    747 
    748     unsigned Index;
    749     if (Keyword == Ident_introduced)
    750       Index = Introduced;
    751     else if (Keyword == Ident_deprecated)
    752       Index = Deprecated;
    753     else if (Keyword == Ident_obsoleted)
    754       Index = Obsoleted;
    755     else
    756       Index = Unknown;
    757 
    758     if (Index < Unknown) {
    759       if (!Changes[Index].KeywordLoc.isInvalid()) {
    760         Diag(KeywordLoc, diag::err_availability_redundant)
    761           << Keyword
    762           << SourceRange(Changes[Index].KeywordLoc,
    763                          Changes[Index].VersionRange.getEnd());
    764       }
    765 
    766       Changes[Index].KeywordLoc = KeywordLoc;
    767       Changes[Index].Version = Version;
    768       Changes[Index].VersionRange = VersionRange;
    769     } else {
    770       Diag(KeywordLoc, diag::err_availability_unknown_change)
    771         << Keyword << VersionRange;
    772     }
    773 
    774     if (Tok.isNot(tok::comma))
    775       break;
    776 
    777     ConsumeToken();
    778   } while (true);
    779 
    780   // Closing ')'.
    781   if (T.consumeClose())
    782     return;
    783 
    784   if (endLoc)
    785     *endLoc = T.getCloseLocation();
    786 
    787   // The 'unavailable' availability cannot be combined with any other
    788   // availability changes. Make sure that hasn't happened.
    789   if (UnavailableLoc.isValid()) {
    790     bool Complained = false;
    791     for (unsigned Index = Introduced; Index != Unknown; ++Index) {
    792       if (Changes[Index].KeywordLoc.isValid()) {
    793         if (!Complained) {
    794           Diag(UnavailableLoc, diag::warn_availability_and_unavailable)
    795             << SourceRange(Changes[Index].KeywordLoc,
    796                            Changes[Index].VersionRange.getEnd());
    797           Complained = true;
    798         }
    799 
    800         // Clear out the availability.
    801         Changes[Index] = AvailabilityChange();
    802       }
    803     }
    804   }
    805 
    806   // Record this attribute
    807   attrs.addNew(&Availability,
    808                SourceRange(AvailabilityLoc, T.getCloseLocation()),
    809                0, AvailabilityLoc,
    810                Platform, PlatformLoc,
    811                Changes[Introduced],
    812                Changes[Deprecated],
    813                Changes[Obsoleted],
    814                UnavailableLoc, MessageExpr.take(),
    815                AttributeList::AS_GNU);
    816 }
    817 
    818 
    819 // Late Parsed Attributes:
    820 // See other examples of late parsing in lib/Parse/ParseCXXInlineMethods
    821 
    822 void Parser::LateParsedDeclaration::ParseLexedAttributes() {}
    823 
    824 void Parser::LateParsedClass::ParseLexedAttributes() {
    825   Self->ParseLexedAttributes(*Class);
    826 }
    827 
    828 void Parser::LateParsedAttribute::ParseLexedAttributes() {
    829   Self->ParseLexedAttribute(*this, true, false);
    830 }
    831 
    832 /// Wrapper class which calls ParseLexedAttribute, after setting up the
    833 /// scope appropriately.
    834 void Parser::ParseLexedAttributes(ParsingClass &Class) {
    835   // Deal with templates
    836   // FIXME: Test cases to make sure this does the right thing for templates.
    837   bool HasTemplateScope = !Class.TopLevelClass && Class.TemplateScope;
    838   ParseScope ClassTemplateScope(this, Scope::TemplateParamScope,
    839                                 HasTemplateScope);
    840   if (HasTemplateScope)
    841     Actions.ActOnReenterTemplateScope(getCurScope(), Class.TagOrTemplate);
    842 
    843   // Set or update the scope flags.
    844   bool AlreadyHasClassScope = Class.TopLevelClass;
    845   unsigned ScopeFlags = Scope::ClassScope|Scope::DeclScope;
    846   ParseScope ClassScope(this, ScopeFlags, !AlreadyHasClassScope);
    847   ParseScopeFlags ClassScopeFlags(this, ScopeFlags, AlreadyHasClassScope);
    848 
    849   // Enter the scope of nested classes
    850   if (!AlreadyHasClassScope)
    851     Actions.ActOnStartDelayedMemberDeclarations(getCurScope(),
    852                                                 Class.TagOrTemplate);
    853   if (!Class.LateParsedDeclarations.empty()) {
    854     for (unsigned i = 0, ni = Class.LateParsedDeclarations.size(); i < ni; ++i){
    855       Class.LateParsedDeclarations[i]->ParseLexedAttributes();
    856     }
    857   }
    858 
    859   if (!AlreadyHasClassScope)
    860     Actions.ActOnFinishDelayedMemberDeclarations(getCurScope(),
    861                                                  Class.TagOrTemplate);
    862 }
    863 
    864 
    865 /// \brief Parse all attributes in LAs, and attach them to Decl D.
    866 void Parser::ParseLexedAttributeList(LateParsedAttrList &LAs, Decl *D,
    867                                      bool EnterScope, bool OnDefinition) {
    868   for (unsigned i = 0, ni = LAs.size(); i < ni; ++i) {
    869     if (D)
    870       LAs[i]->addDecl(D);
    871     ParseLexedAttribute(*LAs[i], EnterScope, OnDefinition);
    872     delete LAs[i];
    873   }
    874   LAs.clear();
    875 }
    876 
    877 
    878 /// \brief Finish parsing an attribute for which parsing was delayed.
    879 /// This will be called at the end of parsing a class declaration
    880 /// for each LateParsedAttribute. We consume the saved tokens and
    881 /// create an attribute with the arguments filled in. We add this
    882 /// to the Attribute list for the decl.
    883 void Parser::ParseLexedAttribute(LateParsedAttribute &LA,
    884                                  bool EnterScope, bool OnDefinition) {
    885   // Save the current token position.
    886   SourceLocation OrigLoc = Tok.getLocation();
    887 
    888   // Append the current token at the end of the new token stream so that it
    889   // doesn't get lost.
    890   LA.Toks.push_back(Tok);
    891   PP.EnterTokenStream(LA.Toks.data(), LA.Toks.size(), true, false);
    892   // Consume the previously pushed token.
    893   ConsumeAnyToken();
    894 
    895   if (OnDefinition && !IsThreadSafetyAttribute(LA.AttrName.getName())) {
    896     Diag(Tok, diag::warn_attribute_on_function_definition)
    897       << LA.AttrName.getName();
    898   }
    899 
    900   ParsedAttributes Attrs(AttrFactory);
    901   SourceLocation endLoc;
    902 
    903   if (LA.Decls.size() > 0) {
    904     Decl *D = LA.Decls[0];
    905     NamedDecl *ND  = dyn_cast<NamedDecl>(D);
    906     RecordDecl *RD = dyn_cast_or_null<RecordDecl>(D->getDeclContext());
    907 
    908     // Allow 'this' within late-parsed attributes.
    909     Sema::CXXThisScopeRAII ThisScope(Actions, RD,
    910                                      /*TypeQuals=*/0,
    911                                      ND && RD && ND->isCXXInstanceMember());
    912 
    913     if (LA.Decls.size() == 1) {
    914       // If the Decl is templatized, add template parameters to scope.
    915       bool HasTemplateScope = EnterScope && D->isTemplateDecl();
    916       ParseScope TempScope(this, Scope::TemplateParamScope, HasTemplateScope);
    917       if (HasTemplateScope)
    918         Actions.ActOnReenterTemplateScope(Actions.CurScope, D);
    919 
    920       // If the Decl is on a function, add function parameters to the scope.
    921       bool HasFunScope = EnterScope && D->isFunctionOrFunctionTemplate();
    922       ParseScope FnScope(this, Scope::FnScope|Scope::DeclScope, HasFunScope);
    923       if (HasFunScope)
    924         Actions.ActOnReenterFunctionContext(Actions.CurScope, D);
    925 
    926       ParseGNUAttributeArgs(&LA.AttrName, LA.AttrNameLoc, Attrs, &endLoc);
    927 
    928       if (HasFunScope) {
    929         Actions.ActOnExitFunctionContext();
    930         FnScope.Exit();  // Pop scope, and remove Decls from IdResolver
    931       }
    932       if (HasTemplateScope) {
    933         TempScope.Exit();
    934       }
    935     } else {
    936       // If there are multiple decls, then the decl cannot be within the
    937       // function scope.
    938       ParseGNUAttributeArgs(&LA.AttrName, LA.AttrNameLoc, Attrs, &endLoc);
    939     }
    940   } else {
    941     Diag(Tok, diag::warn_attribute_no_decl) << LA.AttrName.getName();
    942   }
    943 
    944   for (unsigned i = 0, ni = LA.Decls.size(); i < ni; ++i) {
    945     Actions.ActOnFinishDelayedAttribute(getCurScope(), LA.Decls[i], Attrs);
    946   }
    947 
    948   if (Tok.getLocation() != OrigLoc) {
    949     // Due to a parsing error, we either went over the cached tokens or
    950     // there are still cached tokens left, so we skip the leftover tokens.
    951     // Since this is an uncommon situation that should be avoided, use the
    952     // expensive isBeforeInTranslationUnit call.
    953     if (PP.getSourceManager().isBeforeInTranslationUnit(Tok.getLocation(),
    954                                                         OrigLoc))
    955     while (Tok.getLocation() != OrigLoc && Tok.isNot(tok::eof))
    956       ConsumeAnyToken();
    957   }
    958 }
    959 
    960 /// \brief Wrapper around a case statement checking if AttrName is
    961 /// one of the thread safety attributes
    962 bool Parser::IsThreadSafetyAttribute(llvm::StringRef AttrName){
    963   return llvm::StringSwitch<bool>(AttrName)
    964       .Case("guarded_by", true)
    965       .Case("guarded_var", true)
    966       .Case("pt_guarded_by", true)
    967       .Case("pt_guarded_var", true)
    968       .Case("lockable", true)
    969       .Case("scoped_lockable", true)
    970       .Case("no_thread_safety_analysis", true)
    971       .Case("acquired_after", true)
    972       .Case("acquired_before", true)
    973       .Case("exclusive_lock_function", true)
    974       .Case("shared_lock_function", true)
    975       .Case("exclusive_trylock_function", true)
    976       .Case("shared_trylock_function", true)
    977       .Case("unlock_function", true)
    978       .Case("lock_returned", true)
    979       .Case("locks_excluded", true)
    980       .Case("exclusive_locks_required", true)
    981       .Case("shared_locks_required", true)
    982       .Default(false);
    983 }
    984 
    985 /// \brief Parse the contents of thread safety attributes. These
    986 /// should always be parsed as an expression list.
    987 ///
    988 /// We need to special case the parsing due to the fact that if the first token
    989 /// of the first argument is an identifier, the main parse loop will store
    990 /// that token as a "parameter" and the rest of
    991 /// the arguments will be added to a list of "arguments". However,
    992 /// subsequent tokens in the first argument are lost. We instead parse each
    993 /// argument as an expression and add all arguments to the list of "arguments".
    994 /// In future, we will take advantage of this special case to also
    995 /// deal with some argument scoping issues here (for example, referring to a
    996 /// function parameter in the attribute on that function).
    997 void Parser::ParseThreadSafetyAttribute(IdentifierInfo &AttrName,
    998                                         SourceLocation AttrNameLoc,
    999                                         ParsedAttributes &Attrs,
   1000                                         SourceLocation *EndLoc) {
   1001   assert(Tok.is(tok::l_paren) && "Attribute arg list not starting with '('");
   1002 
   1003   BalancedDelimiterTracker T(*this, tok::l_paren);
   1004   T.consumeOpen();
   1005 
   1006   ExprVector ArgExprs;
   1007   bool ArgExprsOk = true;
   1008 
   1009   // now parse the list of expressions
   1010   while (Tok.isNot(tok::r_paren)) {
   1011     ExprResult ArgExpr(ParseAssignmentExpression());
   1012     if (ArgExpr.isInvalid()) {
   1013       ArgExprsOk = false;
   1014       T.consumeClose();
   1015       break;
   1016     } else {
   1017       ArgExprs.push_back(ArgExpr.release());
   1018     }
   1019     if (Tok.isNot(tok::comma))
   1020       break;
   1021     ConsumeToken(); // Eat the comma, move to the next argument
   1022   }
   1023   // Match the ')'.
   1024   if (ArgExprsOk && !T.consumeClose()) {
   1025     Attrs.addNew(&AttrName, AttrNameLoc, 0, AttrNameLoc, 0, SourceLocation(),
   1026                  ArgExprs.data(), ArgExprs.size(), AttributeList::AS_GNU);
   1027   }
   1028   if (EndLoc)
   1029     *EndLoc = T.getCloseLocation();
   1030 }
   1031 
   1032 void Parser::ParseTypeTagForDatatypeAttribute(IdentifierInfo &AttrName,
   1033                                               SourceLocation AttrNameLoc,
   1034                                               ParsedAttributes &Attrs,
   1035                                               SourceLocation *EndLoc) {
   1036   assert(Tok.is(tok::l_paren) && "Attribute arg list not starting with '('");
   1037 
   1038   BalancedDelimiterTracker T(*this, tok::l_paren);
   1039   T.consumeOpen();
   1040 
   1041   if (Tok.isNot(tok::identifier)) {
   1042     Diag(Tok, diag::err_expected_ident);
   1043     T.skipToEnd();
   1044     return;
   1045   }
   1046   IdentifierInfo *ArgumentKind = Tok.getIdentifierInfo();
   1047   SourceLocation ArgumentKindLoc = ConsumeToken();
   1048 
   1049   if (Tok.isNot(tok::comma)) {
   1050     Diag(Tok, diag::err_expected_comma);
   1051     T.skipToEnd();
   1052     return;
   1053   }
   1054   ConsumeToken();
   1055 
   1056   SourceRange MatchingCTypeRange;
   1057   TypeResult MatchingCType = ParseTypeName(&MatchingCTypeRange);
   1058   if (MatchingCType.isInvalid()) {
   1059     T.skipToEnd();
   1060     return;
   1061   }
   1062 
   1063   bool LayoutCompatible = false;
   1064   bool MustBeNull = false;
   1065   while (Tok.is(tok::comma)) {
   1066     ConsumeToken();
   1067     if (Tok.isNot(tok::identifier)) {
   1068       Diag(Tok, diag::err_expected_ident);
   1069       T.skipToEnd();
   1070       return;
   1071     }
   1072     IdentifierInfo *Flag = Tok.getIdentifierInfo();
   1073     if (Flag->isStr("layout_compatible"))
   1074       LayoutCompatible = true;
   1075     else if (Flag->isStr("must_be_null"))
   1076       MustBeNull = true;
   1077     else {
   1078       Diag(Tok, diag::err_type_safety_unknown_flag) << Flag;
   1079       T.skipToEnd();
   1080       return;
   1081     }
   1082     ConsumeToken(); // consume flag
   1083   }
   1084 
   1085   if (!T.consumeClose()) {
   1086     Attrs.addNewTypeTagForDatatype(&AttrName, AttrNameLoc, 0, AttrNameLoc,
   1087                                    ArgumentKind, ArgumentKindLoc,
   1088                                    MatchingCType.release(), LayoutCompatible,
   1089                                    MustBeNull, AttributeList::AS_GNU);
   1090   }
   1091 
   1092   if (EndLoc)
   1093     *EndLoc = T.getCloseLocation();
   1094 }
   1095 
   1096 /// DiagnoseProhibitedCXX11Attribute - We have found the opening square brackets
   1097 /// of a C++11 attribute-specifier in a location where an attribute is not
   1098 /// permitted. By C++11 [dcl.attr.grammar]p6, this is ill-formed. Diagnose this
   1099 /// situation.
   1100 ///
   1101 /// \return \c true if we skipped an attribute-like chunk of tokens, \c false if
   1102 /// this doesn't appear to actually be an attribute-specifier, and the caller
   1103 /// should try to parse it.
   1104 bool Parser::DiagnoseProhibitedCXX11Attribute() {
   1105   assert(Tok.is(tok::l_square) && NextToken().is(tok::l_square));
   1106 
   1107   switch (isCXX11AttributeSpecifier(/*Disambiguate*/true)) {
   1108   case CAK_NotAttributeSpecifier:
   1109     // No diagnostic: we're in Obj-C++11 and this is not actually an attribute.
   1110     return false;
   1111 
   1112   case CAK_InvalidAttributeSpecifier:
   1113     Diag(Tok.getLocation(), diag::err_l_square_l_square_not_attribute);
   1114     return false;
   1115 
   1116   case CAK_AttributeSpecifier:
   1117     // Parse and discard the attributes.
   1118     SourceLocation BeginLoc = ConsumeBracket();
   1119     ConsumeBracket();
   1120     SkipUntil(tok::r_square, /*StopAtSemi*/ false);
   1121     assert(Tok.is(tok::r_square) && "isCXX11AttributeSpecifier lied");
   1122     SourceLocation EndLoc = ConsumeBracket();
   1123     Diag(BeginLoc, diag::err_attributes_not_allowed)
   1124       << SourceRange(BeginLoc, EndLoc);
   1125     return true;
   1126   }
   1127   llvm_unreachable("All cases handled above.");
   1128 }
   1129 
   1130 void Parser::DiagnoseProhibitedAttributes(ParsedAttributesWithRange &attrs) {
   1131   Diag(attrs.Range.getBegin(), diag::err_attributes_not_allowed)
   1132     << attrs.Range;
   1133 }
   1134 
   1135 /// ParseDeclaration - Parse a full 'declaration', which consists of
   1136 /// declaration-specifiers, some number of declarators, and a semicolon.
   1137 /// 'Context' should be a Declarator::TheContext value.  This returns the
   1138 /// location of the semicolon in DeclEnd.
   1139 ///
   1140 ///       declaration: [C99 6.7]
   1141 ///         block-declaration ->
   1142 ///           simple-declaration
   1143 ///           others                   [FIXME]
   1144 /// [C++]   template-declaration
   1145 /// [C++]   namespace-definition
   1146 /// [C++]   using-directive
   1147 /// [C++]   using-declaration
   1148 /// [C++11/C11] static_assert-declaration
   1149 ///         others... [FIXME]
   1150 ///
   1151 Parser::DeclGroupPtrTy Parser::ParseDeclaration(StmtVector &Stmts,
   1152                                                 unsigned Context,
   1153                                                 SourceLocation &DeclEnd,
   1154                                           ParsedAttributesWithRange &attrs) {
   1155   ParenBraceBracketBalancer BalancerRAIIObj(*this);
   1156   // Must temporarily exit the objective-c container scope for
   1157   // parsing c none objective-c decls.
   1158   ObjCDeclContextSwitch ObjCDC(*this);
   1159 
   1160   Decl *SingleDecl = 0;
   1161   Decl *OwnedType = 0;
   1162   switch (Tok.getKind()) {
   1163   case tok::kw_template:
   1164   case tok::kw_export:
   1165     ProhibitAttributes(attrs);
   1166     SingleDecl = ParseDeclarationStartingWithTemplate(Context, DeclEnd);
   1167     break;
   1168   case tok::kw_inline:
   1169     // Could be the start of an inline namespace. Allowed as an ext in C++03.
   1170     if (getLangOpts().CPlusPlus && NextToken().is(tok::kw_namespace)) {
   1171       ProhibitAttributes(attrs);
   1172       SourceLocation InlineLoc = ConsumeToken();
   1173       SingleDecl = ParseNamespace(Context, DeclEnd, InlineLoc);
   1174       break;
   1175     }
   1176     return ParseSimpleDeclaration(Stmts, Context, DeclEnd, attrs,
   1177                                   true);
   1178   case tok::kw_namespace:
   1179     ProhibitAttributes(attrs);
   1180     SingleDecl = ParseNamespace(Context, DeclEnd);
   1181     break;
   1182   case tok::kw_using:
   1183     SingleDecl = ParseUsingDirectiveOrDeclaration(Context, ParsedTemplateInfo(),
   1184                                                   DeclEnd, attrs, &OwnedType);
   1185     break;
   1186   case tok::kw_static_assert:
   1187   case tok::kw__Static_assert:
   1188     ProhibitAttributes(attrs);
   1189     SingleDecl = ParseStaticAssertDeclaration(DeclEnd);
   1190     break;
   1191   default:
   1192     return ParseSimpleDeclaration(Stmts, Context, DeclEnd, attrs, true);
   1193   }
   1194 
   1195   // This routine returns a DeclGroup, if the thing we parsed only contains a
   1196   // single decl, convert it now. Alias declarations can also declare a type;
   1197   // include that too if it is present.
   1198   return Actions.ConvertDeclToDeclGroup(SingleDecl, OwnedType);
   1199 }
   1200 
   1201 ///       simple-declaration: [C99 6.7: declaration] [C++ 7p1: dcl.dcl]
   1202 ///         declaration-specifiers init-declarator-list[opt] ';'
   1203 /// [C++11] attribute-specifier-seq decl-specifier-seq[opt]
   1204 ///             init-declarator-list ';'
   1205 ///[C90/C++]init-declarator-list ';'                             [TODO]
   1206 /// [OMP]   threadprivate-directive                              [TODO]
   1207 ///
   1208 ///       for-range-declaration: [C++11 6.5p1: stmt.ranged]
   1209 ///         attribute-specifier-seq[opt] type-specifier-seq declarator
   1210 ///
   1211 /// If RequireSemi is false, this does not check for a ';' at the end of the
   1212 /// declaration.  If it is true, it checks for and eats it.
   1213 ///
   1214 /// If FRI is non-null, we might be parsing a for-range-declaration instead
   1215 /// of a simple-declaration. If we find that we are, we also parse the
   1216 /// for-range-initializer, and place it here.
   1217 Parser::DeclGroupPtrTy
   1218 Parser::ParseSimpleDeclaration(StmtVector &Stmts, unsigned Context,
   1219                                SourceLocation &DeclEnd,
   1220                                ParsedAttributesWithRange &attrs,
   1221                                bool RequireSemi, ForRangeInit *FRI) {
   1222   // Parse the common declaration-specifiers piece.
   1223   ParsingDeclSpec DS(*this);
   1224   DS.takeAttributesFrom(attrs);
   1225 
   1226   ParseDeclarationSpecifiers(DS, ParsedTemplateInfo(), AS_none,
   1227                              getDeclSpecContextFromDeclaratorContext(Context));
   1228 
   1229   // C99 6.7.2.3p6: Handle "struct-or-union identifier;", "enum { X };"
   1230   // declaration-specifiers init-declarator-list[opt] ';'
   1231   if (Tok.is(tok::semi)) {
   1232     DeclEnd = Tok.getLocation();
   1233     if (RequireSemi) ConsumeToken();
   1234     Decl *TheDecl = Actions.ParsedFreeStandingDeclSpec(getCurScope(), AS_none,
   1235                                                        DS);
   1236     DS.complete(TheDecl);
   1237     return Actions.ConvertDeclToDeclGroup(TheDecl);
   1238   }
   1239 
   1240   return ParseDeclGroup(DS, Context, /*FunctionDefs=*/ false, &DeclEnd, FRI);
   1241 }
   1242 
   1243 /// Returns true if this might be the start of a declarator, or a common typo
   1244 /// for a declarator.
   1245 bool Parser::MightBeDeclarator(unsigned Context) {
   1246   switch (Tok.getKind()) {
   1247   case tok::annot_cxxscope:
   1248   case tok::annot_template_id:
   1249   case tok::caret:
   1250   case tok::code_completion:
   1251   case tok::coloncolon:
   1252   case tok::ellipsis:
   1253   case tok::kw___attribute:
   1254   case tok::kw_operator:
   1255   case tok::l_paren:
   1256   case tok::star:
   1257     return true;
   1258 
   1259   case tok::amp:
   1260   case tok::ampamp:
   1261     return getLangOpts().CPlusPlus;
   1262 
   1263   case tok::l_square: // Might be an attribute on an unnamed bit-field.
   1264     return Context == Declarator::MemberContext && getLangOpts().CPlusPlus0x &&
   1265            NextToken().is(tok::l_square);
   1266 
   1267   case tok::colon: // Might be a typo for '::' or an unnamed bit-field.
   1268     return Context == Declarator::MemberContext || getLangOpts().CPlusPlus;
   1269 
   1270   case tok::identifier:
   1271     switch (NextToken().getKind()) {
   1272     case tok::code_completion:
   1273     case tok::coloncolon:
   1274     case tok::comma:
   1275     case tok::equal:
   1276     case tok::equalequal: // Might be a typo for '='.
   1277     case tok::kw_alignas:
   1278     case tok::kw_asm:
   1279     case tok::kw___attribute:
   1280     case tok::l_brace:
   1281     case tok::l_paren:
   1282     case tok::l_square:
   1283     case tok::less:
   1284     case tok::r_brace:
   1285     case tok::r_paren:
   1286     case tok::r_square:
   1287     case tok::semi:
   1288       return true;
   1289 
   1290     case tok::colon:
   1291       // At namespace scope, 'identifier:' is probably a typo for 'identifier::'
   1292       // and in block scope it's probably a label. Inside a class definition,
   1293       // this is a bit-field.
   1294       return Context == Declarator::MemberContext ||
   1295              (getLangOpts().CPlusPlus && Context == Declarator::FileContext);
   1296 
   1297     case tok::identifier: // Possible virt-specifier.
   1298       return getLangOpts().CPlusPlus0x && isCXX0XVirtSpecifier(NextToken());
   1299 
   1300     default:
   1301       return false;
   1302     }
   1303 
   1304   default:
   1305     return false;
   1306   }
   1307 }
   1308 
   1309 /// Skip until we reach something which seems like a sensible place to pick
   1310 /// up parsing after a malformed declaration. This will sometimes stop sooner
   1311 /// than SkipUntil(tok::r_brace) would, but will never stop later.
   1312 void Parser::SkipMalformedDecl() {
   1313   while (true) {
   1314     switch (Tok.getKind()) {
   1315     case tok::l_brace:
   1316       // Skip until matching }, then stop. We've probably skipped over
   1317       // a malformed class or function definition or similar.
   1318       ConsumeBrace();
   1319       SkipUntil(tok::r_brace, /*StopAtSemi*/false);
   1320       if (Tok.is(tok::comma) || Tok.is(tok::l_brace) || Tok.is(tok::kw_try)) {
   1321         // This declaration isn't over yet. Keep skipping.
   1322         continue;
   1323       }
   1324       if (Tok.is(tok::semi))
   1325         ConsumeToken();
   1326       return;
   1327 
   1328     case tok::l_square:
   1329       ConsumeBracket();
   1330       SkipUntil(tok::r_square, /*StopAtSemi*/false);
   1331       continue;
   1332 
   1333     case tok::l_paren:
   1334       ConsumeParen();
   1335       SkipUntil(tok::r_paren, /*StopAtSemi*/false);
   1336       continue;
   1337 
   1338     case tok::r_brace:
   1339       return;
   1340 
   1341     case tok::semi:
   1342       ConsumeToken();
   1343       return;
   1344 
   1345     case tok::kw_inline:
   1346       // 'inline namespace' at the start of a line is almost certainly
   1347       // a good place to pick back up parsing, except in an Objective-C
   1348       // @interface context.
   1349       if (Tok.isAtStartOfLine() && NextToken().is(tok::kw_namespace) &&
   1350           (!ParsingInObjCContainer || CurParsedObjCImpl))
   1351         return;
   1352       break;
   1353 
   1354     case tok::kw_namespace:
   1355       // 'namespace' at the start of a line is almost certainly a good
   1356       // place to pick back up parsing, except in an Objective-C
   1357       // @interface context.
   1358       if (Tok.isAtStartOfLine() &&
   1359           (!ParsingInObjCContainer || CurParsedObjCImpl))
   1360         return;
   1361       break;
   1362 
   1363     case tok::at:
   1364       // @end is very much like } in Objective-C contexts.
   1365       if (NextToken().isObjCAtKeyword(tok::objc_end) &&
   1366           ParsingInObjCContainer)
   1367         return;
   1368       break;
   1369 
   1370     case tok::minus:
   1371     case tok::plus:
   1372       // - and + probably start new method declarations in Objective-C contexts.
   1373       if (Tok.isAtStartOfLine() && ParsingInObjCContainer)
   1374         return;
   1375       break;
   1376 
   1377     case tok::eof:
   1378       return;
   1379 
   1380     default:
   1381       break;
   1382     }
   1383 
   1384     ConsumeAnyToken();
   1385   }
   1386 }
   1387 
   1388 /// ParseDeclGroup - Having concluded that this is either a function
   1389 /// definition or a group of object declarations, actually parse the
   1390 /// result.
   1391 Parser::DeclGroupPtrTy Parser::ParseDeclGroup(ParsingDeclSpec &DS,
   1392                                               unsigned Context,
   1393                                               bool AllowFunctionDefinitions,
   1394                                               SourceLocation *DeclEnd,
   1395                                               ForRangeInit *FRI) {
   1396   // Parse the first declarator.
   1397   ParsingDeclarator D(*this, DS, static_cast<Declarator::TheContext>(Context));
   1398   ParseDeclarator(D);
   1399 
   1400   // Bail out if the first declarator didn't seem well-formed.
   1401   if (!D.hasName() && !D.mayOmitIdentifier()) {
   1402     SkipMalformedDecl();
   1403     return DeclGroupPtrTy();
   1404   }
   1405 
   1406   // Save late-parsed attributes for now; they need to be parsed in the
   1407   // appropriate function scope after the function Decl has been constructed.
   1408   LateParsedAttrList LateParsedAttrs;
   1409   if (D.isFunctionDeclarator())
   1410     MaybeParseGNUAttributes(D, &LateParsedAttrs);
   1411 
   1412   // Check to see if we have a function *definition* which must have a body.
   1413   if (AllowFunctionDefinitions && D.isFunctionDeclarator() &&
   1414       // Look at the next token to make sure that this isn't a function
   1415       // declaration.  We have to check this because __attribute__ might be the
   1416       // start of a function definition in GCC-extended K&R C.
   1417       !isDeclarationAfterDeclarator()) {
   1418 
   1419     if (isStartOfFunctionDefinition(D)) {
   1420       if (DS.getStorageClassSpec() == DeclSpec::SCS_typedef) {
   1421         Diag(Tok, diag::err_function_declared_typedef);
   1422 
   1423         // Recover by treating the 'typedef' as spurious.
   1424         DS.ClearStorageClassSpecs();
   1425       }
   1426 
   1427       Decl *TheDecl =
   1428         ParseFunctionDefinition(D, ParsedTemplateInfo(), &LateParsedAttrs);
   1429       return Actions.ConvertDeclToDeclGroup(TheDecl);
   1430     }
   1431 
   1432     if (isDeclarationSpecifier()) {
   1433       // If there is an invalid declaration specifier right after the function
   1434       // prototype, then we must be in a missing semicolon case where this isn't
   1435       // actually a body.  Just fall through into the code that handles it as a
   1436       // prototype, and let the top-level code handle the erroneous declspec
   1437       // where it would otherwise expect a comma or semicolon.
   1438     } else {
   1439       Diag(Tok, diag::err_expected_fn_body);
   1440       SkipUntil(tok::semi);
   1441       return DeclGroupPtrTy();
   1442     }
   1443   }
   1444 
   1445   if (ParseAsmAttributesAfterDeclarator(D))
   1446     return DeclGroupPtrTy();
   1447 
   1448   // C++0x [stmt.iter]p1: Check if we have a for-range-declarator. If so, we
   1449   // must parse and analyze the for-range-initializer before the declaration is
   1450   // analyzed.
   1451   if (FRI && Tok.is(tok::colon)) {
   1452     FRI->ColonLoc = ConsumeToken();
   1453     if (Tok.is(tok::l_brace))
   1454       FRI->RangeExpr = ParseBraceInitializer();
   1455     else
   1456       FRI->RangeExpr = ParseExpression();
   1457     Decl *ThisDecl = Actions.ActOnDeclarator(getCurScope(), D);
   1458     Actions.ActOnCXXForRangeDecl(ThisDecl);
   1459     Actions.FinalizeDeclaration(ThisDecl);
   1460     D.complete(ThisDecl);
   1461     return Actions.FinalizeDeclaratorGroup(getCurScope(), DS, &ThisDecl, 1);
   1462   }
   1463 
   1464   SmallVector<Decl *, 8> DeclsInGroup;
   1465   Decl *FirstDecl = ParseDeclarationAfterDeclaratorAndAttributes(D);
   1466   if (LateParsedAttrs.size() > 0)
   1467     ParseLexedAttributeList(LateParsedAttrs, FirstDecl, true, false);
   1468   D.complete(FirstDecl);
   1469   if (FirstDecl)
   1470     DeclsInGroup.push_back(FirstDecl);
   1471 
   1472   bool ExpectSemi = Context != Declarator::ForContext;
   1473 
   1474   // If we don't have a comma, it is either the end of the list (a ';') or an
   1475   // error, bail out.
   1476   while (Tok.is(tok::comma)) {
   1477     SourceLocation CommaLoc = ConsumeToken();
   1478 
   1479     if (Tok.isAtStartOfLine() && ExpectSemi && !MightBeDeclarator(Context)) {
   1480       // This comma was followed by a line-break and something which can't be
   1481       // the start of a declarator. The comma was probably a typo for a
   1482       // semicolon.
   1483       Diag(CommaLoc, diag::err_expected_semi_declaration)
   1484         << FixItHint::CreateReplacement(CommaLoc, ";");
   1485       ExpectSemi = false;
   1486       break;
   1487     }
   1488 
   1489     // Parse the next declarator.
   1490     D.clear();
   1491     D.setCommaLoc(CommaLoc);
   1492 
   1493     // Accept attributes in an init-declarator.  In the first declarator in a
   1494     // declaration, these would be part of the declspec.  In subsequent
   1495     // declarators, they become part of the declarator itself, so that they
   1496     // don't apply to declarators after *this* one.  Examples:
   1497     //    short __attribute__((common)) var;    -> declspec
   1498     //    short var __attribute__((common));    -> declarator
   1499     //    short x, __attribute__((common)) var;    -> declarator
   1500     MaybeParseGNUAttributes(D);
   1501 
   1502     ParseDeclarator(D);
   1503     if (!D.isInvalidType()) {
   1504       Decl *ThisDecl = ParseDeclarationAfterDeclarator(D);
   1505       D.complete(ThisDecl);
   1506       if (ThisDecl)
   1507         DeclsInGroup.push_back(ThisDecl);
   1508     }
   1509   }
   1510 
   1511   if (DeclEnd)
   1512     *DeclEnd = Tok.getLocation();
   1513 
   1514   if (ExpectSemi &&
   1515       ExpectAndConsumeSemi(Context == Declarator::FileContext
   1516                            ? diag::err_invalid_token_after_toplevel_declarator
   1517                            : diag::err_expected_semi_declaration)) {
   1518     // Okay, there was no semicolon and one was expected.  If we see a
   1519     // declaration specifier, just assume it was missing and continue parsing.
   1520     // Otherwise things are very confused and we skip to recover.
   1521     if (!isDeclarationSpecifier()) {
   1522       SkipUntil(tok::r_brace, true, true);
   1523       if (Tok.is(tok::semi))
   1524         ConsumeToken();
   1525     }
   1526   }
   1527 
   1528   return Actions.FinalizeDeclaratorGroup(getCurScope(), DS,
   1529                                          DeclsInGroup.data(),
   1530                                          DeclsInGroup.size());
   1531 }
   1532 
   1533 /// Parse an optional simple-asm-expr and attributes, and attach them to a
   1534 /// declarator. Returns true on an error.
   1535 bool Parser::ParseAsmAttributesAfterDeclarator(Declarator &D) {
   1536   // If a simple-asm-expr is present, parse it.
   1537   if (Tok.is(tok::kw_asm)) {
   1538     SourceLocation Loc;
   1539     ExprResult AsmLabel(ParseSimpleAsm(&Loc));
   1540     if (AsmLabel.isInvalid()) {
   1541       SkipUntil(tok::semi, true, true);
   1542       return true;
   1543     }
   1544 
   1545     D.setAsmLabel(AsmLabel.release());
   1546     D.SetRangeEnd(Loc);
   1547   }
   1548 
   1549   MaybeParseGNUAttributes(D);
   1550   return false;
   1551 }
   1552 
   1553 /// \brief Parse 'declaration' after parsing 'declaration-specifiers
   1554 /// declarator'. This method parses the remainder of the declaration
   1555 /// (including any attributes or initializer, among other things) and
   1556 /// finalizes the declaration.
   1557 ///
   1558 ///       init-declarator: [C99 6.7]
   1559 ///         declarator
   1560 ///         declarator '=' initializer
   1561 /// [GNU]   declarator simple-asm-expr[opt] attributes[opt]
   1562 /// [GNU]   declarator simple-asm-expr[opt] attributes[opt] '=' initializer
   1563 /// [C++]   declarator initializer[opt]
   1564 ///
   1565 /// [C++] initializer:
   1566 /// [C++]   '=' initializer-clause
   1567 /// [C++]   '(' expression-list ')'
   1568 /// [C++0x] '=' 'default'                                                [TODO]
   1569 /// [C++0x] '=' 'delete'
   1570 /// [C++0x] braced-init-list
   1571 ///
   1572 /// According to the standard grammar, =default and =delete are function
   1573 /// definitions, but that definitely doesn't fit with the parser here.
   1574 ///
   1575 Decl *Parser::ParseDeclarationAfterDeclarator(Declarator &D,
   1576                                      const ParsedTemplateInfo &TemplateInfo) {
   1577   if (ParseAsmAttributesAfterDeclarator(D))
   1578     return 0;
   1579 
   1580   return ParseDeclarationAfterDeclaratorAndAttributes(D, TemplateInfo);
   1581 }
   1582 
   1583 Decl *Parser::ParseDeclarationAfterDeclaratorAndAttributes(Declarator &D,
   1584                                      const ParsedTemplateInfo &TemplateInfo) {
   1585   // Inform the current actions module that we just parsed this declarator.
   1586   Decl *ThisDecl = 0;
   1587   switch (TemplateInfo.Kind) {
   1588   case ParsedTemplateInfo::NonTemplate:
   1589     ThisDecl = Actions.ActOnDeclarator(getCurScope(), D);
   1590     break;
   1591 
   1592   case ParsedTemplateInfo::Template:
   1593   case ParsedTemplateInfo::ExplicitSpecialization:
   1594     ThisDecl = Actions.ActOnTemplateDeclarator(getCurScope(),
   1595                                                *TemplateInfo.TemplateParams,
   1596                                                D);
   1597     break;
   1598 
   1599   case ParsedTemplateInfo::ExplicitInstantiation: {
   1600     DeclResult ThisRes
   1601       = Actions.ActOnExplicitInstantiation(getCurScope(),
   1602                                            TemplateInfo.ExternLoc,
   1603                                            TemplateInfo.TemplateLoc,
   1604                                            D);
   1605     if (ThisRes.isInvalid()) {
   1606       SkipUntil(tok::semi, true, true);
   1607       return 0;
   1608     }
   1609 
   1610     ThisDecl = ThisRes.get();
   1611     break;
   1612     }
   1613   }
   1614 
   1615   bool TypeContainsAuto =
   1616     D.getDeclSpec().getTypeSpecType() == DeclSpec::TST_auto;
   1617 
   1618   // Parse declarator '=' initializer.
   1619   // If a '==' or '+=' is found, suggest a fixit to '='.
   1620   if (isTokenEqualOrEqualTypo()) {
   1621     ConsumeToken();
   1622     if (Tok.is(tok::kw_delete)) {
   1623       if (D.isFunctionDeclarator())
   1624         Diag(ConsumeToken(), diag::err_default_delete_in_multiple_declaration)
   1625           << 1 /* delete */;
   1626       else
   1627         Diag(ConsumeToken(), diag::err_deleted_non_function);
   1628     } else if (Tok.is(tok::kw_default)) {
   1629       if (D.isFunctionDeclarator())
   1630         Diag(ConsumeToken(), diag::err_default_delete_in_multiple_declaration)
   1631           << 0 /* default */;
   1632       else
   1633         Diag(ConsumeToken(), diag::err_default_special_members);
   1634     } else {
   1635       if (getLangOpts().CPlusPlus && D.getCXXScopeSpec().isSet()) {
   1636         EnterScope(0);
   1637         Actions.ActOnCXXEnterDeclInitializer(getCurScope(), ThisDecl);
   1638       }
   1639 
   1640       if (Tok.is(tok::code_completion)) {
   1641         Actions.CodeCompleteInitializer(getCurScope(), ThisDecl);
   1642         Actions.FinalizeDeclaration(ThisDecl);
   1643         cutOffParsing();
   1644         return 0;
   1645       }
   1646 
   1647       ExprResult Init(ParseInitializer());
   1648 
   1649       if (getLangOpts().CPlusPlus && D.getCXXScopeSpec().isSet()) {
   1650         Actions.ActOnCXXExitDeclInitializer(getCurScope(), ThisDecl);
   1651         ExitScope();
   1652       }
   1653 
   1654       if (Init.isInvalid()) {
   1655         SkipUntil(tok::comma, true, true);
   1656         Actions.ActOnInitializerError(ThisDecl);
   1657       } else
   1658         Actions.AddInitializerToDecl(ThisDecl, Init.take(),
   1659                                      /*DirectInit=*/false, TypeContainsAuto);
   1660     }
   1661   } else if (Tok.is(tok::l_paren)) {
   1662     // Parse C++ direct initializer: '(' expression-list ')'
   1663     BalancedDelimiterTracker T(*this, tok::l_paren);
   1664     T.consumeOpen();
   1665 
   1666     ExprVector Exprs;
   1667     CommaLocsTy CommaLocs;
   1668 
   1669     if (getLangOpts().CPlusPlus && D.getCXXScopeSpec().isSet()) {
   1670       EnterScope(0);
   1671       Actions.ActOnCXXEnterDeclInitializer(getCurScope(), ThisDecl);
   1672     }
   1673 
   1674     if (ParseExpressionList(Exprs, CommaLocs)) {
   1675       SkipUntil(tok::r_paren);
   1676 
   1677       if (getLangOpts().CPlusPlus && D.getCXXScopeSpec().isSet()) {
   1678         Actions.ActOnCXXExitDeclInitializer(getCurScope(), ThisDecl);
   1679         ExitScope();
   1680       }
   1681     } else {
   1682       // Match the ')'.
   1683       T.consumeClose();
   1684 
   1685       assert(!Exprs.empty() && Exprs.size()-1 == CommaLocs.size() &&
   1686              "Unexpected number of commas!");
   1687 
   1688       if (getLangOpts().CPlusPlus && D.getCXXScopeSpec().isSet()) {
   1689         Actions.ActOnCXXExitDeclInitializer(getCurScope(), ThisDecl);
   1690         ExitScope();
   1691       }
   1692 
   1693       ExprResult Initializer = Actions.ActOnParenListExpr(T.getOpenLocation(),
   1694                                                           T.getCloseLocation(),
   1695                                                           Exprs);
   1696       Actions.AddInitializerToDecl(ThisDecl, Initializer.take(),
   1697                                    /*DirectInit=*/true, TypeContainsAuto);
   1698     }
   1699   } else if (getLangOpts().CPlusPlus0x && Tok.is(tok::l_brace) &&
   1700              (!CurParsedObjCImpl || !D.isFunctionDeclarator())) {
   1701     // Parse C++0x braced-init-list.
   1702     Diag(Tok, diag::warn_cxx98_compat_generalized_initializer_lists);
   1703 
   1704     if (D.getCXXScopeSpec().isSet()) {
   1705       EnterScope(0);
   1706       Actions.ActOnCXXEnterDeclInitializer(getCurScope(), ThisDecl);
   1707     }
   1708 
   1709     ExprResult Init(ParseBraceInitializer());
   1710 
   1711     if (D.getCXXScopeSpec().isSet()) {
   1712       Actions.ActOnCXXExitDeclInitializer(getCurScope(), ThisDecl);
   1713       ExitScope();
   1714     }
   1715 
   1716     if (Init.isInvalid()) {
   1717       Actions.ActOnInitializerError(ThisDecl);
   1718     } else
   1719       Actions.AddInitializerToDecl(ThisDecl, Init.take(),
   1720                                    /*DirectInit=*/true, TypeContainsAuto);
   1721 
   1722   } else {
   1723     Actions.ActOnUninitializedDecl(ThisDecl, TypeContainsAuto);
   1724   }
   1725 
   1726   Actions.FinalizeDeclaration(ThisDecl);
   1727 
   1728   return ThisDecl;
   1729 }
   1730 
   1731 /// ParseSpecifierQualifierList
   1732 ///        specifier-qualifier-list:
   1733 ///          type-specifier specifier-qualifier-list[opt]
   1734 ///          type-qualifier specifier-qualifier-list[opt]
   1735 /// [GNU]    attributes     specifier-qualifier-list[opt]
   1736 ///
   1737 void Parser::ParseSpecifierQualifierList(DeclSpec &DS, AccessSpecifier AS,
   1738                                          DeclSpecContext DSC) {
   1739   /// specifier-qualifier-list is a subset of declaration-specifiers.  Just
   1740   /// parse declaration-specifiers and complain about extra stuff.
   1741   /// TODO: diagnose attribute-specifiers and alignment-specifiers.
   1742   ParseDeclarationSpecifiers(DS, ParsedTemplateInfo(), AS, DSC);
   1743 
   1744   // Validate declspec for type-name.
   1745   unsigned Specs = DS.getParsedSpecifiers();
   1746   if ((DSC == DSC_type_specifier || DSC == DSC_trailing) &&
   1747       !DS.hasTypeSpecifier()) {
   1748     Diag(Tok, diag::err_expected_type);
   1749     DS.SetTypeSpecError();
   1750   } else if (Specs == DeclSpec::PQ_None && !DS.getNumProtocolQualifiers() &&
   1751              !DS.hasAttributes()) {
   1752     Diag(Tok, diag::err_typename_requires_specqual);
   1753     if (!DS.hasTypeSpecifier())
   1754       DS.SetTypeSpecError();
   1755   }
   1756 
   1757   // Issue diagnostic and remove storage class if present.
   1758   if (Specs & DeclSpec::PQ_StorageClassSpecifier) {
   1759     if (DS.getStorageClassSpecLoc().isValid())
   1760       Diag(DS.getStorageClassSpecLoc(),diag::err_typename_invalid_storageclass);
   1761     else
   1762       Diag(DS.getThreadSpecLoc(), diag::err_typename_invalid_storageclass);
   1763     DS.ClearStorageClassSpecs();
   1764   }
   1765 
   1766   // Issue diagnostic and remove function specfier if present.
   1767   if (Specs & DeclSpec::PQ_FunctionSpecifier) {
   1768     if (DS.isInlineSpecified())
   1769       Diag(DS.getInlineSpecLoc(), diag::err_typename_invalid_functionspec);
   1770     if (DS.isVirtualSpecified())
   1771       Diag(DS.getVirtualSpecLoc(), diag::err_typename_invalid_functionspec);
   1772     if (DS.isExplicitSpecified())
   1773       Diag(DS.getExplicitSpecLoc(), diag::err_typename_invalid_functionspec);
   1774     DS.ClearFunctionSpecs();
   1775   }
   1776 
   1777   // Issue diagnostic and remove constexpr specfier if present.
   1778   if (DS.isConstexprSpecified()) {
   1779     Diag(DS.getConstexprSpecLoc(), diag::err_typename_invalid_constexpr);
   1780     DS.ClearConstexprSpec();
   1781   }
   1782 }
   1783 
   1784 /// isValidAfterIdentifierInDeclaratorAfterDeclSpec - Return true if the
   1785 /// specified token is valid after the identifier in a declarator which
   1786 /// immediately follows the declspec.  For example, these things are valid:
   1787 ///
   1788 ///      int x   [             4];         // direct-declarator
   1789 ///      int x   (             int y);     // direct-declarator
   1790 ///  int(int x   )                         // direct-declarator
   1791 ///      int x   ;                         // simple-declaration
   1792 ///      int x   =             17;         // init-declarator-list
   1793 ///      int x   ,             y;          // init-declarator-list
   1794 ///      int x   __asm__       ("foo");    // init-declarator-list
   1795 ///      int x   :             4;          // struct-declarator
   1796 ///      int x   {             5};         // C++'0x unified initializers
   1797 ///
   1798 /// This is not, because 'x' does not immediately follow the declspec (though
   1799 /// ')' happens to be valid anyway).
   1800 ///    int (x)
   1801 ///
   1802 static bool isValidAfterIdentifierInDeclarator(const Token &T) {
   1803   return T.is(tok::l_square) || T.is(tok::l_paren) || T.is(tok::r_paren) ||
   1804          T.is(tok::semi) || T.is(tok::comma) || T.is(tok::equal) ||
   1805          T.is(tok::kw_asm) || T.is(tok::l_brace) || T.is(tok::colon);
   1806 }
   1807 
   1808 
   1809 /// ParseImplicitInt - This method is called when we have an non-typename
   1810 /// identifier in a declspec (which normally terminates the decl spec) when
   1811 /// the declspec has no type specifier.  In this case, the declspec is either
   1812 /// malformed or is "implicit int" (in K&R and C89).
   1813 ///
   1814 /// This method handles diagnosing this prettily and returns false if the
   1815 /// declspec is done being processed.  If it recovers and thinks there may be
   1816 /// other pieces of declspec after it, it returns true.
   1817 ///
   1818 bool Parser::ParseImplicitInt(DeclSpec &DS, CXXScopeSpec *SS,
   1819                               const ParsedTemplateInfo &TemplateInfo,
   1820                               AccessSpecifier AS, DeclSpecContext DSC) {
   1821   assert(Tok.is(tok::identifier) && "should have identifier");
   1822 
   1823   SourceLocation Loc = Tok.getLocation();
   1824   // If we see an identifier that is not a type name, we normally would
   1825   // parse it as the identifer being declared.  However, when a typename
   1826   // is typo'd or the definition is not included, this will incorrectly
   1827   // parse the typename as the identifier name and fall over misparsing
   1828   // later parts of the diagnostic.
   1829   //
   1830   // As such, we try to do some look-ahead in cases where this would
   1831   // otherwise be an "implicit-int" case to see if this is invalid.  For
   1832   // example: "static foo_t x = 4;"  In this case, if we parsed foo_t as
   1833   // an identifier with implicit int, we'd get a parse error because the
   1834   // next token is obviously invalid for a type.  Parse these as a case
   1835   // with an invalid type specifier.
   1836   assert(!DS.hasTypeSpecifier() && "Type specifier checked above");
   1837 
   1838   // Since we know that this either implicit int (which is rare) or an
   1839   // error, do lookahead to try to do better recovery. This never applies
   1840   // within a type specifier. Outside of C++, we allow this even if the
   1841   // language doesn't "officially" support implicit int -- we support
   1842   // implicit int as an extension in C99 and C11. Allegedly, MS also
   1843   // supports implicit int in C++ mode.
   1844   if (DSC != DSC_type_specifier && DSC != DSC_trailing &&
   1845       (!getLangOpts().CPlusPlus || getLangOpts().MicrosoftExt) &&
   1846       isValidAfterIdentifierInDeclarator(NextToken())) {
   1847     // If this token is valid for implicit int, e.g. "static x = 4", then
   1848     // we just avoid eating the identifier, so it will be parsed as the
   1849     // identifier in the declarator.
   1850     return false;
   1851   }
   1852 
   1853   if (getLangOpts().CPlusPlus &&
   1854       DS.getStorageClassSpec() == DeclSpec::SCS_auto) {
   1855     // Don't require a type specifier if we have the 'auto' storage class
   1856     // specifier in C++98 -- we'll promote it to a type specifier.
   1857     return false;
   1858   }
   1859 
   1860   // Otherwise, if we don't consume this token, we are going to emit an
   1861   // error anyway.  Try to recover from various common problems.  Check
   1862   // to see if this was a reference to a tag name without a tag specified.
   1863   // This is a common problem in C (saying 'foo' instead of 'struct foo').
   1864   //
   1865   // C++ doesn't need this, and isTagName doesn't take SS.
   1866   if (SS == 0) {
   1867     const char *TagName = 0, *FixitTagName = 0;
   1868     tok::TokenKind TagKind = tok::unknown;
   1869 
   1870     switch (Actions.isTagName(*Tok.getIdentifierInfo(), getCurScope())) {
   1871       default: break;
   1872       case DeclSpec::TST_enum:
   1873         TagName="enum"  ; FixitTagName = "enum "  ; TagKind=tok::kw_enum ;break;
   1874       case DeclSpec::TST_union:
   1875         TagName="union" ; FixitTagName = "union " ;TagKind=tok::kw_union ;break;
   1876       case DeclSpec::TST_struct:
   1877         TagName="struct"; FixitTagName = "struct ";TagKind=tok::kw_struct;break;
   1878       case DeclSpec::TST_interface:
   1879         TagName="__interface"; FixitTagName = "__interface ";
   1880         TagKind=tok::kw___interface;break;
   1881       case DeclSpec::TST_class:
   1882         TagName="class" ; FixitTagName = "class " ;TagKind=tok::kw_class ;break;
   1883     }
   1884 
   1885     if (TagName) {
   1886       IdentifierInfo *TokenName = Tok.getIdentifierInfo();
   1887       LookupResult R(Actions, TokenName, SourceLocation(),
   1888                      Sema::LookupOrdinaryName);
   1889 
   1890       Diag(Loc, diag::err_use_of_tag_name_without_tag)
   1891         << TokenName << TagName << getLangOpts().CPlusPlus
   1892         << FixItHint::CreateInsertion(Tok.getLocation(), FixitTagName);
   1893 
   1894       if (Actions.LookupParsedName(R, getCurScope(), SS)) {
   1895         for (LookupResult::iterator I = R.begin(), IEnd = R.end();
   1896              I != IEnd; ++I)
   1897           Diag((*I)->getLocation(), diag::note_decl_hiding_tag_type)
   1898             << TokenName << TagName;
   1899       }
   1900 
   1901       // Parse this as a tag as if the missing tag were present.
   1902       if (TagKind == tok::kw_enum)
   1903         ParseEnumSpecifier(Loc, DS, TemplateInfo, AS, DSC_normal);
   1904       else
   1905         ParseClassSpecifier(TagKind, Loc, DS, TemplateInfo, AS,
   1906                             /*EnteringContext*/ false, DSC_normal);
   1907       return true;
   1908     }
   1909   }
   1910 
   1911   // Determine whether this identifier could plausibly be the name of something
   1912   // being declared (with a missing type).
   1913   if (DSC != DSC_type_specifier && DSC != DSC_trailing &&
   1914       (!SS || DSC == DSC_top_level || DSC == DSC_class)) {
   1915     // Look ahead to the next token to try to figure out what this declaration
   1916     // was supposed to be.
   1917     switch (NextToken().getKind()) {
   1918     case tok::comma:
   1919     case tok::equal:
   1920     case tok::kw_asm:
   1921     case tok::l_brace:
   1922     case tok::l_square:
   1923     case tok::semi:
   1924       // This looks like a variable declaration. The type is probably missing.
   1925       // We're done parsing decl-specifiers.
   1926       return false;
   1927 
   1928     case tok::l_paren: {
   1929       // static x(4); // 'x' is not a type
   1930       // x(int n);    // 'x' is not a type
   1931       // x (*p)[];    // 'x' is a type
   1932       //
   1933       // Since we're in an error case (or the rare 'implicit int in C++' MS
   1934       // extension), we can afford to perform a tentative parse to determine
   1935       // which case we're in.
   1936       TentativeParsingAction PA(*this);
   1937       ConsumeToken();
   1938       TPResult TPR = TryParseDeclarator(/*mayBeAbstract*/false);
   1939       PA.Revert();
   1940       if (TPR == TPResult::False())
   1941         return false;
   1942       // The identifier is followed by a parenthesized declarator.
   1943       // It's supposed to be a type.
   1944       break;
   1945     }
   1946 
   1947     default:
   1948       // This is probably supposed to be a type. This includes cases like:
   1949       //   int f(itn);
   1950       //   struct S { unsinged : 4; };
   1951       break;
   1952     }
   1953   }
   1954 
   1955   // This is almost certainly an invalid type name. Let the action emit a
   1956   // diagnostic and attempt to recover.
   1957   ParsedType T;
   1958   IdentifierInfo *II = Tok.getIdentifierInfo();
   1959   if (Actions.DiagnoseUnknownTypeName(II, Loc, getCurScope(), SS, T)) {
   1960     // The action emitted a diagnostic, so we don't have to.
   1961     if (T) {
   1962       // The action has suggested that the type T could be used. Set that as
   1963       // the type in the declaration specifiers, consume the would-be type
   1964       // name token, and we're done.
   1965       const char *PrevSpec;
   1966       unsigned DiagID;
   1967       DS.SetTypeSpecType(DeclSpec::TST_typename, Loc, PrevSpec, DiagID, T);
   1968       DS.SetRangeEnd(Tok.getLocation());
   1969       ConsumeToken();
   1970       // There may be other declaration specifiers after this.
   1971       return true;
   1972     } else if (II != Tok.getIdentifierInfo()) {
   1973       // If no type was suggested, the correction is to a keyword
   1974       Tok.setKind(II->getTokenID());
   1975       // There may be other declaration specifiers after this.
   1976       return true;
   1977     }
   1978 
   1979     // Fall through; the action had no suggestion for us.
   1980   } else {
   1981     // The action did not emit a diagnostic, so emit one now.
   1982     SourceRange R;
   1983     if (SS) R = SS->getRange();
   1984     Diag(Loc, diag::err_unknown_typename) << Tok.getIdentifierInfo() << R;
   1985   }
   1986 
   1987   // Mark this as an error.
   1988   DS.SetTypeSpecError();
   1989   DS.SetRangeEnd(Tok.getLocation());
   1990   ConsumeToken();
   1991 
   1992   // TODO: Could inject an invalid typedef decl in an enclosing scope to
   1993   // avoid rippling error messages on subsequent uses of the same type,
   1994   // could be useful if #include was forgotten.
   1995   return false;
   1996 }
   1997 
   1998 /// \brief Determine the declaration specifier context from the declarator
   1999 /// context.
   2000 ///
   2001 /// \param Context the declarator context, which is one of the
   2002 /// Declarator::TheContext enumerator values.
   2003 Parser::DeclSpecContext
   2004 Parser::getDeclSpecContextFromDeclaratorContext(unsigned Context) {
   2005   if (Context == Declarator::MemberContext)
   2006     return DSC_class;
   2007   if (Context == Declarator::FileContext)
   2008     return DSC_top_level;
   2009   if (Context == Declarator::TrailingReturnContext)
   2010     return DSC_trailing;
   2011   return DSC_normal;
   2012 }
   2013 
   2014 /// ParseAlignArgument - Parse the argument to an alignment-specifier.
   2015 ///
   2016 /// FIXME: Simply returns an alignof() expression if the argument is a
   2017 /// type. Ideally, the type should be propagated directly into Sema.
   2018 ///
   2019 /// [C11]   type-id
   2020 /// [C11]   constant-expression
   2021 /// [C++0x] type-id ...[opt]
   2022 /// [C++0x] assignment-expression ...[opt]
   2023 ExprResult Parser::ParseAlignArgument(SourceLocation Start,
   2024                                       SourceLocation &EllipsisLoc) {
   2025   ExprResult ER;
   2026   if (isTypeIdInParens()) {
   2027     SourceLocation TypeLoc = Tok.getLocation();
   2028     ParsedType Ty = ParseTypeName().get();
   2029     SourceRange TypeRange(Start, Tok.getLocation());
   2030     ER = Actions.ActOnUnaryExprOrTypeTraitExpr(TypeLoc, UETT_AlignOf, true,
   2031                                                Ty.getAsOpaquePtr(), TypeRange);
   2032   } else
   2033     ER = ParseConstantExpression();
   2034 
   2035   if (getLangOpts().CPlusPlus0x && Tok.is(tok::ellipsis))
   2036     EllipsisLoc = ConsumeToken();
   2037 
   2038   return ER;
   2039 }
   2040 
   2041 /// ParseAlignmentSpecifier - Parse an alignment-specifier, and add the
   2042 /// attribute to Attrs.
   2043 ///
   2044 /// alignment-specifier:
   2045 /// [C11]   '_Alignas' '(' type-id ')'
   2046 /// [C11]   '_Alignas' '(' constant-expression ')'
   2047 /// [C++0x] 'alignas' '(' type-id ...[opt] ')'
   2048 /// [C++0x] 'alignas' '(' assignment-expression ...[opt] ')'
   2049 void Parser::ParseAlignmentSpecifier(ParsedAttributes &Attrs,
   2050                                      SourceLocation *endLoc) {
   2051   assert((Tok.is(tok::kw_alignas) || Tok.is(tok::kw__Alignas)) &&
   2052          "Not an alignment-specifier!");
   2053 
   2054   SourceLocation KWLoc = Tok.getLocation();
   2055   ConsumeToken();
   2056 
   2057   BalancedDelimiterTracker T(*this, tok::l_paren);
   2058   if (T.expectAndConsume(diag::err_expected_lparen))
   2059     return;
   2060 
   2061   SourceLocation EllipsisLoc;
   2062   ExprResult ArgExpr = ParseAlignArgument(T.getOpenLocation(), EllipsisLoc);
   2063   if (ArgExpr.isInvalid()) {
   2064     SkipUntil(tok::r_paren);
   2065     return;
   2066   }
   2067 
   2068   T.consumeClose();
   2069   if (endLoc)
   2070     *endLoc = T.getCloseLocation();
   2071 
   2072   // FIXME: Handle pack-expansions here.
   2073   if (EllipsisLoc.isValid()) {
   2074     Diag(EllipsisLoc, diag::err_alignas_pack_exp_unsupported);
   2075     return;
   2076   }
   2077 
   2078   ExprVector ArgExprs;
   2079   ArgExprs.push_back(ArgExpr.release());
   2080   // FIXME: This should not be GNU, but we since the attribute used is
   2081   //        based on the spelling, and there is no true spelling for
   2082   //        C++11 attributes, this isn't accepted.
   2083   Attrs.addNew(PP.getIdentifierInfo("aligned"), KWLoc, 0, KWLoc,
   2084                0, T.getOpenLocation(), ArgExprs.data(), 1,
   2085                AttributeList::AS_GNU);
   2086 }
   2087 
   2088 /// ParseDeclarationSpecifiers
   2089 ///       declaration-specifiers: [C99 6.7]
   2090 ///         storage-class-specifier declaration-specifiers[opt]
   2091 ///         type-specifier declaration-specifiers[opt]
   2092 /// [C99]   function-specifier declaration-specifiers[opt]
   2093 /// [C11]   alignment-specifier declaration-specifiers[opt]
   2094 /// [GNU]   attributes declaration-specifiers[opt]
   2095 /// [Clang] '__module_private__' declaration-specifiers[opt]
   2096 ///
   2097 ///       storage-class-specifier: [C99 6.7.1]
   2098 ///         'typedef'
   2099 ///         'extern'
   2100 ///         'static'
   2101 ///         'auto'
   2102 ///         'register'
   2103 /// [C++]   'mutable'
   2104 /// [GNU]   '__thread'
   2105 ///       function-specifier: [C99 6.7.4]
   2106 /// [C99]   'inline'
   2107 /// [C++]   'virtual'
   2108 /// [C++]   'explicit'
   2109 /// [OpenCL] '__kernel'
   2110 ///       'friend': [C++ dcl.friend]
   2111 ///       'constexpr': [C++0x dcl.constexpr]
   2112 
   2113 ///
   2114 void Parser::ParseDeclarationSpecifiers(DeclSpec &DS,
   2115                                         const ParsedTemplateInfo &TemplateInfo,
   2116                                         AccessSpecifier AS,
   2117                                         DeclSpecContext DSContext,
   2118                                         LateParsedAttrList *LateAttrs) {
   2119   if (DS.getSourceRange().isInvalid()) {
   2120     DS.SetRangeStart(Tok.getLocation());
   2121     DS.SetRangeEnd(Tok.getLocation());
   2122   }
   2123 
   2124   bool EnteringContext = (DSContext == DSC_class || DSContext == DSC_top_level);
   2125   bool AttrsLastTime = false;
   2126   ParsedAttributesWithRange attrs(AttrFactory);
   2127   while (1) {
   2128     bool isInvalid = false;
   2129     const char *PrevSpec = 0;
   2130     unsigned DiagID = 0;
   2131 
   2132     SourceLocation Loc = Tok.getLocation();
   2133 
   2134     switch (Tok.getKind()) {
   2135     default:
   2136     DoneWithDeclSpec:
   2137       if (!AttrsLastTime)
   2138         ProhibitAttributes(attrs);
   2139       else
   2140         DS.takeAttributesFrom(attrs);
   2141 
   2142       // If this is not a declaration specifier token, we're done reading decl
   2143       // specifiers.  First verify that DeclSpec's are consistent.
   2144       DS.Finish(Diags, PP);
   2145       return;
   2146 
   2147     case tok::l_square:
   2148     case tok::kw_alignas:
   2149       if (!isCXX11AttributeSpecifier())
   2150         goto DoneWithDeclSpec;
   2151 
   2152       ProhibitAttributes(attrs);
   2153       // FIXME: It would be good to recover by accepting the attributes,
   2154       //        but attempting to do that now would cause serious
   2155       //        madness in terms of diagnostics.
   2156       attrs.clear();
   2157       attrs.Range = SourceRange();
   2158 
   2159       ParseCXX11Attributes(attrs);
   2160       AttrsLastTime = true;
   2161       continue;
   2162 
   2163     case tok::code_completion: {
   2164       Sema::ParserCompletionContext CCC = Sema::PCC_Namespace;
   2165       if (DS.hasTypeSpecifier()) {
   2166         bool AllowNonIdentifiers
   2167           = (getCurScope()->getFlags() & (Scope::ControlScope |
   2168                                           Scope::BlockScope |
   2169                                           Scope::TemplateParamScope |
   2170                                           Scope::FunctionPrototypeScope |
   2171                                           Scope::AtCatchScope)) == 0;
   2172         bool AllowNestedNameSpecifiers
   2173           = DSContext == DSC_top_level ||
   2174             (DSContext == DSC_class && DS.isFriendSpecified());
   2175 
   2176         Actions.CodeCompleteDeclSpec(getCurScope(), DS,
   2177                                      AllowNonIdentifiers,
   2178                                      AllowNestedNameSpecifiers);
   2179         return cutOffParsing();
   2180       }
   2181 
   2182       if (getCurScope()->getFnParent() || getCurScope()->getBlockParent())
   2183         CCC = Sema::PCC_LocalDeclarationSpecifiers;
   2184       else if (TemplateInfo.Kind != ParsedTemplateInfo::NonTemplate)
   2185         CCC = DSContext == DSC_class? Sema::PCC_MemberTemplate
   2186                                     : Sema::PCC_Template;
   2187       else if (DSContext == DSC_class)
   2188         CCC = Sema::PCC_Class;
   2189       else if (CurParsedObjCImpl)
   2190         CCC = Sema::PCC_ObjCImplementation;
   2191 
   2192       Actions.CodeCompleteOrdinaryName(getCurScope(), CCC);
   2193       return cutOffParsing();
   2194     }
   2195 
   2196     case tok::coloncolon: // ::foo::bar
   2197       // C++ scope specifier.  Annotate and loop, or bail out on error.
   2198       if (TryAnnotateCXXScopeToken(true)) {
   2199         if (!DS.hasTypeSpecifier())
   2200           DS.SetTypeSpecError();
   2201         goto DoneWithDeclSpec;
   2202       }
   2203       if (Tok.is(tok::coloncolon)) // ::new or ::delete
   2204         goto DoneWithDeclSpec;
   2205       continue;
   2206 
   2207     case tok::annot_cxxscope: {
   2208       if (DS.hasTypeSpecifier() || DS.isTypeAltiVecVector())
   2209         goto DoneWithDeclSpec;
   2210 
   2211       CXXScopeSpec SS;
   2212       Actions.RestoreNestedNameSpecifierAnnotation(Tok.getAnnotationValue(),
   2213                                                    Tok.getAnnotationRange(),
   2214                                                    SS);
   2215 
   2216       // We are looking for a qualified typename.
   2217       Token Next = NextToken();
   2218       if (Next.is(tok::annot_template_id) &&
   2219           static_cast<TemplateIdAnnotation *>(Next.getAnnotationValue())
   2220             ->Kind == TNK_Type_template) {
   2221         // We have a qualified template-id, e.g., N::A<int>
   2222 
   2223         // C++ [class.qual]p2:
   2224         //   In a lookup in which the constructor is an acceptable lookup
   2225         //   result and the nested-name-specifier nominates a class C:
   2226         //
   2227         //     - if the name specified after the
   2228         //       nested-name-specifier, when looked up in C, is the
   2229         //       injected-class-name of C (Clause 9), or
   2230         //
   2231         //     - if the name specified after the nested-name-specifier
   2232         //       is the same as the identifier or the
   2233         //       simple-template-id's template-name in the last
   2234         //       component of the nested-name-specifier,
   2235         //
   2236         //   the name is instead considered to name the constructor of
   2237         //   class C.
   2238         //
   2239         // Thus, if the template-name is actually the constructor
   2240         // name, then the code is ill-formed; this interpretation is
   2241         // reinforced by the NAD status of core issue 635.
   2242         TemplateIdAnnotation *TemplateId = takeTemplateIdAnnotation(Next);
   2243         if ((DSContext == DSC_top_level ||
   2244              (DSContext == DSC_class && DS.isFriendSpecified())) &&
   2245             TemplateId->Name &&
   2246             Actions.isCurrentClassName(*TemplateId->Name, getCurScope(), &SS)) {
   2247           if (isConstructorDeclarator()) {
   2248             // The user meant this to be an out-of-line constructor
   2249             // definition, but template arguments are not allowed
   2250             // there.  Just allow this as a constructor; we'll
   2251             // complain about it later.
   2252             goto DoneWithDeclSpec;
   2253           }
   2254 
   2255           // The user meant this to name a type, but it actually names
   2256           // a constructor with some extraneous template
   2257           // arguments. Complain, then parse it as a type as the user
   2258           // intended.
   2259           Diag(TemplateId->TemplateNameLoc,
   2260                diag::err_out_of_line_template_id_names_constructor)
   2261             << TemplateId->Name;
   2262         }
   2263 
   2264         DS.getTypeSpecScope() = SS;
   2265         ConsumeToken(); // The C++ scope.
   2266         assert(Tok.is(tok::annot_template_id) &&
   2267                "ParseOptionalCXXScopeSpecifier not working");
   2268         AnnotateTemplateIdTokenAsType();
   2269         continue;
   2270       }
   2271 
   2272       if (Next.is(tok::annot_typename)) {
   2273         DS.getTypeSpecScope() = SS;
   2274         ConsumeToken(); // The C++ scope.
   2275         if (Tok.getAnnotationValue()) {
   2276           ParsedType T = getTypeAnnotation(Tok);
   2277           isInvalid = DS.SetTypeSpecType(DeclSpec::TST_typename,
   2278                                          Tok.getAnnotationEndLoc(),
   2279                                          PrevSpec, DiagID, T);
   2280         }
   2281         else
   2282           DS.SetTypeSpecError();
   2283         DS.SetRangeEnd(Tok.getAnnotationEndLoc());
   2284         ConsumeToken(); // The typename
   2285       }
   2286 
   2287       if (Next.isNot(tok::identifier))
   2288         goto DoneWithDeclSpec;
   2289 
   2290       // If we're in a context where the identifier could be a class name,
   2291       // check whether this is a constructor declaration.
   2292       if ((DSContext == DSC_top_level ||
   2293            (DSContext == DSC_class && DS.isFriendSpecified())) &&
   2294           Actions.isCurrentClassName(*Next.getIdentifierInfo(), getCurScope(),
   2295                                      &SS)) {
   2296         if (isConstructorDeclarator())
   2297           goto DoneWithDeclSpec;
   2298 
   2299         // As noted in C++ [class.qual]p2 (cited above), when the name
   2300         // of the class is qualified in a context where it could name
   2301         // a constructor, its a constructor name. However, we've
   2302         // looked at the declarator, and the user probably meant this
   2303         // to be a type. Complain that it isn't supposed to be treated
   2304         // as a type, then proceed to parse it as a type.
   2305         Diag(Next.getLocation(), diag::err_out_of_line_type_names_constructor)
   2306           << Next.getIdentifierInfo();
   2307       }
   2308 
   2309       ParsedType TypeRep = Actions.getTypeName(*Next.getIdentifierInfo(),
   2310                                                Next.getLocation(),
   2311                                                getCurScope(), &SS,
   2312                                                false, false, ParsedType(),
   2313                                                /*IsCtorOrDtorName=*/false,
   2314                                                /*NonTrivialSourceInfo=*/true);
   2315 
   2316       // If the referenced identifier is not a type, then this declspec is
   2317       // erroneous: We already checked about that it has no type specifier, and
   2318       // C++ doesn't have implicit int.  Diagnose it as a typo w.r.t. to the
   2319       // typename.
   2320       if (TypeRep == 0) {
   2321         ConsumeToken();   // Eat the scope spec so the identifier is current.
   2322         if (ParseImplicitInt(DS, &SS, TemplateInfo, AS, DSContext)) continue;
   2323         goto DoneWithDeclSpec;
   2324       }
   2325 
   2326       DS.getTypeSpecScope() = SS;
   2327       ConsumeToken(); // The C++ scope.
   2328 
   2329       isInvalid = DS.SetTypeSpecType(DeclSpec::TST_typename, Loc, PrevSpec,
   2330                                      DiagID, TypeRep);
   2331       if (isInvalid)
   2332         break;
   2333 
   2334       DS.SetRangeEnd(Tok.getLocation());
   2335       ConsumeToken(); // The typename.
   2336 
   2337       continue;
   2338     }
   2339 
   2340     case tok::annot_typename: {
   2341       if (Tok.getAnnotationValue()) {
   2342         ParsedType T = getTypeAnnotation(Tok);
   2343         isInvalid = DS.SetTypeSpecType(DeclSpec::TST_typename, Loc, PrevSpec,
   2344                                        DiagID, T);
   2345       } else
   2346         DS.SetTypeSpecError();
   2347 
   2348       if (isInvalid)
   2349         break;
   2350 
   2351       DS.SetRangeEnd(Tok.getAnnotationEndLoc());
   2352       ConsumeToken(); // The typename
   2353 
   2354       // Objective-C supports syntax of the form 'id<proto1,proto2>' where 'id'
   2355       // is a specific typedef and 'itf<proto1,proto2>' where 'itf' is an
   2356       // Objective-C interface.
   2357       if (Tok.is(tok::less) && getLangOpts().ObjC1)
   2358         ParseObjCProtocolQualifiers(DS);
   2359 
   2360       continue;
   2361     }
   2362 
   2363     case tok::kw___is_signed:
   2364       // GNU libstdc++ 4.4 uses __is_signed as an identifier, but Clang
   2365       // typically treats it as a trait. If we see __is_signed as it appears
   2366       // in libstdc++, e.g.,
   2367       //
   2368       //   static const bool __is_signed;
   2369       //
   2370       // then treat __is_signed as an identifier rather than as a keyword.
   2371       if (DS.getTypeSpecType() == TST_bool &&
   2372           DS.getTypeQualifiers() == DeclSpec::TQ_const &&
   2373           DS.getStorageClassSpec() == DeclSpec::SCS_static) {
   2374         Tok.getIdentifierInfo()->RevertTokenIDToIdentifier();
   2375         Tok.setKind(tok::identifier);
   2376       }
   2377 
   2378       // We're done with the declaration-specifiers.
   2379       goto DoneWithDeclSpec;
   2380 
   2381       // typedef-name
   2382     case tok::kw_decltype:
   2383     case tok::identifier: {
   2384       // In C++, check to see if this is a scope specifier like foo::bar::, if
   2385       // so handle it as such.  This is important for ctor parsing.
   2386       if (getLangOpts().CPlusPlus) {
   2387         if (TryAnnotateCXXScopeToken(true)) {
   2388           if (!DS.hasTypeSpecifier())
   2389             DS.SetTypeSpecError();
   2390           goto DoneWithDeclSpec;
   2391         }
   2392         if (!Tok.is(tok::identifier))
   2393           continue;
   2394       }
   2395 
   2396       // This identifier can only be a typedef name if we haven't already seen
   2397       // a type-specifier.  Without this check we misparse:
   2398       //  typedef int X; struct Y { short X; };  as 'short int'.
   2399       if (DS.hasTypeSpecifier())
   2400         goto DoneWithDeclSpec;
   2401 
   2402       // Check for need to substitute AltiVec keyword tokens.
   2403       if (TryAltiVecToken(DS, Loc, PrevSpec, DiagID, isInvalid))
   2404         break;
   2405 
   2406       // [AltiVec] 2.2: [If the 'vector' specifier is used] The syntax does not
   2407       //                allow the use of a typedef name as a type specifier.
   2408       if (DS.isTypeAltiVecVector())
   2409         goto DoneWithDeclSpec;
   2410 
   2411       ParsedType TypeRep =
   2412         Actions.getTypeName(*Tok.getIdentifierInfo(),
   2413                             Tok.getLocation(), getCurScope());
   2414 
   2415       // If this is not a typedef name, don't parse it as part of the declspec,
   2416       // it must be an implicit int or an error.
   2417       if (!TypeRep) {
   2418         if (ParseImplicitInt(DS, 0, TemplateInfo, AS, DSContext)) continue;
   2419         goto DoneWithDeclSpec;
   2420       }
   2421 
   2422       // If we're in a context where the identifier could be a class name,
   2423       // check whether this is a constructor declaration.
   2424       if (getLangOpts().CPlusPlus && DSContext == DSC_class &&
   2425           Actions.isCurrentClassName(*Tok.getIdentifierInfo(), getCurScope()) &&
   2426           isConstructorDeclarator())
   2427         goto DoneWithDeclSpec;
   2428 
   2429       isInvalid = DS.SetTypeSpecType(DeclSpec::TST_typename, Loc, PrevSpec,
   2430                                      DiagID, TypeRep);
   2431       if (isInvalid)
   2432         break;
   2433 
   2434       DS.SetRangeEnd(Tok.getLocation());
   2435       ConsumeToken(); // The identifier
   2436 
   2437       // Objective-C supports syntax of the form 'id<proto1,proto2>' where 'id'
   2438       // is a specific typedef and 'itf<proto1,proto2>' where 'itf' is an
   2439       // Objective-C interface.
   2440       if (Tok.is(tok::less) && getLangOpts().ObjC1)
   2441         ParseObjCProtocolQualifiers(DS);
   2442 
   2443       // Need to support trailing type qualifiers (e.g. "id<p> const").
   2444       // If a type specifier follows, it will be diagnosed elsewhere.
   2445       continue;
   2446     }
   2447 
   2448       // type-name
   2449     case tok::annot_template_id: {
   2450       TemplateIdAnnotation *TemplateId = takeTemplateIdAnnotation(Tok);
   2451       if (TemplateId->Kind != TNK_Type_template) {
   2452         // This template-id does not refer to a type name, so we're
   2453         // done with the type-specifiers.
   2454         goto DoneWithDeclSpec;
   2455       }
   2456 
   2457       // If we're in a context where the template-id could be a
   2458       // constructor name or specialization, check whether this is a
   2459       // constructor declaration.
   2460       if (getLangOpts().CPlusPlus && DSContext == DSC_class &&
   2461           Actions.isCurrentClassName(*TemplateId->Name, getCurScope()) &&
   2462           isConstructorDeclarator())
   2463         goto DoneWithDeclSpec;
   2464 
   2465       // Turn the template-id annotation token into a type annotation
   2466       // token, then try again to parse it as a type-specifier.
   2467       AnnotateTemplateIdTokenAsType();
   2468       continue;
   2469     }
   2470 
   2471     // GNU attributes support.
   2472     case tok::kw___attribute:
   2473       ParseGNUAttributes(DS.getAttributes(), 0, LateAttrs);
   2474       continue;
   2475 
   2476     // Microsoft declspec support.
   2477     case tok::kw___declspec:
   2478       ParseMicrosoftDeclSpec(DS.getAttributes());
   2479       continue;
   2480 
   2481     // Microsoft single token adornments.
   2482     case tok::kw___forceinline: {
   2483       isInvalid = DS.SetFunctionSpecInline(Loc, PrevSpec, DiagID);
   2484       IdentifierInfo *AttrName = Tok.getIdentifierInfo();
   2485       SourceLocation AttrNameLoc = ConsumeToken();
   2486       // FIXME: This does not work correctly if it is set to be a declspec
   2487       //        attribute, and a GNU attribute is simply incorrect.
   2488       DS.getAttributes().addNew(AttrName, AttrNameLoc, 0, AttrNameLoc, 0,
   2489                                 SourceLocation(), 0, 0, AttributeList::AS_GNU);
   2490       continue;
   2491     }
   2492 
   2493     case tok::kw___ptr64:
   2494     case tok::kw___ptr32:
   2495     case tok::kw___w64:
   2496     case tok::kw___cdecl:
   2497     case tok::kw___stdcall:
   2498     case tok::kw___fastcall:
   2499     case tok::kw___thiscall:
   2500     case tok::kw___unaligned:
   2501       ParseMicrosoftTypeAttributes(DS.getAttributes());
   2502       continue;
   2503 
   2504     // Borland single token adornments.
   2505     case tok::kw___pascal:
   2506       ParseBorlandTypeAttributes(DS.getAttributes());
   2507       continue;
   2508 
   2509     // OpenCL single token adornments.
   2510     case tok::kw___kernel:
   2511       ParseOpenCLAttributes(DS.getAttributes());
   2512       continue;
   2513 
   2514     // storage-class-specifier
   2515     case tok::kw_typedef:
   2516       isInvalid = DS.SetStorageClassSpec(Actions, DeclSpec::SCS_typedef, Loc,
   2517                                          PrevSpec, DiagID);
   2518       break;
   2519     case tok::kw_extern:
   2520       if (DS.isThreadSpecified())
   2521         Diag(Tok, diag::ext_thread_before) << "extern";
   2522       isInvalid = DS.SetStorageClassSpec(Actions, DeclSpec::SCS_extern, Loc,
   2523                                          PrevSpec, DiagID);
   2524       break;
   2525     case tok::kw___private_extern__:
   2526       isInvalid = DS.SetStorageClassSpec(Actions, DeclSpec::SCS_private_extern,
   2527                                          Loc, PrevSpec, DiagID);
   2528       break;
   2529     case tok::kw_static:
   2530       if (DS.isThreadSpecified())
   2531         Diag(Tok, diag::ext_thread_before) << "static";
   2532       isInvalid = DS.SetStorageClassSpec(Actions, DeclSpec::SCS_static, Loc,
   2533                                          PrevSpec, DiagID);
   2534       break;
   2535     case tok::kw_auto:
   2536       if (getLangOpts().CPlusPlus0x) {
   2537         if (isKnownToBeTypeSpecifier(GetLookAheadToken(1))) {
   2538           isInvalid = DS.SetStorageClassSpec(Actions, DeclSpec::SCS_auto, Loc,
   2539                                              PrevSpec, DiagID);
   2540           if (!isInvalid)
   2541             Diag(Tok, diag::ext_auto_storage_class)
   2542               << FixItHint::CreateRemoval(DS.getStorageClassSpecLoc());
   2543         } else
   2544           isInvalid = DS.SetTypeSpecType(DeclSpec::TST_auto, Loc, PrevSpec,
   2545                                          DiagID);
   2546       } else
   2547         isInvalid = DS.SetStorageClassSpec(Actions, DeclSpec::SCS_auto, Loc,
   2548                                            PrevSpec, DiagID);
   2549       break;
   2550     case tok::kw_register:
   2551       isInvalid = DS.SetStorageClassSpec(Actions, DeclSpec::SCS_register, Loc,
   2552                                          PrevSpec, DiagID);
   2553       break;
   2554     case tok::kw_mutable:
   2555       isInvalid = DS.SetStorageClassSpec(Actions, DeclSpec::SCS_mutable, Loc,
   2556                                          PrevSpec, DiagID);
   2557       break;
   2558     case tok::kw___thread:
   2559       isInvalid = DS.SetStorageClassSpecThread(Loc, PrevSpec, DiagID);
   2560       break;
   2561 
   2562     // function-specifier
   2563     case tok::kw_inline:
   2564       isInvalid = DS.SetFunctionSpecInline(Loc, PrevSpec, DiagID);
   2565       break;
   2566     case tok::kw_virtual:
   2567       isInvalid = DS.SetFunctionSpecVirtual(Loc, PrevSpec, DiagID);
   2568       break;
   2569     case tok::kw_explicit:
   2570       isInvalid = DS.SetFunctionSpecExplicit(Loc, PrevSpec, DiagID);
   2571       break;
   2572 
   2573     // alignment-specifier
   2574     case tok::kw__Alignas:
   2575       if (!getLangOpts().C11)
   2576         Diag(Tok, diag::ext_c11_alignment) << Tok.getName();
   2577       ParseAlignmentSpecifier(DS.getAttributes());
   2578       continue;
   2579 
   2580     // friend
   2581     case tok::kw_friend:
   2582       if (DSContext == DSC_class)
   2583         isInvalid = DS.SetFriendSpec(Loc, PrevSpec, DiagID);
   2584       else {
   2585         PrevSpec = ""; // not actually used by the diagnostic
   2586         DiagID = diag::err_friend_invalid_in_context;
   2587         isInvalid = true;
   2588       }
   2589       break;
   2590 
   2591     // Modules
   2592     case tok::kw___module_private__:
   2593       isInvalid = DS.setModulePrivateSpec(Loc, PrevSpec, DiagID);
   2594       break;
   2595 
   2596     // constexpr
   2597     case tok::kw_constexpr:
   2598       isInvalid = DS.SetConstexprSpec(Loc, PrevSpec, DiagID);
   2599       break;
   2600 
   2601     // type-specifier
   2602     case tok::kw_short:
   2603       isInvalid = DS.SetTypeSpecWidth(DeclSpec::TSW_short, Loc, PrevSpec,
   2604                                       DiagID);
   2605       break;
   2606     case tok::kw_long:
   2607       if (DS.getTypeSpecWidth() != DeclSpec::TSW_long)
   2608         isInvalid = DS.SetTypeSpecWidth(DeclSpec::TSW_long, Loc, PrevSpec,
   2609                                         DiagID);
   2610       else
   2611         isInvalid = DS.SetTypeSpecWidth(DeclSpec::TSW_longlong, Loc, PrevSpec,
   2612                                         DiagID);
   2613       break;
   2614     case tok::kw___int64:
   2615         isInvalid = DS.SetTypeSpecWidth(DeclSpec::TSW_longlong, Loc, PrevSpec,
   2616                                         DiagID);
   2617       break;
   2618     case tok::kw_signed:
   2619       isInvalid = DS.SetTypeSpecSign(DeclSpec::TSS_signed, Loc, PrevSpec,
   2620                                      DiagID);
   2621       break;
   2622     case tok::kw_unsigned:
   2623       isInvalid = DS.SetTypeSpecSign(DeclSpec::TSS_unsigned, Loc, PrevSpec,
   2624                                      DiagID);
   2625       break;
   2626     case tok::kw__Complex:
   2627       isInvalid = DS.SetTypeSpecComplex(DeclSpec::TSC_complex, Loc, PrevSpec,
   2628                                         DiagID);
   2629       break;
   2630     case tok::kw__Imaginary:
   2631       isInvalid = DS.SetTypeSpecComplex(DeclSpec::TSC_imaginary, Loc, PrevSpec,
   2632                                         DiagID);
   2633       break;
   2634     case tok::kw_void:
   2635       isInvalid = DS.SetTypeSpecType(DeclSpec::TST_void, Loc, PrevSpec,
   2636                                      DiagID);
   2637       break;
   2638     case tok::kw_char:
   2639       isInvalid = DS.SetTypeSpecType(DeclSpec::TST_char, Loc, PrevSpec,
   2640                                      DiagID);
   2641       break;
   2642     case tok::kw_int:
   2643       isInvalid = DS.SetTypeSpecType(DeclSpec::TST_int, Loc, PrevSpec,
   2644                                      DiagID);
   2645       break;
   2646     case tok::kw___int128:
   2647       isInvalid = DS.SetTypeSpecType(DeclSpec::TST_int128, Loc, PrevSpec,
   2648                                      DiagID);
   2649       break;
   2650     case tok::kw_half:
   2651       isInvalid = DS.SetTypeSpecType(DeclSpec::TST_half, Loc, PrevSpec,
   2652                                      DiagID);
   2653       break;
   2654     case tok::kw_float:
   2655       isInvalid = DS.SetTypeSpecType(DeclSpec::TST_float, Loc, PrevSpec,
   2656                                      DiagID);
   2657       break;
   2658     case tok::kw_double:
   2659       isInvalid = DS.SetTypeSpecType(DeclSpec::TST_double, Loc, PrevSpec,
   2660                                      DiagID);
   2661       break;
   2662     case tok::kw_wchar_t:
   2663       isInvalid = DS.SetTypeSpecType(DeclSpec::TST_wchar, Loc, PrevSpec,
   2664                                      DiagID);
   2665       break;
   2666     case tok::kw_char16_t:
   2667       isInvalid = DS.SetTypeSpecType(DeclSpec::TST_char16, Loc, PrevSpec,
   2668                                      DiagID);
   2669       break;
   2670     case tok::kw_char32_t:
   2671       isInvalid = DS.SetTypeSpecType(DeclSpec::TST_char32, Loc, PrevSpec,
   2672                                      DiagID);
   2673       break;
   2674     case tok::kw_bool:
   2675     case tok::kw__Bool:
   2676       if (Tok.is(tok::kw_bool) &&
   2677           DS.getTypeSpecType() != DeclSpec::TST_unspecified &&
   2678           DS.getStorageClassSpec() == DeclSpec::SCS_typedef) {
   2679         PrevSpec = ""; // Not used by the diagnostic.
   2680         DiagID = diag::err_bool_redeclaration;
   2681         // For better error recovery.
   2682         Tok.setKind(tok::identifier);
   2683         isInvalid = true;
   2684       } else {
   2685         isInvalid = DS.SetTypeSpecType(DeclSpec::TST_bool, Loc, PrevSpec,
   2686                                        DiagID);
   2687       }
   2688       break;
   2689     case tok::kw__Decimal32:
   2690       isInvalid = DS.SetTypeSpecType(DeclSpec::TST_decimal32, Loc, PrevSpec,
   2691                                      DiagID);
   2692       break;
   2693     case tok::kw__Decimal64:
   2694       isInvalid = DS.SetTypeSpecType(DeclSpec::TST_decimal64, Loc, PrevSpec,
   2695                                      DiagID);
   2696       break;
   2697     case tok::kw__Decimal128:
   2698       isInvalid = DS.SetTypeSpecType(DeclSpec::TST_decimal128, Loc, PrevSpec,
   2699                                      DiagID);
   2700       break;
   2701     case tok::kw___vector:
   2702       isInvalid = DS.SetTypeAltiVecVector(true, Loc, PrevSpec, DiagID);
   2703       break;
   2704     case tok::kw___pixel:
   2705       isInvalid = DS.SetTypeAltiVecPixel(true, Loc, PrevSpec, DiagID);
   2706       break;
   2707     case tok::kw___unknown_anytype:
   2708       isInvalid = DS.SetTypeSpecType(TST_unknown_anytype, Loc,
   2709                                      PrevSpec, DiagID);
   2710       break;
   2711 
   2712     // class-specifier:
   2713     case tok::kw_class:
   2714     case tok::kw_struct:
   2715     case tok::kw___interface:
   2716     case tok::kw_union: {
   2717       tok::TokenKind Kind = Tok.getKind();
   2718       ConsumeToken();
   2719       ParseClassSpecifier(Kind, Loc, DS, TemplateInfo, AS,
   2720                           EnteringContext, DSContext);
   2721       continue;
   2722     }
   2723 
   2724     // enum-specifier:
   2725     case tok::kw_enum:
   2726       ConsumeToken();
   2727       ParseEnumSpecifier(Loc, DS, TemplateInfo, AS, DSContext);
   2728       continue;
   2729 
   2730     // cv-qualifier:
   2731     case tok::kw_const:
   2732       isInvalid = DS.SetTypeQual(DeclSpec::TQ_const, Loc, PrevSpec, DiagID,
   2733                                  getLangOpts(), /*IsTypeSpec*/true);
   2734       break;
   2735     case tok::kw_volatile:
   2736       isInvalid = DS.SetTypeQual(DeclSpec::TQ_volatile, Loc, PrevSpec, DiagID,
   2737                                  getLangOpts(), /*IsTypeSpec*/true);
   2738       break;
   2739     case tok::kw_restrict:
   2740       isInvalid = DS.SetTypeQual(DeclSpec::TQ_restrict, Loc, PrevSpec, DiagID,
   2741                                  getLangOpts(), /*IsTypeSpec*/true);
   2742       break;
   2743 
   2744     // C++ typename-specifier:
   2745     case tok::kw_typename:
   2746       if (TryAnnotateTypeOrScopeToken()) {
   2747         DS.SetTypeSpecError();
   2748         goto DoneWithDeclSpec;
   2749       }
   2750       if (!Tok.is(tok::kw_typename))
   2751         continue;
   2752       break;
   2753 
   2754     // GNU typeof support.
   2755     case tok::kw_typeof:
   2756       ParseTypeofSpecifier(DS);
   2757       continue;
   2758 
   2759     case tok::annot_decltype:
   2760       ParseDecltypeSpecifier(DS);
   2761       continue;
   2762 
   2763     case tok::kw___underlying_type:
   2764       ParseUnderlyingTypeSpecifier(DS);
   2765       continue;
   2766 
   2767     case tok::kw__Atomic:
   2768       ParseAtomicSpecifier(DS);
   2769       continue;
   2770 
   2771     // OpenCL qualifiers:
   2772     case tok::kw_private:
   2773       if (!getLangOpts().OpenCL)
   2774         goto DoneWithDeclSpec;
   2775     case tok::kw___private:
   2776     case tok::kw___global:
   2777     case tok::kw___local:
   2778     case tok::kw___constant:
   2779     case tok::kw___read_only:
   2780     case tok::kw___write_only:
   2781     case tok::kw___read_write:
   2782       ParseOpenCLQualifiers(DS);
   2783       break;
   2784 
   2785     case tok::less:
   2786       // GCC ObjC supports types like "<SomeProtocol>" as a synonym for
   2787       // "id<SomeProtocol>".  This is hopelessly old fashioned and dangerous,
   2788       // but we support it.
   2789       if (DS.hasTypeSpecifier() || !getLangOpts().ObjC1)
   2790         goto DoneWithDeclSpec;
   2791 
   2792       if (!ParseObjCProtocolQualifiers(DS))
   2793         Diag(Loc, diag::warn_objc_protocol_qualifier_missing_id)
   2794           << FixItHint::CreateInsertion(Loc, "id")
   2795           << SourceRange(Loc, DS.getSourceRange().getEnd());
   2796 
   2797       // Need to support trailing type qualifiers (e.g. "id<p> const").
   2798       // If a type specifier follows, it will be diagnosed elsewhere.
   2799       continue;
   2800     }
   2801     // If the specifier wasn't legal, issue a diagnostic.
   2802     if (isInvalid) {
   2803       assert(PrevSpec && "Method did not return previous specifier!");
   2804       assert(DiagID);
   2805 
   2806       if (DiagID == diag::ext_duplicate_declspec)
   2807         Diag(Tok, DiagID)
   2808           << PrevSpec << FixItHint::CreateRemoval(Tok.getLocation());
   2809       else
   2810         Diag(Tok, DiagID) << PrevSpec;
   2811     }
   2812 
   2813     DS.SetRangeEnd(Tok.getLocation());
   2814     if (DiagID != diag::err_bool_redeclaration)
   2815       ConsumeToken();
   2816 
   2817     AttrsLastTime = false;
   2818   }
   2819 }
   2820 
   2821 /// ParseStructDeclaration - Parse a struct declaration without the terminating
   2822 /// semicolon.
   2823 ///
   2824 ///       struct-declaration:
   2825 ///         specifier-qualifier-list struct-declarator-list
   2826 /// [GNU]   __extension__ struct-declaration
   2827 /// [GNU]   specifier-qualifier-list
   2828 ///       struct-declarator-list:
   2829 ///         struct-declarator
   2830 ///         struct-declarator-list ',' struct-declarator
   2831 /// [GNU]   struct-declarator-list ',' attributes[opt] struct-declarator
   2832 ///       struct-declarator:
   2833 ///         declarator
   2834 /// [GNU]   declarator attributes[opt]
   2835 ///         declarator[opt] ':' constant-expression
   2836 /// [GNU]   declarator[opt] ':' constant-expression attributes[opt]
   2837 ///
   2838 void Parser::
   2839 ParseStructDeclaration(ParsingDeclSpec &DS, FieldCallback &Fields) {
   2840 
   2841   if (Tok.is(tok::kw___extension__)) {
   2842     // __extension__ silences extension warnings in the subexpression.
   2843     ExtensionRAIIObject O(Diags);  // Use RAII to do this.
   2844     ConsumeToken();
   2845     return ParseStructDeclaration(DS, Fields);
   2846   }
   2847 
   2848   // Parse the common specifier-qualifiers-list piece.
   2849   ParseSpecifierQualifierList(DS);
   2850 
   2851   // If there are no declarators, this is a free-standing declaration
   2852   // specifier. Let the actions module cope with it.
   2853   if (Tok.is(tok::semi)) {
   2854     Decl *TheDecl = Actions.ParsedFreeStandingDeclSpec(getCurScope(), AS_none,
   2855                                                        DS);
   2856     DS.complete(TheDecl);
   2857     return;
   2858   }
   2859 
   2860   // Read struct-declarators until we find the semicolon.
   2861   bool FirstDeclarator = true;
   2862   SourceLocation CommaLoc;
   2863   while (1) {
   2864     ParsingFieldDeclarator DeclaratorInfo(*this, DS);
   2865     DeclaratorInfo.D.setCommaLoc(CommaLoc);
   2866 
   2867     // Attributes are only allowed here on successive declarators.
   2868     if (!FirstDeclarator)
   2869       MaybeParseGNUAttributes(DeclaratorInfo.D);
   2870 
   2871     /// struct-declarator: declarator
   2872     /// struct-declarator: declarator[opt] ':' constant-expression
   2873     if (Tok.isNot(tok::colon)) {
   2874       // Don't parse FOO:BAR as if it were a typo for FOO::BAR.
   2875       ColonProtectionRAIIObject X(*this);
   2876       ParseDeclarator(DeclaratorInfo.D);
   2877     }
   2878 
   2879     if (Tok.is(tok::colon)) {
   2880       ConsumeToken();
   2881       ExprResult Res(ParseConstantExpression());
   2882       if (Res.isInvalid())
   2883         SkipUntil(tok::semi, true, true);
   2884       else
   2885         DeclaratorInfo.BitfieldSize = Res.release();
   2886     }
   2887 
   2888     // If attributes exist after the declarator, parse them.
   2889     MaybeParseGNUAttributes(DeclaratorInfo.D);
   2890 
   2891     // We're done with this declarator;  invoke the callback.
   2892     Fields.invoke(DeclaratorInfo);
   2893 
   2894     // If we don't have a comma, it is either the end of the list (a ';')
   2895     // or an error, bail out.
   2896     if (Tok.isNot(tok::comma))
   2897       return;
   2898 
   2899     // Consume the comma.
   2900     CommaLoc = ConsumeToken();
   2901 
   2902     FirstDeclarator = false;
   2903   }
   2904 }
   2905 
   2906 /// ParseStructUnionBody
   2907 ///       struct-contents:
   2908 ///         struct-declaration-list
   2909 /// [EXT]   empty
   2910 /// [GNU]   "struct-declaration-list" without terminatoring ';'
   2911 ///       struct-declaration-list:
   2912 ///         struct-declaration
   2913 ///         struct-declaration-list struct-declaration
   2914 /// [OBC]   '@' 'defs' '(' class-name ')'
   2915 ///
   2916 void Parser::ParseStructUnionBody(SourceLocation RecordLoc,
   2917                                   unsigned TagType, Decl *TagDecl) {
   2918   PrettyDeclStackTraceEntry CrashInfo(Actions, TagDecl, RecordLoc,
   2919                                       "parsing struct/union body");
   2920 
   2921   BalancedDelimiterTracker T(*this, tok::l_brace);
   2922   if (T.consumeOpen())
   2923     return;
   2924 
   2925   ParseScope StructScope(this, Scope::ClassScope|Scope::DeclScope);
   2926   Actions.ActOnTagStartDefinition(getCurScope(), TagDecl);
   2927 
   2928   // Empty structs are an extension in C (C99 6.7.2.1p7), but are allowed in
   2929   // C++.
   2930   if (Tok.is(tok::r_brace) && !getLangOpts().CPlusPlus) {
   2931     Diag(Tok, diag::ext_empty_struct_union) << (TagType == TST_union);
   2932     Diag(Tok, diag::warn_empty_struct_union_compat) << (TagType == TST_union);
   2933   }
   2934 
   2935   SmallVector<Decl *, 32> FieldDecls;
   2936 
   2937   // While we still have something to read, read the declarations in the struct.
   2938   while (Tok.isNot(tok::r_brace) && Tok.isNot(tok::eof)) {
   2939     // Each iteration of this loop reads one struct-declaration.
   2940 
   2941     // Check for extraneous top-level semicolon.
   2942     if (Tok.is(tok::semi)) {
   2943       ConsumeExtraSemi(InsideStruct, TagType);
   2944       continue;
   2945     }
   2946 
   2947     if (!Tok.is(tok::at)) {
   2948       struct CFieldCallback : FieldCallback {
   2949         Parser &P;
   2950         Decl *TagDecl;
   2951         SmallVectorImpl<Decl *> &FieldDecls;
   2952 
   2953         CFieldCallback(Parser &P, Decl *TagDecl,
   2954                        SmallVectorImpl<Decl *> &FieldDecls) :
   2955           P(P), TagDecl(TagDecl), FieldDecls(FieldDecls) {}
   2956 
   2957         void invoke(ParsingFieldDeclarator &FD) {
   2958           // Install the declarator into the current TagDecl.
   2959           Decl *Field = P.Actions.ActOnField(P.getCurScope(), TagDecl,
   2960                               FD.D.getDeclSpec().getSourceRange().getBegin(),
   2961                                                  FD.D, FD.BitfieldSize);
   2962           FieldDecls.push_back(Field);
   2963           FD.complete(Field);
   2964         }
   2965       } Callback(*this, TagDecl, FieldDecls);
   2966 
   2967       // Parse all the comma separated declarators.
   2968       ParsingDeclSpec DS(*this);
   2969       ParseStructDeclaration(DS, Callback);
   2970     } else { // Handle @defs
   2971       ConsumeToken();
   2972       if (!Tok.isObjCAtKeyword(tok::objc_defs)) {
   2973         Diag(Tok, diag::err_unexpected_at);
   2974         SkipUntil(tok::semi, true);
   2975         continue;
   2976       }
   2977       ConsumeToken();
   2978       ExpectAndConsume(tok::l_paren, diag::err_expected_lparen);
   2979       if (!Tok.is(tok::identifier)) {
   2980         Diag(Tok, diag::err_expected_ident);
   2981         SkipUntil(tok::semi, true);
   2982         continue;
   2983       }
   2984       SmallVector<Decl *, 16> Fields;
   2985       Actions.ActOnDefs(getCurScope(), TagDecl, Tok.getLocation(),
   2986                         Tok.getIdentifierInfo(), Fields);
   2987       FieldDecls.insert(FieldDecls.end(), Fields.begin(), Fields.end());
   2988       ConsumeToken();
   2989       ExpectAndConsume(tok::r_paren, diag::err_expected_rparen);
   2990     }
   2991 
   2992     if (Tok.is(tok::semi)) {
   2993       ConsumeToken();
   2994     } else if (Tok.is(tok::r_brace)) {
   2995       ExpectAndConsume(tok::semi, diag::ext_expected_semi_decl_list);
   2996       break;
   2997     } else {
   2998       ExpectAndConsume(tok::semi, diag::err_expected_semi_decl_list);
   2999       // Skip to end of block or statement to avoid ext-warning on extra ';'.
   3000       SkipUntil(tok::r_brace, true, true);
   3001       // If we stopped at a ';', eat it.
   3002       if (Tok.is(tok::semi)) ConsumeToken();
   3003     }
   3004   }
   3005 
   3006   T.consumeClose();
   3007 
   3008   ParsedAttributes attrs(AttrFactory);
   3009   // If attributes exist after struct contents, parse them.
   3010   MaybeParseGNUAttributes(attrs);
   3011 
   3012   Actions.ActOnFields(getCurScope(),
   3013                       RecordLoc, TagDecl, FieldDecls,
   3014                       T.getOpenLocation(), T.getCloseLocation(),
   3015                       attrs.getList());
   3016   StructScope.Exit();
   3017   Actions.ActOnTagFinishDefinition(getCurScope(), TagDecl,
   3018                                    T.getCloseLocation());
   3019 }
   3020 
   3021 /// ParseEnumSpecifier
   3022 ///       enum-specifier: [C99 6.7.2.2]
   3023 ///         'enum' identifier[opt] '{' enumerator-list '}'
   3024 ///[C99/C++]'enum' identifier[opt] '{' enumerator-list ',' '}'
   3025 /// [GNU]   'enum' attributes[opt] identifier[opt] '{' enumerator-list ',' [opt]
   3026 ///                                                 '}' attributes[opt]
   3027 /// [MS]    'enum' __declspec[opt] identifier[opt] '{' enumerator-list ',' [opt]
   3028 ///                                                 '}'
   3029 ///         'enum' identifier
   3030 /// [GNU]   'enum' attributes[opt] identifier
   3031 ///
   3032 /// [C++11] enum-head '{' enumerator-list[opt] '}'
   3033 /// [C++11] enum-head '{' enumerator-list ','  '}'
   3034 ///
   3035 ///       enum-head: [C++11]
   3036 ///         enum-key attribute-specifier-seq[opt] identifier[opt] enum-base[opt]
   3037 ///         enum-key attribute-specifier-seq[opt] nested-name-specifier
   3038 ///             identifier enum-base[opt]
   3039 ///
   3040 ///       enum-key: [C++11]
   3041 ///         'enum'
   3042 ///         'enum' 'class'
   3043 ///         'enum' 'struct'
   3044 ///
   3045 ///       enum-base: [C++11]
   3046 ///         ':' type-specifier-seq
   3047 ///
   3048 /// [C++] elaborated-type-specifier:
   3049 /// [C++]   'enum' '::'[opt] nested-name-specifier[opt] identifier
   3050 ///
   3051 void Parser::ParseEnumSpecifier(SourceLocation StartLoc, DeclSpec &DS,
   3052                                 const ParsedTemplateInfo &TemplateInfo,
   3053                                 AccessSpecifier AS, DeclSpecContext DSC) {
   3054   // Parse the tag portion of this.
   3055   if (Tok.is(tok::code_completion)) {
   3056     // Code completion for an enum name.
   3057     Actions.CodeCompleteTag(getCurScope(), DeclSpec::TST_enum);
   3058     return cutOffParsing();
   3059   }
   3060 
   3061   // If attributes exist after tag, parse them.
   3062   ParsedAttributesWithRange attrs(AttrFactory);
   3063   MaybeParseGNUAttributes(attrs);
   3064   MaybeParseCXX0XAttributes(attrs);
   3065 
   3066   // If declspecs exist after tag, parse them.
   3067   while (Tok.is(tok::kw___declspec))
   3068     ParseMicrosoftDeclSpec(attrs);
   3069 
   3070   SourceLocation ScopedEnumKWLoc;
   3071   bool IsScopedUsingClassTag = false;
   3072 
   3073   // In C++11, recognize 'enum class' and 'enum struct'.
   3074   if (getLangOpts().CPlusPlus0x &&
   3075       (Tok.is(tok::kw_class) || Tok.is(tok::kw_struct))) {
   3076     Diag(Tok, diag::warn_cxx98_compat_scoped_enum);
   3077     IsScopedUsingClassTag = Tok.is(tok::kw_class);
   3078     ScopedEnumKWLoc = ConsumeToken();
   3079 
   3080     // Attributes are not allowed between these keywords.  Diagnose,
   3081     // but then just treat them like they appeared in the right place.
   3082     ProhibitAttributes(attrs);
   3083 
   3084     // They are allowed afterwards, though.
   3085     MaybeParseGNUAttributes(attrs);
   3086     MaybeParseCXX0XAttributes(attrs);
   3087     while (Tok.is(tok::kw___declspec))
   3088       ParseMicrosoftDeclSpec(attrs);
   3089   }
   3090 
   3091   // C++11 [temp.explicit]p12:
   3092   //   The usual access controls do not apply to names used to specify
   3093   //   explicit instantiations.
   3094   // We extend this to also cover explicit specializations.  Note that
   3095   // we don't suppress if this turns out to be an elaborated type
   3096   // specifier.
   3097   bool shouldDelayDiagsInTag =
   3098     (TemplateInfo.Kind == ParsedTemplateInfo::ExplicitInstantiation ||
   3099      TemplateInfo.Kind == ParsedTemplateInfo::ExplicitSpecialization);
   3100   SuppressAccessChecks diagsFromTag(*this, shouldDelayDiagsInTag);
   3101 
   3102   // Enum definitions should not be parsed in a trailing-return-type.
   3103   bool AllowDeclaration = DSC != DSC_trailing;
   3104 
   3105   bool AllowFixedUnderlyingType = AllowDeclaration &&
   3106     (getLangOpts().CPlusPlus0x || getLangOpts().MicrosoftExt ||
   3107      getLangOpts().ObjC2);
   3108 
   3109   CXXScopeSpec &SS = DS.getTypeSpecScope();
   3110   if (getLangOpts().CPlusPlus) {
   3111     // "enum foo : bar;" is not a potential typo for "enum foo::bar;"
   3112     // if a fixed underlying type is allowed.
   3113     ColonProtectionRAIIObject X(*this, AllowFixedUnderlyingType);
   3114 
   3115     if (ParseOptionalCXXScopeSpecifier(SS, ParsedType(),
   3116                                        /*EnteringContext=*/false))
   3117       return;
   3118 
   3119     if (SS.isSet() && Tok.isNot(tok::identifier)) {
   3120       Diag(Tok, diag::err_expected_ident);
   3121       if (Tok.isNot(tok::l_brace)) {
   3122         // Has no name and is not a definition.
   3123         // Skip the rest of this declarator, up until the comma or semicolon.
   3124         SkipUntil(tok::comma, true);
   3125         return;
   3126       }
   3127     }
   3128   }
   3129 
   3130   // Must have either 'enum name' or 'enum {...}'.
   3131   if (Tok.isNot(tok::identifier) && Tok.isNot(tok::l_brace) &&
   3132       !(AllowFixedUnderlyingType && Tok.is(tok::colon))) {
   3133     Diag(Tok, diag::err_expected_ident_lbrace);
   3134 
   3135     // Skip the rest of this declarator, up until the comma or semicolon.
   3136     SkipUntil(tok::comma, true);
   3137     return;
   3138   }
   3139 
   3140   // If an identifier is present, consume and remember it.
   3141   IdentifierInfo *Name = 0;
   3142   SourceLocation NameLoc;
   3143   if (Tok.is(tok::identifier)) {
   3144     Name = Tok.getIdentifierInfo();
   3145     NameLoc = ConsumeToken();
   3146   }
   3147 
   3148   if (!Name && ScopedEnumKWLoc.isValid()) {
   3149     // C++0x 7.2p2: The optional identifier shall not be omitted in the
   3150     // declaration of a scoped enumeration.
   3151     Diag(Tok, diag::err_scoped_enum_missing_identifier);
   3152     ScopedEnumKWLoc = SourceLocation();
   3153     IsScopedUsingClassTag = false;
   3154   }
   3155 
   3156   // Okay, end the suppression area.  We'll decide whether to emit the
   3157   // diagnostics in a second.
   3158   if (shouldDelayDiagsInTag)
   3159     diagsFromTag.done();
   3160 
   3161   TypeResult BaseType;
   3162 
   3163   // Parse the fixed underlying type.
   3164   bool CanBeBitfield = getCurScope()->getFlags() & Scope::ClassScope;
   3165   if (AllowFixedUnderlyingType && Tok.is(tok::colon)) {
   3166     bool PossibleBitfield = false;
   3167     if (CanBeBitfield) {
   3168       // If we're in class scope, this can either be an enum declaration with
   3169       // an underlying type, or a declaration of a bitfield member. We try to
   3170       // use a simple disambiguation scheme first to catch the common cases
   3171       // (integer literal, sizeof); if it's still ambiguous, we then consider
   3172       // anything that's a simple-type-specifier followed by '(' as an
   3173       // expression. This suffices because function types are not valid
   3174       // underlying types anyway.
   3175       EnterExpressionEvaluationContext Unevaluated(Actions,
   3176                                                    Sema::ConstantEvaluated);
   3177       TPResult TPR = isExpressionOrTypeSpecifierSimple(NextToken().getKind());
   3178       // If the next token starts an expression, we know we're parsing a
   3179       // bit-field. This is the common case.
   3180       if (TPR == TPResult::True())
   3181         PossibleBitfield = true;
   3182       // If the next token starts a type-specifier-seq, it may be either a
   3183       // a fixed underlying type or the start of a function-style cast in C++;
   3184       // lookahead one more token to see if it's obvious that we have a
   3185       // fixed underlying type.
   3186       else if (TPR == TPResult::False() &&
   3187                GetLookAheadToken(2).getKind() == tok::semi) {
   3188         // Consume the ':'.
   3189         ConsumeToken();
   3190       } else {
   3191         // We have the start of a type-specifier-seq, so we have to perform
   3192         // tentative parsing to determine whether we have an expression or a
   3193         // type.
   3194         TentativeParsingAction TPA(*this);
   3195 
   3196         // Consume the ':'.
   3197         ConsumeToken();
   3198 
   3199         // If we see a type specifier followed by an open-brace, we have an
   3200         // ambiguity between an underlying type and a C++11 braced
   3201         // function-style cast. Resolve this by always treating it as an
   3202         // underlying type.
   3203         // FIXME: The standard is not entirely clear on how to disambiguate in
   3204         // this case.
   3205         if ((getLangOpts().CPlusPlus &&
   3206              isCXXDeclarationSpecifier(TPResult::True()) != TPResult::True()) ||
   3207             (!getLangOpts().CPlusPlus && !isDeclarationSpecifier(true))) {
   3208           // We'll parse this as a bitfield later.
   3209           PossibleBitfield = true;
   3210           TPA.Revert();
   3211         } else {
   3212           // We have a type-specifier-seq.
   3213           TPA.Commit();
   3214         }
   3215       }
   3216     } else {
   3217       // Consume the ':'.
   3218       ConsumeToken();
   3219     }
   3220 
   3221     if (!PossibleBitfield) {
   3222       SourceRange Range;
   3223       BaseType = ParseTypeName(&Range);
   3224 
   3225       if (!getLangOpts().CPlusPlus0x && !getLangOpts().ObjC2)
   3226         Diag(StartLoc, diag::ext_ms_enum_fixed_underlying_type)
   3227           << Range;
   3228       if (getLangOpts().CPlusPlus0x)
   3229         Diag(StartLoc, diag::warn_cxx98_compat_enum_fixed_underlying_type);
   3230     }
   3231   }
   3232 
   3233   // There are four options here.  If we have 'friend enum foo;' then this is a
   3234   // friend declaration, and cannot have an accompanying definition. If we have
   3235   // 'enum foo;', then this is a forward declaration.  If we have
   3236   // 'enum foo {...' then this is a definition. Otherwise we have something
   3237   // like 'enum foo xyz', a reference.
   3238   //
   3239   // This is needed to handle stuff like this right (C99 6.7.2.3p11):
   3240   // enum foo {..};  void bar() { enum foo; }    <- new foo in bar.
   3241   // enum foo {..};  void bar() { enum foo x; }  <- use of old foo.
   3242   //
   3243   Sema::TagUseKind TUK;
   3244   if (!AllowDeclaration) {
   3245     TUK = Sema::TUK_Reference;
   3246   } else if (Tok.is(tok::l_brace)) {
   3247     if (DS.isFriendSpecified()) {
   3248       Diag(Tok.getLocation(), diag::err_friend_decl_defines_type)
   3249         << SourceRange(DS.getFriendSpecLoc());
   3250       ConsumeBrace();
   3251       SkipUntil(tok::r_brace);
   3252       TUK = Sema::TUK_Friend;
   3253     } else {
   3254       TUK = Sema::TUK_Definition;
   3255     }
   3256   } else if (DSC != DSC_type_specifier &&
   3257              (Tok.is(tok::semi) ||
   3258               (Tok.isAtStartOfLine() &&
   3259                !isValidAfterTypeSpecifier(CanBeBitfield)))) {
   3260     TUK = DS.isFriendSpecified() ? Sema::TUK_Friend : Sema::TUK_Declaration;
   3261     if (Tok.isNot(tok::semi)) {
   3262       // A semicolon was missing after this declaration. Diagnose and recover.
   3263       ExpectAndConsume(tok::semi, diag::err_expected_semi_after_tagdecl,
   3264                        "enum");
   3265       PP.EnterToken(Tok);
   3266       Tok.setKind(tok::semi);
   3267     }
   3268   } else {
   3269     TUK = Sema::TUK_Reference;
   3270   }
   3271 
   3272   // If this is an elaborated type specifier, and we delayed
   3273   // diagnostics before, just merge them into the current pool.
   3274   if (TUK == Sema::TUK_Reference && shouldDelayDiagsInTag) {
   3275     diagsFromTag.redelay();
   3276   }
   3277 
   3278   MultiTemplateParamsArg TParams;
   3279   if (TemplateInfo.Kind != ParsedTemplateInfo::NonTemplate &&
   3280       TUK != Sema::TUK_Reference) {
   3281     if (!getLangOpts().CPlusPlus0x || !SS.isSet()) {
   3282       // Skip the rest of this declarator, up until the comma or semicolon.
   3283       Diag(Tok, diag::err_enum_template);
   3284       SkipUntil(tok::comma, true);
   3285       return;
   3286     }
   3287 
   3288     if (TemplateInfo.Kind == ParsedTemplateInfo::ExplicitInstantiation) {
   3289       // Enumerations can't be explicitly instantiated.
   3290       DS.SetTypeSpecError();
   3291       Diag(StartLoc, diag::err_explicit_instantiation_enum);
   3292       return;
   3293     }
   3294 
   3295     assert(TemplateInfo.TemplateParams && "no template parameters");
   3296     TParams = MultiTemplateParamsArg(TemplateInfo.TemplateParams->data(),
   3297                                      TemplateInfo.TemplateParams->size());
   3298   }
   3299 
   3300   if (TUK == Sema::TUK_Reference)
   3301     ProhibitAttributes(attrs);
   3302 
   3303   if (!Name && TUK != Sema::TUK_Definition) {
   3304     Diag(Tok, diag::err_enumerator_unnamed_no_def);
   3305 
   3306     // Skip the rest of this declarator, up until the comma or semicolon.
   3307     SkipUntil(tok::comma, true);
   3308     return;
   3309   }
   3310 
   3311   bool Owned = false;
   3312   bool IsDependent = false;
   3313   const char *PrevSpec = 0;
   3314   unsigned DiagID;
   3315   Decl *TagDecl = Actions.ActOnTag(getCurScope(), DeclSpec::TST_enum, TUK,
   3316                                    StartLoc, SS, Name, NameLoc, attrs.getList(),
   3317                                    AS, DS.getModulePrivateSpecLoc(), TParams,
   3318                                    Owned, IsDependent, ScopedEnumKWLoc,
   3319                                    IsScopedUsingClassTag, BaseType);
   3320 
   3321   if (IsDependent) {
   3322     // This enum has a dependent nested-name-specifier. Handle it as a
   3323     // dependent tag.
   3324     if (!Name) {
   3325       DS.SetTypeSpecError();
   3326       Diag(Tok, diag::err_expected_type_name_after_typename);
   3327       return;
   3328     }
   3329 
   3330     TypeResult Type = Actions.ActOnDependentTag(getCurScope(), DeclSpec::TST_enum,
   3331                                                 TUK, SS, Name, StartLoc,
   3332                                                 NameLoc);
   3333     if (Type.isInvalid()) {
   3334       DS.SetTypeSpecError();
   3335       return;
   3336     }
   3337 
   3338     if (DS.SetTypeSpecType(DeclSpec::TST_typename, StartLoc,
   3339                            NameLoc.isValid() ? NameLoc : StartLoc,
   3340                            PrevSpec, DiagID, Type.get()))
   3341       Diag(StartLoc, DiagID) << PrevSpec;
   3342 
   3343     return;
   3344   }
   3345 
   3346   if (!TagDecl) {
   3347     // The action failed to produce an enumeration tag. If this is a
   3348     // definition, consume the entire definition.
   3349     if (Tok.is(tok::l_brace) && TUK != Sema::TUK_Reference) {
   3350       ConsumeBrace();
   3351       SkipUntil(tok::r_brace);
   3352     }
   3353 
   3354     DS.SetTypeSpecError();
   3355     return;
   3356   }
   3357 
   3358   if (Tok.is(tok::l_brace) && TUK != Sema::TUK_Reference)
   3359     ParseEnumBody(StartLoc, TagDecl);
   3360 
   3361   if (DS.SetTypeSpecType(DeclSpec::TST_enum, StartLoc,
   3362                          NameLoc.isValid() ? NameLoc : StartLoc,
   3363                          PrevSpec, DiagID, TagDecl, Owned))
   3364     Diag(StartLoc, DiagID) << PrevSpec;
   3365 }
   3366 
   3367 /// ParseEnumBody - Parse a {} enclosed enumerator-list.
   3368 ///       enumerator-list:
   3369 ///         enumerator
   3370 ///         enumerator-list ',' enumerator
   3371 ///       enumerator:
   3372 ///         enumeration-constant
   3373 ///         enumeration-constant '=' constant-expression
   3374 ///       enumeration-constant:
   3375 ///         identifier
   3376 ///
   3377 void Parser::ParseEnumBody(SourceLocation StartLoc, Decl *EnumDecl) {
   3378   // Enter the scope of the enum body and start the definition.
   3379   ParseScope EnumScope(this, Scope::DeclScope);
   3380   Actions.ActOnTagStartDefinition(getCurScope(), EnumDecl);
   3381 
   3382   BalancedDelimiterTracker T(*this, tok::l_brace);
   3383   T.consumeOpen();
   3384 
   3385   // C does not allow an empty enumerator-list, C++ does [dcl.enum].
   3386   if (Tok.is(tok::r_brace) && !getLangOpts().CPlusPlus)
   3387     Diag(Tok, diag::error_empty_enum);
   3388 
   3389   SmallVector<Decl *, 32> EnumConstantDecls;
   3390 
   3391   Decl *LastEnumConstDecl = 0;
   3392 
   3393   // Parse the enumerator-list.
   3394   while (Tok.is(tok::identifier)) {
   3395     IdentifierInfo *Ident = Tok.getIdentifierInfo();
   3396     SourceLocation IdentLoc = ConsumeToken();
   3397 
   3398     // If attributes exist after the enumerator, parse them.
   3399     ParsedAttributesWithRange attrs(AttrFactory);
   3400     MaybeParseGNUAttributes(attrs);
   3401     MaybeParseCXX0XAttributes(attrs);
   3402     ProhibitAttributes(attrs);
   3403 
   3404     SourceLocation EqualLoc;
   3405     ExprResult AssignedVal;
   3406     ParsingDeclRAIIObject PD(*this, ParsingDeclRAIIObject::NoParent);
   3407 
   3408     if (Tok.is(tok::equal)) {
   3409       EqualLoc = ConsumeToken();
   3410       AssignedVal = ParseConstantExpression();
   3411       if (AssignedVal.isInvalid())
   3412         SkipUntil(tok::comma, tok::r_brace, true, true);
   3413     }
   3414 
   3415     // Install the enumerator constant into EnumDecl.
   3416     Decl *EnumConstDecl = Actions.ActOnEnumConstant(getCurScope(), EnumDecl,
   3417                                                     LastEnumConstDecl,
   3418                                                     IdentLoc, Ident,
   3419                                                     attrs.getList(), EqualLoc,
   3420                                                     AssignedVal.release());
   3421     PD.complete(EnumConstDecl);
   3422 
   3423     EnumConstantDecls.push_back(EnumConstDecl);
   3424     LastEnumConstDecl = EnumConstDecl;
   3425 
   3426     if (Tok.is(tok::identifier)) {
   3427       // We're missing a comma between enumerators.
   3428       SourceLocation Loc = PP.getLocForEndOfToken(PrevTokLocation);
   3429       Diag(Loc, diag::err_enumerator_list_missing_comma)
   3430         << FixItHint::CreateInsertion(Loc, ", ");
   3431       continue;
   3432     }
   3433 
   3434     if (Tok.isNot(tok::comma))
   3435       break;
   3436     SourceLocation CommaLoc = ConsumeToken();
   3437 
   3438     if (Tok.isNot(tok::identifier)) {
   3439       if (!getLangOpts().C99 && !getLangOpts().CPlusPlus0x)
   3440         Diag(CommaLoc, getLangOpts().CPlusPlus ?
   3441                diag::ext_enumerator_list_comma_cxx :
   3442                diag::ext_enumerator_list_comma_c)
   3443           << FixItHint::CreateRemoval(CommaLoc);
   3444       else if (getLangOpts().CPlusPlus0x)
   3445         Diag(CommaLoc, diag::warn_cxx98_compat_enumerator_list_comma)
   3446           << FixItHint::CreateRemoval(CommaLoc);
   3447     }
   3448   }
   3449 
   3450   // Eat the }.
   3451   T.consumeClose();
   3452 
   3453   // If attributes exist after the identifier list, parse them.
   3454   ParsedAttributes attrs(AttrFactory);
   3455   MaybeParseGNUAttributes(attrs);
   3456 
   3457   Actions.ActOnEnumBody(StartLoc, T.getOpenLocation(), T.getCloseLocation(),
   3458                         EnumDecl, EnumConstantDecls.data(),
   3459                         EnumConstantDecls.size(), getCurScope(),
   3460                         attrs.getList());
   3461 
   3462   EnumScope.Exit();
   3463   Actions.ActOnTagFinishDefinition(getCurScope(), EnumDecl,
   3464                                    T.getCloseLocation());
   3465 
   3466   // The next token must be valid after an enum definition. If not, a ';'
   3467   // was probably forgotten.
   3468   bool CanBeBitfield = getCurScope()->getFlags() & Scope::ClassScope;
   3469   if (!isValidAfterTypeSpecifier(CanBeBitfield)) {
   3470     ExpectAndConsume(tok::semi, diag::err_expected_semi_after_tagdecl, "enum");
   3471     // Push this token back into the preprocessor and change our current token
   3472     // to ';' so that the rest of the code recovers as though there were an
   3473     // ';' after the definition.
   3474     PP.EnterToken(Tok);
   3475     Tok.setKind(tok::semi);
   3476   }
   3477 }
   3478 
   3479 /// isTypeSpecifierQualifier - Return true if the current token could be the
   3480 /// start of a type-qualifier-list.
   3481 bool Parser::isTypeQualifier() const {
   3482   switch (Tok.getKind()) {
   3483   default: return false;
   3484 
   3485     // type-qualifier only in OpenCL
   3486   case tok::kw_private:
   3487     return getLangOpts().OpenCL;
   3488 
   3489     // type-qualifier
   3490   case tok::kw_const:
   3491   case tok::kw_volatile:
   3492   case tok::kw_restrict:
   3493   case tok::kw___private:
   3494   case tok::kw___local:
   3495   case tok::kw___global:
   3496   case tok::kw___constant:
   3497   case tok::kw___read_only:
   3498   case tok::kw___read_write:
   3499   case tok::kw___write_only:
   3500     return true;
   3501   }
   3502 }
   3503 
   3504 /// isKnownToBeTypeSpecifier - Return true if we know that the specified token
   3505 /// is definitely a type-specifier.  Return false if it isn't part of a type
   3506 /// specifier or if we're not sure.
   3507 bool Parser::isKnownToBeTypeSpecifier(const Token &Tok) const {
   3508   switch (Tok.getKind()) {
   3509   default: return false;
   3510     // type-specifiers
   3511   case tok::kw_short:
   3512   case tok::kw_long:
   3513   case tok::kw___int64:
   3514   case tok::kw___int128:
   3515   case tok::kw_signed:
   3516   case tok::kw_unsigned:
   3517   case tok::kw__Complex:
   3518   case tok::kw__Imaginary:
   3519   case tok::kw_void:
   3520   case tok::kw_char:
   3521   case tok::kw_wchar_t:
   3522   case tok::kw_char16_t:
   3523   case tok::kw_char32_t:
   3524   case tok::kw_int:
   3525   case tok::kw_half:
   3526   case tok::kw_float:
   3527   case tok::kw_double:
   3528   case tok::kw_bool:
   3529   case tok::kw__Bool:
   3530   case tok::kw__Decimal32:
   3531   case tok::kw__Decimal64:
   3532   case tok::kw__Decimal128:
   3533   case tok::kw___vector:
   3534 
   3535     // struct-or-union-specifier (C99) or class-specifier (C++)
   3536   case tok::kw_class:
   3537   case tok::kw_struct:
   3538   case tok::kw___interface:
   3539   case tok::kw_union:
   3540     // enum-specifier
   3541   case tok::kw_enum:
   3542 
   3543     // typedef-name
   3544   case tok::annot_typename:
   3545     return true;
   3546   }
   3547 }
   3548 
   3549 /// isTypeSpecifierQualifier - Return true if the current token could be the
   3550 /// start of a specifier-qualifier-list.
   3551 bool Parser::isTypeSpecifierQualifier() {
   3552   switch (Tok.getKind()) {
   3553   default: return false;
   3554 
   3555   case tok::identifier:   // foo::bar
   3556     if (TryAltiVecVectorToken())
   3557       return true;
   3558     // Fall through.
   3559   case tok::kw_typename:  // typename T::type
   3560     // Annotate typenames and C++ scope specifiers.  If we get one, just
   3561     // recurse to handle whatever we get.
   3562     if (TryAnnotateTypeOrScopeToken())
   3563       return true;
   3564     if (Tok.is(tok::identifier))
   3565       return false;
   3566     return isTypeSpecifierQualifier();
   3567 
   3568   case tok::coloncolon:   // ::foo::bar
   3569     if (NextToken().is(tok::kw_new) ||    // ::new
   3570         NextToken().is(tok::kw_delete))   // ::delete
   3571       return false;
   3572 
   3573     if (TryAnnotateTypeOrScopeToken())
   3574       return true;
   3575     return isTypeSpecifierQualifier();
   3576 
   3577     // GNU attributes support.
   3578   case tok::kw___attribute:
   3579     // GNU typeof support.
   3580   case tok::kw_typeof:
   3581 
   3582     // type-specifiers
   3583   case tok::kw_short:
   3584   case tok::kw_long:
   3585   case tok::kw___int64:
   3586   case tok::kw___int128:
   3587   case tok::kw_signed:
   3588   case tok::kw_unsigned:
   3589   case tok::kw__Complex:
   3590   case tok::kw__Imaginary:
   3591   case tok::kw_void:
   3592   case tok::kw_char:
   3593   case tok::kw_wchar_t:
   3594   case tok::kw_char16_t:
   3595   case tok::kw_char32_t:
   3596   case tok::kw_int:
   3597   case tok::kw_half:
   3598   case tok::kw_float:
   3599   case tok::kw_double:
   3600   case tok::kw_bool:
   3601   case tok::kw__Bool:
   3602   case tok::kw__Decimal32:
   3603   case tok::kw__Decimal64:
   3604   case tok::kw__Decimal128:
   3605   case tok::kw___vector:
   3606 
   3607     // struct-or-union-specifier (C99) or class-specifier (C++)
   3608   case tok::kw_class:
   3609   case tok::kw_struct:
   3610   case tok::kw___interface:
   3611   case tok::kw_union:
   3612     // enum-specifier
   3613   case tok::kw_enum:
   3614 
   3615     // type-qualifier
   3616   case tok::kw_const:
   3617   case tok::kw_volatile:
   3618   case tok::kw_restrict:
   3619 
   3620     // typedef-name
   3621   case tok::annot_typename:
   3622     return true;
   3623 
   3624     // GNU ObjC bizarre protocol extension: <proto1,proto2> with implicit 'id'.
   3625   case tok::less:
   3626     return getLangOpts().ObjC1;
   3627 
   3628   case tok::kw___cdecl:
   3629   case tok::kw___stdcall:
   3630   case tok::kw___fastcall:
   3631   case tok::kw___thiscall:
   3632   case tok::kw___w64:
   3633   case tok::kw___ptr64:
   3634   case tok::kw___ptr32:
   3635   case tok::kw___pascal:
   3636   case tok::kw___unaligned:
   3637 
   3638   case tok::kw___private:
   3639   case tok::kw___local:
   3640   case tok::kw___global:
   3641   case tok::kw___constant:
   3642   case tok::kw___read_only:
   3643   case tok::kw___read_write:
   3644   case tok::kw___write_only:
   3645 
   3646     return true;
   3647 
   3648   case tok::kw_private:
   3649     return getLangOpts().OpenCL;
   3650 
   3651   // C11 _Atomic()
   3652   case tok::kw__Atomic:
   3653     return true;
   3654   }
   3655 }
   3656 
   3657 /// isDeclarationSpecifier() - Return true if the current token is part of a
   3658 /// declaration specifier.
   3659 ///
   3660 /// \param DisambiguatingWithExpression True to indicate that the purpose of
   3661 /// this check is to disambiguate between an expression and a declaration.
   3662 bool Parser::isDeclarationSpecifier(bool DisambiguatingWithExpression) {
   3663   switch (Tok.getKind()) {
   3664   default: return false;
   3665 
   3666   case tok::kw_private:
   3667     return getLangOpts().OpenCL;
   3668 
   3669   case tok::identifier:   // foo::bar
   3670     // Unfortunate hack to support "Class.factoryMethod" notation.
   3671     if (getLangOpts().ObjC1 && NextToken().is(tok::period))
   3672       return false;
   3673     if (TryAltiVecVectorToken())
   3674       return true;
   3675     // Fall through.
   3676   case tok::kw_decltype: // decltype(T())::type
   3677   case tok::kw_typename: // typename T::type
   3678     // Annotate typenames and C++ scope specifiers.  If we get one, just
   3679     // recurse to handle whatever we get.
   3680     if (TryAnnotateTypeOrScopeToken())
   3681       return true;
   3682     if (Tok.is(tok::identifier))
   3683       return false;
   3684 
   3685     // If we're in Objective-C and we have an Objective-C class type followed
   3686     // by an identifier and then either ':' or ']', in a place where an
   3687     // expression is permitted, then this is probably a class message send
   3688     // missing the initial '['. In this case, we won't consider this to be
   3689     // the start of a declaration.
   3690     if (DisambiguatingWithExpression &&
   3691         isStartOfObjCClassMessageMissingOpenBracket())
   3692       return false;
   3693 
   3694     return isDeclarationSpecifier();
   3695 
   3696   case tok::coloncolon:   // ::foo::bar
   3697     if (NextToken().is(tok::kw_new) ||    // ::new
   3698         NextToken().is(tok::kw_delete))   // ::delete
   3699       return false;
   3700 
   3701     // Annotate typenames and C++ scope specifiers.  If we get one, just
   3702     // recurse to handle whatever we get.
   3703     if (TryAnnotateTypeOrScopeToken())
   3704       return true;
   3705     return isDeclarationSpecifier();
   3706 
   3707     // storage-class-specifier
   3708   case tok::kw_typedef:
   3709   case tok::kw_extern:
   3710   case tok::kw___private_extern__:
   3711   case tok::kw_static:
   3712   case tok::kw_auto:
   3713   case tok::kw_register:
   3714   case tok::kw___thread:
   3715 
   3716     // Modules
   3717   case tok::kw___module_private__:
   3718 
   3719     // type-specifiers
   3720   case tok::kw_short:
   3721   case tok::kw_long:
   3722   case tok::kw___int64:
   3723   case tok::kw___int128:
   3724   case tok::kw_signed:
   3725   case tok::kw_unsigned:
   3726   case tok::kw__Complex:
   3727   case tok::kw__Imaginary:
   3728   case tok::kw_void:
   3729   case tok::kw_char:
   3730   case tok::kw_wchar_t:
   3731   case tok::kw_char16_t:
   3732   case tok::kw_char32_t:
   3733 
   3734   case tok::kw_int:
   3735   case tok::kw_half:
   3736   case tok::kw_float:
   3737   case tok::kw_double:
   3738   case tok::kw_bool:
   3739   case tok::kw__Bool:
   3740   case tok::kw__Decimal32:
   3741   case tok::kw__Decimal64:
   3742   case tok::kw__Decimal128:
   3743   case tok::kw___vector:
   3744 
   3745     // struct-or-union-specifier (C99) or class-specifier (C++)
   3746   case tok::kw_class:
   3747   case tok::kw_struct:
   3748   case tok::kw_union:
   3749   case tok::kw___interface:
   3750     // enum-specifier
   3751   case tok::kw_enum:
   3752 
   3753     // type-qualifier
   3754   case tok::kw_const:
   3755   case tok::kw_volatile:
   3756   case tok::kw_restrict:
   3757 
   3758     // function-specifier
   3759   case tok::kw_inline:
   3760   case tok::kw_virtual:
   3761   case tok::kw_explicit:
   3762 
   3763     // static_assert-declaration
   3764   case tok::kw__Static_assert:
   3765 
   3766     // GNU typeof support.
   3767   case tok::kw_typeof:
   3768 
   3769     // GNU attributes.
   3770   case tok::kw___attribute:
   3771     return true;
   3772 
   3773     // C++0x decltype.
   3774   case tok::annot_decltype:
   3775     return true;
   3776 
   3777     // C11 _Atomic()
   3778   case tok::kw__Atomic:
   3779     return true;
   3780 
   3781     // GNU ObjC bizarre protocol extension: <proto1,proto2> with implicit 'id'.
   3782   case tok::less:
   3783     return getLangOpts().ObjC1;
   3784 
   3785     // typedef-name
   3786   case tok::annot_typename:
   3787     return !DisambiguatingWithExpression ||
   3788            !isStartOfObjCClassMessageMissingOpenBracket();
   3789 
   3790   case tok::kw___declspec:
   3791   case tok::kw___cdecl:
   3792   case tok::kw___stdcall:
   3793   case tok::kw___fastcall:
   3794   case tok::kw___thiscall:
   3795   case tok::kw___w64:
   3796   case tok::kw___ptr64:
   3797   case tok::kw___ptr32:
   3798   case tok::kw___forceinline:
   3799   case tok::kw___pascal:
   3800   case tok::kw___unaligned:
   3801 
   3802   case tok::kw___private:
   3803   case tok::kw___local:
   3804   case tok::kw___global:
   3805   case tok::kw___constant:
   3806   case tok::kw___read_only:
   3807   case tok::kw___read_write:
   3808   case tok::kw___write_only:
   3809 
   3810     return true;
   3811   }
   3812 }
   3813 
   3814 bool Parser::isConstructorDeclarator() {
   3815   TentativeParsingAction TPA(*this);
   3816 
   3817   // Parse the C++ scope specifier.
   3818   CXXScopeSpec SS;
   3819   if (ParseOptionalCXXScopeSpecifier(SS, ParsedType(),
   3820                                      /*EnteringContext=*/true)) {
   3821     TPA.Revert();
   3822     return false;
   3823   }
   3824 
   3825   // Parse the constructor name.
   3826   if (Tok.is(tok::identifier) || Tok.is(tok::annot_template_id)) {
   3827     // We already know that we have a constructor name; just consume
   3828     // the token.
   3829     ConsumeToken();
   3830   } else {
   3831     TPA.Revert();
   3832     return false;
   3833   }
   3834 
   3835   // Current class name must be followed by a left parenthesis.
   3836   if (Tok.isNot(tok::l_paren)) {
   3837     TPA.Revert();
   3838     return false;
   3839   }
   3840   ConsumeParen();
   3841 
   3842   // A right parenthesis, or ellipsis followed by a right parenthesis signals
   3843   // that we have a constructor.
   3844   if (Tok.is(tok::r_paren) ||
   3845       (Tok.is(tok::ellipsis) && NextToken().is(tok::r_paren))) {
   3846     TPA.Revert();
   3847     return true;
   3848   }
   3849 
   3850   // If we need to, enter the specified scope.
   3851   DeclaratorScopeObj DeclScopeObj(*this, SS);
   3852   if (SS.isSet() && Actions.ShouldEnterDeclaratorScope(getCurScope(), SS))
   3853     DeclScopeObj.EnterDeclaratorScope();
   3854 
   3855   // Optionally skip Microsoft attributes.
   3856   ParsedAttributes Attrs(AttrFactory);
   3857   MaybeParseMicrosoftAttributes(Attrs);
   3858 
   3859   // Check whether the next token(s) are part of a declaration
   3860   // specifier, in which case we have the start of a parameter and,
   3861   // therefore, we know that this is a constructor.
   3862   bool IsConstructor = false;
   3863   if (isDeclarationSpecifier())
   3864     IsConstructor = true;
   3865   else if (Tok.is(tok::identifier) ||
   3866            (Tok.is(tok::annot_cxxscope) && NextToken().is(tok::identifier))) {
   3867     // We've seen "C ( X" or "C ( X::Y", but "X" / "X::Y" is not a type.
   3868     // This might be a parenthesized member name, but is more likely to
   3869     // be a constructor declaration with an invalid argument type. Keep
   3870     // looking.
   3871     if (Tok.is(tok::annot_cxxscope))
   3872       ConsumeToken();
   3873     ConsumeToken();
   3874 
   3875     // If this is not a constructor, we must be parsing a declarator,
   3876     // which must have one of the following syntactic forms (see the
   3877     // grammar extract at the start of ParseDirectDeclarator):
   3878     switch (Tok.getKind()) {
   3879     case tok::l_paren:
   3880       // C(X   (   int));
   3881     case tok::l_square:
   3882       // C(X   [   5]);
   3883       // C(X   [   [attribute]]);
   3884     case tok::coloncolon:
   3885       // C(X   ::   Y);
   3886       // C(X   ::   *p);
   3887     case tok::r_paren:
   3888       // C(X   )
   3889       // Assume this isn't a constructor, rather than assuming it's a
   3890       // constructor with an unnamed parameter of an ill-formed type.
   3891       break;
   3892 
   3893     default:
   3894       IsConstructor = true;
   3895       break;
   3896     }
   3897   }
   3898 
   3899   TPA.Revert();
   3900   return IsConstructor;
   3901 }
   3902 
   3903 /// ParseTypeQualifierListOpt
   3904 ///          type-qualifier-list: [C99 6.7.5]
   3905 ///            type-qualifier
   3906 /// [vendor]   attributes
   3907 ///              [ only if VendorAttributesAllowed=true ]
   3908 ///            type-qualifier-list type-qualifier
   3909 /// [vendor]   type-qualifier-list attributes
   3910 ///              [ only if VendorAttributesAllowed=true ]
   3911 /// [C++0x]    attribute-specifier[opt] is allowed before cv-qualifier-seq
   3912 ///              [ only if CXX0XAttributesAllowed=true ]
   3913 /// Note: vendor can be GNU, MS, etc.
   3914 ///
   3915 void Parser::ParseTypeQualifierListOpt(DeclSpec &DS,
   3916                                        bool VendorAttributesAllowed,
   3917                                        bool CXX11AttributesAllowed) {
   3918   if (getLangOpts().CPlusPlus0x && CXX11AttributesAllowed &&
   3919       isCXX11AttributeSpecifier()) {
   3920     ParsedAttributesWithRange attrs(AttrFactory);
   3921     ParseCXX11Attributes(attrs);
   3922     DS.takeAttributesFrom(attrs);
   3923   }
   3924 
   3925   SourceLocation EndLoc;
   3926 
   3927   while (1) {
   3928     bool isInvalid = false;
   3929     const char *PrevSpec = 0;
   3930     unsigned DiagID = 0;
   3931     SourceLocation Loc = Tok.getLocation();
   3932 
   3933     switch (Tok.getKind()) {
   3934     case tok::code_completion:
   3935       Actions.CodeCompleteTypeQualifiers(DS);
   3936       return cutOffParsing();
   3937 
   3938     case tok::kw_const:
   3939       isInvalid = DS.SetTypeQual(DeclSpec::TQ_const   , Loc, PrevSpec, DiagID,
   3940                                  getLangOpts(), /*IsTypeSpec*/false);
   3941       break;
   3942     case tok::kw_volatile:
   3943       isInvalid = DS.SetTypeQual(DeclSpec::TQ_volatile, Loc, PrevSpec, DiagID,
   3944                                  getLangOpts(), /*IsTypeSpec*/false);
   3945       break;
   3946     case tok::kw_restrict:
   3947       isInvalid = DS.SetTypeQual(DeclSpec::TQ_restrict, Loc, PrevSpec, DiagID,
   3948                                  getLangOpts(), /*IsTypeSpec*/false);
   3949       break;
   3950 
   3951     // OpenCL qualifiers:
   3952     case tok::kw_private:
   3953       if (!getLangOpts().OpenCL)
   3954         goto DoneWithTypeQuals;
   3955     case tok::kw___private:
   3956     case tok::kw___global:
   3957     case tok::kw___local:
   3958     case tok::kw___constant:
   3959     case tok::kw___read_only:
   3960     case tok::kw___write_only:
   3961     case tok::kw___read_write:
   3962       ParseOpenCLQualifiers(DS);
   3963       break;
   3964 
   3965     case tok::kw___w64:
   3966     case tok::kw___ptr64:
   3967     case tok::kw___ptr32:
   3968     case tok::kw___cdecl:
   3969     case tok::kw___stdcall:
   3970     case tok::kw___fastcall:
   3971     case tok::kw___thiscall:
   3972     case tok::kw___unaligned:
   3973       if (VendorAttributesAllowed) {
   3974         ParseMicrosoftTypeAttributes(DS.getAttributes());
   3975         continue;
   3976       }
   3977       goto DoneWithTypeQuals;
   3978     case tok::kw___pascal:
   3979       if (VendorAttributesAllowed) {
   3980         ParseBorlandTypeAttributes(DS.getAttributes());
   3981         continue;
   3982       }
   3983       goto DoneWithTypeQuals;
   3984     case tok::kw___attribute:
   3985       if (VendorAttributesAllowed) {
   3986         ParseGNUAttributes(DS.getAttributes());
   3987         continue; // do *not* consume the next token!
   3988       }
   3989       // otherwise, FALL THROUGH!
   3990     default:
   3991       DoneWithTypeQuals:
   3992       // If this is not a type-qualifier token, we're done reading type
   3993       // qualifiers.  First verify that DeclSpec's are consistent.
   3994       DS.Finish(Diags, PP);
   3995       if (EndLoc.isValid())
   3996         DS.SetRangeEnd(EndLoc);
   3997       return;
   3998     }
   3999 
   4000     // If the specifier combination wasn't legal, issue a diagnostic.
   4001     if (isInvalid) {
   4002       assert(PrevSpec && "Method did not return previous specifier!");
   4003       Diag(Tok, DiagID) << PrevSpec;
   4004     }
   4005     EndLoc = ConsumeToken();
   4006   }
   4007 }
   4008 
   4009 
   4010 /// ParseDeclarator - Parse and verify a newly-initialized declarator.
   4011 ///
   4012 void Parser::ParseDeclarator(Declarator &D) {
   4013   /// This implements the 'declarator' production in the C grammar, then checks
   4014   /// for well-formedness and issues diagnostics.
   4015   ParseDeclaratorInternal(D, &Parser::ParseDirectDeclarator);
   4016 }
   4017 
   4018 static bool isPtrOperatorToken(tok::TokenKind Kind, const LangOptions &Lang) {
   4019   if (Kind == tok::star || Kind == tok::caret)
   4020     return true;
   4021 
   4022   // We parse rvalue refs in C++03, because otherwise the errors are scary.
   4023   if (!Lang.CPlusPlus)
   4024     return false;
   4025 
   4026   return Kind == tok::amp || Kind == tok::ampamp;
   4027 }
   4028 
   4029 /// ParseDeclaratorInternal - Parse a C or C++ declarator. The direct-declarator
   4030 /// is parsed by the function passed to it. Pass null, and the direct-declarator
   4031 /// isn't parsed at all, making this function effectively parse the C++
   4032 /// ptr-operator production.
   4033 ///
   4034 /// If the grammar of this construct is extended, matching changes must also be
   4035 /// made to TryParseDeclarator and MightBeDeclarator, and possibly to
   4036 /// isConstructorDeclarator.
   4037 ///
   4038 ///       declarator: [C99 6.7.5] [C++ 8p4, dcl.decl]
   4039 /// [C]     pointer[opt] direct-declarator
   4040 /// [C++]   direct-declarator
   4041 /// [C++]   ptr-operator declarator
   4042 ///
   4043 ///       pointer: [C99 6.7.5]
   4044 ///         '*' type-qualifier-list[opt]
   4045 ///         '*' type-qualifier-list[opt] pointer
   4046 ///
   4047 ///       ptr-operator:
   4048 ///         '*' cv-qualifier-seq[opt]
   4049 ///         '&'
   4050 /// [C++0x] '&&'
   4051 /// [GNU]   '&' restrict[opt] attributes[opt]
   4052 /// [GNU?]  '&&' restrict[opt] attributes[opt]
   4053 ///         '::'[opt] nested-name-specifier '*' cv-qualifier-seq[opt]
   4054 void Parser::ParseDeclaratorInternal(Declarator &D,
   4055                                      DirectDeclParseFunction DirectDeclParser) {
   4056   if (Diags.hasAllExtensionsSilenced())
   4057     D.setExtension();
   4058 
   4059   // C++ member pointers start with a '::' or a nested-name.
   4060   // Member pointers get special handling, since there's no place for the
   4061   // scope spec in the generic path below.
   4062   if (getLangOpts().CPlusPlus &&
   4063       (Tok.is(tok::coloncolon) || Tok.is(tok::identifier) ||
   4064        Tok.is(tok::annot_cxxscope))) {
   4065     bool EnteringContext = D.getContext() == Declarator::FileContext ||
   4066                            D.getContext() == Declarator::MemberContext;
   4067     CXXScopeSpec SS;
   4068     ParseOptionalCXXScopeSpecifier(SS, ParsedType(), EnteringContext);
   4069 
   4070     if (SS.isNotEmpty()) {
   4071       if (Tok.isNot(tok::star)) {
   4072         // The scope spec really belongs to the direct-declarator.
   4073         D.getCXXScopeSpec() = SS;
   4074         if (DirectDeclParser)
   4075           (this->*DirectDeclParser)(D);
   4076         return;
   4077       }
   4078 
   4079       SourceLocation Loc = ConsumeToken();
   4080       D.SetRangeEnd(Loc);
   4081       DeclSpec DS(AttrFactory);
   4082       ParseTypeQualifierListOpt(DS);
   4083       D.ExtendWithDeclSpec(DS);
   4084 
   4085       // Recurse to parse whatever is left.
   4086       ParseDeclaratorInternal(D, DirectDeclParser);
   4087 
   4088       // Sema will have to catch (syntactically invalid) pointers into global
   4089       // scope. It has to catch pointers into namespace scope anyway.
   4090       D.AddTypeInfo(DeclaratorChunk::getMemberPointer(SS,DS.getTypeQualifiers(),
   4091                                                       Loc),
   4092                     DS.getAttributes(),
   4093                     /* Don't replace range end. */SourceLocation());
   4094       return;
   4095     }
   4096   }
   4097 
   4098   tok::TokenKind Kind = Tok.getKind();
   4099   // Not a pointer, C++ reference, or block.
   4100   if (!isPtrOperatorToken(Kind, getLangOpts())) {
   4101     if (DirectDeclParser)
   4102       (this->*DirectDeclParser)(D);
   4103     return;
   4104   }
   4105 
   4106   // Otherwise, '*' -> pointer, '^' -> block, '&' -> lvalue reference,
   4107   // '&&' -> rvalue reference
   4108   SourceLocation Loc = ConsumeToken();  // Eat the *, ^, & or &&.
   4109   D.SetRangeEnd(Loc);
   4110 
   4111   if (Kind == tok::star || Kind == tok::caret) {
   4112     // Is a pointer.
   4113     DeclSpec DS(AttrFactory);
   4114 
   4115     // FIXME: GNU attributes are not allowed here in a new-type-id.
   4116     ParseTypeQualifierListOpt(DS);
   4117     D.ExtendWithDeclSpec(DS);
   4118 
   4119     // Recursively parse the declarator.
   4120     ParseDeclaratorInternal(D, DirectDeclParser);
   4121     if (Kind == tok::star)
   4122       // Remember that we parsed a pointer type, and remember the type-quals.
   4123       D.AddTypeInfo(DeclaratorChunk::getPointer(DS.getTypeQualifiers(), Loc,
   4124                                                 DS.getConstSpecLoc(),
   4125                                                 DS.getVolatileSpecLoc(),
   4126                                                 DS.getRestrictSpecLoc()),
   4127                     DS.getAttributes(),
   4128                     SourceLocation());
   4129     else
   4130       // Remember that we parsed a Block type, and remember the type-quals.
   4131       D.AddTypeInfo(DeclaratorChunk::getBlockPointer(DS.getTypeQualifiers(),
   4132                                                      Loc),
   4133                     DS.getAttributes(),
   4134                     SourceLocation());
   4135   } else {
   4136     // Is a reference
   4137     DeclSpec DS(AttrFactory);
   4138 
   4139     // Complain about rvalue references in C++03, but then go on and build
   4140     // the declarator.
   4141     if (Kind == tok::ampamp)
   4142       Diag(Loc, getLangOpts().CPlusPlus0x ?
   4143            diag::warn_cxx98_compat_rvalue_reference :
   4144            diag::ext_rvalue_reference);
   4145 
   4146     // GNU-style and C++11 attributes are allowed here, as is restrict.
   4147     ParseTypeQualifierListOpt(DS);
   4148     D.ExtendWithDeclSpec(DS);
   4149 
   4150     // C++ 8.3.2p1: cv-qualified references are ill-formed except when the
   4151     // cv-qualifiers are introduced through the use of a typedef or of a
   4152     // template type argument, in which case the cv-qualifiers are ignored.
   4153     if (DS.getTypeQualifiers() != DeclSpec::TQ_unspecified) {
   4154       if (DS.getTypeQualifiers() & DeclSpec::TQ_const)
   4155         Diag(DS.getConstSpecLoc(),
   4156              diag::err_invalid_reference_qualifier_application) << "const";
   4157       if (DS.getTypeQualifiers() & DeclSpec::TQ_volatile)
   4158         Diag(DS.getVolatileSpecLoc(),
   4159              diag::err_invalid_reference_qualifier_application) << "volatile";
   4160     }
   4161 
   4162     // Recursively parse the declarator.
   4163     ParseDeclaratorInternal(D, DirectDeclParser);
   4164 
   4165     if (D.getNumTypeObjects() > 0) {
   4166       // C++ [dcl.ref]p4: There shall be no references to references.
   4167       DeclaratorChunk& InnerChunk = D.getTypeObject(D.getNumTypeObjects() - 1);
   4168       if (InnerChunk.Kind == DeclaratorChunk::Reference) {
   4169         if (const IdentifierInfo *II = D.getIdentifier())
   4170           Diag(InnerChunk.Loc, diag::err_illegal_decl_reference_to_reference)
   4171            << II;
   4172         else
   4173           Diag(InnerChunk.Loc, diag::err_illegal_decl_reference_to_reference)
   4174             << "type name";
   4175 
   4176         // Once we've complained about the reference-to-reference, we
   4177         // can go ahead and build the (technically ill-formed)
   4178         // declarator: reference collapsing will take care of it.
   4179       }
   4180     }
   4181 
   4182     // Remember that we parsed a reference type. It doesn't have type-quals.
   4183     D.AddTypeInfo(DeclaratorChunk::getReference(DS.getTypeQualifiers(), Loc,
   4184                                                 Kind == tok::amp),
   4185                   DS.getAttributes(),
   4186                   SourceLocation());
   4187   }
   4188 }
   4189 
   4190 static void diagnoseMisplacedEllipsis(Parser &P, Declarator &D,
   4191                                       SourceLocation EllipsisLoc) {
   4192   if (EllipsisLoc.isValid()) {
   4193     FixItHint Insertion;
   4194     if (!D.getEllipsisLoc().isValid()) {
   4195       Insertion = FixItHint::CreateInsertion(D.getIdentifierLoc(), "...");
   4196       D.setEllipsisLoc(EllipsisLoc);
   4197     }
   4198     P.Diag(EllipsisLoc, diag::err_misplaced_ellipsis_in_declaration)
   4199       << FixItHint::CreateRemoval(EllipsisLoc) << Insertion << !D.hasName();
   4200   }
   4201 }
   4202 
   4203 /// ParseDirectDeclarator
   4204 ///       direct-declarator: [C99 6.7.5]
   4205 /// [C99]   identifier
   4206 ///         '(' declarator ')'
   4207 /// [GNU]   '(' attributes declarator ')'
   4208 /// [C90]   direct-declarator '[' constant-expression[opt] ']'
   4209 /// [C99]   direct-declarator '[' type-qual-list[opt] assignment-expr[opt] ']'
   4210 /// [C99]   direct-declarator '[' 'static' type-qual-list[opt] assign-expr ']'
   4211 /// [C99]   direct-declarator '[' type-qual-list 'static' assignment-expr ']'
   4212 /// [C99]   direct-declarator '[' type-qual-list[opt] '*' ']'
   4213 /// [C++11] direct-declarator '[' constant-expression[opt] ']'
   4214 ///                    attribute-specifier-seq[opt]
   4215 ///         direct-declarator '(' parameter-type-list ')'
   4216 ///         direct-declarator '(' identifier-list[opt] ')'
   4217 /// [GNU]   direct-declarator '(' parameter-forward-declarations
   4218 ///                    parameter-type-list[opt] ')'
   4219 /// [C++]   direct-declarator '(' parameter-declaration-clause ')'
   4220 ///                    cv-qualifier-seq[opt] exception-specification[opt]
   4221 /// [C++11] direct-declarator '(' parameter-declaration-clause ')'
   4222 ///                    attribute-specifier-seq[opt] cv-qualifier-seq[opt]
   4223 ///                    ref-qualifier[opt] exception-specification[opt]
   4224 /// [C++]   declarator-id
   4225 /// [C++11] declarator-id attribute-specifier-seq[opt]
   4226 ///
   4227 ///       declarator-id: [C++ 8]
   4228 ///         '...'[opt] id-expression
   4229 ///         '::'[opt] nested-name-specifier[opt] type-name
   4230 ///
   4231 ///       id-expression: [C++ 5.1]
   4232 ///         unqualified-id
   4233 ///         qualified-id
   4234 ///
   4235 ///       unqualified-id: [C++ 5.1]
   4236 ///         identifier
   4237 ///         operator-function-id
   4238 ///         conversion-function-id
   4239 ///          '~' class-name
   4240 ///         template-id
   4241 ///
   4242 /// Note, any additional constructs added here may need corresponding changes
   4243 /// in isConstructorDeclarator.
   4244 void Parser::ParseDirectDeclarator(Declarator &D) {
   4245   DeclaratorScopeObj DeclScopeObj(*this, D.getCXXScopeSpec());
   4246 
   4247   if (getLangOpts().CPlusPlus && D.mayHaveIdentifier()) {
   4248     // ParseDeclaratorInternal might already have parsed the scope.
   4249     if (D.getCXXScopeSpec().isEmpty()) {
   4250       bool EnteringContext = D.getContext() == Declarator::FileContext ||
   4251                              D.getContext() == Declarator::MemberContext;
   4252       ParseOptionalCXXScopeSpecifier(D.getCXXScopeSpec(), ParsedType(),
   4253                                      EnteringContext);
   4254     }
   4255 
   4256     if (D.getCXXScopeSpec().isValid()) {
   4257       if (Actions.ShouldEnterDeclaratorScope(getCurScope(), D.getCXXScopeSpec()))
   4258         // Change the declaration context for name lookup, until this function
   4259         // is exited (and the declarator has been parsed).
   4260         DeclScopeObj.EnterDeclaratorScope();
   4261     }
   4262 
   4263     // C++0x [dcl.fct]p14:
   4264     //   There is a syntactic ambiguity when an ellipsis occurs at the end
   4265     //   of a parameter-declaration-clause without a preceding comma. In
   4266     //   this case, the ellipsis is parsed as part of the
   4267     //   abstract-declarator if the type of the parameter names a template
   4268     //   parameter pack that has not been expanded; otherwise, it is parsed
   4269     //   as part of the parameter-declaration-clause.
   4270     if (Tok.is(tok::ellipsis) && D.getCXXScopeSpec().isEmpty() &&
   4271         !((D.getContext() == Declarator::PrototypeContext ||
   4272            D.getContext() == Declarator::BlockLiteralContext) &&
   4273           NextToken().is(tok::r_paren) &&
   4274           !Actions.containsUnexpandedParameterPacks(D))) {
   4275       SourceLocation EllipsisLoc = ConsumeToken();
   4276       if (isPtrOperatorToken(Tok.getKind(), getLangOpts())) {
   4277         // The ellipsis was put in the wrong place. Recover, and explain to
   4278         // the user what they should have done.
   4279         ParseDeclarator(D);
   4280         diagnoseMisplacedEllipsis(*this, D, EllipsisLoc);
   4281         return;
   4282       } else
   4283         D.setEllipsisLoc(EllipsisLoc);
   4284 
   4285       // The ellipsis can't be followed by a parenthesized declarator. We
   4286       // check for that in ParseParenDeclarator, after we have disambiguated
   4287       // the l_paren token.
   4288     }
   4289 
   4290     if (Tok.is(tok::identifier) || Tok.is(tok::kw_operator) ||
   4291         Tok.is(tok::annot_template_id) || Tok.is(tok::tilde)) {
   4292       // We found something that indicates the start of an unqualified-id.
   4293       // Parse that unqualified-id.
   4294       bool AllowConstructorName;
   4295       if (D.getDeclSpec().hasTypeSpecifier())
   4296         AllowConstructorName = false;
   4297       else if (D.getCXXScopeSpec().isSet())
   4298         AllowConstructorName =
   4299           (D.getContext() == Declarator::FileContext ||
   4300            (D.getContext() == Declarator::MemberContext &&
   4301             D.getDeclSpec().isFriendSpecified()));
   4302       else
   4303         AllowConstructorName = (D.getContext() == Declarator::MemberContext);
   4304 
   4305       SourceLocation TemplateKWLoc;
   4306       if (ParseUnqualifiedId(D.getCXXScopeSpec(),
   4307                              /*EnteringContext=*/true,
   4308                              /*AllowDestructorName=*/true,
   4309                              AllowConstructorName,
   4310                              ParsedType(),
   4311                              TemplateKWLoc,
   4312                              D.getName()) ||
   4313           // Once we're past the identifier, if the scope was bad, mark the
   4314           // whole declarator bad.
   4315           D.getCXXScopeSpec().isInvalid()) {
   4316         D.SetIdentifier(0, Tok.getLocation());
   4317         D.setInvalidType(true);
   4318       } else {
   4319         // Parsed the unqualified-id; update range information and move along.
   4320         if (D.getSourceRange().getBegin().isInvalid())
   4321           D.SetRangeBegin(D.getName().getSourceRange().getBegin());
   4322         D.SetRangeEnd(D.getName().getSourceRange().getEnd());
   4323       }
   4324       goto PastIdentifier;
   4325     }
   4326   } else if (Tok.is(tok::identifier) && D.mayHaveIdentifier()) {
   4327     assert(!getLangOpts().CPlusPlus &&
   4328            "There's a C++-specific check for tok::identifier above");
   4329     assert(Tok.getIdentifierInfo() && "Not an identifier?");
   4330     D.SetIdentifier(Tok.getIdentifierInfo(), Tok.getLocation());
   4331     ConsumeToken();
   4332     goto PastIdentifier;
   4333   }
   4334 
   4335   if (Tok.is(tok::l_paren)) {
   4336     // direct-declarator: '(' declarator ')'
   4337     // direct-declarator: '(' attributes declarator ')'
   4338     // Example: 'char (*X)'   or 'int (*XX)(void)'
   4339     ParseParenDeclarator(D);
   4340 
   4341     // If the declarator was parenthesized, we entered the declarator
   4342     // scope when parsing the parenthesized declarator, then exited
   4343     // the scope already. Re-enter the scope, if we need to.
   4344     if (D.getCXXScopeSpec().isSet()) {
   4345       // If there was an error parsing parenthesized declarator, declarator
   4346       // scope may have been entered before. Don't do it again.
   4347       if (!D.isInvalidType() &&
   4348           Actions.ShouldEnterDeclaratorScope(getCurScope(), D.getCXXScopeSpec()))
   4349         // Change the declaration context for name lookup, until this function
   4350         // is exited (and the declarator has been parsed).
   4351         DeclScopeObj.EnterDeclaratorScope();
   4352     }
   4353   } else if (D.mayOmitIdentifier()) {
   4354     // This could be something simple like "int" (in which case the declarator
   4355     // portion is empty), if an abstract-declarator is allowed.
   4356     D.SetIdentifier(0, Tok.getLocation());
   4357   } else {
   4358     if (Tok.getKind() == tok::annot_pragma_parser_crash)
   4359       LLVM_BUILTIN_TRAP;
   4360     if (D.getContext() == Declarator::MemberContext)
   4361       Diag(Tok, diag::err_expected_member_name_or_semi)
   4362         << D.getDeclSpec().getSourceRange();
   4363     else if (getLangOpts().CPlusPlus)
   4364       Diag(Tok, diag::err_expected_unqualified_id) << getLangOpts().CPlusPlus;
   4365     else
   4366       Diag(Tok, diag::err_expected_ident_lparen);
   4367     D.SetIdentifier(0, Tok.getLocation());
   4368     D.setInvalidType(true);
   4369   }
   4370 
   4371  PastIdentifier:
   4372   assert(D.isPastIdentifier() &&
   4373          "Haven't past the location of the identifier yet?");
   4374 
   4375   // Don't parse attributes unless we have parsed an unparenthesized name.
   4376   if (D.hasName() && !D.getNumTypeObjects())
   4377     MaybeParseCXX0XAttributes(D);
   4378 
   4379   while (1) {
   4380     if (Tok.is(tok::l_paren)) {
   4381       // Enter function-declaration scope, limiting any declarators to the
   4382       // function prototype scope, including parameter declarators.
   4383       ParseScope PrototypeScope(this,
   4384                                 Scope::FunctionPrototypeScope|Scope::DeclScope);
   4385       // The paren may be part of a C++ direct initializer, eg. "int x(1);".
   4386       // In such a case, check if we actually have a function declarator; if it
   4387       // is not, the declarator has been fully parsed.
   4388       bool IsAmbiguous = false;
   4389       if (getLangOpts().CPlusPlus && D.mayBeFollowedByCXXDirectInit()) {
   4390         // The name of the declarator, if any, is tentatively declared within
   4391         // a possible direct initializer.
   4392         TentativelyDeclaredIdentifiers.push_back(D.getIdentifier());
   4393         bool IsFunctionDecl = isCXXFunctionDeclarator(&IsAmbiguous);
   4394         TentativelyDeclaredIdentifiers.pop_back();
   4395         if (!IsFunctionDecl)
   4396           break;
   4397       }
   4398       ParsedAttributes attrs(AttrFactory);
   4399       BalancedDelimiterTracker T(*this, tok::l_paren);
   4400       T.consumeOpen();
   4401       ParseFunctionDeclarator(D, attrs, T, IsAmbiguous);
   4402       PrototypeScope.Exit();
   4403     } else if (Tok.is(tok::l_square)) {
   4404       ParseBracketDeclarator(D);
   4405     } else {
   4406       break;
   4407     }
   4408   }
   4409 }
   4410 
   4411 /// ParseParenDeclarator - We parsed the declarator D up to a paren.  This is
   4412 /// only called before the identifier, so these are most likely just grouping
   4413 /// parens for precedence.  If we find that these are actually function
   4414 /// parameter parens in an abstract-declarator, we call ParseFunctionDeclarator.
   4415 ///
   4416 ///       direct-declarator:
   4417 ///         '(' declarator ')'
   4418 /// [GNU]   '(' attributes declarator ')'
   4419 ///         direct-declarator '(' parameter-type-list ')'
   4420 ///         direct-declarator '(' identifier-list[opt] ')'
   4421 /// [GNU]   direct-declarator '(' parameter-forward-declarations
   4422 ///                    parameter-type-list[opt] ')'
   4423 ///
   4424 void Parser::ParseParenDeclarator(Declarator &D) {
   4425   BalancedDelimiterTracker T(*this, tok::l_paren);
   4426   T.consumeOpen();
   4427 
   4428   assert(!D.isPastIdentifier() && "Should be called before passing identifier");
   4429 
   4430   // Eat any attributes before we look at whether this is a grouping or function
   4431   // declarator paren.  If this is a grouping paren, the attribute applies to
   4432   // the type being built up, for example:
   4433   //     int (__attribute__(()) *x)(long y)
   4434   // If this ends up not being a grouping paren, the attribute applies to the
   4435   // first argument, for example:
   4436   //     int (__attribute__(()) int x)
   4437   // In either case, we need to eat any attributes to be able to determine what
   4438   // sort of paren this is.
   4439   //
   4440   ParsedAttributes attrs(AttrFactory);
   4441   bool RequiresArg = false;
   4442   if (Tok.is(tok::kw___attribute)) {
   4443     ParseGNUAttributes(attrs);
   4444 
   4445     // We require that the argument list (if this is a non-grouping paren) be
   4446     // present even if the attribute list was empty.
   4447     RequiresArg = true;
   4448   }
   4449   // Eat any Microsoft extensions.
   4450   if  (Tok.is(tok::kw___cdecl) || Tok.is(tok::kw___stdcall) ||
   4451        Tok.is(tok::kw___thiscall) || Tok.is(tok::kw___fastcall) ||
   4452        Tok.is(tok::kw___w64) || Tok.is(tok::kw___ptr64) ||
   4453        Tok.is(tok::kw___ptr32) || Tok.is(tok::kw___unaligned)) {
   4454     ParseMicrosoftTypeAttributes(attrs);
   4455   }
   4456   // Eat any Borland extensions.
   4457   if  (Tok.is(tok::kw___pascal))
   4458     ParseBorlandTypeAttributes(attrs);
   4459 
   4460   // If we haven't past the identifier yet (or where the identifier would be
   4461   // stored, if this is an abstract declarator), then this is probably just
   4462   // grouping parens. However, if this could be an abstract-declarator, then
   4463   // this could also be the start of function arguments (consider 'void()').
   4464   bool isGrouping;
   4465 
   4466   if (!D.mayOmitIdentifier()) {
   4467     // If this can't be an abstract-declarator, this *must* be a grouping
   4468     // paren, because we haven't seen the identifier yet.
   4469     isGrouping = true;
   4470   } else if (Tok.is(tok::r_paren) ||           // 'int()' is a function.
   4471              (getLangOpts().CPlusPlus && Tok.is(tok::ellipsis) &&
   4472               NextToken().is(tok::r_paren)) || // C++ int(...)
   4473              isDeclarationSpecifier() ||       // 'int(int)' is a function.
   4474              isCXX11AttributeSpecifier()) {    // 'int([[]]int)' is a function.
   4475     // This handles C99 6.7.5.3p11: in "typedef int X; void foo(X)", X is
   4476     // considered to be a type, not a K&R identifier-list.
   4477     isGrouping = false;
   4478   } else {
   4479     // Otherwise, this is a grouping paren, e.g. 'int (*X)' or 'int(X)'.
   4480     isGrouping = true;
   4481   }
   4482 
   4483   // If this is a grouping paren, handle:
   4484   // direct-declarator: '(' declarator ')'
   4485   // direct-declarator: '(' attributes declarator ')'
   4486   if (isGrouping) {
   4487     SourceLocation EllipsisLoc = D.getEllipsisLoc();
   4488     D.setEllipsisLoc(SourceLocation());
   4489 
   4490     bool hadGroupingParens = D.hasGroupingParens();
   4491     D.setGroupingParens(true);
   4492     ParseDeclaratorInternal(D, &Parser::ParseDirectDeclarator);
   4493     // Match the ')'.
   4494     T.consumeClose();
   4495     D.AddTypeInfo(DeclaratorChunk::getParen(T.getOpenLocation(),
   4496                                             T.getCloseLocation()),
   4497                   attrs, T.getCloseLocation());
   4498 
   4499     D.setGroupingParens(hadGroupingParens);
   4500 
   4501     // An ellipsis cannot be placed outside parentheses.
   4502     if (EllipsisLoc.isValid())
   4503       diagnoseMisplacedEllipsis(*this, D, EllipsisLoc);
   4504 
   4505     return;
   4506   }
   4507 
   4508   // Okay, if this wasn't a grouping paren, it must be the start of a function
   4509   // argument list.  Recognize that this declarator will never have an
   4510   // identifier (and remember where it would have been), then call into
   4511   // ParseFunctionDeclarator to handle of argument list.
   4512   D.SetIdentifier(0, Tok.getLocation());
   4513 
   4514   // Enter function-declaration scope, limiting any declarators to the
   4515   // function prototype scope, including parameter declarators.
   4516   ParseScope PrototypeScope(this,
   4517                             Scope::FunctionPrototypeScope|Scope::DeclScope);
   4518   ParseFunctionDeclarator(D, attrs, T, false, RequiresArg);
   4519   PrototypeScope.Exit();
   4520 }
   4521 
   4522 /// ParseFunctionDeclarator - We are after the identifier and have parsed the
   4523 /// declarator D up to a paren, which indicates that we are parsing function
   4524 /// arguments.
   4525 ///
   4526 /// If FirstArgAttrs is non-null, then the caller parsed those arguments
   4527 /// immediately after the open paren - they should be considered to be the
   4528 /// first argument of a parameter.
   4529 ///
   4530 /// If RequiresArg is true, then the first argument of the function is required
   4531 /// to be present and required to not be an identifier list.
   4532 ///
   4533 /// For C++, after the parameter-list, it also parses the cv-qualifier-seq[opt],
   4534 /// (C++11) ref-qualifier[opt], exception-specification[opt],
   4535 /// (C++11) attribute-specifier-seq[opt], and (C++11) trailing-return-type[opt].
   4536 ///
   4537 /// [C++11] exception-specification:
   4538 ///           dynamic-exception-specification
   4539 ///           noexcept-specification
   4540 ///
   4541 void Parser::ParseFunctionDeclarator(Declarator &D,
   4542                                      ParsedAttributes &FirstArgAttrs,
   4543                                      BalancedDelimiterTracker &Tracker,
   4544                                      bool IsAmbiguous,
   4545                                      bool RequiresArg) {
   4546   assert(getCurScope()->isFunctionPrototypeScope() &&
   4547          "Should call from a Function scope");
   4548   // lparen is already consumed!
   4549   assert(D.isPastIdentifier() && "Should not call before identifier!");
   4550 
   4551   // This should be true when the function has typed arguments.
   4552   // Otherwise, it is treated as a K&R-style function.
   4553   bool HasProto = false;
   4554   // Build up an array of information about the parsed arguments.
   4555   SmallVector<DeclaratorChunk::ParamInfo, 16> ParamInfo;
   4556   // Remember where we see an ellipsis, if any.
   4557   SourceLocation EllipsisLoc;
   4558 
   4559   DeclSpec DS(AttrFactory);
   4560   bool RefQualifierIsLValueRef = true;
   4561   SourceLocation RefQualifierLoc;
   4562   SourceLocation ConstQualifierLoc;
   4563   SourceLocation VolatileQualifierLoc;
   4564   ExceptionSpecificationType ESpecType = EST_None;
   4565   SourceRange ESpecRange;
   4566   SmallVector<ParsedType, 2> DynamicExceptions;
   4567   SmallVector<SourceRange, 2> DynamicExceptionRanges;
   4568   ExprResult NoexceptExpr;
   4569   ParsedAttributes FnAttrs(AttrFactory);
   4570   TypeResult TrailingReturnType;
   4571 
   4572   Actions.ActOnStartFunctionDeclarator();
   4573 
   4574   SourceLocation EndLoc;
   4575   if (isFunctionDeclaratorIdentifierList()) {
   4576     if (RequiresArg)
   4577       Diag(Tok, diag::err_argument_required_after_attribute);
   4578 
   4579     ParseFunctionDeclaratorIdentifierList(D, ParamInfo);
   4580 
   4581     Tracker.consumeClose();
   4582     EndLoc = Tracker.getCloseLocation();
   4583   } else {
   4584     if (Tok.isNot(tok::r_paren))
   4585       ParseParameterDeclarationClause(D, FirstArgAttrs, ParamInfo, EllipsisLoc);
   4586     else if (RequiresArg)
   4587       Diag(Tok, diag::err_argument_required_after_attribute);
   4588 
   4589     HasProto = ParamInfo.size() || getLangOpts().CPlusPlus;
   4590 
   4591     // If we have the closing ')', eat it.
   4592     Tracker.consumeClose();
   4593     EndLoc = Tracker.getCloseLocation();
   4594 
   4595     if (getLangOpts().CPlusPlus) {
   4596       // FIXME: Accept these components in any order, and produce fixits to
   4597       // correct the order if the user gets it wrong. Ideally we should deal
   4598       // with the virt-specifier-seq and pure-specifier in the same way.
   4599 
   4600       // Parse cv-qualifier-seq[opt].
   4601       ParseTypeQualifierListOpt(DS, false /*no attributes*/, false);
   4602       if (!DS.getSourceRange().getEnd().isInvalid()) {
   4603         EndLoc = DS.getSourceRange().getEnd();
   4604         ConstQualifierLoc = DS.getConstSpecLoc();
   4605         VolatileQualifierLoc = DS.getVolatileSpecLoc();
   4606       }
   4607 
   4608       // Parse ref-qualifier[opt].
   4609       if (Tok.is(tok::amp) || Tok.is(tok::ampamp)) {
   4610         Diag(Tok, getLangOpts().CPlusPlus0x ?
   4611              diag::warn_cxx98_compat_ref_qualifier :
   4612              diag::ext_ref_qualifier);
   4613 
   4614         RefQualifierIsLValueRef = Tok.is(tok::amp);
   4615         RefQualifierLoc = ConsumeToken();
   4616         EndLoc = RefQualifierLoc;
   4617       }
   4618 
   4619       // C++11 [expr.prim.general]p3:
   4620       //   If a declaration declares a member function or member function
   4621       //   template of a class X, the expression this is a prvalue of type
   4622       //   "pointer to cv-qualifier-seq X" between the optional cv-qualifer-seq
   4623       //   and the end of the function-definition, member-declarator, or
   4624       //   declarator.
   4625       bool IsCXX11MemberFunction =
   4626         getLangOpts().CPlusPlus0x &&
   4627         (D.getContext() == Declarator::MemberContext ||
   4628          (D.getContext() == Declarator::FileContext &&
   4629           D.getCXXScopeSpec().isValid() &&
   4630           Actions.CurContext->isRecord()));
   4631       Sema::CXXThisScopeRAII ThisScope(Actions,
   4632                                dyn_cast<CXXRecordDecl>(Actions.CurContext),
   4633                                DS.getTypeQualifiers(),
   4634                                IsCXX11MemberFunction);
   4635 
   4636       // Parse exception-specification[opt].
   4637       ESpecType = tryParseExceptionSpecification(ESpecRange,
   4638                                                  DynamicExceptions,
   4639                                                  DynamicExceptionRanges,
   4640                                                  NoexceptExpr);
   4641       if (ESpecType != EST_None)
   4642         EndLoc = ESpecRange.getEnd();
   4643 
   4644       // Parse attribute-specifier-seq[opt]. Per DR 979 and DR 1297, this goes
   4645       // after the exception-specification.
   4646       MaybeParseCXX0XAttributes(FnAttrs);
   4647 
   4648       // Parse trailing-return-type[opt].
   4649       if (getLangOpts().CPlusPlus0x && Tok.is(tok::arrow)) {
   4650         Diag(Tok, diag::warn_cxx98_compat_trailing_return_type);
   4651         SourceRange Range;
   4652         TrailingReturnType = ParseTrailingReturnType(Range);
   4653         if (Range.getEnd().isValid())
   4654           EndLoc = Range.getEnd();
   4655       }
   4656     }
   4657   }
   4658 
   4659   // Remember that we parsed a function type, and remember the attributes.
   4660   D.AddTypeInfo(DeclaratorChunk::getFunction(HasProto,
   4661                                              /*isVariadic=*/EllipsisLoc.isValid(),
   4662                                              IsAmbiguous, EllipsisLoc,
   4663                                              ParamInfo.data(), ParamInfo.size(),
   4664                                              DS.getTypeQualifiers(),
   4665                                              RefQualifierIsLValueRef,
   4666                                              RefQualifierLoc, ConstQualifierLoc,
   4667                                              VolatileQualifierLoc,
   4668                                              /*MutableLoc=*/SourceLocation(),
   4669                                              ESpecType, ESpecRange.getBegin(),
   4670                                              DynamicExceptions.data(),
   4671                                              DynamicExceptionRanges.data(),
   4672                                              DynamicExceptions.size(),
   4673                                              NoexceptExpr.isUsable() ?
   4674                                                NoexceptExpr.get() : 0,
   4675                                              Tracker.getOpenLocation(),
   4676                                              EndLoc, D,
   4677                                              TrailingReturnType),
   4678                 FnAttrs, EndLoc);
   4679 
   4680   Actions.ActOnEndFunctionDeclarator();
   4681 }
   4682 
   4683 /// isFunctionDeclaratorIdentifierList - This parameter list may have an
   4684 /// identifier list form for a K&R-style function:  void foo(a,b,c)
   4685 ///
   4686 /// Note that identifier-lists are only allowed for normal declarators, not for
   4687 /// abstract-declarators.
   4688 bool Parser::isFunctionDeclaratorIdentifierList() {
   4689   return !getLangOpts().CPlusPlus
   4690          && Tok.is(tok::identifier)
   4691          && !TryAltiVecVectorToken()
   4692          // K&R identifier lists can't have typedefs as identifiers, per C99
   4693          // 6.7.5.3p11.
   4694          && (TryAnnotateTypeOrScopeToken() || !Tok.is(tok::annot_typename))
   4695          // Identifier lists follow a really simple grammar: the identifiers can
   4696          // be followed *only* by a ", identifier" or ")".  However, K&R
   4697          // identifier lists are really rare in the brave new modern world, and
   4698          // it is very common for someone to typo a type in a non-K&R style
   4699          // list.  If we are presented with something like: "void foo(intptr x,
   4700          // float y)", we don't want to start parsing the function declarator as
   4701          // though it is a K&R style declarator just because intptr is an
   4702          // invalid type.
   4703          //
   4704          // To handle this, we check to see if the token after the first
   4705          // identifier is a "," or ")".  Only then do we parse it as an
   4706          // identifier list.
   4707          && (NextToken().is(tok::comma) || NextToken().is(tok::r_paren));
   4708 }
   4709 
   4710 /// ParseFunctionDeclaratorIdentifierList - While parsing a function declarator
   4711 /// we found a K&R-style identifier list instead of a typed parameter list.
   4712 ///
   4713 /// After returning, ParamInfo will hold the parsed parameters.
   4714 ///
   4715 ///       identifier-list: [C99 6.7.5]
   4716 ///         identifier
   4717 ///         identifier-list ',' identifier
   4718 ///
   4719 void Parser::ParseFunctionDeclaratorIdentifierList(
   4720        Declarator &D,
   4721        SmallVector<DeclaratorChunk::ParamInfo, 16> &ParamInfo) {
   4722   // If there was no identifier specified for the declarator, either we are in
   4723   // an abstract-declarator, or we are in a parameter declarator which was found
   4724   // to be abstract.  In abstract-declarators, identifier lists are not valid:
   4725   // diagnose this.
   4726   if (!D.getIdentifier())
   4727     Diag(Tok, diag::ext_ident_list_in_param);
   4728 
   4729   // Maintain an efficient lookup of params we have seen so far.
   4730   llvm::SmallSet<const IdentifierInfo*, 16> ParamsSoFar;
   4731 
   4732   while (1) {
   4733     // If this isn't an identifier, report the error and skip until ')'.
   4734     if (Tok.isNot(tok::identifier)) {
   4735       Diag(Tok, diag::err_expected_ident);
   4736       SkipUntil(tok::r_paren, /*StopAtSemi=*/true, /*DontConsume=*/true);
   4737       // Forget we parsed anything.
   4738       ParamInfo.clear();
   4739       return;
   4740     }
   4741 
   4742     IdentifierInfo *ParmII = Tok.getIdentifierInfo();
   4743 
   4744     // Reject 'typedef int y; int test(x, y)', but continue parsing.
   4745     if (Actions.getTypeName(*ParmII, Tok.getLocation(), getCurScope()))
   4746       Diag(Tok, diag::err_unexpected_typedef_ident) << ParmII;
   4747 
   4748     // Verify that the argument identifier has not already been mentioned.
   4749     if (!ParamsSoFar.insert(ParmII)) {
   4750       Diag(Tok, diag::err_param_redefinition) << ParmII;
   4751     } else {
   4752       // Remember this identifier in ParamInfo.
   4753       ParamInfo.push_back(DeclaratorChunk::ParamInfo(ParmII,
   4754                                                      Tok.getLocation(),
   4755                                                      0));
   4756     }
   4757 
   4758     // Eat the identifier.
   4759     ConsumeToken();
   4760 
   4761     // The list continues if we see a comma.
   4762     if (Tok.isNot(tok::comma))
   4763       break;
   4764     ConsumeToken();
   4765   }
   4766 }
   4767 
   4768 /// ParseParameterDeclarationClause - Parse a (possibly empty) parameter-list
   4769 /// after the opening parenthesis. This function will not parse a K&R-style
   4770 /// identifier list.
   4771 ///
   4772 /// D is the declarator being parsed.  If FirstArgAttrs is non-null, then the
   4773 /// caller parsed those arguments immediately after the open paren - they should
   4774 /// be considered to be part of the first parameter.
   4775 ///
   4776 /// After returning, ParamInfo will hold the parsed parameters. EllipsisLoc will
   4777 /// be the location of the ellipsis, if any was parsed.
   4778 ///
   4779 ///       parameter-type-list: [C99 6.7.5]
   4780 ///         parameter-list
   4781 ///         parameter-list ',' '...'
   4782 /// [C++]   parameter-list '...'
   4783 ///
   4784 ///       parameter-list: [C99 6.7.5]
   4785 ///         parameter-declaration
   4786 ///         parameter-list ',' parameter-declaration
   4787 ///
   4788 ///       parameter-declaration: [C99 6.7.5]
   4789 ///         declaration-specifiers declarator
   4790 /// [C++]   declaration-specifiers declarator '=' assignment-expression
   4791 /// [C++11]                                       initializer-clause
   4792 /// [GNU]   declaration-specifiers declarator attributes
   4793 ///         declaration-specifiers abstract-declarator[opt]
   4794 /// [C++]   declaration-specifiers abstract-declarator[opt]
   4795 ///           '=' assignment-expression
   4796 /// [GNU]   declaration-specifiers abstract-declarator[opt] attributes
   4797 /// [C++11] attribute-specifier-seq parameter-declaration
   4798 ///
   4799 void Parser::ParseParameterDeclarationClause(
   4800        Declarator &D,
   4801        ParsedAttributes &FirstArgAttrs,
   4802        SmallVector<DeclaratorChunk::ParamInfo, 16> &ParamInfo,
   4803        SourceLocation &EllipsisLoc) {
   4804 
   4805   while (1) {
   4806     if (Tok.is(tok::ellipsis)) {
   4807       // FIXME: Issue a diagnostic if we parsed an attribute-specifier-seq
   4808       // before deciding this was a parameter-declaration-clause.
   4809       EllipsisLoc = ConsumeToken();     // Consume the ellipsis.
   4810       break;
   4811     }
   4812 
   4813     // Parse the declaration-specifiers.
   4814     // Just use the ParsingDeclaration "scope" of the declarator.
   4815     DeclSpec DS(AttrFactory);
   4816 
   4817     // Parse any C++11 attributes.
   4818     MaybeParseCXX0XAttributes(DS.getAttributes());
   4819 
   4820     // Skip any Microsoft attributes before a param.
   4821     if (getLangOpts().MicrosoftExt && Tok.is(tok::l_square))
   4822       ParseMicrosoftAttributes(DS.getAttributes());
   4823 
   4824     SourceLocation DSStart = Tok.getLocation();
   4825 
   4826     // If the caller parsed attributes for the first argument, add them now.
   4827     // Take them so that we only apply the attributes to the first parameter.
   4828     // FIXME: If we can leave the attributes in the token stream somehow, we can
   4829     // get rid of a parameter (FirstArgAttrs) and this statement. It might be
   4830     // too much hassle.
   4831     DS.takeAttributesFrom(FirstArgAttrs);
   4832 
   4833     ParseDeclarationSpecifiers(DS);
   4834 
   4835     // Parse the declarator.  This is "PrototypeContext", because we must
   4836     // accept either 'declarator' or 'abstract-declarator' here.
   4837     Declarator ParmDecl(DS, Declarator::PrototypeContext);
   4838     ParseDeclarator(ParmDecl);
   4839 
   4840     // Parse GNU attributes, if present.
   4841     MaybeParseGNUAttributes(ParmDecl);
   4842 
   4843     // Remember this parsed parameter in ParamInfo.
   4844     IdentifierInfo *ParmII = ParmDecl.getIdentifier();
   4845 
   4846     // DefArgToks is used when the parsing of default arguments needs
   4847     // to be delayed.
   4848     CachedTokens *DefArgToks = 0;
   4849 
   4850     // If no parameter was specified, verify that *something* was specified,
   4851     // otherwise we have a missing type and identifier.
   4852     if (DS.isEmpty() && ParmDecl.getIdentifier() == 0 &&
   4853         ParmDecl.getNumTypeObjects() == 0) {
   4854       // Completely missing, emit error.
   4855       Diag(DSStart, diag::err_missing_param);
   4856     } else {
   4857       // Otherwise, we have something.  Add it and let semantic analysis try
   4858       // to grok it and add the result to the ParamInfo we are building.
   4859 
   4860       // Inform the actions module about the parameter declarator, so it gets
   4861       // added to the current scope.
   4862       Decl *Param = Actions.ActOnParamDeclarator(getCurScope(), ParmDecl);
   4863 
   4864       // Parse the default argument, if any. We parse the default
   4865       // arguments in all dialects; the semantic analysis in
   4866       // ActOnParamDefaultArgument will reject the default argument in
   4867       // C.
   4868       if (Tok.is(tok::equal)) {
   4869         SourceLocation EqualLoc = Tok.getLocation();
   4870 
   4871         // Parse the default argument
   4872         if (D.getContext() == Declarator::MemberContext) {
   4873           // If we're inside a class definition, cache the tokens
   4874           // corresponding to the default argument. We'll actually parse
   4875           // them when we see the end of the class definition.
   4876           // FIXME: Can we use a smart pointer for Toks?
   4877           DefArgToks = new CachedTokens;
   4878 
   4879           if (!ConsumeAndStoreUntil(tok::comma, tok::r_paren, *DefArgToks,
   4880                                     /*StopAtSemi=*/true,
   4881                                     /*ConsumeFinalToken=*/false)) {
   4882             delete DefArgToks;
   4883             DefArgToks = 0;
   4884             Actions.ActOnParamDefaultArgumentError(Param);
   4885           } else {
   4886             // Mark the end of the default argument so that we know when to
   4887             // stop when we parse it later on.
   4888             Token DefArgEnd;
   4889             DefArgEnd.startToken();
   4890             DefArgEnd.setKind(tok::cxx_defaultarg_end);
   4891             DefArgEnd.setLocation(Tok.getLocation());
   4892             DefArgToks->push_back(DefArgEnd);
   4893             Actions.ActOnParamUnparsedDefaultArgument(Param, EqualLoc,
   4894                                                 (*DefArgToks)[1].getLocation());
   4895           }
   4896         } else {
   4897           // Consume the '='.
   4898           ConsumeToken();
   4899 
   4900           // The argument isn't actually potentially evaluated unless it is
   4901           // used.
   4902           EnterExpressionEvaluationContext Eval(Actions,
   4903                                               Sema::PotentiallyEvaluatedIfUsed,
   4904                                                 Param);
   4905 
   4906           ExprResult DefArgResult;
   4907           if (getLangOpts().CPlusPlus0x && Tok.is(tok::l_brace)) {
   4908             Diag(Tok, diag::warn_cxx98_compat_generalized_initializer_lists);
   4909             DefArgResult = ParseBraceInitializer();
   4910           } else
   4911             DefArgResult = ParseAssignmentExpression();
   4912           if (DefArgResult.isInvalid()) {
   4913             Actions.ActOnParamDefaultArgumentError(Param);
   4914             SkipUntil(tok::comma, tok::r_paren, true, true);
   4915           } else {
   4916             // Inform the actions module about the default argument
   4917             Actions.ActOnParamDefaultArgument(Param, EqualLoc,
   4918                                               DefArgResult.take());
   4919           }
   4920         }
   4921       }
   4922 
   4923       ParamInfo.push_back(DeclaratorChunk::ParamInfo(ParmII,
   4924                                           ParmDecl.getIdentifierLoc(), Param,
   4925                                           DefArgToks));
   4926     }
   4927 
   4928     // If the next token is a comma, consume it and keep reading arguments.
   4929     if (Tok.isNot(tok::comma)) {
   4930       if (Tok.is(tok::ellipsis)) {
   4931         EllipsisLoc = ConsumeToken();     // Consume the ellipsis.
   4932 
   4933         if (!getLangOpts().CPlusPlus) {
   4934           // We have ellipsis without a preceding ',', which is ill-formed
   4935           // in C. Complain and provide the fix.
   4936           Diag(EllipsisLoc, diag::err_missing_comma_before_ellipsis)
   4937             << FixItHint::CreateInsertion(EllipsisLoc, ", ");
   4938         }
   4939       }
   4940 
   4941       break;
   4942     }
   4943 
   4944     // Consume the comma.
   4945     ConsumeToken();
   4946   }
   4947 
   4948 }
   4949 
   4950 /// [C90]   direct-declarator '[' constant-expression[opt] ']'
   4951 /// [C99]   direct-declarator '[' type-qual-list[opt] assignment-expr[opt] ']'
   4952 /// [C99]   direct-declarator '[' 'static' type-qual-list[opt] assign-expr ']'
   4953 /// [C99]   direct-declarator '[' type-qual-list 'static' assignment-expr ']'
   4954 /// [C99]   direct-declarator '[' type-qual-list[opt] '*' ']'
   4955 /// [C++11] direct-declarator '[' constant-expression[opt] ']'
   4956 ///                           attribute-specifier-seq[opt]
   4957 void Parser::ParseBracketDeclarator(Declarator &D) {
   4958   if (CheckProhibitedCXX11Attribute())
   4959     return;
   4960 
   4961   BalancedDelimiterTracker T(*this, tok::l_square);
   4962   T.consumeOpen();
   4963 
   4964   // C array syntax has many features, but by-far the most common is [] and [4].
   4965   // This code does a fast path to handle some of the most obvious cases.
   4966   if (Tok.getKind() == tok::r_square) {
   4967     T.consumeClose();
   4968     ParsedAttributes attrs(AttrFactory);
   4969     MaybeParseCXX0XAttributes(attrs);
   4970 
   4971     // Remember that we parsed the empty array type.
   4972     ExprResult NumElements;
   4973     D.AddTypeInfo(DeclaratorChunk::getArray(0, false, false, 0,
   4974                                             T.getOpenLocation(),
   4975                                             T.getCloseLocation()),
   4976                   attrs, T.getCloseLocation());
   4977     return;
   4978   } else if (Tok.getKind() == tok::numeric_constant &&
   4979              GetLookAheadToken(1).is(tok::r_square)) {
   4980     // [4] is very common.  Parse the numeric constant expression.
   4981     ExprResult ExprRes(Actions.ActOnNumericConstant(Tok, getCurScope()));
   4982     ConsumeToken();
   4983 
   4984     T.consumeClose();
   4985     ParsedAttributes attrs(AttrFactory);
   4986     MaybeParseCXX0XAttributes(attrs);
   4987 
   4988     // Remember that we parsed a array type, and remember its features.
   4989     D.AddTypeInfo(DeclaratorChunk::getArray(0, false, 0,
   4990                                             ExprRes.release(),
   4991                                             T.getOpenLocation(),
   4992                                             T.getCloseLocation()),
   4993                   attrs, T.getCloseLocation());
   4994     return;
   4995   }
   4996 
   4997   // If valid, this location is the position where we read the 'static' keyword.
   4998   SourceLocation StaticLoc;
   4999   if (Tok.is(tok::kw_static))
   5000     StaticLoc = ConsumeToken();
   5001 
   5002   // If there is a type-qualifier-list, read it now.
   5003   // Type qualifiers in an array subscript are a C99 feature.
   5004   DeclSpec DS(AttrFactory);
   5005   ParseTypeQualifierListOpt(DS, false /*no attributes*/);
   5006 
   5007   // If we haven't already read 'static', check to see if there is one after the
   5008   // type-qualifier-list.
   5009   if (!StaticLoc.isValid() && Tok.is(tok::kw_static))
   5010     StaticLoc = ConsumeToken();
   5011 
   5012   // Handle "direct-declarator [ type-qual-list[opt] * ]".
   5013   bool isStar = false;
   5014   ExprResult NumElements;
   5015 
   5016   // Handle the case where we have '[*]' as the array size.  However, a leading
   5017   // star could be the start of an expression, for example 'X[*p + 4]'.  Verify
   5018   // the token after the star is a ']'.  Since stars in arrays are
   5019   // infrequent, use of lookahead is not costly here.
   5020   if (Tok.is(tok::star) && GetLookAheadToken(1).is(tok::r_square)) {
   5021     ConsumeToken();  // Eat the '*'.
   5022 
   5023     if (StaticLoc.isValid()) {
   5024       Diag(StaticLoc, diag::err_unspecified_vla_size_with_static);
   5025       StaticLoc = SourceLocation();  // Drop the static.
   5026     }
   5027     isStar = true;
   5028   } else if (Tok.isNot(tok::r_square)) {
   5029     // Note, in C89, this production uses the constant-expr production instead
   5030     // of assignment-expr.  The only difference is that assignment-expr allows
   5031     // things like '=' and '*='.  Sema rejects these in C89 mode because they
   5032     // are not i-c-e's, so we don't need to distinguish between the two here.
   5033 
   5034     // Parse the constant-expression or assignment-expression now (depending
   5035     // on dialect).
   5036     if (getLangOpts().CPlusPlus) {
   5037       NumElements = ParseConstantExpression();
   5038     } else {
   5039       EnterExpressionEvaluationContext Unevaluated(Actions,
   5040                                                    Sema::ConstantEvaluated);
   5041       NumElements = ParseAssignmentExpression();
   5042     }
   5043   }
   5044 
   5045   // If there was an error parsing the assignment-expression, recover.
   5046   if (NumElements.isInvalid()) {
   5047     D.setInvalidType(true);
   5048     // If the expression was invalid, skip it.
   5049     SkipUntil(tok::r_square);
   5050     return;
   5051   }
   5052 
   5053   T.consumeClose();
   5054 
   5055   ParsedAttributes attrs(AttrFactory);
   5056   MaybeParseCXX0XAttributes(attrs);
   5057 
   5058   // Remember that we parsed a array type, and remember its features.
   5059   D.AddTypeInfo(DeclaratorChunk::getArray(DS.getTypeQualifiers(),
   5060                                           StaticLoc.isValid(), isStar,
   5061                                           NumElements.release(),
   5062                                           T.getOpenLocation(),
   5063                                           T.getCloseLocation()),
   5064                 attrs, T.getCloseLocation());
   5065 }
   5066 
   5067 /// [GNU]   typeof-specifier:
   5068 ///           typeof ( expressions )
   5069 ///           typeof ( type-name )
   5070 /// [GNU/C++] typeof unary-expression
   5071 ///
   5072 void Parser::ParseTypeofSpecifier(DeclSpec &DS) {
   5073   assert(Tok.is(tok::kw_typeof) && "Not a typeof specifier");
   5074   Token OpTok = Tok;
   5075   SourceLocation StartLoc = ConsumeToken();
   5076 
   5077   const bool hasParens = Tok.is(tok::l_paren);
   5078 
   5079   EnterExpressionEvaluationContext Unevaluated(Actions, Sema::Unevaluated);
   5080 
   5081   bool isCastExpr;
   5082   ParsedType CastTy;
   5083   SourceRange CastRange;
   5084   ExprResult Operand = ParseExprAfterUnaryExprOrTypeTrait(OpTok, isCastExpr,
   5085                                                           CastTy, CastRange);
   5086   if (hasParens)
   5087     DS.setTypeofParensRange(CastRange);
   5088 
   5089   if (CastRange.getEnd().isInvalid())
   5090     // FIXME: Not accurate, the range gets one token more than it should.
   5091     DS.SetRangeEnd(Tok.getLocation());
   5092   else
   5093     DS.SetRangeEnd(CastRange.getEnd());
   5094 
   5095   if (isCastExpr) {
   5096     if (!CastTy) {
   5097       DS.SetTypeSpecError();
   5098       return;
   5099     }
   5100 
   5101     const char *PrevSpec = 0;
   5102     unsigned DiagID;
   5103     // Check for duplicate type specifiers (e.g. "int typeof(int)").
   5104     if (DS.SetTypeSpecType(DeclSpec::TST_typeofType, StartLoc, PrevSpec,
   5105                            DiagID, CastTy))
   5106       Diag(StartLoc, DiagID) << PrevSpec;
   5107     return;
   5108   }
   5109 
   5110   // If we get here, the operand to the typeof was an expresion.
   5111   if (Operand.isInvalid()) {
   5112     DS.SetTypeSpecError();
   5113     return;
   5114   }
   5115 
   5116   // We might need to transform the operand if it is potentially evaluated.
   5117   Operand = Actions.HandleExprEvaluationContextForTypeof(Operand.get());
   5118   if (Operand.isInvalid()) {
   5119     DS.SetTypeSpecError();
   5120     return;
   5121   }
   5122 
   5123   const char *PrevSpec = 0;
   5124   unsigned DiagID;
   5125   // Check for duplicate type specifiers (e.g. "int typeof(int)").
   5126   if (DS.SetTypeSpecType(DeclSpec::TST_typeofExpr, StartLoc, PrevSpec,
   5127                          DiagID, Operand.get()))
   5128     Diag(StartLoc, DiagID) << PrevSpec;
   5129 }
   5130 
   5131 /// [C11]   atomic-specifier:
   5132 ///           _Atomic ( type-name )
   5133 ///
   5134 void Parser::ParseAtomicSpecifier(DeclSpec &DS) {
   5135   assert(Tok.is(tok::kw__Atomic) && "Not an atomic specifier");
   5136 
   5137   SourceLocation StartLoc = ConsumeToken();
   5138   BalancedDelimiterTracker T(*this, tok::l_paren);
   5139   if (T.expectAndConsume(diag::err_expected_lparen_after, "_Atomic")) {
   5140     SkipUntil(tok::r_paren);
   5141     return;
   5142   }
   5143 
   5144   TypeResult Result = ParseTypeName();
   5145   if (Result.isInvalid()) {
   5146     SkipUntil(tok::r_paren);
   5147     return;
   5148   }
   5149 
   5150   // Match the ')'
   5151   T.consumeClose();
   5152 
   5153   if (T.getCloseLocation().isInvalid())
   5154     return;
   5155 
   5156   DS.setTypeofParensRange(T.getRange());
   5157   DS.SetRangeEnd(T.getCloseLocation());
   5158 
   5159   const char *PrevSpec = 0;
   5160   unsigned DiagID;
   5161   if (DS.SetTypeSpecType(DeclSpec::TST_atomic, StartLoc, PrevSpec,
   5162                          DiagID, Result.release()))
   5163     Diag(StartLoc, DiagID) << PrevSpec;
   5164 }
   5165 
   5166 
   5167 /// TryAltiVecVectorTokenOutOfLine - Out of line body that should only be called
   5168 /// from TryAltiVecVectorToken.
   5169 bool Parser::TryAltiVecVectorTokenOutOfLine() {
   5170   Token Next = NextToken();
   5171   switch (Next.getKind()) {
   5172   default: return false;
   5173   case tok::kw_short:
   5174   case tok::kw_long:
   5175   case tok::kw_signed:
   5176   case tok::kw_unsigned:
   5177   case tok::kw_void:
   5178   case tok::kw_char:
   5179   case tok::kw_int:
   5180   case tok::kw_float:
   5181   case tok::kw_double:
   5182   case tok::kw_bool:
   5183   case tok::kw___pixel:
   5184     Tok.setKind(tok::kw___vector);
   5185     return true;
   5186   case tok::identifier:
   5187     if (Next.getIdentifierInfo() == Ident_pixel) {
   5188       Tok.setKind(tok::kw___vector);
   5189       return true;
   5190     }
   5191     return false;
   5192   }
   5193 }
   5194 
   5195 bool Parser::TryAltiVecTokenOutOfLine(DeclSpec &DS, SourceLocation Loc,
   5196                                       const char *&PrevSpec, unsigned &DiagID,
   5197                                       bool &isInvalid) {
   5198   if (Tok.getIdentifierInfo() == Ident_vector) {
   5199     Token Next = NextToken();
   5200     switch (Next.getKind()) {
   5201     case tok::kw_short:
   5202     case tok::kw_long:
   5203     case tok::kw_signed:
   5204     case tok::kw_unsigned:
   5205     case tok::kw_void:
   5206     case tok::kw_char:
   5207     case tok::kw_int:
   5208     case tok::kw_float:
   5209     case tok::kw_double:
   5210     case tok::kw_bool:
   5211     case tok::kw___pixel:
   5212       isInvalid = DS.SetTypeAltiVecVector(true, Loc, PrevSpec, DiagID);
   5213       return true;
   5214     case tok::identifier:
   5215       if (Next.getIdentifierInfo() == Ident_pixel) {
   5216         isInvalid = DS.SetTypeAltiVecVector(true, Loc, PrevSpec, DiagID);
   5217         return true;
   5218       }
   5219       break;
   5220     default:
   5221       break;
   5222     }
   5223   } else if ((Tok.getIdentifierInfo() == Ident_pixel) &&
   5224              DS.isTypeAltiVecVector()) {
   5225     isInvalid = DS.SetTypeAltiVecPixel(true, Loc, PrevSpec, DiagID);
   5226     return true;
   5227   }
   5228   return false;
   5229 }
   5230