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"
25using 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++.
36TypeResult 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.
65static 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
109void 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
177void 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.
291void 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.
314bool 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.
336void 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
395void 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
449void 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
463void 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
473void 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
483void 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
539VersionTuple 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>
657void 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
822void Parser::LateParsedDeclaration::ParseLexedAttributes() {}
823
824void Parser::LateParsedClass::ParseLexedAttributes() {
825  Self->ParseLexedAttributes(*Class);
826}
827
828void Parser::LateParsedAttribute::ParseLexedAttributes() {
829  Self->ParseLexedAttribute(*this, true, false);
830}
831
832/// Wrapper class which calls ParseLexedAttribute, after setting up the
833/// scope appropriately.
834void 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.
866void 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.
883void 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
962bool 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).
997void 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
1032void 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.
1104bool 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
1130void 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///
1151Parser::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.
1217Parser::DeclGroupPtrTy
1218Parser::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.
1245bool 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.
1312void 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.
1391Parser::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.
1535bool 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///
1575Decl *Parser::ParseDeclarationAfterDeclarator(Declarator &D,
1576                                     const ParsedTemplateInfo &TemplateInfo) {
1577  if (ParseAsmAttributesAfterDeclarator(D))
1578    return 0;
1579
1580  return ParseDeclarationAfterDeclaratorAndAttributes(D, TemplateInfo);
1581}
1582
1583Decl *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///
1737void 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///
1802static 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///
1818bool 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.
2003Parser::DeclSpecContext
2004Parser::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]
2023ExprResult 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] ')'
2049void 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///
2114void 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///
2838void Parser::
2839ParseStructDeclaration(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///
2916void 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///
3051void 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///
3377void 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.
3481bool 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.
3507bool 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.
3551bool 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.
3662bool 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
3814bool 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///
3915void 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///
4012void 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
4018static 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]
4054void 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
4190static 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.
4244void 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///
4424void 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///
4541void 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.
4688bool 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///
4719void 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///
4799void 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]
4957void 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///
5072void 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///
5134void 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.
5169bool 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
5195bool 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