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