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