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