clang 20.0.0git
Parser.h
Go to the documentation of this file.
1//===--- Parser.h - C Language Parser ---------------------------*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file defines the Parser interface.
10//
11//===----------------------------------------------------------------------===//
12
13#ifndef LLVM_CLANG_PARSE_PARSER_H
14#define LLVM_CLANG_PARSE_PARSER_H
15
20#include "clang/Sema/Sema.h"
22#include "clang/Sema/SemaObjC.h"
24#include "llvm/ADT/SmallVector.h"
25#include "llvm/Frontend/OpenMP/OMPContext.h"
26#include "llvm/Support/SaveAndRestore.h"
27#include <optional>
28#include <stack>
29
30namespace clang {
31 class PragmaHandler;
32 class Scope;
33 class BalancedDelimiterTracker;
34 class CorrectionCandidateCallback;
35 class DeclGroupRef;
36 class DiagnosticBuilder;
37 struct LoopHint;
38 class Parser;
39 class ParsingDeclRAIIObject;
40 class ParsingDeclSpec;
41 class ParsingDeclarator;
42 class ParsingFieldDeclarator;
43 class ColonProtectionRAIIObject;
44 class InMessageExpressionRAIIObject;
45 class PoisonSEHIdentifiersRAIIObject;
46 class OMPClause;
47 class OpenACCClause;
48 class ObjCTypeParamList;
49 struct OMPTraitProperty;
50 struct OMPTraitSelector;
51 struct OMPTraitSet;
52 class OMPTraitInfo;
53
54/// Parser - This implements a parser for the C family of languages. After
55/// parsing units of the grammar, productions are invoked to handle whatever has
56/// been read.
57///
68
69 Preprocessor &PP;
70
71 /// Tok - The current token we are peeking ahead. All parsing methods assume
72 /// that this is valid.
73 Token Tok;
74
75 // PrevTokLocation - The location of the token we previously
76 // consumed. This token is used for diagnostics where we expected to
77 // see a token following another token (e.g., the ';' at the end of
78 // a statement).
79 SourceLocation PrevTokLocation;
80
81 /// Tracks an expected type for the current token when parsing an expression.
82 /// Used by code completion for ranking.
83 PreferredTypeBuilder PreferredType;
84
85 unsigned short ParenCount = 0, BracketCount = 0, BraceCount = 0;
86 unsigned short MisplacedModuleBeginCount = 0;
87
88 /// Actions - These are the callbacks we invoke as we parse various constructs
89 /// in the file.
90 Sema &Actions;
91
92 DiagnosticsEngine &Diags;
93
94 /// ScopeCache - Cache scopes to reduce malloc traffic.
95 enum { ScopeCacheSize = 16 };
96 unsigned NumCachedScopes;
97 Scope *ScopeCache[ScopeCacheSize];
98
99 /// Identifiers used for SEH handling in Borland. These are only
100 /// allowed in particular circumstances
101 // __except block
102 IdentifierInfo *Ident__exception_code,
103 *Ident___exception_code,
104 *Ident_GetExceptionCode;
105 // __except filter expression
106 IdentifierInfo *Ident__exception_info,
107 *Ident___exception_info,
108 *Ident_GetExceptionInfo;
109 // __finally
110 IdentifierInfo *Ident__abnormal_termination,
111 *Ident___abnormal_termination,
112 *Ident_AbnormalTermination;
113
114 /// Contextual keywords for Microsoft extensions.
115 IdentifierInfo *Ident__except;
116 mutable IdentifierInfo *Ident_sealed;
117 mutable IdentifierInfo *Ident_abstract;
118
119 /// Ident_super - IdentifierInfo for "super", to support fast
120 /// comparison.
121 IdentifierInfo *Ident_super;
122 /// Ident_vector, Ident_bool, Ident_Bool - cached IdentifierInfos for "vector"
123 /// and "bool" fast comparison. Only present if AltiVec or ZVector are
124 /// enabled.
125 IdentifierInfo *Ident_vector;
126 IdentifierInfo *Ident_bool;
127 IdentifierInfo *Ident_Bool;
128 /// Ident_pixel - cached IdentifierInfos for "pixel" fast comparison.
129 /// Only present if AltiVec enabled.
130 IdentifierInfo *Ident_pixel;
131
132 /// Objective-C contextual keywords.
133 IdentifierInfo *Ident_instancetype;
134
135 /// Identifier for "introduced".
136 IdentifierInfo *Ident_introduced;
137
138 /// Identifier for "deprecated".
139 IdentifierInfo *Ident_deprecated;
140
141 /// Identifier for "obsoleted".
142 IdentifierInfo *Ident_obsoleted;
143
144 /// Identifier for "unavailable".
145 IdentifierInfo *Ident_unavailable;
146
147 /// Identifier for "message".
148 IdentifierInfo *Ident_message;
149
150 /// Identifier for "strict".
151 IdentifierInfo *Ident_strict;
152
153 /// Identifier for "replacement".
154 IdentifierInfo *Ident_replacement;
155
156 /// Identifier for "environment".
157 IdentifierInfo *Ident_environment;
158
159 /// Identifiers used by the 'external_source_symbol' attribute.
160 IdentifierInfo *Ident_language, *Ident_defined_in,
161 *Ident_generated_declaration, *Ident_USR;
162
163 /// C++11 contextual keywords.
164 mutable IdentifierInfo *Ident_final;
165 mutable IdentifierInfo *Ident_GNU_final;
166 mutable IdentifierInfo *Ident_override;
167
168 // C++2a contextual keywords.
169 mutable IdentifierInfo *Ident_import;
170 mutable IdentifierInfo *Ident_module;
171
172 // C++ type trait keywords that can be reverted to identifiers and still be
173 // used as type traits.
174 llvm::SmallDenseMap<IdentifierInfo *, tok::TokenKind> RevertibleTypeTraits;
175
176 std::unique_ptr<PragmaHandler> AlignHandler;
177 std::unique_ptr<PragmaHandler> GCCVisibilityHandler;
178 std::unique_ptr<PragmaHandler> OptionsHandler;
179 std::unique_ptr<PragmaHandler> PackHandler;
180 std::unique_ptr<PragmaHandler> MSStructHandler;
181 std::unique_ptr<PragmaHandler> UnusedHandler;
182 std::unique_ptr<PragmaHandler> WeakHandler;
183 std::unique_ptr<PragmaHandler> RedefineExtnameHandler;
184 std::unique_ptr<PragmaHandler> FPContractHandler;
185 std::unique_ptr<PragmaHandler> OpenCLExtensionHandler;
186 std::unique_ptr<PragmaHandler> OpenMPHandler;
187 std::unique_ptr<PragmaHandler> OpenACCHandler;
188 std::unique_ptr<PragmaHandler> PCSectionHandler;
189 std::unique_ptr<PragmaHandler> MSCommentHandler;
190 std::unique_ptr<PragmaHandler> MSDetectMismatchHandler;
191 std::unique_ptr<PragmaHandler> FPEvalMethodHandler;
192 std::unique_ptr<PragmaHandler> FloatControlHandler;
193 std::unique_ptr<PragmaHandler> MSPointersToMembers;
194 std::unique_ptr<PragmaHandler> MSVtorDisp;
195 std::unique_ptr<PragmaHandler> MSInitSeg;
196 std::unique_ptr<PragmaHandler> MSDataSeg;
197 std::unique_ptr<PragmaHandler> MSBSSSeg;
198 std::unique_ptr<PragmaHandler> MSConstSeg;
199 std::unique_ptr<PragmaHandler> MSCodeSeg;
200 std::unique_ptr<PragmaHandler> MSSection;
201 std::unique_ptr<PragmaHandler> MSStrictGuardStackCheck;
202 std::unique_ptr<PragmaHandler> MSRuntimeChecks;
203 std::unique_ptr<PragmaHandler> MSIntrinsic;
204 std::unique_ptr<PragmaHandler> MSFunction;
205 std::unique_ptr<PragmaHandler> MSOptimize;
206 std::unique_ptr<PragmaHandler> MSFenvAccess;
207 std::unique_ptr<PragmaHandler> MSAllocText;
208 std::unique_ptr<PragmaHandler> CUDAForceHostDeviceHandler;
209 std::unique_ptr<PragmaHandler> OptimizeHandler;
210 std::unique_ptr<PragmaHandler> LoopHintHandler;
211 std::unique_ptr<PragmaHandler> UnrollHintHandler;
212 std::unique_ptr<PragmaHandler> NoUnrollHintHandler;
213 std::unique_ptr<PragmaHandler> UnrollAndJamHintHandler;
214 std::unique_ptr<PragmaHandler> NoUnrollAndJamHintHandler;
215 std::unique_ptr<PragmaHandler> FPHandler;
216 std::unique_ptr<PragmaHandler> STDCFenvAccessHandler;
217 std::unique_ptr<PragmaHandler> STDCFenvRoundHandler;
218 std::unique_ptr<PragmaHandler> STDCCXLIMITHandler;
219 std::unique_ptr<PragmaHandler> STDCUnknownHandler;
220 std::unique_ptr<PragmaHandler> AttributePragmaHandler;
221 std::unique_ptr<PragmaHandler> MaxTokensHerePragmaHandler;
222 std::unique_ptr<PragmaHandler> MaxTokensTotalPragmaHandler;
223 std::unique_ptr<PragmaHandler> RISCVPragmaHandler;
224
225 std::unique_ptr<CommentHandler> CommentSemaHandler;
226
227 /// Whether the '>' token acts as an operator or not. This will be
228 /// true except when we are parsing an expression within a C++
229 /// template argument list, where the '>' closes the template
230 /// argument list.
231 bool GreaterThanIsOperator;
232
233 /// ColonIsSacred - When this is false, we aggressively try to recover from
234 /// code like "foo : bar" as if it were a typo for "foo :: bar". This is not
235 /// safe in case statements and a few other things. This is managed by the
236 /// ColonProtectionRAIIObject RAII object.
237 bool ColonIsSacred;
238
239 /// Parsing OpenMP directive mode.
240 bool OpenMPDirectiveParsing = false;
241
242 /// Parsing OpenACC directive mode.
243 bool OpenACCDirectiveParsing = false;
244
245 /// Currently parsing a situation where an OpenACC array section could be
246 /// legal, such as a 'var-list'.
247 bool AllowOpenACCArraySections = false;
248
249 /// RAII object to set reset OpenACC parsing a context where Array Sections
250 /// are allowed.
251 class OpenACCArraySectionRAII {
252 Parser &P;
253
254 public:
255 OpenACCArraySectionRAII(Parser &P) : P(P) {
256 assert(!P.AllowOpenACCArraySections);
257 P.AllowOpenACCArraySections = true;
258 }
259 ~OpenACCArraySectionRAII() {
260 assert(P.AllowOpenACCArraySections);
261 P.AllowOpenACCArraySections = false;
262 }
263 };
264
265 /// When true, we are directly inside an Objective-C message
266 /// send expression.
267 ///
268 /// This is managed by the \c InMessageExpressionRAIIObject class, and
269 /// should not be set directly.
270 bool InMessageExpression;
271
272 /// Gets set to true after calling ProduceSignatureHelp, it is for a
273 /// workaround to make sure ProduceSignatureHelp is only called at the deepest
274 /// function call.
275 bool CalledSignatureHelp = false;
276
278
279 /// The "depth" of the template parameters currently being parsed.
280 unsigned TemplateParameterDepth;
281
282 /// Current kind of OpenMP clause
283 OpenMPClauseKind OMPClauseKind = llvm::omp::OMPC_unknown;
284
285 /// RAII class that manages the template parameter depth.
286 class TemplateParameterDepthRAII {
287 unsigned &Depth;
288 unsigned AddedLevels;
289 public:
290 explicit TemplateParameterDepthRAII(unsigned &Depth)
291 : Depth(Depth), AddedLevels(0) {}
292
293 ~TemplateParameterDepthRAII() {
294 Depth -= AddedLevels;
295 }
296
297 void operator++() {
298 ++Depth;
299 ++AddedLevels;
300 }
301 void addDepth(unsigned D) {
302 Depth += D;
303 AddedLevels += D;
304 }
305 void setAddedDepth(unsigned D) {
306 Depth = Depth - AddedLevels + D;
307 AddedLevels = D;
308 }
309
310 unsigned getDepth() const { return Depth; }
311 unsigned getOriginalDepth() const { return Depth - AddedLevels; }
312 };
313
314 /// Factory object for creating ParsedAttr objects.
315 AttributeFactory AttrFactory;
316
317 /// Gathers and cleans up TemplateIdAnnotations when parsing of a
318 /// top-level declaration is finished.
319 SmallVector<TemplateIdAnnotation *, 16> TemplateIds;
320
321 /// Don't destroy template annotations in MaybeDestroyTemplateIds even if
322 /// we're at the end of a declaration. Instead, we defer the destruction until
323 /// after a top-level declaration.
324 /// Use DelayTemplateIdDestructionRAII rather than setting it directly.
325 bool DelayTemplateIdDestruction = false;
326
327 void MaybeDestroyTemplateIds() {
328 if (DelayTemplateIdDestruction)
329 return;
330 if (!TemplateIds.empty() &&
331 (Tok.is(tok::eof) || !PP.mightHavePendingAnnotationTokens()))
332 DestroyTemplateIds();
333 }
334 void DestroyTemplateIds();
335
336 /// RAII object to destroy TemplateIdAnnotations where possible, from a
337 /// likely-good position during parsing.
338 struct DestroyTemplateIdAnnotationsRAIIObj {
339 Parser &Self;
340
341 DestroyTemplateIdAnnotationsRAIIObj(Parser &Self) : Self(Self) {}
342 ~DestroyTemplateIdAnnotationsRAIIObj() { Self.MaybeDestroyTemplateIds(); }
343 };
344
345 struct DelayTemplateIdDestructionRAII {
346 Parser &Self;
347 bool PrevDelayTemplateIdDestruction;
348
349 DelayTemplateIdDestructionRAII(Parser &Self,
350 bool DelayTemplateIdDestruction) noexcept
351 : Self(Self),
352 PrevDelayTemplateIdDestruction(Self.DelayTemplateIdDestruction) {
353 Self.DelayTemplateIdDestruction = DelayTemplateIdDestruction;
354 }
355
356 ~DelayTemplateIdDestructionRAII() noexcept {
357 Self.DelayTemplateIdDestruction = PrevDelayTemplateIdDestruction;
358 }
359 };
360
361 /// Identifiers which have been declared within a tentative parse.
362 SmallVector<const IdentifierInfo *, 8> TentativelyDeclaredIdentifiers;
363
364 /// Tracker for '<' tokens that might have been intended to be treated as an
365 /// angle bracket instead of a less-than comparison.
366 ///
367 /// This happens when the user intends to form a template-id, but typoes the
368 /// template-name or forgets a 'template' keyword for a dependent template
369 /// name.
370 ///
371 /// We track these locations from the point where we see a '<' with a
372 /// name-like expression on its left until we see a '>' or '>>' that might
373 /// match it.
374 struct AngleBracketTracker {
375 /// Flags used to rank candidate template names when there is more than one
376 /// '<' in a scope.
377 enum Priority : unsigned short {
378 /// A non-dependent name that is a potential typo for a template name.
379 PotentialTypo = 0x0,
380 /// A dependent name that might instantiate to a template-name.
381 DependentName = 0x2,
382
383 /// A space appears before the '<' token.
384 SpaceBeforeLess = 0x0,
385 /// No space before the '<' token
386 NoSpaceBeforeLess = 0x1,
387
388 LLVM_MARK_AS_BITMASK_ENUM(/*LargestValue*/ DependentName)
389 };
390
391 struct Loc {
394 AngleBracketTracker::Priority Priority;
396
397 bool isActive(Parser &P) const {
398 return P.ParenCount == ParenCount && P.BracketCount == BracketCount &&
399 P.BraceCount == BraceCount;
400 }
401
402 bool isActiveOrNested(Parser &P) const {
403 return isActive(P) || P.ParenCount > ParenCount ||
404 P.BracketCount > BracketCount || P.BraceCount > BraceCount;
405 }
406 };
407
409
410 /// Add an expression that might have been intended to be a template name.
411 /// In the case of ambiguity, we arbitrarily select the innermost such
412 /// expression, for example in 'foo < bar < baz', 'bar' is the current
413 /// candidate. No attempt is made to track that 'foo' is also a candidate
414 /// for the case where we see a second suspicious '>' token.
415 void add(Parser &P, Expr *TemplateName, SourceLocation LessLoc,
416 Priority Prio) {
417 if (!Locs.empty() && Locs.back().isActive(P)) {
418 if (Locs.back().Priority <= Prio) {
419 Locs.back().TemplateName = TemplateName;
420 Locs.back().LessLoc = LessLoc;
421 Locs.back().Priority = Prio;
422 }
423 } else {
424 Locs.push_back({TemplateName, LessLoc, Prio,
425 P.ParenCount, P.BracketCount, P.BraceCount});
426 }
427 }
428
429 /// Mark the current potential missing template location as having been
430 /// handled (this happens if we pass a "corresponding" '>' or '>>' token
431 /// or leave a bracket scope).
432 void clear(Parser &P) {
433 while (!Locs.empty() && Locs.back().isActiveOrNested(P))
434 Locs.pop_back();
435 }
436
437 /// Get the current enclosing expression that might hve been intended to be
438 /// a template name.
439 Loc *getCurrent(Parser &P) {
440 if (!Locs.empty() && Locs.back().isActive(P))
441 return &Locs.back();
442 return nullptr;
443 }
444 };
445
446 AngleBracketTracker AngleBrackets;
447
448 IdentifierInfo *getSEHExceptKeyword();
449
450 /// True if we are within an Objective-C container while parsing C-like decls.
451 ///
452 /// This is necessary because Sema thinks we have left the container
453 /// to parse the C-like decls, meaning Actions.ObjC().getObjCDeclContext()
454 /// will be NULL.
455 bool ParsingInObjCContainer;
456
457 /// Whether to skip parsing of function bodies.
458 ///
459 /// This option can be used, for example, to speed up searches for
460 /// declarations/definitions when indexing.
461 bool SkipFunctionBodies;
462
463 /// The location of the expression statement that is being parsed right now.
464 /// Used to determine if an expression that is being parsed is a statement or
465 /// just a regular sub-expression.
466 SourceLocation ExprStatementTokLoc;
467
468 /// Flags describing a context in which we're parsing a statement.
469 enum class ParsedStmtContext {
470 /// This context permits declarations in language modes where declarations
471 /// are not statements.
472 AllowDeclarationsInC = 0x1,
473 /// This context permits standalone OpenMP directives.
474 AllowStandaloneOpenMPDirectives = 0x2,
475 /// This context is at the top level of a GNU statement expression.
476 InStmtExpr = 0x4,
477
478 /// The context of a regular substatement.
479 SubStmt = 0,
480 /// The context of a compound-statement.
481 Compound = AllowDeclarationsInC | AllowStandaloneOpenMPDirectives,
482
483 LLVM_MARK_AS_BITMASK_ENUM(InStmtExpr)
484 };
485
486 /// Act on an expression statement that might be the last statement in a
487 /// GNU statement expression. Checks whether we are actually at the end of
488 /// a statement expression and builds a suitable expression statement.
489 StmtResult handleExprStmt(ExprResult E, ParsedStmtContext StmtCtx);
490
491public:
492 Parser(Preprocessor &PP, Sema &Actions, bool SkipFunctionBodies);
493 ~Parser() override;
494
495 const LangOptions &getLangOpts() const { return PP.getLangOpts(); }
496 const TargetInfo &getTargetInfo() const { return PP.getTargetInfo(); }
497 Preprocessor &getPreprocessor() const { return PP; }
498 Sema &getActions() const { return Actions; }
499 AttributeFactory &getAttrFactory() { return AttrFactory; }
500
501 const Token &getCurToken() const { return Tok; }
502 Scope *getCurScope() const { return Actions.getCurScope(); }
504 return Actions.incrementMSManglingNumber();
505 }
506
508 return Actions.ObjC().getObjCDeclContext();
509 }
510
511 // Type forwarding. All of these are statically 'void*', but they may all be
512 // different actual classes based on the actions in place.
515
517
519
520 /// A SmallVector of statements.
522
523 // Parsing methods.
524
525 /// Initialize - Warm up the parser.
526 ///
527 void Initialize();
528
529 /// Parse the first top-level declaration in a translation unit.
531 Sema::ModuleImportState &ImportState);
532
533 /// ParseTopLevelDecl - Parse one top-level declaration. Returns true if
534 /// the EOF was encountered.
536 Sema::ModuleImportState &ImportState);
540 return ParseTopLevelDecl(Result, IS);
541 }
542
543 /// ConsumeToken - Consume the current 'peek token' and lex the next one.
544 /// This does not work with special tokens: string literals, code completion,
545 /// annotation tokens and balanced tokens must be handled using the specific
546 /// consume methods.
547 /// Returns the location of the consumed token.
549 assert(!isTokenSpecial() &&
550 "Should consume special tokens with Consume*Token");
551 PrevTokLocation = Tok.getLocation();
552 PP.Lex(Tok);
553 return PrevTokLocation;
554 }
555
557 if (Tok.isNot(Expected))
558 return false;
559 assert(!isTokenSpecial() &&
560 "Should consume special tokens with Consume*Token");
561 PrevTokLocation = Tok.getLocation();
562 PP.Lex(Tok);
563 return true;
564 }
565
568 return false;
569 Loc = PrevTokLocation;
570 return true;
571 }
572
573 /// ConsumeAnyToken - Dispatch to the right Consume* method based on the
574 /// current token type. This should only be used in cases where the type of
575 /// the token really isn't known, e.g. in error recovery.
576 SourceLocation ConsumeAnyToken(bool ConsumeCodeCompletionTok = false) {
577 if (isTokenParen())
578 return ConsumeParen();
579 if (isTokenBracket())
580 return ConsumeBracket();
581 if (isTokenBrace())
582 return ConsumeBrace();
583 if (isTokenStringLiteral())
584 return ConsumeStringToken();
585 if (Tok.is(tok::code_completion))
586 return ConsumeCodeCompletionTok ? ConsumeCodeCompletionToken()
587 : handleUnexpectedCodeCompletionToken();
588 if (Tok.isAnnotation())
589 return ConsumeAnnotationToken();
590 return ConsumeToken();
591 }
592
593
595 return PP.getLocForEndOfToken(PrevTokLocation);
596 }
597
598 /// Retrieve the underscored keyword (_Nonnull, _Nullable) that corresponds
599 /// to the given nullability kind.
601 return Actions.getNullabilityKeyword(nullability);
602 }
603
604private:
605 //===--------------------------------------------------------------------===//
606 // Low-Level token peeking and consumption methods.
607 //
608
609 /// isTokenParen - Return true if the cur token is '(' or ')'.
610 bool isTokenParen() const {
611 return Tok.isOneOf(tok::l_paren, tok::r_paren);
612 }
613 /// isTokenBracket - Return true if the cur token is '[' or ']'.
614 bool isTokenBracket() const {
615 return Tok.isOneOf(tok::l_square, tok::r_square);
616 }
617 /// isTokenBrace - Return true if the cur token is '{' or '}'.
618 bool isTokenBrace() const {
619 return Tok.isOneOf(tok::l_brace, tok::r_brace);
620 }
621 /// isTokenStringLiteral - True if this token is a string-literal.
622 bool isTokenStringLiteral() const {
623 return tok::isStringLiteral(Tok.getKind());
624 }
625 /// isTokenSpecial - True if this token requires special consumption methods.
626 bool isTokenSpecial() const {
627 return isTokenStringLiteral() || isTokenParen() || isTokenBracket() ||
628 isTokenBrace() || Tok.is(tok::code_completion) || Tok.isAnnotation();
629 }
630
631 /// Returns true if the current token is '=' or is a type of '='.
632 /// For typos, give a fixit to '='
633 bool isTokenEqualOrEqualTypo();
634
635 /// Return the current token to the token stream and make the given
636 /// token the current token.
637 void UnconsumeToken(Token &Consumed) {
638 Token Next = Tok;
639 PP.EnterToken(Consumed, /*IsReinject*/true);
640 PP.Lex(Tok);
641 PP.EnterToken(Next, /*IsReinject*/true);
642 }
643
644 SourceLocation ConsumeAnnotationToken() {
645 assert(Tok.isAnnotation() && "wrong consume method");
646 SourceLocation Loc = Tok.getLocation();
647 PrevTokLocation = Tok.getAnnotationEndLoc();
648 PP.Lex(Tok);
649 return Loc;
650 }
651
652 /// ConsumeParen - This consume method keeps the paren count up-to-date.
653 ///
654 SourceLocation ConsumeParen() {
655 assert(isTokenParen() && "wrong consume method");
656 if (Tok.getKind() == tok::l_paren)
657 ++ParenCount;
658 else if (ParenCount) {
659 AngleBrackets.clear(*this);
660 --ParenCount; // Don't let unbalanced )'s drive the count negative.
661 }
662 PrevTokLocation = Tok.getLocation();
663 PP.Lex(Tok);
664 return PrevTokLocation;
665 }
666
667 /// ConsumeBracket - This consume method keeps the bracket count up-to-date.
668 ///
669 SourceLocation ConsumeBracket() {
670 assert(isTokenBracket() && "wrong consume method");
671 if (Tok.getKind() == tok::l_square)
672 ++BracketCount;
673 else if (BracketCount) {
674 AngleBrackets.clear(*this);
675 --BracketCount; // Don't let unbalanced ]'s drive the count negative.
676 }
677
678 PrevTokLocation = Tok.getLocation();
679 PP.Lex(Tok);
680 return PrevTokLocation;
681 }
682
683 /// ConsumeBrace - This consume method keeps the brace count up-to-date.
684 ///
685 SourceLocation ConsumeBrace() {
686 assert(isTokenBrace() && "wrong consume method");
687 if (Tok.getKind() == tok::l_brace)
688 ++BraceCount;
689 else if (BraceCount) {
690 AngleBrackets.clear(*this);
691 --BraceCount; // Don't let unbalanced }'s drive the count negative.
692 }
693
694 PrevTokLocation = Tok.getLocation();
695 PP.Lex(Tok);
696 return PrevTokLocation;
697 }
698
699 /// ConsumeStringToken - Consume the current 'peek token', lexing a new one
700 /// and returning the token kind. This method is specific to strings, as it
701 /// handles string literal concatenation, as per C99 5.1.1.2, translation
702 /// phase #6.
703 SourceLocation ConsumeStringToken() {
704 assert(isTokenStringLiteral() &&
705 "Should only consume string literals with this method");
706 PrevTokLocation = Tok.getLocation();
707 PP.Lex(Tok);
708 return PrevTokLocation;
709 }
710
711 /// Consume the current code-completion token.
712 ///
713 /// This routine can be called to consume the code-completion token and
714 /// continue processing in special cases where \c cutOffParsing() isn't
715 /// desired, such as token caching or completion with lookahead.
716 SourceLocation ConsumeCodeCompletionToken() {
717 assert(Tok.is(tok::code_completion));
718 PrevTokLocation = Tok.getLocation();
719 PP.Lex(Tok);
720 return PrevTokLocation;
721 }
722
723 /// When we are consuming a code-completion token without having matched
724 /// specific position in the grammar, provide code-completion results based
725 /// on context.
726 ///
727 /// \returns the source location of the code-completion token.
728 SourceLocation handleUnexpectedCodeCompletionToken();
729
730 /// Abruptly cut off parsing; mainly used when we have reached the
731 /// code-completion point.
732 void cutOffParsing() {
735 // Cut off parsing by acting as if we reached the end-of-file.
736 Tok.setKind(tok::eof);
737 }
738
739 /// Determine if we're at the end of the file or at a transition
740 /// between modules.
741 bool isEofOrEom() {
743 return Kind == tok::eof || Kind == tok::annot_module_begin ||
744 Kind == tok::annot_module_end || Kind == tok::annot_module_include ||
745 Kind == tok::annot_repl_input_end;
746 }
747
748 /// Checks if the \p Level is valid for use in a fold expression.
749 bool isFoldOperator(prec::Level Level) const;
750
751 /// Checks if the \p Kind is a valid operator for fold expressions.
752 bool isFoldOperator(tok::TokenKind Kind) const;
753
754 /// Initialize all pragma handlers.
755 void initializePragmaHandlers();
756
757 /// Destroy and reset all pragma handlers.
758 void resetPragmaHandlers();
759
760 /// Handle the annotation token produced for #pragma unused(...)
761 void HandlePragmaUnused();
762
763 /// Handle the annotation token produced for
764 /// #pragma GCC visibility...
765 void HandlePragmaVisibility();
766
767 /// Handle the annotation token produced for
768 /// #pragma pack...
769 void HandlePragmaPack();
770
771 /// Handle the annotation token produced for
772 /// #pragma ms_struct...
773 void HandlePragmaMSStruct();
774
775 void HandlePragmaMSPointersToMembers();
776
777 void HandlePragmaMSVtorDisp();
778
779 void HandlePragmaMSPragma();
780 bool HandlePragmaMSSection(StringRef PragmaName,
781 SourceLocation PragmaLocation);
782 bool HandlePragmaMSSegment(StringRef PragmaName,
783 SourceLocation PragmaLocation);
784 bool HandlePragmaMSInitSeg(StringRef PragmaName,
785 SourceLocation PragmaLocation);
786 bool HandlePragmaMSStrictGuardStackCheck(StringRef PragmaName,
787 SourceLocation PragmaLocation);
788 bool HandlePragmaMSFunction(StringRef PragmaName,
789 SourceLocation PragmaLocation);
790 bool HandlePragmaMSAllocText(StringRef PragmaName,
791 SourceLocation PragmaLocation);
792 bool HandlePragmaMSOptimize(StringRef PragmaName,
793 SourceLocation PragmaLocation);
794
795 /// Handle the annotation token produced for
796 /// #pragma align...
797 void HandlePragmaAlign();
798
799 /// Handle the annotation token produced for
800 /// #pragma clang __debug dump...
801 void HandlePragmaDump();
802
803 /// Handle the annotation token produced for
804 /// #pragma weak id...
805 void HandlePragmaWeak();
806
807 /// Handle the annotation token produced for
808 /// #pragma weak id = id...
809 void HandlePragmaWeakAlias();
810
811 /// Handle the annotation token produced for
812 /// #pragma redefine_extname...
813 void HandlePragmaRedefineExtname();
814
815 /// Handle the annotation token produced for
816 /// #pragma STDC FP_CONTRACT...
817 void HandlePragmaFPContract();
818
819 /// Handle the annotation token produced for
820 /// #pragma STDC FENV_ACCESS...
821 void HandlePragmaFEnvAccess();
822
823 /// Handle the annotation token produced for
824 /// #pragma STDC FENV_ROUND...
825 void HandlePragmaFEnvRound();
826
827 /// Handle the annotation token produced for
828 /// #pragma STDC CX_LIMITED_RANGE...
829 void HandlePragmaCXLimitedRange();
830
831 /// Handle the annotation token produced for
832 /// #pragma float_control
833 void HandlePragmaFloatControl();
834
835 /// \brief Handle the annotation token produced for
836 /// #pragma clang fp ...
837 void HandlePragmaFP();
838
839 /// Handle the annotation token produced for
840 /// #pragma OPENCL EXTENSION...
841 void HandlePragmaOpenCLExtension();
842
843 /// Handle the annotation token produced for
844 /// #pragma clang __debug captured
845 StmtResult HandlePragmaCaptured();
846
847 /// Handle the annotation token produced for
848 /// #pragma clang loop and #pragma unroll.
849 bool HandlePragmaLoopHint(LoopHint &Hint);
850
851 bool ParsePragmaAttributeSubjectMatchRuleSet(
852 attr::ParsedSubjectMatchRuleSet &SubjectMatchRules,
853 SourceLocation &AnyLoc, SourceLocation &LastMatchRuleEndLoc);
854
855 void HandlePragmaAttribute();
856
857 /// GetLookAheadToken - This peeks ahead N tokens and returns that token
858 /// without consuming any tokens. LookAhead(0) returns 'Tok', LookAhead(1)
859 /// returns the token after Tok, etc.
860 ///
861 /// Note that this differs from the Preprocessor's LookAhead method, because
862 /// the Parser always has one token lexed that the preprocessor doesn't.
863 ///
864 const Token &GetLookAheadToken(unsigned N) {
865 if (N == 0 || Tok.is(tok::eof)) return Tok;
866 return PP.LookAhead(N-1);
867 }
868
869public:
870 /// NextToken - This peeks ahead one token and returns it without
871 /// consuming it.
872 const Token &NextToken() {
873 return PP.LookAhead(0);
874 }
875
876 /// getTypeAnnotation - Read a parsed type out of an annotation token.
877 static TypeResult getTypeAnnotation(const Token &Tok) {
878 if (!Tok.getAnnotationValue())
879 return TypeError();
881 }
882
883private:
884 static void setTypeAnnotation(Token &Tok, TypeResult T) {
885 assert((T.isInvalid() || T.get()) &&
886 "produced a valid-but-null type annotation?");
887 Tok.setAnnotationValue(T.isInvalid() ? nullptr : T.get().getAsOpaquePtr());
888 }
889
890 static NamedDecl *getNonTypeAnnotation(const Token &Tok) {
891 return static_cast<NamedDecl*>(Tok.getAnnotationValue());
892 }
893
894 static void setNonTypeAnnotation(Token &Tok, NamedDecl *ND) {
895 Tok.setAnnotationValue(ND);
896 }
897
898 static IdentifierInfo *getIdentifierAnnotation(const Token &Tok) {
899 return static_cast<IdentifierInfo*>(Tok.getAnnotationValue());
900 }
901
902 static void setIdentifierAnnotation(Token &Tok, IdentifierInfo *ND) {
903 Tok.setAnnotationValue(ND);
904 }
905
906 /// Read an already-translated primary expression out of an annotation
907 /// token.
908 static ExprResult getExprAnnotation(const Token &Tok) {
909 return ExprResult::getFromOpaquePointer(Tok.getAnnotationValue());
910 }
911
912 /// Set the primary expression corresponding to the given annotation
913 /// token.
914 static void setExprAnnotation(Token &Tok, ExprResult ER) {
915 Tok.setAnnotationValue(ER.getAsOpaquePointer());
916 }
917
918public:
919 // If NeedType is true, then TryAnnotateTypeOrScopeToken will try harder to
920 // find a type name by attempting typo correction.
921 bool
925 CXXScopeSpec &SS, bool IsNewScope,
926 ImplicitTypenameContext AllowImplicitTypename);
927 bool TryAnnotateCXXScopeToken(bool EnteringContext = false);
928
930 return getLangOpts().CPlusPlus &&
931 (Tok.is(tok::identifier) || Tok.is(tok::coloncolon) ||
932 (Tok.is(tok::annot_template_id) &&
933 NextToken().is(tok::coloncolon)) ||
934 Tok.is(tok::kw_decltype) || Tok.is(tok::kw___super));
935 }
936 bool TryAnnotateOptionalCXXScopeToken(bool EnteringContext = false) {
937 return MightBeCXXScopeToken() && TryAnnotateCXXScopeToken(EnteringContext);
938 }
939
940private:
941 enum AnnotatedNameKind {
942 /// Annotation has failed and emitted an error.
943 ANK_Error,
944 /// The identifier is a tentatively-declared name.
945 ANK_TentativeDecl,
946 /// The identifier is a template name. FIXME: Add an annotation for that.
947 ANK_TemplateName,
948 /// The identifier can't be resolved.
949 ANK_Unresolved,
950 /// Annotation was successful.
951 ANK_Success
952 };
953
954 AnnotatedNameKind
955 TryAnnotateName(CorrectionCandidateCallback *CCC = nullptr,
956 ImplicitTypenameContext AllowImplicitTypename =
958
959 /// Push a tok::annot_cxxscope token onto the token stream.
960 void AnnotateScopeToken(CXXScopeSpec &SS, bool IsNewAnnotation);
961
962 /// TryAltiVecToken - Check for context-sensitive AltiVec identifier tokens,
963 /// replacing them with the non-context-sensitive keywords. This returns
964 /// true if the token was replaced.
965 bool TryAltiVecToken(DeclSpec &DS, SourceLocation Loc,
966 const char *&PrevSpec, unsigned &DiagID,
967 bool &isInvalid) {
968 if (!getLangOpts().AltiVec && !getLangOpts().ZVector)
969 return false;
970
971 if (Tok.getIdentifierInfo() != Ident_vector &&
972 Tok.getIdentifierInfo() != Ident_bool &&
973 Tok.getIdentifierInfo() != Ident_Bool &&
974 (!getLangOpts().AltiVec || Tok.getIdentifierInfo() != Ident_pixel))
975 return false;
976
977 return TryAltiVecTokenOutOfLine(DS, Loc, PrevSpec, DiagID, isInvalid);
978 }
979
980 /// TryAltiVecVectorToken - Check for context-sensitive AltiVec vector
981 /// identifier token, replacing it with the non-context-sensitive __vector.
982 /// This returns true if the token was replaced.
983 bool TryAltiVecVectorToken() {
984 if ((!getLangOpts().AltiVec && !getLangOpts().ZVector) ||
985 Tok.getIdentifierInfo() != Ident_vector) return false;
986 return TryAltiVecVectorTokenOutOfLine();
987 }
988
989 bool TryAltiVecVectorTokenOutOfLine();
990 bool TryAltiVecTokenOutOfLine(DeclSpec &DS, SourceLocation Loc,
991 const char *&PrevSpec, unsigned &DiagID,
992 bool &isInvalid);
993
994 /// Returns true if the current token is the identifier 'instancetype'.
995 ///
996 /// Should only be used in Objective-C language modes.
997 bool isObjCInstancetype() {
998 assert(getLangOpts().ObjC);
999 if (Tok.isAnnotation())
1000 return false;
1001 if (!Ident_instancetype)
1002 Ident_instancetype = PP.getIdentifierInfo("instancetype");
1003 return Tok.getIdentifierInfo() == Ident_instancetype;
1004 }
1005
1006 /// TryKeywordIdentFallback - For compatibility with system headers using
1007 /// keywords as identifiers, attempt to convert the current token to an
1008 /// identifier and optionally disable the keyword for the remainder of the
1009 /// translation unit. This returns false if the token was not replaced,
1010 /// otherwise emits a diagnostic and returns true.
1011 bool TryKeywordIdentFallback(bool DisableKeyword);
1012
1013 /// Get the TemplateIdAnnotation from the token.
1014 TemplateIdAnnotation *takeTemplateIdAnnotation(const Token &tok);
1015
1016 /// TentativeParsingAction - An object that is used as a kind of "tentative
1017 /// parsing transaction". It gets instantiated to mark the token position and
1018 /// after the token consumption is done, Commit() or Revert() is called to
1019 /// either "commit the consumed tokens" or revert to the previously marked
1020 /// token position. Example:
1021 ///
1022 /// TentativeParsingAction TPA(*this);
1023 /// ConsumeToken();
1024 /// ....
1025 /// TPA.Revert();
1026 ///
1027 /// If the Unannotated parameter is true, any token annotations created
1028 /// during the tentative parse are reverted.
1029 class TentativeParsingAction {
1030 Parser &P;
1031 PreferredTypeBuilder PrevPreferredType;
1032 Token PrevTok;
1033 size_t PrevTentativelyDeclaredIdentifierCount;
1034 unsigned short PrevParenCount, PrevBracketCount, PrevBraceCount;
1035 bool isActive;
1036
1037 public:
1038 explicit TentativeParsingAction(Parser &p, bool Unannotated = false)
1039 : P(p), PrevPreferredType(P.PreferredType) {
1040 PrevTok = P.Tok;
1041 PrevTentativelyDeclaredIdentifierCount =
1042 P.TentativelyDeclaredIdentifiers.size();
1043 PrevParenCount = P.ParenCount;
1044 PrevBracketCount = P.BracketCount;
1045 PrevBraceCount = P.BraceCount;
1046 P.PP.EnableBacktrackAtThisPos(Unannotated);
1047 isActive = true;
1048 }
1049 void Commit() {
1050 assert(isActive && "Parsing action was finished!");
1051 P.TentativelyDeclaredIdentifiers.resize(
1052 PrevTentativelyDeclaredIdentifierCount);
1053 P.PP.CommitBacktrackedTokens();
1054 isActive = false;
1055 }
1056 void Revert() {
1057 assert(isActive && "Parsing action was finished!");
1058 P.PP.Backtrack();
1059 P.PreferredType = PrevPreferredType;
1060 P.Tok = PrevTok;
1061 P.TentativelyDeclaredIdentifiers.resize(
1062 PrevTentativelyDeclaredIdentifierCount);
1063 P.ParenCount = PrevParenCount;
1064 P.BracketCount = PrevBracketCount;
1065 P.BraceCount = PrevBraceCount;
1066 isActive = false;
1067 }
1068 ~TentativeParsingAction() {
1069 assert(!isActive && "Forgot to call Commit or Revert!");
1070 }
1071 };
1072 /// A TentativeParsingAction that automatically reverts in its destructor.
1073 /// Useful for disambiguation parses that will always be reverted.
1074 class RevertingTentativeParsingAction
1075 : private Parser::TentativeParsingAction {
1076 public:
1077 using TentativeParsingAction::TentativeParsingAction;
1078
1079 ~RevertingTentativeParsingAction() { Revert(); }
1080 };
1081
1082 /// ObjCDeclContextSwitch - An object used to switch context from
1083 /// an objective-c decl context to its enclosing decl context and
1084 /// back.
1085 class ObjCDeclContextSwitch {
1086 Parser &P;
1087 ObjCContainerDecl *DC;
1088 SaveAndRestore<bool> WithinObjCContainer;
1089 public:
1090 explicit ObjCDeclContextSwitch(Parser &p)
1091 : P(p), DC(p.getObjCDeclContext()),
1092 WithinObjCContainer(P.ParsingInObjCContainer, DC != nullptr) {
1093 if (DC)
1094 P.Actions.ObjC().ActOnObjCTemporaryExitContainerContext(DC);
1095 }
1096 ~ObjCDeclContextSwitch() {
1097 if (DC)
1098 P.Actions.ObjC().ActOnObjCReenterContainerContext(DC);
1099 }
1100 };
1101
1102 /// ExpectAndConsume - The parser expects that 'ExpectedTok' is next in the
1103 /// input. If so, it is consumed and false is returned.
1104 ///
1105 /// If a trivial punctuator misspelling is encountered, a FixIt error
1106 /// diagnostic is issued and false is returned after recovery.
1107 ///
1108 /// If the input is malformed, this emits the specified diagnostic and true is
1109 /// returned.
1110 bool ExpectAndConsume(tok::TokenKind ExpectedTok,
1111 unsigned Diag = diag::err_expected,
1112 StringRef DiagMsg = "");
1113
1114 /// The parser expects a semicolon and, if present, will consume it.
1115 ///
1116 /// If the next token is not a semicolon, this emits the specified diagnostic,
1117 /// or, if there's just some closing-delimiter noise (e.g., ')' or ']') prior
1118 /// to the semicolon, consumes that extra token.
1119 bool ExpectAndConsumeSemi(unsigned DiagID , StringRef TokenUsed = "");
1120
1121 /// The kind of extra semi diagnostic to emit.
1122 enum ExtraSemiKind {
1123 OutsideFunction = 0,
1124 InsideStruct = 1,
1125 InstanceVariableList = 2,
1126 AfterMemberFunctionDefinition = 3
1127 };
1128
1129 /// Consume any extra semi-colons until the end of the line.
1130 void ConsumeExtraSemi(ExtraSemiKind Kind, DeclSpec::TST T = TST_unspecified);
1131
1132 /// Return false if the next token is an identifier. An 'expected identifier'
1133 /// error is emitted otherwise.
1134 ///
1135 /// The parser tries to recover from the error by checking if the next token
1136 /// is a C++ keyword when parsing Objective-C++. Return false if the recovery
1137 /// was successful.
1138 bool expectIdentifier();
1139
1140 /// Kinds of compound pseudo-tokens formed by a sequence of two real tokens.
1141 enum class CompoundToken {
1142 /// A '(' '{' beginning a statement-expression.
1143 StmtExprBegin,
1144 /// A '}' ')' ending a statement-expression.
1145 StmtExprEnd,
1146 /// A '[' '[' beginning a C++11 or C23 attribute.
1147 AttrBegin,
1148 /// A ']' ']' ending a C++11 or C23 attribute.
1149 AttrEnd,
1150 /// A '::' '*' forming a C++ pointer-to-member declaration.
1151 MemberPtr,
1152 };
1153
1154 /// Check that a compound operator was written in a "sensible" way, and warn
1155 /// if not.
1156 void checkCompoundToken(SourceLocation FirstTokLoc,
1157 tok::TokenKind FirstTokKind, CompoundToken Op);
1158
1159 void diagnoseUseOfC11Keyword(const Token &Tok);
1160
1161public:
1162 //===--------------------------------------------------------------------===//
1163 // Scope manipulation
1164
1165 /// ParseScope - Introduces a new scope for parsing. The kind of
1166 /// scope is determined by ScopeFlags. Objects of this type should
1167 /// be created on the stack to coincide with the position where the
1168 /// parser enters the new scope, and this object's constructor will
1169 /// create that new scope. Similarly, once the object is destroyed
1170 /// the parser will exit the scope.
1172 Parser *Self;
1173 ParseScope(const ParseScope &) = delete;
1174 void operator=(const ParseScope &) = delete;
1175
1176 public:
1177 // ParseScope - Construct a new object to manage a scope in the
1178 // parser Self where the new Scope is created with the flags
1179 // ScopeFlags, but only when we aren't about to enter a compound statement.
1180 ParseScope(Parser *Self, unsigned ScopeFlags, bool EnteredScope = true,
1181 bool BeforeCompoundStmt = false)
1182 : Self(Self) {
1183 if (EnteredScope && !BeforeCompoundStmt)
1184 Self->EnterScope(ScopeFlags);
1185 else {
1186 if (BeforeCompoundStmt)
1187 Self->incrementMSManglingNumber();
1188
1189 this->Self = nullptr;
1190 }
1191 }
1192
1193 // Exit - Exit the scope associated with this object now, rather
1194 // than waiting until the object is destroyed.
1195 void Exit() {
1196 if (Self) {
1197 Self->ExitScope();
1198 Self = nullptr;
1199 }
1200 }
1201
1203 Exit();
1204 }
1205 };
1206
1207 /// Introduces zero or more scopes for parsing. The scopes will all be exited
1208 /// when the object is destroyed.
1210 Parser &Self;
1211 unsigned NumScopes = 0;
1212
1213 MultiParseScope(const MultiParseScope&) = delete;
1214
1215 public:
1216 MultiParseScope(Parser &Self) : Self(Self) {}
1217 void Enter(unsigned ScopeFlags) {
1218 Self.EnterScope(ScopeFlags);
1219 ++NumScopes;
1220 }
1221 void Exit() {
1222 while (NumScopes) {
1223 Self.ExitScope();
1224 --NumScopes;
1225 }
1226 }
1228 Exit();
1229 }
1230 };
1231
1232 /// EnterScope - Start a new scope.
1233 void EnterScope(unsigned ScopeFlags);
1234
1235 /// ExitScope - Pop a scope off the scope stack.
1236 void ExitScope();
1237
1238 /// Re-enter the template scopes for a declaration that might be a template.
1239 unsigned ReenterTemplateScopes(MultiParseScope &S, Decl *D);
1240
1241private:
1242 /// RAII object used to modify the scope flags for the current scope.
1243 class ParseScopeFlags {
1244 Scope *CurScope;
1245 unsigned OldFlags = 0;
1246 ParseScopeFlags(const ParseScopeFlags &) = delete;
1247 void operator=(const ParseScopeFlags &) = delete;
1248
1249 public:
1250 ParseScopeFlags(Parser *Self, unsigned ScopeFlags, bool ManageFlags = true);
1251 ~ParseScopeFlags();
1252 };
1253
1254 //===--------------------------------------------------------------------===//
1255 // Diagnostic Emission and Error recovery.
1256
1257public:
1258 DiagnosticBuilder Diag(SourceLocation Loc, unsigned DiagID);
1259 DiagnosticBuilder Diag(const Token &Tok, unsigned DiagID);
1260 DiagnosticBuilder Diag(unsigned DiagID) {
1261 return Diag(Tok, DiagID);
1262 }
1263
1264private:
1265 void SuggestParentheses(SourceLocation Loc, unsigned DK,
1266 SourceRange ParenRange);
1267 void CheckNestedObjCContexts(SourceLocation AtLoc);
1268
1269public:
1270
1271 /// Control flags for SkipUntil functions.
1273 StopAtSemi = 1 << 0, ///< Stop skipping at semicolon
1274 /// Stop skipping at specified token, but don't skip the token itself
1276 StopAtCodeCompletion = 1 << 2 ///< Stop at code completion
1278
1280 SkipUntilFlags R) {
1281 return static_cast<SkipUntilFlags>(static_cast<unsigned>(L) |
1282 static_cast<unsigned>(R));
1283 }
1284
1285 /// SkipUntil - Read tokens until we get to the specified token, then consume
1286 /// it (unless StopBeforeMatch is specified). Because we cannot guarantee
1287 /// that the token will ever occur, this skips to the next token, or to some
1288 /// likely good stopping point. If Flags has StopAtSemi flag, skipping will
1289 /// stop at a ';' character. Balances (), [], and {} delimiter tokens while
1290 /// skipping.
1291 ///
1292 /// If SkipUntil finds the specified token, it returns true, otherwise it
1293 /// returns false.
1295 SkipUntilFlags Flags = static_cast<SkipUntilFlags>(0)) {
1296 return SkipUntil(llvm::ArrayRef(T), Flags);
1297 }
1299 SkipUntilFlags Flags = static_cast<SkipUntilFlags>(0)) {
1300 tok::TokenKind TokArray[] = {T1, T2};
1301 return SkipUntil(TokArray, Flags);
1302 }
1304 SkipUntilFlags Flags = static_cast<SkipUntilFlags>(0)) {
1305 tok::TokenKind TokArray[] = {T1, T2, T3};
1306 return SkipUntil(TokArray, Flags);
1307 }
1309 SkipUntilFlags Flags = static_cast<SkipUntilFlags>(0));
1310
1311 /// SkipMalformedDecl - Read tokens until we get to some likely good stopping
1312 /// point for skipping past a simple-declaration.
1313 void SkipMalformedDecl();
1314
1315 /// The location of the first statement inside an else that might
1316 /// have a missleading indentation. If there is no
1317 /// MisleadingIndentationChecker on an else active, this location is invalid.
1319
1320private:
1321 //===--------------------------------------------------------------------===//
1322 // Lexing and parsing of C++ inline methods.
1323
1324 struct ParsingClass;
1325
1326 /// [class.mem]p1: "... the class is regarded as complete within
1327 /// - function bodies
1328 /// - default arguments
1329 /// - exception-specifications (TODO: C++0x)
1330 /// - and brace-or-equal-initializers for non-static data members
1331 /// (including such things in nested classes)."
1332 /// LateParsedDeclarations build the tree of those elements so they can
1333 /// be parsed after parsing the top-level class.
1334 class LateParsedDeclaration {
1335 public:
1336 virtual ~LateParsedDeclaration();
1337
1338 virtual void ParseLexedMethodDeclarations();
1339 virtual void ParseLexedMemberInitializers();
1340 virtual void ParseLexedMethodDefs();
1341 virtual void ParseLexedAttributes();
1342 virtual void ParseLexedPragmas();
1343 };
1344
1345 /// Inner node of the LateParsedDeclaration tree that parses
1346 /// all its members recursively.
1347 class LateParsedClass : public LateParsedDeclaration {
1348 public:
1349 LateParsedClass(Parser *P, ParsingClass *C);
1350 ~LateParsedClass() override;
1351
1352 void ParseLexedMethodDeclarations() override;
1353 void ParseLexedMemberInitializers() override;
1354 void ParseLexedMethodDefs() override;
1355 void ParseLexedAttributes() override;
1356 void ParseLexedPragmas() override;
1357
1358 // Delete copy constructor and copy assignment operator.
1359 LateParsedClass(const LateParsedClass &) = delete;
1360 LateParsedClass &operator=(const LateParsedClass &) = delete;
1361
1362 private:
1363 Parser *Self;
1364 ParsingClass *Class;
1365 };
1366
1367 /// Contains the lexed tokens of an attribute with arguments that
1368 /// may reference member variables and so need to be parsed at the
1369 /// end of the class declaration after parsing all other member
1370 /// member declarations.
1371 /// FIXME: Perhaps we should change the name of LateParsedDeclaration to
1372 /// LateParsedTokens.
1373 struct LateParsedAttribute : public LateParsedDeclaration {
1374 Parser *Self;
1375 CachedTokens Toks;
1376 IdentifierInfo &AttrName;
1377 IdentifierInfo *MacroII = nullptr;
1378 SourceLocation AttrNameLoc;
1379 SmallVector<Decl*, 2> Decls;
1380
1381 explicit LateParsedAttribute(Parser *P, IdentifierInfo &Name,
1382 SourceLocation Loc)
1383 : Self(P), AttrName(Name), AttrNameLoc(Loc) {}
1384
1385 void ParseLexedAttributes() override;
1386
1387 void addDecl(Decl *D) { Decls.push_back(D); }
1388 };
1389
1390 /// Contains the lexed tokens of a pragma with arguments that
1391 /// may reference member variables and so need to be parsed at the
1392 /// end of the class declaration after parsing all other member
1393 /// member declarations.
1394 class LateParsedPragma : public LateParsedDeclaration {
1395 Parser *Self = nullptr;
1397 CachedTokens Toks;
1398
1399 public:
1400 explicit LateParsedPragma(Parser *P, AccessSpecifier AS)
1401 : Self(P), AS(AS) {}
1402
1403 void takeToks(CachedTokens &Cached) { Toks.swap(Cached); }
1404 const CachedTokens &toks() const { return Toks; }
1405 AccessSpecifier getAccessSpecifier() const { return AS; }
1406
1407 void ParseLexedPragmas() override;
1408 };
1409
1410 // A list of late-parsed attributes. Used by ParseGNUAttributes.
1411 class LateParsedAttrList: public SmallVector<LateParsedAttribute *, 2> {
1412 public:
1413 LateParsedAttrList(bool PSoon = false,
1414 bool LateAttrParseExperimentalExtOnly = false)
1415 : ParseSoon(PSoon),
1416 LateAttrParseExperimentalExtOnly(LateAttrParseExperimentalExtOnly) {}
1417
1418 bool parseSoon() { return ParseSoon; }
1419 /// returns true iff the attribute to be parsed should only be late parsed
1420 /// if it is annotated with `LateAttrParseExperimentalExt`
1421 bool lateAttrParseExperimentalExtOnly() {
1422 return LateAttrParseExperimentalExtOnly;
1423 }
1424
1425 private:
1426 bool ParseSoon; // Are we planning to parse these shortly after creation?
1427 bool LateAttrParseExperimentalExtOnly;
1428 };
1429
1430 /// Contains the lexed tokens of a member function definition
1431 /// which needs to be parsed at the end of the class declaration
1432 /// after parsing all other member declarations.
1433 struct LexedMethod : public LateParsedDeclaration {
1434 Parser *Self;
1435 Decl *D;
1436 CachedTokens Toks;
1437
1438 explicit LexedMethod(Parser *P, Decl *MD) : Self(P), D(MD) {}
1439
1440 void ParseLexedMethodDefs() override;
1441 };
1442
1443 /// LateParsedDefaultArgument - Keeps track of a parameter that may
1444 /// have a default argument that cannot be parsed yet because it
1445 /// occurs within a member function declaration inside the class
1446 /// (C++ [class.mem]p2).
1447 struct LateParsedDefaultArgument {
1448 explicit LateParsedDefaultArgument(Decl *P,
1449 std::unique_ptr<CachedTokens> Toks = nullptr)
1450 : Param(P), Toks(std::move(Toks)) { }
1451
1452 /// Param - The parameter declaration for this parameter.
1453 Decl *Param;
1454
1455 /// Toks - The sequence of tokens that comprises the default
1456 /// argument expression, not including the '=' or the terminating
1457 /// ')' or ','. This will be NULL for parameters that have no
1458 /// default argument.
1459 std::unique_ptr<CachedTokens> Toks;
1460 };
1461
1462 /// LateParsedMethodDeclaration - A method declaration inside a class that
1463 /// contains at least one entity whose parsing needs to be delayed
1464 /// until the class itself is completely-defined, such as a default
1465 /// argument (C++ [class.mem]p2).
1466 struct LateParsedMethodDeclaration : public LateParsedDeclaration {
1467 explicit LateParsedMethodDeclaration(Parser *P, Decl *M)
1468 : Self(P), Method(M), ExceptionSpecTokens(nullptr) {}
1469
1470 void ParseLexedMethodDeclarations() override;
1471
1472 Parser *Self;
1473
1474 /// Method - The method declaration.
1475 Decl *Method;
1476
1477 /// DefaultArgs - Contains the parameters of the function and
1478 /// their default arguments. At least one of the parameters will
1479 /// have a default argument, but all of the parameters of the
1480 /// method will be stored so that they can be reintroduced into
1481 /// scope at the appropriate times.
1482 SmallVector<LateParsedDefaultArgument, 8> DefaultArgs;
1483
1484 /// The set of tokens that make up an exception-specification that
1485 /// has not yet been parsed.
1486 CachedTokens *ExceptionSpecTokens;
1487 };
1488
1489 /// LateParsedMemberInitializer - An initializer for a non-static class data
1490 /// member whose parsing must to be delayed until the class is completely
1491 /// defined (C++11 [class.mem]p2).
1492 struct LateParsedMemberInitializer : public LateParsedDeclaration {
1493 LateParsedMemberInitializer(Parser *P, Decl *FD)
1494 : Self(P), Field(FD) { }
1495
1496 void ParseLexedMemberInitializers() override;
1497
1498 Parser *Self;
1499
1500 /// Field - The field declaration.
1501 Decl *Field;
1502
1503 /// CachedTokens - The sequence of tokens that comprises the initializer,
1504 /// including any leading '='.
1505 CachedTokens Toks;
1506 };
1507
1508 /// LateParsedDeclarationsContainer - During parsing of a top (non-nested)
1509 /// C++ class, its method declarations that contain parts that won't be
1510 /// parsed until after the definition is completed (C++ [class.mem]p2),
1511 /// the method declarations and possibly attached inline definitions
1512 /// will be stored here with the tokens that will be parsed to create those
1513 /// entities.
1514 typedef SmallVector<LateParsedDeclaration*,2> LateParsedDeclarationsContainer;
1515
1516 /// Representation of a class that has been parsed, including
1517 /// any member function declarations or definitions that need to be
1518 /// parsed after the corresponding top-level class is complete.
1519 struct ParsingClass {
1520 ParsingClass(Decl *TagOrTemplate, bool TopLevelClass, bool IsInterface)
1521 : TopLevelClass(TopLevelClass), IsInterface(IsInterface),
1522 TagOrTemplate(TagOrTemplate) {}
1523
1524 /// Whether this is a "top-level" class, meaning that it is
1525 /// not nested within another class.
1526 bool TopLevelClass : 1;
1527
1528 /// Whether this class is an __interface.
1529 bool IsInterface : 1;
1530
1531 /// The class or class template whose definition we are parsing.
1532 Decl *TagOrTemplate;
1533
1534 /// LateParsedDeclarations - Method declarations, inline definitions and
1535 /// nested classes that contain pieces whose parsing will be delayed until
1536 /// the top-level class is fully defined.
1537 LateParsedDeclarationsContainer LateParsedDeclarations;
1538 };
1539
1540 /// The stack of classes that is currently being
1541 /// parsed. Nested and local classes will be pushed onto this stack
1542 /// when they are parsed, and removed afterward.
1543 std::stack<ParsingClass *> ClassStack;
1544
1545 ParsingClass &getCurrentClass() {
1546 assert(!ClassStack.empty() && "No lexed method stacks!");
1547 return *ClassStack.top();
1548 }
1549
1550 /// RAII object used to manage the parsing of a class definition.
1551 class ParsingClassDefinition {
1552 Parser &P;
1553 bool Popped;
1555
1556 public:
1557 ParsingClassDefinition(Parser &P, Decl *TagOrTemplate, bool TopLevelClass,
1558 bool IsInterface)
1559 : P(P), Popped(false),
1560 State(P.PushParsingClass(TagOrTemplate, TopLevelClass, IsInterface)) {
1561 }
1562
1563 /// Pop this class of the stack.
1564 void Pop() {
1565 assert(!Popped && "Nested class has already been popped");
1566 Popped = true;
1567 P.PopParsingClass(State);
1568 }
1569
1570 ~ParsingClassDefinition() {
1571 if (!Popped)
1572 P.PopParsingClass(State);
1573 }
1574 };
1575
1576 /// Contains information about any template-specific
1577 /// information that has been parsed prior to parsing declaration
1578 /// specifiers.
1579 struct ParsedTemplateInfo {
1580 ParsedTemplateInfo() : Kind(NonTemplate), TemplateParams(nullptr) {}
1581
1582 ParsedTemplateInfo(TemplateParameterLists *TemplateParams,
1583 bool isSpecialization,
1584 bool lastParameterListWasEmpty = false)
1585 : Kind(isSpecialization? ExplicitSpecialization : Template),
1586 TemplateParams(TemplateParams),
1587 LastParameterListWasEmpty(lastParameterListWasEmpty) { }
1588
1589 explicit ParsedTemplateInfo(SourceLocation ExternLoc,
1590 SourceLocation TemplateLoc)
1591 : Kind(ExplicitInstantiation), TemplateParams(nullptr),
1592 ExternLoc(ExternLoc), TemplateLoc(TemplateLoc),
1593 LastParameterListWasEmpty(false){ }
1594
1595 /// The kind of template we are parsing.
1596 enum {
1597 /// We are not parsing a template at all.
1598 NonTemplate = 0,
1599 /// We are parsing a template declaration.
1600 Template,
1601 /// We are parsing an explicit specialization.
1602 ExplicitSpecialization,
1603 /// We are parsing an explicit instantiation.
1604 ExplicitInstantiation
1605 } Kind;
1606
1607 /// The template parameter lists, for template declarations
1608 /// and explicit specializations.
1609 TemplateParameterLists *TemplateParams;
1610
1611 /// The location of the 'extern' keyword, if any, for an explicit
1612 /// instantiation
1613 SourceLocation ExternLoc;
1614
1615 /// The location of the 'template' keyword, for an explicit
1616 /// instantiation.
1617 SourceLocation TemplateLoc;
1618
1619 /// Whether the last template parameter list was empty.
1620 bool LastParameterListWasEmpty;
1621
1622 SourceRange getSourceRange() const LLVM_READONLY;
1623 };
1624
1625 // In ParseCXXInlineMethods.cpp.
1626 struct ReenterTemplateScopeRAII;
1627 struct ReenterClassScopeRAII;
1628
1629 void LexTemplateFunctionForLateParsing(CachedTokens &Toks);
1630 void ParseLateTemplatedFuncDef(LateParsedTemplate &LPT);
1631
1632 static void LateTemplateParserCallback(void *P, LateParsedTemplate &LPT);
1633
1634 Sema::ParsingClassState
1635 PushParsingClass(Decl *TagOrTemplate, bool TopLevelClass, bool IsInterface);
1636 void DeallocateParsedClasses(ParsingClass *Class);
1637 void PopParsingClass(Sema::ParsingClassState);
1638
1639 enum CachedInitKind {
1640 CIK_DefaultArgument,
1641 CIK_DefaultInitializer
1642 };
1643
1644 NamedDecl *ParseCXXInlineMethodDef(AccessSpecifier AS,
1645 const ParsedAttributesView &AccessAttrs,
1646 ParsingDeclarator &D,
1647 const ParsedTemplateInfo &TemplateInfo,
1648 const VirtSpecifiers &VS,
1649 SourceLocation PureSpecLoc);
1650 StringLiteral *ParseCXXDeletedFunctionMessage();
1651 void SkipDeletedFunctionBody();
1652 void ParseCXXNonStaticMemberInitializer(Decl *VarD);
1653 void ParseLexedAttributes(ParsingClass &Class);
1654 void ParseLexedAttributeList(LateParsedAttrList &LAs, Decl *D,
1655 bool EnterScope, bool OnDefinition);
1656 void ParseLexedCAttributeList(LateParsedAttrList &LA, bool EnterScope,
1657 ParsedAttributes *OutAttrs = nullptr);
1658 void ParseLexedAttribute(LateParsedAttribute &LA,
1659 bool EnterScope, bool OnDefinition);
1660 void ParseLexedCAttribute(LateParsedAttribute &LA, bool EnterScope,
1661 ParsedAttributes *OutAttrs = nullptr);
1662 void ParseLexedMethodDeclarations(ParsingClass &Class);
1663 void ParseLexedMethodDeclaration(LateParsedMethodDeclaration &LM);
1664 void ParseLexedMethodDefs(ParsingClass &Class);
1665 void ParseLexedMethodDef(LexedMethod &LM);
1666 void ParseLexedMemberInitializers(ParsingClass &Class);
1667 void ParseLexedMemberInitializer(LateParsedMemberInitializer &MI);
1668 void ParseLexedObjCMethodDefs(LexedMethod &LM, bool parseMethod);
1669 void ParseLexedPragmas(ParsingClass &Class);
1670 void ParseLexedPragma(LateParsedPragma &LP);
1671 bool ConsumeAndStoreFunctionPrologue(CachedTokens &Toks);
1672 bool ConsumeAndStoreInitializer(CachedTokens &Toks, CachedInitKind CIK);
1673 bool ConsumeAndStoreConditional(CachedTokens &Toks);
1674 bool ConsumeAndStoreUntil(tok::TokenKind T1,
1675 CachedTokens &Toks,
1676 bool StopAtSemi = true,
1677 bool ConsumeFinalToken = true) {
1678 return ConsumeAndStoreUntil(T1, T1, Toks, StopAtSemi, ConsumeFinalToken);
1679 }
1680 bool ConsumeAndStoreUntil(tok::TokenKind T1, tok::TokenKind T2,
1681 CachedTokens &Toks,
1682 bool StopAtSemi = true,
1683 bool ConsumeFinalToken = true);
1684
1685 //===--------------------------------------------------------------------===//
1686 // C99 6.9: External Definitions.
1687 DeclGroupPtrTy ParseExternalDeclaration(ParsedAttributes &DeclAttrs,
1688 ParsedAttributes &DeclSpecAttrs,
1689 ParsingDeclSpec *DS = nullptr);
1690 bool isDeclarationAfterDeclarator();
1691 bool isStartOfFunctionDefinition(const ParsingDeclarator &Declarator);
1692 DeclGroupPtrTy ParseDeclarationOrFunctionDefinition(
1693 ParsedAttributes &DeclAttrs, ParsedAttributes &DeclSpecAttrs,
1694 ParsingDeclSpec *DS = nullptr, AccessSpecifier AS = AS_none);
1695 DeclGroupPtrTy ParseDeclOrFunctionDefInternal(ParsedAttributes &Attrs,
1696 ParsedAttributes &DeclSpecAttrs,
1697 ParsingDeclSpec &DS,
1698 AccessSpecifier AS);
1699
1700 void SkipFunctionBody();
1701 Decl *ParseFunctionDefinition(ParsingDeclarator &D,
1702 const ParsedTemplateInfo &TemplateInfo = ParsedTemplateInfo(),
1703 LateParsedAttrList *LateParsedAttrs = nullptr);
1704 void ParseKNRParamDeclarations(Declarator &D);
1705 // EndLoc is filled with the location of the last token of the simple-asm.
1706 ExprResult ParseSimpleAsm(bool ForAsmLabel, SourceLocation *EndLoc);
1707 ExprResult ParseAsmStringLiteral(bool ForAsmLabel);
1708
1709 // Objective-C External Declarations
1710 void MaybeSkipAttributes(tok::ObjCKeywordKind Kind);
1711 DeclGroupPtrTy ParseObjCAtDirectives(ParsedAttributes &DeclAttrs,
1712 ParsedAttributes &DeclSpecAttrs);
1713 DeclGroupPtrTy ParseObjCAtClassDeclaration(SourceLocation atLoc);
1714 Decl *ParseObjCAtInterfaceDeclaration(SourceLocation AtLoc,
1715 ParsedAttributes &prefixAttrs);
1716 class ObjCTypeParamListScope;
1717 ObjCTypeParamList *parseObjCTypeParamList();
1718 ObjCTypeParamList *parseObjCTypeParamListOrProtocolRefs(
1719 ObjCTypeParamListScope &Scope, SourceLocation &lAngleLoc,
1720 SmallVectorImpl<IdentifierLocPair> &protocolIdents,
1721 SourceLocation &rAngleLoc, bool mayBeProtocolList = true);
1722
1723 void HelperActionsForIvarDeclarations(ObjCContainerDecl *interfaceDecl,
1724 SourceLocation atLoc,
1726 SmallVectorImpl<Decl *> &AllIvarDecls,
1727 bool RBraceMissing);
1728 void ParseObjCClassInstanceVariables(ObjCContainerDecl *interfaceDecl,
1729 tok::ObjCKeywordKind visibility,
1730 SourceLocation atLoc);
1731 bool ParseObjCProtocolReferences(SmallVectorImpl<Decl *> &P,
1732 SmallVectorImpl<SourceLocation> &PLocs,
1733 bool WarnOnDeclarations,
1734 bool ForObjCContainer,
1735 SourceLocation &LAngleLoc,
1736 SourceLocation &EndProtoLoc,
1737 bool consumeLastToken);
1738
1739 /// Parse the first angle-bracket-delimited clause for an
1740 /// Objective-C object or object pointer type, which may be either
1741 /// type arguments or protocol qualifiers.
1742 void parseObjCTypeArgsOrProtocolQualifiers(
1743 ParsedType baseType,
1744 SourceLocation &typeArgsLAngleLoc,
1745 SmallVectorImpl<ParsedType> &typeArgs,
1746 SourceLocation &typeArgsRAngleLoc,
1747 SourceLocation &protocolLAngleLoc,
1748 SmallVectorImpl<Decl *> &protocols,
1749 SmallVectorImpl<SourceLocation> &protocolLocs,
1750 SourceLocation &protocolRAngleLoc,
1751 bool consumeLastToken,
1752 bool warnOnIncompleteProtocols);
1753
1754 /// Parse either Objective-C type arguments or protocol qualifiers; if the
1755 /// former, also parse protocol qualifiers afterward.
1756 void parseObjCTypeArgsAndProtocolQualifiers(
1757 ParsedType baseType,
1758 SourceLocation &typeArgsLAngleLoc,
1759 SmallVectorImpl<ParsedType> &typeArgs,
1760 SourceLocation &typeArgsRAngleLoc,
1761 SourceLocation &protocolLAngleLoc,
1762 SmallVectorImpl<Decl *> &protocols,
1763 SmallVectorImpl<SourceLocation> &protocolLocs,
1764 SourceLocation &protocolRAngleLoc,
1765 bool consumeLastToken);
1766
1767 /// Parse a protocol qualifier type such as '<NSCopying>', which is
1768 /// an anachronistic way of writing 'id<NSCopying>'.
1769 TypeResult parseObjCProtocolQualifierType(SourceLocation &rAngleLoc);
1770
1771 /// Parse Objective-C type arguments and protocol qualifiers, extending the
1772 /// current type with the parsed result.
1773 TypeResult parseObjCTypeArgsAndProtocolQualifiers(SourceLocation loc,
1775 bool consumeLastToken,
1776 SourceLocation &endLoc);
1777
1778 void ParseObjCInterfaceDeclList(tok::ObjCKeywordKind contextKey,
1779 Decl *CDecl);
1780 DeclGroupPtrTy ParseObjCAtProtocolDeclaration(SourceLocation atLoc,
1781 ParsedAttributes &prefixAttrs);
1782
1783 struct ObjCImplParsingDataRAII {
1784 Parser &P;
1785 Decl *Dcl;
1786 bool HasCFunction;
1787 typedef SmallVector<LexedMethod*, 8> LateParsedObjCMethodContainer;
1788 LateParsedObjCMethodContainer LateParsedObjCMethods;
1789
1790 ObjCImplParsingDataRAII(Parser &parser, Decl *D)
1791 : P(parser), Dcl(D), HasCFunction(false) {
1792 P.CurParsedObjCImpl = this;
1793 Finished = false;
1794 }
1795 ~ObjCImplParsingDataRAII();
1796
1797 void finish(SourceRange AtEnd);
1798 bool isFinished() const { return Finished; }
1799
1800 private:
1801 bool Finished;
1802 };
1803 ObjCImplParsingDataRAII *CurParsedObjCImpl;
1804 void StashAwayMethodOrFunctionBodyTokens(Decl *MDecl);
1805
1806 DeclGroupPtrTy ParseObjCAtImplementationDeclaration(SourceLocation AtLoc,
1807 ParsedAttributes &Attrs);
1808 DeclGroupPtrTy ParseObjCAtEndDeclaration(SourceRange atEnd);
1809 Decl *ParseObjCAtAliasDeclaration(SourceLocation atLoc);
1810 Decl *ParseObjCPropertySynthesize(SourceLocation atLoc);
1811 Decl *ParseObjCPropertyDynamic(SourceLocation atLoc);
1812
1813 IdentifierInfo *ParseObjCSelectorPiece(SourceLocation &MethodLocation);
1814 // Definitions for Objective-c context sensitive keywords recognition.
1815 enum ObjCTypeQual {
1816 objc_in=0, objc_out, objc_inout, objc_oneway, objc_bycopy, objc_byref,
1817 objc_nonnull, objc_nullable, objc_null_unspecified,
1818 objc_NumQuals
1819 };
1820 IdentifierInfo *ObjCTypeQuals[objc_NumQuals];
1821
1822 bool isTokIdentifier_in() const;
1823
1824 ParsedType ParseObjCTypeName(ObjCDeclSpec &DS, DeclaratorContext Ctx,
1825 ParsedAttributes *ParamAttrs);
1826 Decl *ParseObjCMethodPrototype(
1827 tok::ObjCKeywordKind MethodImplKind = tok::objc_not_keyword,
1828 bool MethodDefinition = true);
1829 Decl *ParseObjCMethodDecl(SourceLocation mLoc, tok::TokenKind mType,
1830 tok::ObjCKeywordKind MethodImplKind = tok::objc_not_keyword,
1831 bool MethodDefinition=true);
1832 void ParseObjCPropertyAttribute(ObjCDeclSpec &DS);
1833
1834 Decl *ParseObjCMethodDefinition();
1835
1836public:
1837 //===--------------------------------------------------------------------===//
1838 // C99 6.5: Expressions.
1839
1840 /// TypeCastState - State whether an expression is or may be a type cast.
1846
1849 TypeCastState isTypeCast = NotTypeCast);
1855 ParseConstraintLogicalAndExpression(bool IsTrailingRequiresClause);
1856 ExprResult ParseConstraintLogicalOrExpression(bool IsTrailingRequiresClause);
1857 // Expr that doesn't include commas.
1860
1862 unsigned &NumLineToksConsumed,
1863 bool IsUnevaluated);
1864
1865 ExprResult ParseStringLiteralExpression(bool AllowUserDefinedLiteral = false);
1867
1868private:
1869 ExprResult ParseStringLiteralExpression(bool AllowUserDefinedLiteral,
1870 bool Unevaluated);
1871
1872 ExprResult ParseExpressionWithLeadingAt(SourceLocation AtLoc);
1873
1874 ExprResult ParseExpressionWithLeadingExtension(SourceLocation ExtLoc);
1875
1876 ExprResult ParseRHSOfBinaryExpression(ExprResult LHS,
1877 prec::Level MinPrec);
1878 /// Control what ParseCastExpression will parse.
1879 enum CastParseKind {
1880 AnyCastExpr = 0,
1881 UnaryExprOnly,
1882 PrimaryExprOnly
1883 };
1884
1885 bool isRevertibleTypeTrait(const IdentifierInfo *Id,
1886 clang::tok::TokenKind *Kind = nullptr);
1887
1888 ExprResult ParseCastExpression(CastParseKind ParseKind,
1889 bool isAddressOfOperand,
1890 bool &NotCastExpr,
1891 TypeCastState isTypeCast,
1892 bool isVectorLiteral = false,
1893 bool *NotPrimaryExpression = nullptr);
1894 ExprResult ParseCastExpression(CastParseKind ParseKind,
1895 bool isAddressOfOperand = false,
1896 TypeCastState isTypeCast = NotTypeCast,
1897 bool isVectorLiteral = false,
1898 bool *NotPrimaryExpression = nullptr);
1899
1900 /// Returns true if the next token cannot start an expression.
1901 bool isNotExpressionStart();
1902
1903 /// Returns true if the next token would start a postfix-expression
1904 /// suffix.
1905 bool isPostfixExpressionSuffixStart() {
1906 tok::TokenKind K = Tok.getKind();
1907 return (K == tok::l_square || K == tok::l_paren ||
1908 K == tok::period || K == tok::arrow ||
1909 K == tok::plusplus || K == tok::minusminus);
1910 }
1911
1912 bool diagnoseUnknownTemplateId(ExprResult TemplateName, SourceLocation Less);
1913 void checkPotentialAngleBracket(ExprResult &PotentialTemplateName);
1914 bool checkPotentialAngleBracketDelimiter(const AngleBracketTracker::Loc &,
1915 const Token &OpToken);
1916 bool checkPotentialAngleBracketDelimiter(const Token &OpToken) {
1917 if (auto *Info = AngleBrackets.getCurrent(*this))
1918 return checkPotentialAngleBracketDelimiter(*Info, OpToken);
1919 return false;
1920 }
1921
1922 ExprResult ParsePostfixExpressionSuffix(ExprResult LHS);
1923 ExprResult ParseUnaryExprOrTypeTraitExpression();
1924 ExprResult ParseBuiltinPrimaryExpression();
1925 ExprResult ParseSYCLUniqueStableNameExpression();
1926
1927 ExprResult ParseExprAfterUnaryExprOrTypeTrait(const Token &OpTok,
1928 bool &isCastExpr,
1929 ParsedType &CastTy,
1930 SourceRange &CastRange);
1931
1932 /// ParseExpressionList - Used for C/C++ (argument-)expression-list.
1933 bool ParseExpressionList(SmallVectorImpl<Expr *> &Exprs,
1934 llvm::function_ref<void()> ExpressionStarts =
1935 llvm::function_ref<void()>(),
1936 bool FailImmediatelyOnInvalidExpr = false,
1937 bool EarlyTypoCorrection = false,
1938 bool *HasTrailingComma = nullptr);
1939
1940 /// ParseSimpleExpressionList - A simple comma-separated list of expressions,
1941 /// used for misc language extensions.
1942 bool ParseSimpleExpressionList(SmallVectorImpl<Expr *> &Exprs);
1943
1944 /// ParenParseOption - Control what ParseParenExpression will parse.
1945 enum ParenParseOption {
1946 SimpleExpr, // Only parse '(' expression ')'
1947 FoldExpr, // Also allow fold-expression <anything>
1948 CompoundStmt, // Also allow '(' compound-statement ')'
1949 CompoundLiteral, // Also allow '(' type-name ')' '{' ... '}'
1950 CastExpr // Also allow '(' type-name ')' <anything>
1951 };
1952 ExprResult ParseParenExpression(ParenParseOption &ExprType,
1953 bool stopIfCastExpr,
1954 bool isTypeCast,
1955 ParsedType &CastTy,
1956 SourceLocation &RParenLoc);
1957
1958 ExprResult ParseCXXAmbiguousParenExpression(
1959 ParenParseOption &ExprType, ParsedType &CastTy,
1961 ExprResult ParseCompoundLiteralExpression(ParsedType Ty,
1962 SourceLocation LParenLoc,
1963 SourceLocation RParenLoc);
1964
1965 ExprResult ParseGenericSelectionExpression();
1966
1967 ExprResult ParseObjCBoolLiteral();
1968
1969 ExprResult ParseFoldExpression(ExprResult LHS, BalancedDelimiterTracker &T);
1970
1971 //===--------------------------------------------------------------------===//
1972 // C++ Expressions
1973 ExprResult tryParseCXXIdExpression(CXXScopeSpec &SS, bool isAddressOfOperand,
1974 Token &Replacement);
1975
1976 ExprResult tryParseCXXPackIndexingExpression(ExprResult PackIdExpression);
1977 ExprResult ParseCXXPackIndexingExpression(ExprResult PackIdExpression);
1978
1979 ExprResult ParseCXXIdExpression(bool isAddressOfOperand = false);
1980
1981 bool areTokensAdjacent(const Token &A, const Token &B);
1982
1983 void CheckForTemplateAndDigraph(Token &Next, ParsedType ObjectTypePtr,
1984 bool EnteringContext, IdentifierInfo &II,
1985 CXXScopeSpec &SS);
1986
1987 bool ParseOptionalCXXScopeSpecifier(
1988 CXXScopeSpec &SS, ParsedType ObjectType, bool ObjectHasErrors,
1989 bool EnteringContext, bool *MayBePseudoDestructor = nullptr,
1990 bool IsTypename = false, const IdentifierInfo **LastII = nullptr,
1991 bool OnlyNamespace = false, bool InUsingDeclaration = false,
1992 bool Disambiguation = false);
1993
1994 //===--------------------------------------------------------------------===//
1995 // C++11 5.1.2: Lambda expressions
1996
1997 /// Result of tentatively parsing a lambda-introducer.
1998 enum class LambdaIntroducerTentativeParse {
1999 /// This appears to be a lambda-introducer, which has been fully parsed.
2000 Success,
2001 /// This is a lambda-introducer, but has not been fully parsed, and this
2002 /// function needs to be called again to parse it.
2003 Incomplete,
2004 /// This is definitely an Objective-C message send expression, rather than
2005 /// a lambda-introducer, attribute-specifier, or array designator.
2006 MessageSend,
2007 /// This is not a lambda-introducer.
2008 Invalid,
2009 };
2010
2011 // [...] () -> type {...}
2012 ExprResult ParseLambdaExpression();
2013 ExprResult TryParseLambdaExpression();
2014 bool
2015 ParseLambdaIntroducer(LambdaIntroducer &Intro,
2016 LambdaIntroducerTentativeParse *Tentative = nullptr);
2017 ExprResult ParseLambdaExpressionAfterIntroducer(LambdaIntroducer &Intro);
2018
2019 //===--------------------------------------------------------------------===//
2020 // C++ 5.2p1: C++ Casts
2021 ExprResult ParseCXXCasts();
2022
2023 /// Parse a __builtin_bit_cast(T, E), used to implement C++2a std::bit_cast.
2024 ExprResult ParseBuiltinBitCast();
2025
2026 //===--------------------------------------------------------------------===//
2027 // C++ 5.2p1: C++ Type Identification
2028 ExprResult ParseCXXTypeid();
2029
2030 //===--------------------------------------------------------------------===//
2031 // C++ : Microsoft __uuidof Expression
2032 ExprResult ParseCXXUuidof();
2033
2034 //===--------------------------------------------------------------------===//
2035 // C++ 5.2.4: C++ Pseudo-Destructor Expressions
2036 ExprResult ParseCXXPseudoDestructor(Expr *Base, SourceLocation OpLoc,
2037 tok::TokenKind OpKind,
2038 CXXScopeSpec &SS,
2039 ParsedType ObjectType);
2040
2041 //===--------------------------------------------------------------------===//
2042 // C++ 9.3.2: C++ 'this' pointer
2043 ExprResult ParseCXXThis();
2044
2045 //===--------------------------------------------------------------------===//
2046 // C++ 15: C++ Throw Expression
2047 ExprResult ParseThrowExpression();
2048
2049 ExceptionSpecificationType tryParseExceptionSpecification(
2050 bool Delayed,
2051 SourceRange &SpecificationRange,
2052 SmallVectorImpl<ParsedType> &DynamicExceptions,
2053 SmallVectorImpl<SourceRange> &DynamicExceptionRanges,
2054 ExprResult &NoexceptExpr,
2055 CachedTokens *&ExceptionSpecTokens);
2056
2057 // EndLoc is filled with the location of the last token of the specification.
2058 ExceptionSpecificationType ParseDynamicExceptionSpecification(
2059 SourceRange &SpecificationRange,
2060 SmallVectorImpl<ParsedType> &Exceptions,
2061 SmallVectorImpl<SourceRange> &Ranges);
2062
2063 //===--------------------------------------------------------------------===//
2064 // C++0x 8: Function declaration trailing-return-type
2065 TypeResult ParseTrailingReturnType(SourceRange &Range,
2066 bool MayBeFollowedByDirectInit);
2067
2068 //===--------------------------------------------------------------------===//
2069 // C++ 2.13.5: C++ Boolean Literals
2070 ExprResult ParseCXXBoolLiteral();
2071
2072 //===--------------------------------------------------------------------===//
2073 // C++ 5.2.3: Explicit type conversion (functional notation)
2074 ExprResult ParseCXXTypeConstructExpression(const DeclSpec &DS);
2075
2076 /// ParseCXXSimpleTypeSpecifier - [C++ 7.1.5.2] Simple type specifiers.
2077 /// This should only be called when the current token is known to be part of
2078 /// simple-type-specifier.
2079 void ParseCXXSimpleTypeSpecifier(DeclSpec &DS);
2080
2081 bool ParseCXXTypeSpecifierSeq(
2082 DeclSpec &DS, DeclaratorContext Context = DeclaratorContext::TypeName);
2083
2084 //===--------------------------------------------------------------------===//
2085 // C++ 5.3.4 and 5.3.5: C++ new and delete
2086 bool ParseExpressionListOrTypeId(SmallVectorImpl<Expr*> &Exprs,
2087 Declarator &D);
2088 void ParseDirectNewDeclarator(Declarator &D);
2089 ExprResult ParseCXXNewExpression(bool UseGlobal, SourceLocation Start);
2090 ExprResult ParseCXXDeleteExpression(bool UseGlobal,
2091 SourceLocation Start);
2092
2093 //===--------------------------------------------------------------------===//
2094 // C++ if/switch/while/for condition expression.
2095 struct ForRangeInfo;
2096 Sema::ConditionResult ParseCXXCondition(StmtResult *InitStmt,
2097 SourceLocation Loc,
2099 bool MissingOK,
2100 ForRangeInfo *FRI = nullptr,
2101 bool EnterForConditionScope = false);
2102 DeclGroupPtrTy ParseAliasDeclarationInInitStatement(DeclaratorContext Context,
2103 ParsedAttributes &Attrs);
2104
2105 //===--------------------------------------------------------------------===//
2106 // C++ Coroutines
2107
2108 ExprResult ParseCoyieldExpression();
2109
2110 //===--------------------------------------------------------------------===//
2111 // C++ Concepts
2112
2113 ExprResult ParseRequiresExpression();
2114 void ParseTrailingRequiresClause(Declarator &D);
2115
2116 //===--------------------------------------------------------------------===//
2117 // C99 6.7.8: Initialization.
2118
2119 /// ParseInitializer
2120 /// initializer: [C99 6.7.8]
2121 /// assignment-expression
2122 /// '{' ...
2123 ExprResult ParseInitializer() {
2124 if (Tok.isNot(tok::l_brace))
2126 return ParseBraceInitializer();
2127 }
2128 bool MayBeDesignationStart();
2129 ExprResult ParseBraceInitializer();
2130 struct DesignatorCompletionInfo {
2131 SmallVectorImpl<Expr *> &InitExprs;
2132 QualType PreferredBaseType;
2133 };
2134 ExprResult ParseInitializerWithPotentialDesignator(DesignatorCompletionInfo);
2135 ExprResult createEmbedExpr();
2136 void injectEmbedTokens();
2137
2138 //===--------------------------------------------------------------------===//
2139 // clang Expressions
2140
2141 ExprResult ParseBlockLiteralExpression(); // ^{...}
2142
2143 //===--------------------------------------------------------------------===//
2144 // Objective-C Expressions
2145 ExprResult ParseObjCAtExpression(SourceLocation AtLocation);
2146 ExprResult ParseObjCStringLiteral(SourceLocation AtLoc);
2147 ExprResult ParseObjCCharacterLiteral(SourceLocation AtLoc);
2148 ExprResult ParseObjCNumericLiteral(SourceLocation AtLoc);
2149 ExprResult ParseObjCBooleanLiteral(SourceLocation AtLoc, bool ArgValue);
2150 ExprResult ParseObjCArrayLiteral(SourceLocation AtLoc);
2151 ExprResult ParseObjCDictionaryLiteral(SourceLocation AtLoc);
2152 ExprResult ParseObjCBoxedExpr(SourceLocation AtLoc);
2153 ExprResult ParseObjCEncodeExpression(SourceLocation AtLoc);
2154 ExprResult ParseObjCSelectorExpression(SourceLocation AtLoc);
2155 ExprResult ParseObjCProtocolExpression(SourceLocation AtLoc);
2156 bool isSimpleObjCMessageExpression();
2157 ExprResult ParseObjCMessageExpression();
2158 ExprResult ParseObjCMessageExpressionBody(SourceLocation LBracloc,
2159 SourceLocation SuperLoc,
2160 ParsedType ReceiverType,
2161 Expr *ReceiverExpr);
2162 ExprResult ParseAssignmentExprWithObjCMessageExprStart(
2163 SourceLocation LBracloc, SourceLocation SuperLoc,
2164 ParsedType ReceiverType, Expr *ReceiverExpr);
2165 bool ParseObjCXXMessageReceiver(bool &IsExpr, void *&TypeOrExpr);
2166
2167 //===--------------------------------------------------------------------===//
2168 // C99 6.8: Statements and Blocks.
2169
2170 /// A SmallVector of expressions.
2171 typedef SmallVector<Expr*, 12> ExprVector;
2172
2174 ParseStatement(SourceLocation *TrailingElseLoc = nullptr,
2175 ParsedStmtContext StmtCtx = ParsedStmtContext::SubStmt);
2176 StmtResult ParseStatementOrDeclaration(
2177 StmtVector &Stmts, ParsedStmtContext StmtCtx,
2178 SourceLocation *TrailingElseLoc = nullptr);
2179 StmtResult ParseStatementOrDeclarationAfterAttributes(
2180 StmtVector &Stmts, ParsedStmtContext StmtCtx,
2181 SourceLocation *TrailingElseLoc, ParsedAttributes &DeclAttrs,
2182 ParsedAttributes &DeclSpecAttrs);
2183 StmtResult ParseExprStatement(ParsedStmtContext StmtCtx);
2184 StmtResult ParseLabeledStatement(ParsedAttributes &Attrs,
2185 ParsedStmtContext StmtCtx);
2186 StmtResult ParseCaseStatement(ParsedStmtContext StmtCtx,
2187 bool MissingCase = false,
2188 ExprResult Expr = ExprResult());
2189 StmtResult ParseDefaultStatement(ParsedStmtContext StmtCtx);
2190 StmtResult ParseCompoundStatement(bool isStmtExpr = false);
2191 StmtResult ParseCompoundStatement(bool isStmtExpr,
2192 unsigned ScopeFlags);
2193 void ParseCompoundStatementLeadingPragmas();
2194 void DiagnoseLabelAtEndOfCompoundStatement();
2195 bool ConsumeNullStmt(StmtVector &Stmts);
2196 StmtResult ParseCompoundStatementBody(bool isStmtExpr = false);
2197 bool ParseParenExprOrCondition(StmtResult *InitStmt,
2198 Sema::ConditionResult &CondResult,
2199 SourceLocation Loc, Sema::ConditionKind CK,
2200 SourceLocation &LParenLoc,
2201 SourceLocation &RParenLoc);
2202 StmtResult ParseIfStatement(SourceLocation *TrailingElseLoc);
2203 StmtResult ParseSwitchStatement(SourceLocation *TrailingElseLoc);
2204 StmtResult ParseWhileStatement(SourceLocation *TrailingElseLoc);
2205 StmtResult ParseDoStatement();
2206 StmtResult ParseForStatement(SourceLocation *TrailingElseLoc);
2207 StmtResult ParseGotoStatement();
2208 StmtResult ParseContinueStatement();
2209 StmtResult ParseBreakStatement();
2210 StmtResult ParseReturnStatement();
2211 StmtResult ParseAsmStatement(bool &msAsm);
2212 StmtResult ParseMicrosoftAsmStatement(SourceLocation AsmLoc);
2213 StmtResult ParsePragmaLoopHint(StmtVector &Stmts, ParsedStmtContext StmtCtx,
2214 SourceLocation *TrailingElseLoc,
2215 ParsedAttributes &Attrs);
2216
2217 /// Describes the behavior that should be taken for an __if_exists
2218 /// block.
2219 enum IfExistsBehavior {
2220 /// Parse the block; this code is always used.
2221 IEB_Parse,
2222 /// Skip the block entirely; this code is never used.
2223 IEB_Skip,
2224 /// Parse the block as a dependent block, which may be used in
2225 /// some template instantiations but not others.
2226 IEB_Dependent
2227 };
2228
2229 /// Describes the condition of a Microsoft __if_exists or
2230 /// __if_not_exists block.
2231 struct IfExistsCondition {
2232 /// The location of the initial keyword.
2233 SourceLocation KeywordLoc;
2234 /// Whether this is an __if_exists block (rather than an
2235 /// __if_not_exists block).
2236 bool IsIfExists;
2237
2238 /// Nested-name-specifier preceding the name.
2239 CXXScopeSpec SS;
2240
2241 /// The name we're looking for.
2242 UnqualifiedId Name;
2243
2244 /// The behavior of this __if_exists or __if_not_exists block
2245 /// should.
2246 IfExistsBehavior Behavior;
2247 };
2248
2249 bool ParseMicrosoftIfExistsCondition(IfExistsCondition& Result);
2250 void ParseMicrosoftIfExistsStatement(StmtVector &Stmts);
2251 void ParseMicrosoftIfExistsExternalDeclaration();
2252 void ParseMicrosoftIfExistsClassDeclaration(DeclSpec::TST TagType,
2253 ParsedAttributes &AccessAttrs,
2254 AccessSpecifier &CurAS);
2255 bool ParseMicrosoftIfExistsBraceInitializer(ExprVector &InitExprs,
2256 bool &InitExprsOk);
2257 bool ParseAsmOperandsOpt(SmallVectorImpl<IdentifierInfo *> &Names,
2258 SmallVectorImpl<Expr *> &Constraints,
2259 SmallVectorImpl<Expr *> &Exprs);
2260
2261 //===--------------------------------------------------------------------===//
2262 // C++ 6: Statements and Blocks
2263
2264 StmtResult ParseCXXTryBlock();
2265 StmtResult ParseCXXTryBlockCommon(SourceLocation TryLoc, bool FnTry = false);
2266 StmtResult ParseCXXCatchBlock(bool FnCatch = false);
2267
2268 //===--------------------------------------------------------------------===//
2269 // MS: SEH Statements and Blocks
2270
2271 StmtResult ParseSEHTryBlock();
2272 StmtResult ParseSEHExceptBlock(SourceLocation Loc);
2273 StmtResult ParseSEHFinallyBlock(SourceLocation Loc);
2274 StmtResult ParseSEHLeaveStatement();
2275
2276 //===--------------------------------------------------------------------===//
2277 // Objective-C Statements
2278
2279 StmtResult ParseObjCAtStatement(SourceLocation atLoc,
2280 ParsedStmtContext StmtCtx);
2281 StmtResult ParseObjCTryStmt(SourceLocation atLoc);
2282 StmtResult ParseObjCThrowStmt(SourceLocation atLoc);
2283 StmtResult ParseObjCSynchronizedStmt(SourceLocation atLoc);
2284 StmtResult ParseObjCAutoreleasePoolStmt(SourceLocation atLoc);
2285
2286
2287 //===--------------------------------------------------------------------===//
2288 // C99 6.7: Declarations.
2289
2290 /// A context for parsing declaration specifiers. TODO: flesh this
2291 /// out, there are other significant restrictions on specifiers than
2292 /// would be best implemented in the parser.
2293 enum class DeclSpecContext {
2294 DSC_normal, // normal context
2295 DSC_class, // class context, enables 'friend'
2296 DSC_type_specifier, // C++ type-specifier-seq or C specifier-qualifier-list
2297 DSC_trailing, // C++11 trailing-type-specifier in a trailing return type
2298 DSC_alias_declaration, // C++11 type-specifier-seq in an alias-declaration
2299 DSC_conv_operator, // C++ type-specifier-seq in an conversion operator
2300 DSC_top_level, // top-level/namespace declaration context
2301 DSC_template_param, // template parameter context
2302 DSC_template_arg, // template argument context
2303 DSC_template_type_arg, // template type argument context
2304 DSC_objc_method_result, // ObjC method result context, enables
2305 // 'instancetype'
2306 DSC_condition, // condition declaration context
2307 DSC_association, // A _Generic selection expression's type association
2308 DSC_new, // C++ new expression
2309 };
2310
2311 /// Is this a context in which we are parsing just a type-specifier (or
2312 /// trailing-type-specifier)?
2313 static bool isTypeSpecifier(DeclSpecContext DSC) {
2314 switch (DSC) {
2315 case DeclSpecContext::DSC_normal:
2316 case DeclSpecContext::DSC_template_param:
2317 case DeclSpecContext::DSC_template_arg:
2318 case DeclSpecContext::DSC_class:
2319 case DeclSpecContext::DSC_top_level:
2320 case DeclSpecContext::DSC_objc_method_result:
2321 case DeclSpecContext::DSC_condition:
2322 return false;
2323
2324 case DeclSpecContext::DSC_template_type_arg:
2325 case DeclSpecContext::DSC_type_specifier:
2326 case DeclSpecContext::DSC_conv_operator:
2327 case DeclSpecContext::DSC_trailing:
2328 case DeclSpecContext::DSC_alias_declaration:
2329 case DeclSpecContext::DSC_association:
2330 case DeclSpecContext::DSC_new:
2331 return true;
2332 }
2333 llvm_unreachable("Missing DeclSpecContext case");
2334 }
2335
2336 /// Whether a defining-type-specifier is permitted in a given context.
2337 enum class AllowDefiningTypeSpec {
2338 /// The grammar doesn't allow a defining-type-specifier here, and we must
2339 /// not parse one (eg, because a '{' could mean something else).
2340 No,
2341 /// The grammar doesn't allow a defining-type-specifier here, but we permit
2342 /// one for error recovery purposes. Sema will reject.
2343 NoButErrorRecovery,
2344 /// The grammar allows a defining-type-specifier here, even though it's
2345 /// always invalid. Sema will reject.
2346 YesButInvalid,
2347 /// The grammar allows a defining-type-specifier here, and one can be valid.
2348 Yes
2349 };
2350
2351 /// Is this a context in which we are parsing defining-type-specifiers (and
2352 /// so permit class and enum definitions in addition to non-defining class and
2353 /// enum elaborated-type-specifiers)?
2354 static AllowDefiningTypeSpec
2355 isDefiningTypeSpecifierContext(DeclSpecContext DSC, bool IsCPlusPlus) {
2356 switch (DSC) {
2357 case DeclSpecContext::DSC_normal:
2358 case DeclSpecContext::DSC_class:
2359 case DeclSpecContext::DSC_top_level:
2360 case DeclSpecContext::DSC_alias_declaration:
2361 case DeclSpecContext::DSC_objc_method_result:
2362 return AllowDefiningTypeSpec::Yes;
2363
2364 case DeclSpecContext::DSC_condition:
2365 case DeclSpecContext::DSC_template_param:
2366 return AllowDefiningTypeSpec::YesButInvalid;
2367
2368 case DeclSpecContext::DSC_template_type_arg:
2369 case DeclSpecContext::DSC_type_specifier:
2370 return AllowDefiningTypeSpec::NoButErrorRecovery;
2371
2372 case DeclSpecContext::DSC_association:
2373 return IsCPlusPlus ? AllowDefiningTypeSpec::NoButErrorRecovery
2374 : AllowDefiningTypeSpec::Yes;
2375
2376 case DeclSpecContext::DSC_trailing:
2377 case DeclSpecContext::DSC_conv_operator:
2378 case DeclSpecContext::DSC_template_arg:
2379 case DeclSpecContext::DSC_new:
2380 return AllowDefiningTypeSpec::No;
2381 }
2382 llvm_unreachable("Missing DeclSpecContext case");
2383 }
2384
2385 /// Is this a context in which an opaque-enum-declaration can appear?
2386 static bool isOpaqueEnumDeclarationContext(DeclSpecContext DSC) {
2387 switch (DSC) {
2388 case DeclSpecContext::DSC_normal:
2389 case DeclSpecContext::DSC_class:
2390 case DeclSpecContext::DSC_top_level:
2391 return true;
2392
2393 case DeclSpecContext::DSC_alias_declaration:
2394 case DeclSpecContext::DSC_objc_method_result:
2395 case DeclSpecContext::DSC_condition:
2396 case DeclSpecContext::DSC_template_param:
2397 case DeclSpecContext::DSC_template_type_arg:
2398 case DeclSpecContext::DSC_type_specifier:
2399 case DeclSpecContext::DSC_trailing:
2400 case DeclSpecContext::DSC_association:
2401 case DeclSpecContext::DSC_conv_operator:
2402 case DeclSpecContext::DSC_template_arg:
2403 case DeclSpecContext::DSC_new:
2404
2405 return false;
2406 }
2407 llvm_unreachable("Missing DeclSpecContext case");
2408 }
2409
2410 /// Is this a context in which we can perform class template argument
2411 /// deduction?
2412 static bool isClassTemplateDeductionContext(DeclSpecContext DSC) {
2413 switch (DSC) {
2414 case DeclSpecContext::DSC_normal:
2415 case DeclSpecContext::DSC_template_param:
2416 case DeclSpecContext::DSC_template_arg:
2417 case DeclSpecContext::DSC_class:
2418 case DeclSpecContext::DSC_top_level:
2419 case DeclSpecContext::DSC_condition:
2420 case DeclSpecContext::DSC_type_specifier:
2421 case DeclSpecContext::DSC_association:
2422 case DeclSpecContext::DSC_conv_operator:
2423 case DeclSpecContext::DSC_new:
2424 return true;
2425
2426 case DeclSpecContext::DSC_objc_method_result:
2427 case DeclSpecContext::DSC_template_type_arg:
2428 case DeclSpecContext::DSC_trailing:
2429 case DeclSpecContext::DSC_alias_declaration:
2430 return false;
2431 }
2432 llvm_unreachable("Missing DeclSpecContext case");
2433 }
2434
2435 // Is this a context in which an implicit 'typename' is allowed?
2437 getImplicitTypenameContext(DeclSpecContext DSC) {
2438 switch (DSC) {
2439 case DeclSpecContext::DSC_class:
2440 case DeclSpecContext::DSC_top_level:
2441 case DeclSpecContext::DSC_type_specifier:
2442 case DeclSpecContext::DSC_template_type_arg:
2443 case DeclSpecContext::DSC_trailing:
2444 case DeclSpecContext::DSC_alias_declaration:
2445 case DeclSpecContext::DSC_template_param:
2446 case DeclSpecContext::DSC_new:
2448
2449 case DeclSpecContext::DSC_normal:
2450 case DeclSpecContext::DSC_objc_method_result:
2451 case DeclSpecContext::DSC_condition:
2452 case DeclSpecContext::DSC_template_arg:
2453 case DeclSpecContext::DSC_conv_operator:
2454 case DeclSpecContext::DSC_association:
2456 }
2457 llvm_unreachable("Missing DeclSpecContext case");
2458 }
2459
2460 /// Information on a C++0x for-range-initializer found while parsing a
2461 /// declaration which turns out to be a for-range-declaration.
2462 struct ForRangeInit {
2463 SourceLocation ColonLoc;
2464 ExprResult RangeExpr;
2465 SmallVector<MaterializeTemporaryExpr *, 8> LifetimeExtendTemps;
2466 bool ParsedForRangeDecl() { return !ColonLoc.isInvalid(); }
2467 };
2468 struct ForRangeInfo : ForRangeInit {
2469 StmtResult LoopVar;
2470 };
2471
2472 DeclGroupPtrTy ParseDeclaration(DeclaratorContext Context,
2473 SourceLocation &DeclEnd,
2474 ParsedAttributes &DeclAttrs,
2475 ParsedAttributes &DeclSpecAttrs,
2476 SourceLocation *DeclSpecStart = nullptr);
2478 ParseSimpleDeclaration(DeclaratorContext Context, SourceLocation &DeclEnd,
2479 ParsedAttributes &DeclAttrs,
2480 ParsedAttributes &DeclSpecAttrs, bool RequireSemi,
2481 ForRangeInit *FRI = nullptr,
2482 SourceLocation *DeclSpecStart = nullptr);
2483 bool MightBeDeclarator(DeclaratorContext Context);
2484 DeclGroupPtrTy ParseDeclGroup(ParsingDeclSpec &DS, DeclaratorContext Context,
2485 ParsedAttributes &Attrs,
2486 ParsedTemplateInfo &TemplateInfo,
2487 SourceLocation *DeclEnd = nullptr,
2488 ForRangeInit *FRI = nullptr);
2489 Decl *ParseDeclarationAfterDeclarator(Declarator &D,
2490 const ParsedTemplateInfo &TemplateInfo = ParsedTemplateInfo());
2491 bool ParseAsmAttributesAfterDeclarator(Declarator &D);
2492 Decl *ParseDeclarationAfterDeclaratorAndAttributes(
2493 Declarator &D,
2494 const ParsedTemplateInfo &TemplateInfo = ParsedTemplateInfo(),
2495 ForRangeInit *FRI = nullptr);
2496 Decl *ParseFunctionStatementBody(Decl *Decl, ParseScope &BodyScope);
2497 Decl *ParseFunctionTryBlock(Decl *Decl, ParseScope &BodyScope);
2498
2499 /// When in code-completion, skip parsing of the function/method body
2500 /// unless the body contains the code-completion point.
2501 ///
2502 /// \returns true if the function body was skipped.
2503 bool trySkippingFunctionBody();
2504
2505 bool ParseImplicitInt(DeclSpec &DS, CXXScopeSpec *SS,
2506 ParsedTemplateInfo &TemplateInfo, AccessSpecifier AS,
2507 DeclSpecContext DSC, ParsedAttributes &Attrs);
2508 DeclSpecContext
2509 getDeclSpecContextFromDeclaratorContext(DeclaratorContext Context);
2510 void
2511 ParseDeclarationSpecifiers(DeclSpec &DS, ParsedTemplateInfo &TemplateInfo,
2513 DeclSpecContext DSC = DeclSpecContext::DSC_normal,
2514 LateParsedAttrList *LateAttrs = nullptr) {
2515 return ParseDeclarationSpecifiers(DS, TemplateInfo, AS, DSC, LateAttrs,
2516 getImplicitTypenameContext(DSC));
2517 }
2518 void
2519 ParseDeclarationSpecifiers(DeclSpec &DS, ParsedTemplateInfo &TemplateInfo,
2520 AccessSpecifier AS, DeclSpecContext DSC,
2521 LateParsedAttrList *LateAttrs,
2522 ImplicitTypenameContext AllowImplicitTypename);
2523
2524 SourceLocation ParsePackIndexingType(DeclSpec &DS);
2525 void AnnotateExistingIndexedTypeNamePack(ParsedType T,
2526 SourceLocation StartLoc,
2527 SourceLocation EndLoc);
2528
2529 bool DiagnoseMissingSemiAfterTagDefinition(
2530 DeclSpec &DS, AccessSpecifier AS, DeclSpecContext DSContext,
2531 LateParsedAttrList *LateAttrs = nullptr);
2532
2533 void ParseSpecifierQualifierList(
2534 DeclSpec &DS, AccessSpecifier AS = AS_none,
2535 DeclSpecContext DSC = DeclSpecContext::DSC_normal) {
2536 ParseSpecifierQualifierList(DS, getImplicitTypenameContext(DSC), AS, DSC);
2537 }
2538
2539 void ParseSpecifierQualifierList(
2540 DeclSpec &DS, ImplicitTypenameContext AllowImplicitTypename,
2542 DeclSpecContext DSC = DeclSpecContext::DSC_normal);
2543
2544 void ParseObjCTypeQualifierList(ObjCDeclSpec &DS,
2545 DeclaratorContext Context);
2546
2547 void ParseEnumSpecifier(SourceLocation TagLoc, DeclSpec &DS,
2548 const ParsedTemplateInfo &TemplateInfo,
2549 AccessSpecifier AS, DeclSpecContext DSC);
2550 void ParseEnumBody(SourceLocation StartLoc, Decl *TagDecl);
2551 void ParseStructUnionBody(SourceLocation StartLoc, DeclSpec::TST TagType,
2552 RecordDecl *TagDecl);
2553
2554 void ParseStructDeclaration(
2555 ParsingDeclSpec &DS,
2556 llvm::function_ref<Decl *(ParsingFieldDeclarator &)> FieldsCallback,
2557 LateParsedAttrList *LateFieldAttrs = nullptr);
2558
2559 DeclGroupPtrTy ParseTopLevelStmtDecl();
2560
2561 bool isDeclarationSpecifier(ImplicitTypenameContext AllowImplicitTypename,
2562 bool DisambiguatingWithExpression = false);
2563 bool isTypeSpecifierQualifier();
2564
2565 /// isKnownToBeTypeSpecifier - Return true if we know that the specified token
2566 /// is definitely a type-specifier. Return false if it isn't part of a type
2567 /// specifier or if we're not sure.
2568 bool isKnownToBeTypeSpecifier(const Token &Tok) const;
2569
2570 /// Return true if we know that we are definitely looking at a
2571 /// decl-specifier, and isn't part of an expression such as a function-style
2572 /// cast. Return false if it's no a decl-specifier, or we're not sure.
2573 bool isKnownToBeDeclarationSpecifier() {
2574 if (getLangOpts().CPlusPlus)
2575 return isCXXDeclarationSpecifier(ImplicitTypenameContext::No) ==
2576 TPResult::True;
2577 return isDeclarationSpecifier(ImplicitTypenameContext::No, true);
2578 }
2579
2580 /// isDeclarationStatement - Disambiguates between a declaration or an
2581 /// expression statement, when parsing function bodies.
2582 ///
2583 /// \param DisambiguatingWithExpression - True to indicate that the purpose of
2584 /// this check is to disambiguate between an expression and a declaration.
2585 /// Returns true for declaration, false for expression.
2586 bool isDeclarationStatement(bool DisambiguatingWithExpression = false) {
2587 if (getLangOpts().CPlusPlus)
2588 return isCXXDeclarationStatement(DisambiguatingWithExpression);
2589 return isDeclarationSpecifier(ImplicitTypenameContext::No, true);
2590 }
2591
2592 /// isForInitDeclaration - Disambiguates between a declaration or an
2593 /// expression in the context of the C 'clause-1' or the C++
2594 // 'for-init-statement' part of a 'for' statement.
2595 /// Returns true for declaration, false for expression.
2596 bool isForInitDeclaration() {
2597 if (getLangOpts().OpenMP)
2598 Actions.OpenMP().startOpenMPLoop();
2599 if (getLangOpts().CPlusPlus)
2600 return Tok.is(tok::kw_using) ||
2601 isCXXSimpleDeclaration(/*AllowForRangeDecl=*/true);
2602 return isDeclarationSpecifier(ImplicitTypenameContext::No, true);
2603 }
2604
2605 /// Determine whether this is a C++1z for-range-identifier.
2606 bool isForRangeIdentifier();
2607
2608 /// Determine whether we are currently at the start of an Objective-C
2609 /// class message that appears to be missing the open bracket '['.
2610 bool isStartOfObjCClassMessageMissingOpenBracket();
2611
2612 /// Starting with a scope specifier, identifier, or
2613 /// template-id that refers to the current class, determine whether
2614 /// this is a constructor declarator.
2615 bool isConstructorDeclarator(
2616 bool Unqualified, bool DeductionGuide = false,
2618 const ParsedTemplateInfo *TemplateInfo = nullptr);
2619
2620 /// Specifies the context in which type-id/expression
2621 /// disambiguation will occur.
2622 enum TentativeCXXTypeIdContext {
2623 TypeIdInParens,
2624 TypeIdUnambiguous,
2625 TypeIdAsTemplateArgument,
2626 TypeIdInTrailingReturnType,
2627 TypeIdAsGenericSelectionArgument,
2628 };
2629
2630 /// isTypeIdInParens - Assumes that a '(' was parsed and now we want to know
2631 /// whether the parens contain an expression or a type-id.
2632 /// Returns true for a type-id and false for an expression.
2633 bool isTypeIdInParens(bool &isAmbiguous) {
2634 if (getLangOpts().CPlusPlus)
2635 return isCXXTypeId(TypeIdInParens, isAmbiguous);
2636 isAmbiguous = false;
2637 return isTypeSpecifierQualifier();
2638 }
2639 bool isTypeIdInParens() {
2640 bool isAmbiguous;
2641 return isTypeIdInParens(isAmbiguous);
2642 }
2643
2644 /// Checks whether the current tokens form a type-id or an expression for the
2645 /// purposes of use as the initial operand to a generic selection expression.
2646 /// This requires special handling in C++ because it accepts either a type or
2647 /// an expression, and we need to disambiguate which is which. However, we
2648 /// cannot use the same logic as we've used for sizeof expressions, because
2649 /// that logic relies on the operator only accepting a single argument,
2650 /// whereas _Generic accepts a list of arguments.
2651 bool isTypeIdForGenericSelection() {
2652 if (getLangOpts().CPlusPlus) {
2653 bool isAmbiguous;
2654 return isCXXTypeId(TypeIdAsGenericSelectionArgument, isAmbiguous);
2655 }
2656 return isTypeSpecifierQualifier();
2657 }
2658
2659 /// Checks if the current tokens form type-id or expression.
2660 /// It is similar to isTypeIdInParens but does not suppose that type-id
2661 /// is in parenthesis.
2662 bool isTypeIdUnambiguously() {
2663 if (getLangOpts().CPlusPlus) {
2664 bool isAmbiguous;
2665 return isCXXTypeId(TypeIdUnambiguous, isAmbiguous);
2666 }
2667 return isTypeSpecifierQualifier();
2668 }
2669
2670 /// isCXXDeclarationStatement - C++-specialized function that disambiguates
2671 /// between a declaration or an expression statement, when parsing function
2672 /// bodies. Returns true for declaration, false for expression.
2673 bool isCXXDeclarationStatement(bool DisambiguatingWithExpression = false);
2674
2675 /// isCXXSimpleDeclaration - C++-specialized function that disambiguates
2676 /// between a simple-declaration or an expression-statement.
2677 /// If during the disambiguation process a parsing error is encountered,
2678 /// the function returns true to let the declaration parsing code handle it.
2679 /// Returns false if the statement is disambiguated as expression.
2680 bool isCXXSimpleDeclaration(bool AllowForRangeDecl);
2681
2682 /// isCXXFunctionDeclarator - Disambiguates between a function declarator or
2683 /// a constructor-style initializer, when parsing declaration statements.
2684 /// Returns true for function declarator and false for constructor-style
2685 /// initializer. Sets 'IsAmbiguous' to true to indicate that this declaration
2686 /// might be a constructor-style initializer.
2687 /// If during the disambiguation process a parsing error is encountered,
2688 /// the function returns true to let the declaration parsing code handle it.
2689 bool isCXXFunctionDeclarator(bool *IsAmbiguous = nullptr,
2690 ImplicitTypenameContext AllowImplicitTypename =
2692
2693 struct ConditionDeclarationOrInitStatementState;
2694 enum class ConditionOrInitStatement {
2695 Expression, ///< Disambiguated as an expression (either kind).
2696 ConditionDecl, ///< Disambiguated as the declaration form of condition.
2697 InitStmtDecl, ///< Disambiguated as a simple-declaration init-statement.
2698 ForRangeDecl, ///< Disambiguated as a for-range declaration.
2699 Error ///< Can't be any of the above!
2700 };
2701 /// Disambiguates between the different kinds of things that can happen
2702 /// after 'if (' or 'switch ('. This could be one of two different kinds of
2703 /// declaration (depending on whether there is a ';' later) or an expression.
2704 ConditionOrInitStatement
2705 isCXXConditionDeclarationOrInitStatement(bool CanBeInitStmt,
2706 bool CanBeForRangeDecl);
2707
2708 bool isCXXTypeId(TentativeCXXTypeIdContext Context, bool &isAmbiguous);
2709 bool isCXXTypeId(TentativeCXXTypeIdContext Context) {
2710 bool isAmbiguous;
2711 return isCXXTypeId(Context, isAmbiguous);
2712 }
2713
2714 /// TPResult - Used as the result value for functions whose purpose is to
2715 /// disambiguate C++ constructs by "tentatively parsing" them.
2716 enum class TPResult {
2717 True, False, Ambiguous, Error
2718 };
2719
2720 /// Determine whether we could have an enum-base.
2721 ///
2722 /// \p AllowSemi If \c true, then allow a ';' after the enum-base; otherwise
2723 /// only consider this to be an enum-base if the next token is a '{'.
2724 ///
2725 /// \return \c false if this cannot possibly be an enum base; \c true
2726 /// otherwise.
2727 bool isEnumBase(bool AllowSemi);
2728
2729 /// isCXXDeclarationSpecifier - Returns TPResult::True if it is a
2730 /// declaration specifier, TPResult::False if it is not,
2731 /// TPResult::Ambiguous if it could be either a decl-specifier or a
2732 /// function-style cast, and TPResult::Error if a parsing error was
2733 /// encountered. If it could be a braced C++11 function-style cast, returns
2734 /// BracedCastResult.
2735 /// Doesn't consume tokens.
2736 TPResult
2737 isCXXDeclarationSpecifier(ImplicitTypenameContext AllowImplicitTypename,
2738 TPResult BracedCastResult = TPResult::False,
2739 bool *InvalidAsDeclSpec = nullptr);
2740
2741 /// Given that isCXXDeclarationSpecifier returns \c TPResult::True or
2742 /// \c TPResult::Ambiguous, determine whether the decl-specifier would be
2743 /// a type-specifier other than a cv-qualifier.
2744 bool isCXXDeclarationSpecifierAType();
2745
2746 /// Determine whether the current token sequence might be
2747 /// '<' template-argument-list '>'
2748 /// rather than a less-than expression.
2749 TPResult isTemplateArgumentList(unsigned TokensToSkip);
2750
2751 /// Determine whether an '(' after an 'explicit' keyword is part of a C++20
2752 /// 'explicit(bool)' declaration, in earlier language modes where that is an
2753 /// extension.
2754 TPResult isExplicitBool();
2755
2756 /// Determine whether an identifier has been tentatively declared as a
2757 /// non-type. Such tentative declarations should not be found to name a type
2758 /// during a tentative parse, but also should not be annotated as a non-type.
2759 bool isTentativelyDeclared(IdentifierInfo *II);
2760
2761 // "Tentative parsing" functions, used for disambiguation. If a parsing error
2762 // is encountered they will return TPResult::Error.
2763 // Returning TPResult::True/False indicates that the ambiguity was
2764 // resolved and tentative parsing may stop. TPResult::Ambiguous indicates
2765 // that more tentative parsing is necessary for disambiguation.
2766 // They all consume tokens, so backtracking should be used after calling them.
2767
2768 TPResult TryParseSimpleDeclaration(bool AllowForRangeDecl);
2769 TPResult TryParseTypeofSpecifier();
2770 TPResult TryParseProtocolQualifiers();
2771 TPResult TryParsePtrOperatorSeq();
2772 TPResult TryParseOperatorId();
2773 TPResult TryParseInitDeclaratorList(bool MayHaveTrailingReturnType = false);
2774 TPResult TryParseDeclarator(bool mayBeAbstract, bool mayHaveIdentifier = true,
2775 bool mayHaveDirectInit = false,
2776 bool mayHaveTrailingReturnType = false);
2777 TPResult TryParseParameterDeclarationClause(
2778 bool *InvalidAsDeclaration = nullptr, bool VersusTemplateArg = false,
2779 ImplicitTypenameContext AllowImplicitTypename =
2781 TPResult TryParseFunctionDeclarator(bool MayHaveTrailingReturnType = false);
2782 bool NameAfterArrowIsNonType();
2783 TPResult TryParseBracketDeclarator();
2784 TPResult TryConsumeDeclarationSpecifier();
2785
2786 /// Try to skip a possibly empty sequence of 'attribute-specifier's without
2787 /// full validation of the syntactic structure of attributes.
2788 bool TrySkipAttributes();
2789
2790 /// Diagnoses use of _ExtInt as being deprecated, and diagnoses use of
2791 /// _BitInt as an extension when appropriate.
2792 void DiagnoseBitIntUse(const Token &Tok);
2793
2794public:
2796 ParseTypeName(SourceRange *Range = nullptr,
2798 AccessSpecifier AS = AS_none, Decl **OwnedType = nullptr,
2799 ParsedAttributes *Attrs = nullptr);
2800
2801private:
2802 void ParseBlockId(SourceLocation CaretLoc);
2803
2804 /// Return true if the next token should be treated as a [[]] attribute,
2805 /// or as a keyword that behaves like one. The former is only true if
2806 /// [[]] attributes are enabled, whereas the latter is true whenever
2807 /// such a keyword appears. The arguments are as for
2808 /// isCXX11AttributeSpecifier.
2809 bool isAllowedCXX11AttributeSpecifier(bool Disambiguate = false,
2810 bool OuterMightBeMessageSend = false) {
2811 return (Tok.isRegularKeywordAttribute() ||
2812 isCXX11AttributeSpecifier(Disambiguate, OuterMightBeMessageSend));
2813 }
2814
2815 // Check for the start of an attribute-specifier-seq in a context where an
2816 // attribute is not allowed.
2817 bool CheckProhibitedCXX11Attribute() {
2818 assert(Tok.is(tok::l_square));
2819 if (NextToken().isNot(tok::l_square))
2820 return false;
2821 return DiagnoseProhibitedCXX11Attribute();
2822 }
2823
2824 bool DiagnoseProhibitedCXX11Attribute();
2825 void CheckMisplacedCXX11Attribute(ParsedAttributes &Attrs,
2826 SourceLocation CorrectLocation) {
2827 if (!Tok.isRegularKeywordAttribute() &&
2828 (Tok.isNot(tok::l_square) || NextToken().isNot(tok::l_square)) &&
2829 Tok.isNot(tok::kw_alignas))
2830 return;
2831 DiagnoseMisplacedCXX11Attribute(Attrs, CorrectLocation);
2832 }
2833 void DiagnoseMisplacedCXX11Attribute(ParsedAttributes &Attrs,
2834 SourceLocation CorrectLocation);
2835
2836 void stripTypeAttributesOffDeclSpec(ParsedAttributes &Attrs, DeclSpec &DS,
2837 TagUseKind TUK);
2838
2839 // FixItLoc = possible correct location for the attributes
2840 void ProhibitAttributes(ParsedAttributes &Attrs,
2841 SourceLocation FixItLoc = SourceLocation()) {
2842 if (Attrs.Range.isInvalid())
2843 return;
2844 DiagnoseProhibitedAttributes(Attrs, FixItLoc);
2845 Attrs.clear();
2846 }
2847
2848 void ProhibitAttributes(ParsedAttributesView &Attrs,
2849 SourceLocation FixItLoc = SourceLocation()) {
2850 if (Attrs.Range.isInvalid())
2851 return;
2852 DiagnoseProhibitedAttributes(Attrs, FixItLoc);
2853 Attrs.clearListOnly();
2854 }
2855 void DiagnoseProhibitedAttributes(const ParsedAttributesView &Attrs,
2856 SourceLocation FixItLoc);
2857
2858 // Forbid C++11 and C23 attributes that appear on certain syntactic locations
2859 // which standard permits but we don't supported yet, for example, attributes
2860 // appertain to decl specifiers.
2861 // For the most cases we don't want to warn on unknown type attributes, but
2862 // left them to later diagnoses. However, for a few cases like module
2863 // declarations and module import declarations, we should do it.
2864 void ProhibitCXX11Attributes(ParsedAttributes &Attrs, unsigned AttrDiagID,
2865 unsigned KeywordDiagId,
2866 bool DiagnoseEmptyAttrs = false,
2867 bool WarnOnUnknownAttrs = false);
2868
2869 /// Skip C++11 and C23 attributes and return the end location of the
2870 /// last one.
2871 /// \returns SourceLocation() if there are no attributes.
2872 SourceLocation SkipCXX11Attributes();
2873
2874 /// Diagnose and skip C++11 and C23 attributes that appear in syntactic
2875 /// locations where attributes are not allowed.
2876 void DiagnoseAndSkipCXX11Attributes();
2877
2878 /// Emit warnings for C++11 and C23 attributes that are in a position that
2879 /// clang accepts as an extension.
2880 void DiagnoseCXX11AttributeExtension(ParsedAttributes &Attrs);
2881
2882 ExprResult ParseUnevaluatedStringInAttribute(const IdentifierInfo &AttrName);
2883
2884 bool
2885 ParseAttributeArgumentList(const clang::IdentifierInfo &AttrName,
2886 SmallVectorImpl<Expr *> &Exprs,
2887 ParsedAttributeArgumentsProperties ArgsProperties);
2888
2889 /// Parses syntax-generic attribute arguments for attributes which are
2890 /// known to the implementation, and adds them to the given ParsedAttributes
2891 /// list with the given attribute syntax. Returns the number of arguments
2892 /// parsed for the attribute.
2893 unsigned
2894 ParseAttributeArgsCommon(IdentifierInfo *AttrName, SourceLocation AttrNameLoc,
2895 ParsedAttributes &Attrs, SourceLocation *EndLoc,
2896 IdentifierInfo *ScopeName, SourceLocation ScopeLoc,
2897 ParsedAttr::Form Form);
2898
2899 enum ParseAttrKindMask {
2900 PAKM_GNU = 1 << 0,
2901 PAKM_Declspec = 1 << 1,
2902 PAKM_CXX11 = 1 << 2,
2903 };
2904
2905 /// \brief Parse attributes based on what syntaxes are desired, allowing for
2906 /// the order to vary. e.g. with PAKM_GNU | PAKM_Declspec:
2907 /// __attribute__((...)) __declspec(...) __attribute__((...)))
2908 /// Note that Microsoft attributes (spelled with single square brackets) are
2909 /// not supported by this because of parsing ambiguities with other
2910 /// constructs.
2911 ///
2912 /// There are some attribute parse orderings that should not be allowed in
2913 /// arbitrary order. e.g.,
2914 ///
2915 /// [[]] __attribute__(()) int i; // OK
2916 /// __attribute__(()) [[]] int i; // Not OK
2917 ///
2918 /// Such situations should use the specific attribute parsing functionality.
2919 void ParseAttributes(unsigned WhichAttrKinds, ParsedAttributes &Attrs,
2920 LateParsedAttrList *LateAttrs = nullptr);
2921 /// \brief Possibly parse attributes based on what syntaxes are desired,
2922 /// allowing for the order to vary.
2923 bool MaybeParseAttributes(unsigned WhichAttrKinds, ParsedAttributes &Attrs,
2924 LateParsedAttrList *LateAttrs = nullptr) {
2925 if (Tok.isOneOf(tok::kw___attribute, tok::kw___declspec) ||
2926 isAllowedCXX11AttributeSpecifier()) {
2927 ParseAttributes(WhichAttrKinds, Attrs, LateAttrs);
2928 return true;
2929 }
2930 return false;
2931 }
2932
2933 void MaybeParseGNUAttributes(Declarator &D,
2934 LateParsedAttrList *LateAttrs = nullptr) {
2935 if (Tok.is(tok::kw___attribute)) {
2936 ParsedAttributes Attrs(AttrFactory);
2937 ParseGNUAttributes(Attrs, LateAttrs, &D);
2938 D.takeAttributes(Attrs);
2939 }
2940 }
2941
2942 bool MaybeParseGNUAttributes(ParsedAttributes &Attrs,
2943 LateParsedAttrList *LateAttrs = nullptr) {
2944 if (Tok.is(tok::kw___attribute)) {
2945 ParseGNUAttributes(Attrs, LateAttrs);
2946 return true;
2947 }
2948 return false;
2949 }
2950
2951 bool ParseSingleGNUAttribute(ParsedAttributes &Attrs, SourceLocation &EndLoc,
2952 LateParsedAttrList *LateAttrs = nullptr,
2953 Declarator *D = nullptr);
2954 void ParseGNUAttributes(ParsedAttributes &Attrs,
2955 LateParsedAttrList *LateAttrs = nullptr,
2956 Declarator *D = nullptr);
2957 void ParseGNUAttributeArgs(IdentifierInfo *AttrName,
2958 SourceLocation AttrNameLoc,
2959 ParsedAttributes &Attrs, SourceLocation *EndLoc,
2960 IdentifierInfo *ScopeName, SourceLocation ScopeLoc,
2961 ParsedAttr::Form Form, Declarator *D);
2962 IdentifierLoc *ParseIdentifierLoc();
2963
2964 unsigned
2965 ParseClangAttributeArgs(IdentifierInfo *AttrName, SourceLocation AttrNameLoc,
2966 ParsedAttributes &Attrs, SourceLocation *EndLoc,
2967 IdentifierInfo *ScopeName, SourceLocation ScopeLoc,
2968 ParsedAttr::Form Form);
2969
2970 void ReplayOpenMPAttributeTokens(CachedTokens &OpenMPTokens) {
2971 // If parsing the attributes found an OpenMP directive, emit those tokens
2972 // to the parse stream now.
2973 if (!OpenMPTokens.empty()) {
2974 PP.EnterToken(Tok, /*IsReinject*/ true);
2975 PP.EnterTokenStream(OpenMPTokens, /*DisableMacroExpansion*/ true,
2976 /*IsReinject*/ true);
2977 ConsumeAnyToken(/*ConsumeCodeCompletionTok*/ true);
2978 }
2979 }
2980 void MaybeParseCXX11Attributes(Declarator &D) {
2981 if (isAllowedCXX11AttributeSpecifier()) {
2982 ParsedAttributes Attrs(AttrFactory);
2983 ParseCXX11Attributes(Attrs);
2984 D.takeAttributes(Attrs);
2985 }
2986 }
2987
2988 bool MaybeParseCXX11Attributes(ParsedAttributes &Attrs,
2989 bool OuterMightBeMessageSend = false) {
2990 if (isAllowedCXX11AttributeSpecifier(false, OuterMightBeMessageSend)) {
2991 ParseCXX11Attributes(Attrs);
2992 return true;
2993 }
2994 return false;
2995 }
2996
2997 void ParseOpenMPAttributeArgs(const IdentifierInfo *AttrName,
2998 CachedTokens &OpenMPTokens);
2999
3000 void ParseCXX11AttributeSpecifierInternal(ParsedAttributes &Attrs,
3001 CachedTokens &OpenMPTokens,
3002 SourceLocation *EndLoc = nullptr);
3003 void ParseCXX11AttributeSpecifier(ParsedAttributes &Attrs,
3004 SourceLocation *EndLoc = nullptr) {
3005 CachedTokens OpenMPTokens;
3006 ParseCXX11AttributeSpecifierInternal(Attrs, OpenMPTokens, EndLoc);
3007 ReplayOpenMPAttributeTokens(OpenMPTokens);
3008 }
3009 void ParseCXX11Attributes(ParsedAttributes &attrs);
3010 /// Parses a C++11 (or C23)-style attribute argument list. Returns true
3011 /// if this results in adding an attribute to the ParsedAttributes list.
3012 bool ParseCXX11AttributeArgs(IdentifierInfo *AttrName,
3013 SourceLocation AttrNameLoc,
3014 ParsedAttributes &Attrs, SourceLocation *EndLoc,
3015 IdentifierInfo *ScopeName,
3016 SourceLocation ScopeLoc,
3017 CachedTokens &OpenMPTokens);
3018
3019 /// Parse a C++23 assume() attribute. Returns true on error.
3020 bool ParseCXXAssumeAttributeArg(ParsedAttributes &Attrs,
3021 IdentifierInfo *AttrName,
3022 SourceLocation AttrNameLoc,
3023 SourceLocation *EndLoc,
3024 ParsedAttr::Form Form);
3025
3026 IdentifierInfo *TryParseCXX11AttributeIdentifier(
3027 SourceLocation &Loc,
3030 const IdentifierInfo *EnclosingScope = nullptr);
3031
3032 bool MaybeParseHLSLAnnotations(Declarator &D,
3033 SourceLocation *EndLoc = nullptr,
3034 bool CouldBeBitField = false) {
3035 assert(getLangOpts().HLSL && "MaybeParseHLSLAnnotations is for HLSL only");
3036 if (Tok.is(tok::colon)) {
3037 ParsedAttributes Attrs(AttrFactory);
3038 ParseHLSLAnnotations(Attrs, EndLoc, CouldBeBitField);
3039 D.takeAttributes(Attrs);
3040 return true;
3041 }
3042 return false;
3043 }
3044
3045 void MaybeParseHLSLAnnotations(ParsedAttributes &Attrs,
3046 SourceLocation *EndLoc = nullptr) {
3047 assert(getLangOpts().HLSL && "MaybeParseHLSLAnnotations is for HLSL only");
3048 if (Tok.is(tok::colon))
3049 ParseHLSLAnnotations(Attrs, EndLoc);
3050 }
3051
3052 void ParseHLSLAnnotations(ParsedAttributes &Attrs,
3053 SourceLocation *EndLoc = nullptr,
3054 bool CouldBeBitField = false);
3055 Decl *ParseHLSLBuffer(SourceLocation &DeclEnd);
3056
3057 void MaybeParseMicrosoftAttributes(ParsedAttributes &Attrs) {
3058 if ((getLangOpts().MicrosoftExt || getLangOpts().HLSL) &&
3059 Tok.is(tok::l_square)) {
3060 ParsedAttributes AttrsWithRange(AttrFactory);
3061 ParseMicrosoftAttributes(AttrsWithRange);
3062 Attrs.takeAllFrom(AttrsWithRange);
3063 }
3064 }
3065 void ParseMicrosoftUuidAttributeArgs(ParsedAttributes &Attrs);
3066 void ParseMicrosoftAttributes(ParsedAttributes &Attrs);
3067 bool MaybeParseMicrosoftDeclSpecs(ParsedAttributes &Attrs) {
3068 if (getLangOpts().DeclSpecKeyword && Tok.is(tok::kw___declspec)) {
3069 ParseMicrosoftDeclSpecs(Attrs);
3070 return true;
3071 }
3072 return false;
3073 }
3074 void ParseMicrosoftDeclSpecs(ParsedAttributes &Attrs);
3075 bool ParseMicrosoftDeclSpecArgs(IdentifierInfo *AttrName,
3076 SourceLocation AttrNameLoc,
3077 ParsedAttributes &Attrs);
3078 void ParseMicrosoftTypeAttributes(ParsedAttributes &attrs);
3079 void ParseWebAssemblyFuncrefTypeAttribute(ParsedAttributes &Attrs);
3080 void DiagnoseAndSkipExtendedMicrosoftTypeAttributes();
3081 SourceLocation SkipExtendedMicrosoftTypeAttributes();
3082 void ParseMicrosoftInheritanceClassAttributes(ParsedAttributes &attrs);
3083 void ParseNullabilityClassAttributes(ParsedAttributes &attrs);
3084 void ParseBorlandTypeAttributes(ParsedAttributes &attrs);
3085 void ParseOpenCLKernelAttributes(ParsedAttributes &attrs);
3086 void ParseOpenCLQualifiers(ParsedAttributes &Attrs);
3087 void ParseNullabilityTypeSpecifiers(ParsedAttributes &attrs);
3088 void ParseCUDAFunctionAttributes(ParsedAttributes &attrs);
3089 bool isHLSLQualifier(const Token &Tok) const;
3090 void ParseHLSLQualifiers(ParsedAttributes &Attrs);
3091
3092 VersionTuple ParseVersionTuple(SourceRange &Range);
3093 void ParseAvailabilityAttribute(IdentifierInfo &Availability,
3094 SourceLocation AvailabilityLoc,
3095 ParsedAttributes &attrs,
3096 SourceLocation *endLoc,
3097 IdentifierInfo *ScopeName,
3098 SourceLocation ScopeLoc,
3099 ParsedAttr::Form Form);
3100
3101 std::optional<AvailabilitySpec> ParseAvailabilitySpec();
3102 ExprResult ParseAvailabilityCheckExpr(SourceLocation StartLoc);
3103
3104 void ParseExternalSourceSymbolAttribute(IdentifierInfo &ExternalSourceSymbol,
3105 SourceLocation Loc,
3106 ParsedAttributes &Attrs,
3107 SourceLocation *EndLoc,
3108 IdentifierInfo *ScopeName,
3109 SourceLocation ScopeLoc,
3110 ParsedAttr::Form Form);
3111
3112 void ParseObjCBridgeRelatedAttribute(IdentifierInfo &ObjCBridgeRelated,
3113 SourceLocation ObjCBridgeRelatedLoc,
3114 ParsedAttributes &Attrs,
3115 SourceLocation *EndLoc,
3116 IdentifierInfo *ScopeName,
3117 SourceLocation ScopeLoc,
3118 ParsedAttr::Form Form);
3119
3120 void ParseSwiftNewTypeAttribute(IdentifierInfo &AttrName,
3121 SourceLocation AttrNameLoc,
3122 ParsedAttributes &Attrs,
3123 SourceLocation *EndLoc,
3124 IdentifierInfo *ScopeName,
3125 SourceLocation ScopeLoc,
3126 ParsedAttr::Form Form);
3127
3128 void ParseTypeTagForDatatypeAttribute(IdentifierInfo &AttrName,
3129 SourceLocation AttrNameLoc,
3130 ParsedAttributes &Attrs,
3131 SourceLocation *EndLoc,
3132 IdentifierInfo *ScopeName,
3133 SourceLocation ScopeLoc,
3134 ParsedAttr::Form Form);
3135
3136 void ParseAttributeWithTypeArg(IdentifierInfo &AttrName,
3137 SourceLocation AttrNameLoc,
3138 ParsedAttributes &Attrs,
3139 IdentifierInfo *ScopeName,
3140 SourceLocation ScopeLoc,
3141 ParsedAttr::Form Form);
3142
3143 void DistributeCLateParsedAttrs(Decl *Dcl, LateParsedAttrList *LateAttrs);
3144
3145 void ParseBoundsAttribute(IdentifierInfo &AttrName,
3146 SourceLocation AttrNameLoc, ParsedAttributes &Attrs,
3147 IdentifierInfo *ScopeName, SourceLocation ScopeLoc,
3148 ParsedAttr::Form Form);
3149
3150 void ParseTypeofSpecifier(DeclSpec &DS);
3151 SourceLocation ParseDecltypeSpecifier(DeclSpec &DS);
3152 void AnnotateExistingDecltypeSpecifier(const DeclSpec &DS,
3153 SourceLocation StartLoc,
3154 SourceLocation EndLoc);
3155 void ParseAtomicSpecifier(DeclSpec &DS);
3156
3157 ExprResult ParseAlignArgument(StringRef KWName, SourceLocation Start,
3158 SourceLocation &EllipsisLoc, bool &IsType,
3159 ParsedType &Ty);
3160 void ParseAlignmentSpecifier(ParsedAttributes &Attrs,
3161 SourceLocation *endLoc = nullptr);
3162 ExprResult ParseExtIntegerArgument();
3163
3164 VirtSpecifiers::Specifier isCXX11VirtSpecifier(const Token &Tok) const;
3165 VirtSpecifiers::Specifier isCXX11VirtSpecifier() const {
3166 return isCXX11VirtSpecifier(Tok);
3167 }
3168 void ParseOptionalCXX11VirtSpecifierSeq(VirtSpecifiers &VS, bool IsInterface,
3169 SourceLocation FriendLoc);
3170
3171 bool isCXX11FinalKeyword() const;
3172 bool isClassCompatibleKeyword() const;
3173
3174 /// DeclaratorScopeObj - RAII object used in Parser::ParseDirectDeclarator to
3175 /// enter a new C++ declarator scope and exit it when the function is
3176 /// finished.
3177 class DeclaratorScopeObj {
3178 Parser &P;
3179 CXXScopeSpec &SS;
3180 bool EnteredScope;
3181 bool CreatedScope;
3182 public:
3183 DeclaratorScopeObj(Parser &p, CXXScopeSpec &ss)
3184 : P(p), SS(ss), EnteredScope(false), CreatedScope(false) {}
3185
3186 void EnterDeclaratorScope() {
3187 assert(!EnteredScope && "Already entered the scope!");
3188 assert(SS.isSet() && "C++ scope was not set!");
3189
3190 CreatedScope = true;
3191 P.EnterScope(0); // Not a decl scope.
3192
3193 if (!P.Actions.ActOnCXXEnterDeclaratorScope(P.getCurScope(), SS))
3194 EnteredScope = true;
3195 }
3196
3197 ~DeclaratorScopeObj() {
3198 if (EnteredScope) {
3199 assert(SS.isSet() && "C++ scope was cleared ?");
3200 P.Actions.ActOnCXXExitDeclaratorScope(P.getCurScope(), SS);
3201 }
3202 if (CreatedScope)
3203 P.ExitScope();
3204 }
3205 };
3206
3207 /// ParseDeclarator - Parse and verify a newly-initialized declarator.
3208 void ParseDeclarator(Declarator &D);
3209 /// A function that parses a variant of direct-declarator.
3210 typedef void (Parser::*DirectDeclParseFunction)(Declarator&);
3211 void ParseDeclaratorInternal(Declarator &D,
3212 DirectDeclParseFunction DirectDeclParser);
3213
3214 enum AttrRequirements {
3215 AR_NoAttributesParsed = 0, ///< No attributes are diagnosed.
3216 AR_GNUAttributesParsedAndRejected = 1 << 0, ///< Diagnose GNU attributes.
3217 AR_GNUAttributesParsed = 1 << 1,
3218 AR_CXX11AttributesParsed = 1 << 2,
3219 AR_DeclspecAttributesParsed = 1 << 3,
3220 AR_AllAttributesParsed = AR_GNUAttributesParsed |
3221 AR_CXX11AttributesParsed |
3222 AR_DeclspecAttributesParsed,
3223 AR_VendorAttributesParsed = AR_GNUAttributesParsed |
3224 AR_DeclspecAttributesParsed
3225 };
3226
3227 void ParseTypeQualifierListOpt(
3228 DeclSpec &DS, unsigned AttrReqs = AR_AllAttributesParsed,
3229 bool AtomicAllowed = true, bool IdentifierRequired = false,
3230 std::optional<llvm::function_ref<void()>> CodeCompletionHandler =
3231 std::nullopt);
3232 void ParseDirectDeclarator(Declarator &D);
3233 void ParseDecompositionDeclarator(Declarator &D);
3234 void ParseParenDeclarator(Declarator &D);
3235 void ParseFunctionDeclarator(Declarator &D, ParsedAttributes &FirstArgAttrs,
3236 BalancedDelimiterTracker &Tracker,
3237 bool IsAmbiguous, bool RequiresArg = false);
3238 void InitCXXThisScopeForDeclaratorIfRelevant(
3239 const Declarator &D, const DeclSpec &DS,
3240 std::optional<Sema::CXXThisScopeRAII> &ThisScope);
3241 bool ParseRefQualifier(bool &RefQualifierIsLValueRef,
3242 SourceLocation &RefQualifierLoc);
3243 bool isFunctionDeclaratorIdentifierList();
3244 void ParseFunctionDeclaratorIdentifierList(
3245 Declarator &D,
3246 SmallVectorImpl<DeclaratorChunk::ParamInfo> &ParamInfo);
3247 void ParseParameterDeclarationClause(
3248 Declarator &D, ParsedAttributes &attrs,
3249 SmallVectorImpl<DeclaratorChunk::ParamInfo> &ParamInfo,
3250 SourceLocation &EllipsisLoc) {
3251 return ParseParameterDeclarationClause(
3252 D.getContext(), attrs, ParamInfo, EllipsisLoc,
3253 D.getCXXScopeSpec().isSet() &&
3254 D.isFunctionDeclaratorAFunctionDeclaration());
3255 }
3256 void ParseParameterDeclarationClause(
3257 DeclaratorContext DeclaratorContext, ParsedAttributes &attrs,
3258 SmallVectorImpl<DeclaratorChunk::ParamInfo> &ParamInfo,
3259 SourceLocation &EllipsisLoc, bool IsACXXFunctionDeclaration = false);
3260
3261 void ParseBracketDeclarator(Declarator &D);
3262 void ParseMisplacedBracketDeclarator(Declarator &D);
3263 bool MaybeParseTypeTransformTypeSpecifier(DeclSpec &DS);
3264 DeclSpec::TST TypeTransformTokToDeclSpec();
3265
3266 //===--------------------------------------------------------------------===//
3267 // C++ 7: Declarations [dcl.dcl]
3268
3269 /// The kind of attribute specifier we have found.
3270 enum CXX11AttributeKind {
3271 /// This is not an attribute specifier.
3272 CAK_NotAttributeSpecifier,
3273 /// This should be treated as an attribute-specifier.
3274 CAK_AttributeSpecifier,
3275 /// The next tokens are '[[', but this is not an attribute-specifier. This
3276 /// is ill-formed by C++11 [dcl.attr.grammar]p6.
3277 CAK_InvalidAttributeSpecifier
3278 };
3279 CXX11AttributeKind
3280 isCXX11AttributeSpecifier(bool Disambiguate = false,
3281 bool OuterMightBeMessageSend = false);
3282
3283 void DiagnoseUnexpectedNamespace(NamedDecl *Context);
3284
3285 DeclGroupPtrTy ParseNamespace(DeclaratorContext Context,
3286 SourceLocation &DeclEnd,
3287 SourceLocation InlineLoc = SourceLocation());
3288
3289 struct InnerNamespaceInfo {
3290 SourceLocation NamespaceLoc;
3291 SourceLocation InlineLoc;
3292 SourceLocation IdentLoc;
3293 IdentifierInfo *Ident;
3294 };
3295 using InnerNamespaceInfoList = llvm::SmallVector<InnerNamespaceInfo, 4>;
3296
3297 void ParseInnerNamespace(const InnerNamespaceInfoList &InnerNSs,
3298 unsigned int index, SourceLocation &InlineLoc,
3299 ParsedAttributes &attrs,
3300 BalancedDelimiterTracker &Tracker);
3301 Decl *ParseLinkage(ParsingDeclSpec &DS, DeclaratorContext Context);
3302 Decl *ParseExportDeclaration();
3303 DeclGroupPtrTy ParseUsingDirectiveOrDeclaration(
3304 DeclaratorContext Context, const ParsedTemplateInfo &TemplateInfo,
3305 SourceLocation &DeclEnd, ParsedAttributes &Attrs);
3306 Decl *ParseUsingDirective(DeclaratorContext Context,
3307 SourceLocation UsingLoc,
3308 SourceLocation &DeclEnd,
3309 ParsedAttributes &attrs);
3310
3311 struct UsingDeclarator {
3312 SourceLocation TypenameLoc;
3313 CXXScopeSpec SS;
3314 UnqualifiedId Name;
3315 SourceLocation EllipsisLoc;
3316
3317 void clear() {
3318 TypenameLoc = EllipsisLoc = SourceLocation();
3319 SS.clear();
3320 Name.clear();
3321 }
3322 };
3323
3324 bool ParseUsingDeclarator(DeclaratorContext Context, UsingDeclarator &D);
3325 DeclGroupPtrTy ParseUsingDeclaration(DeclaratorContext Context,
3326 const ParsedTemplateInfo &TemplateInfo,
3327 SourceLocation UsingLoc,
3328 SourceLocation &DeclEnd,
3329 ParsedAttributes &Attrs,
3331 Decl *ParseAliasDeclarationAfterDeclarator(
3332 const ParsedTemplateInfo &TemplateInfo, SourceLocation UsingLoc,
3333 UsingDeclarator &D, SourceLocation &DeclEnd, AccessSpecifier AS,
3334 ParsedAttributes &Attrs, Decl **OwnedType = nullptr);
3335
3336 Decl *ParseStaticAssertDeclaration(SourceLocation &DeclEnd);
3337 Decl *ParseNamespaceAlias(SourceLocation NamespaceLoc,
3338 SourceLocation AliasLoc, IdentifierInfo *Alias,
3339 SourceLocation &DeclEnd);
3340
3341 //===--------------------------------------------------------------------===//
3342 // C++ 9: classes [class] and C structs/unions.
3343 bool isValidAfterTypeSpecifier(bool CouldBeBitfield);
3344 void ParseClassSpecifier(tok::TokenKind TagTokKind, SourceLocation TagLoc,
3345 DeclSpec &DS, ParsedTemplateInfo &TemplateInfo,
3346 AccessSpecifier AS, bool EnteringContext,
3347 DeclSpecContext DSC, ParsedAttributes &Attributes);
3348 void SkipCXXMemberSpecification(SourceLocation StartLoc,
3349 SourceLocation AttrFixitLoc,
3350 unsigned TagType,
3351 Decl *TagDecl);
3352 void ParseCXXMemberSpecification(SourceLocation StartLoc,
3353 SourceLocation AttrFixitLoc,
3354 ParsedAttributes &Attrs, unsigned TagType,
3355 Decl *TagDecl);
3356 ExprResult ParseCXXMemberInitializer(Decl *D, bool IsFunction,
3357 SourceLocation &EqualLoc);
3358 bool
3359 ParseCXXMemberDeclaratorBeforeInitializer(Declarator &DeclaratorInfo,
3360 VirtSpecifiers &VS,
3361 ExprResult &BitfieldSize,
3362 LateParsedAttrList &LateAttrs);
3363 void MaybeParseAndDiagnoseDeclSpecAfterCXX11VirtSpecifierSeq(Declarator &D,
3364 VirtSpecifiers &VS);
3365 DeclGroupPtrTy ParseCXXClassMemberDeclaration(
3366 AccessSpecifier AS, ParsedAttributes &Attr,
3367 ParsedTemplateInfo &TemplateInfo,
3368 ParsingDeclRAIIObject *DiagsFromTParams = nullptr);
3370 ParseCXXClassMemberDeclarationWithPragmas(AccessSpecifier &AS,
3371 ParsedAttributes &AccessAttrs,
3372 DeclSpec::TST TagType, Decl *Tag);
3373 void ParseConstructorInitializer(Decl *ConstructorDecl);
3374 MemInitResult ParseMemInitializer(Decl *ConstructorDecl);
3375 void HandleMemberFunctionDeclDelays(Declarator& DeclaratorInfo,
3376 Decl *ThisDecl);
3377
3378 //===--------------------------------------------------------------------===//
3379 // C++ 10: Derived classes [class.derived]
3380 TypeResult ParseBaseTypeSpecifier(SourceLocation &BaseLoc,
3381 SourceLocation &EndLocation);
3382 void ParseBaseClause(Decl *ClassDecl);
3383 BaseResult ParseBaseSpecifier(Decl *ClassDecl);
3384 AccessSpecifier getAccessSpecifierIfPresent() const;
3385
3386 bool ParseUnqualifiedIdTemplateId(CXXScopeSpec &SS,
3387 ParsedType ObjectType,
3388 bool ObjectHadErrors,
3389 SourceLocation TemplateKWLoc,
3390 IdentifierInfo *Name,
3391 SourceLocation NameLoc,
3392 bool EnteringContext,
3393 UnqualifiedId &Id,
3394 bool AssumeTemplateId);
3395 bool ParseUnqualifiedIdOperator(CXXScopeSpec &SS, bool EnteringContext,
3396 ParsedType ObjectType,
3397 UnqualifiedId &Result);
3398
3399 //===--------------------------------------------------------------------===//
3400 // OpenMP: Directives and clauses.
3401 /// Parse clauses for '#pragma omp declare simd'.
3402 DeclGroupPtrTy ParseOMPDeclareSimdClauses(DeclGroupPtrTy Ptr,
3403 CachedTokens &Toks,
3404 SourceLocation Loc);
3405
3406 /// Parse a property kind into \p TIProperty for the selector set \p Set and
3407 /// selector \p Selector.
3408 void parseOMPTraitPropertyKind(OMPTraitProperty &TIProperty,
3409 llvm::omp::TraitSet Set,
3410 llvm::omp::TraitSelector Selector,
3411 llvm::StringMap<SourceLocation> &Seen);
3412
3413 /// Parse a selector kind into \p TISelector for the selector set \p Set.
3414 void parseOMPTraitSelectorKind(OMPTraitSelector &TISelector,
3415 llvm::omp::TraitSet Set,
3416 llvm::StringMap<SourceLocation> &Seen);
3417
3418 /// Parse a selector set kind into \p TISet.
3419 void parseOMPTraitSetKind(OMPTraitSet &TISet,
3420 llvm::StringMap<SourceLocation> &Seen);
3421
3422 /// Parses an OpenMP context property.
3423 void parseOMPContextProperty(OMPTraitSelector &TISelector,
3424 llvm::omp::TraitSet Set,
3425 llvm::StringMap<SourceLocation> &Seen);
3426
3427 /// Parses an OpenMP context selector.
3428 void parseOMPContextSelector(OMPTraitSelector &TISelector,
3429 llvm::omp::TraitSet Set,
3430 llvm::StringMap<SourceLocation> &SeenSelectors);
3431
3432 /// Parses an OpenMP context selector set.
3433 void parseOMPContextSelectorSet(OMPTraitSet &TISet,
3434 llvm::StringMap<SourceLocation> &SeenSets);
3435
3436 /// Parses OpenMP context selectors.
3437 bool parseOMPContextSelectors(SourceLocation Loc, OMPTraitInfo &TI);
3438
3439 /// Parse an 'append_args' clause for '#pragma omp declare variant'.
3440 bool parseOpenMPAppendArgs(SmallVectorImpl<OMPInteropInfo> &InteropInfos);
3441
3442 /// Parse a `match` clause for an '#pragma omp declare variant'. Return true
3443 /// if there was an error.
3444 bool parseOMPDeclareVariantMatchClause(SourceLocation Loc, OMPTraitInfo &TI,
3445 OMPTraitInfo *ParentTI);
3446
3447 /// Parse clauses for '#pragma omp declare variant'.
3448 void ParseOMPDeclareVariantClauses(DeclGroupPtrTy Ptr, CachedTokens &Toks,
3449 SourceLocation Loc);
3450
3451 /// Parse 'omp [begin] assume[s]' directive.
3452 void ParseOpenMPAssumesDirective(OpenMPDirectiveKind DKind,
3453 SourceLocation Loc);
3454
3455 /// Parse 'omp end assumes' directive.
3456 void ParseOpenMPEndAssumesDirective(SourceLocation Loc);
3457
3458 /// Parses clauses for directive.
3459 ///
3460 /// \param DKind Kind of current directive.
3461 /// \param clauses for current directive.
3462 /// \param start location for clauses of current directive
3463 void ParseOpenMPClauses(OpenMPDirectiveKind DKind,
3464 SmallVectorImpl<clang::OMPClause *> &Clauses,
3465 SourceLocation Loc);
3466
3467 /// Parse clauses for '#pragma omp [begin] declare target'.
3468 void ParseOMPDeclareTargetClauses(SemaOpenMP::DeclareTargetContextInfo &DTCI);
3469
3470 /// Parse '#pragma omp end declare target'.
3471 void ParseOMPEndDeclareTargetDirective(OpenMPDirectiveKind BeginDKind,
3472 OpenMPDirectiveKind EndDKind,
3473 SourceLocation Loc);
3474
3475 /// Skip tokens until a `annot_pragma_openmp_end` was found. Emit a warning if
3476 /// it is not the current token.
3477 void skipUntilPragmaOpenMPEnd(OpenMPDirectiveKind DKind);
3478
3479 /// Check the \p FoundKind against the \p ExpectedKind, if not issue an error
3480 /// that the "end" matching the "begin" directive of kind \p BeginKind was not
3481 /// found. Finally, if the expected kind was found or if \p SkipUntilOpenMPEnd
3482 /// is set, skip ahead using the helper `skipUntilPragmaOpenMPEnd`.
3483 void parseOMPEndDirective(OpenMPDirectiveKind BeginKind,
3484 OpenMPDirectiveKind ExpectedKind,
3485 OpenMPDirectiveKind FoundKind,
3486 SourceLocation MatchingLoc,
3487 SourceLocation FoundLoc,
3488 bool SkipUntilOpenMPEnd);
3489
3490 /// Parses declarative OpenMP directives.
3491 DeclGroupPtrTy ParseOpenMPDeclarativeDirectiveWithExtDecl(
3492 AccessSpecifier &AS, ParsedAttributes &Attrs, bool Delayed = false,
3494 Decl *TagDecl = nullptr);
3495 /// Parse 'omp declare reduction' construct.
3496 DeclGroupPtrTy ParseOpenMPDeclareReductionDirective(AccessSpecifier AS);
3497 /// Parses initializer for provided omp_priv declaration inside the reduction
3498 /// initializer.
3499 void ParseOpenMPReductionInitializerForDecl(VarDecl *OmpPrivParm);
3500
3501 /// Parses 'omp declare mapper' directive.
3502 DeclGroupPtrTy ParseOpenMPDeclareMapperDirective(AccessSpecifier AS);
3503 /// Parses variable declaration in 'omp declare mapper' directive.
3504 TypeResult parseOpenMPDeclareMapperVarDecl(SourceRange &Range,
3505 DeclarationName &Name,
3507
3508 /// Tries to parse cast part of OpenMP array shaping operation:
3509 /// '[' expression ']' { '[' expression ']' } ')'.
3510 bool tryParseOpenMPArrayShapingCastPart();
3511
3512 /// Parses simple list of variables.
3513 ///
3514 /// \param Kind Kind of the directive.
3515 /// \param Callback Callback function to be called for the list elements.
3516 /// \param AllowScopeSpecifier true, if the variables can have fully
3517 /// qualified names.
3518 ///
3519 bool ParseOpenMPSimpleVarList(
3521 const llvm::function_ref<void(CXXScopeSpec &, DeclarationNameInfo)> &
3522 Callback,
3523 bool AllowScopeSpecifier);
3524 /// Parses declarative or executable directive.
3525 ///
3526 /// \param StmtCtx The context in which we're parsing the directive.
3527 /// \param ReadDirectiveWithinMetadirective true if directive is within a
3528 /// metadirective and therefore ends on the closing paren.
3529 StmtResult ParseOpenMPDeclarativeOrExecutableDirective(
3530 ParsedStmtContext StmtCtx, bool ReadDirectiveWithinMetadirective = false);
3531
3532 /// Parses executable directive.
3533 ///
3534 /// \param StmtCtx The context in which we're parsing the directive.
3535 /// \param DKind The kind of the executable directive.
3536 /// \param Loc Source location of the beginning of the directive.
3537 /// \param ReadDirectiveWithinMetadirective true if directive is within a
3538 /// metadirective and therefore ends on the closing paren.
3540 ParseOpenMPExecutableDirective(ParsedStmtContext StmtCtx,
3541 OpenMPDirectiveKind DKind, SourceLocation Loc,
3542 bool ReadDirectiveWithinMetadirective);
3543
3544 /// Parses informational directive.
3545 ///
3546 /// \param StmtCtx The context in which we're parsing the directive.
3547 /// \param DKind The kind of the informational directive.
3548 /// \param Loc Source location of the beginning of the directive.
3549 /// \param ReadDirectiveWithinMetadirective true if directive is within a
3550 /// metadirective and therefore ends on the closing paren.
3551 StmtResult ParseOpenMPInformationalDirective(
3552 ParsedStmtContext StmtCtx, OpenMPDirectiveKind DKind, SourceLocation Loc,
3553 bool ReadDirectiveWithinMetadirective);
3554
3555 /// Parses clause of kind \a CKind for directive of a kind \a Kind.
3556 ///
3557 /// \param DKind Kind of current directive.
3558 /// \param CKind Kind of current clause.
3559 /// \param FirstClause true, if this is the first clause of a kind \a CKind
3560 /// in current directive.
3561 ///
3562 OMPClause *ParseOpenMPClause(OpenMPDirectiveKind DKind,
3563 OpenMPClauseKind CKind, bool FirstClause);
3564 /// Parses clause with a single expression of a kind \a Kind.
3565 ///
3566 /// \param Kind Kind of current clause.
3567 /// \param ParseOnly true to skip the clause's semantic actions and return
3568 /// nullptr.
3569 ///
3570 OMPClause *ParseOpenMPSingleExprClause(OpenMPClauseKind Kind,
3571 bool ParseOnly);
3572 /// Parses simple clause of a kind \a Kind.
3573 ///
3574 /// \param Kind Kind of current clause.
3575 /// \param ParseOnly true to skip the clause's semantic actions and return
3576 /// nullptr.
3577 ///
3578 OMPClause *ParseOpenMPSimpleClause(OpenMPClauseKind Kind, bool ParseOnly);
3579 /// Parses indirect clause
3580 /// \param ParseOnly true to skip the clause's semantic actions and return
3581 // false;
3582 bool ParseOpenMPIndirectClause(SemaOpenMP::DeclareTargetContextInfo &DTCI,
3583 bool ParseOnly);
3584 /// Parses clause with a single expression and an additional argument
3585 /// of a kind \a Kind.
3586 ///
3587 /// \param DKind Directive kind.
3588 /// \param Kind Kind of current clause.
3589 /// \param ParseOnly true to skip the clause's semantic actions and return
3590 /// nullptr.
3591 ///
3592 OMPClause *ParseOpenMPSingleExprWithArgClause(OpenMPDirectiveKind DKind,
3593 OpenMPClauseKind Kind,
3594 bool ParseOnly);
3595
3596 /// Parses the 'sizes' clause of a '#pragma omp tile' directive.
3597 OMPClause *ParseOpenMPSizesClause();
3598
3599 /// Parses the 'permutation' clause of a '#pragma omp interchange' directive.
3600 OMPClause *ParseOpenMPPermutationClause();
3601
3602 /// Parses clause without any additional arguments.
3603 ///
3604 /// \param Kind Kind of current clause.
3605 /// \param ParseOnly true to skip the clause's semantic actions and return
3606 /// nullptr.
3607 ///
3608 OMPClause *ParseOpenMPClause(OpenMPClauseKind Kind, bool ParseOnly = false);
3609 /// Parses clause with the list of variables of a kind \a Kind.
3610 ///
3611 /// \param Kind Kind of current clause.
3612 /// \param ParseOnly true to skip the clause's semantic actions and return
3613 /// nullptr.
3614 ///
3615 OMPClause *ParseOpenMPVarListClause(OpenMPDirectiveKind DKind,
3616 OpenMPClauseKind Kind, bool ParseOnly);
3617
3618 /// Parses a clause consisting of a list of expressions.
3619 ///
3620 /// \param Kind The clause to parse.
3621 /// \param ClauseNameLoc [out] The location of the clause name.
3622 /// \param OpenLoc [out] The location of '('.
3623 /// \param CloseLoc [out] The location of ')'.
3624 /// \param Exprs [out] The parsed expressions.
3625 /// \param ReqIntConst If true, each expression must be an integer constant.
3626 ///
3627 /// \return Whether the clause was parsed successfully.
3628 bool ParseOpenMPExprListClause(OpenMPClauseKind Kind,
3629 SourceLocation &ClauseNameLoc,
3630 SourceLocation &OpenLoc,
3631 SourceLocation &CloseLoc,
3632 SmallVectorImpl<Expr *> &Exprs,
3633 bool ReqIntConst = false);
3634
3635 /// Parses and creates OpenMP 5.0 iterators expression:
3636 /// <iterators> = 'iterator' '(' { [ <iterator-type> ] identifier =
3637 /// <range-specification> }+ ')'
3638 ExprResult ParseOpenMPIteratorsExpr();
3639
3640 /// Parses allocators and traits in the context of the uses_allocator clause.
3641 /// Expected format:
3642 /// '(' { <allocator> [ '(' <allocator_traits> ')' ] }+ ')'
3643 OMPClause *ParseOpenMPUsesAllocatorClause(OpenMPDirectiveKind DKind);
3644
3645 /// Parses the 'interop' parts of the 'append_args' and 'init' clauses.
3646 bool ParseOMPInteropInfo(OMPInteropInfo &InteropInfo, OpenMPClauseKind Kind);
3647
3648 /// Parses clause with an interop variable of kind \a Kind.
3649 ///
3650 /// \param Kind Kind of current clause.
3651 /// \param ParseOnly true to skip the clause's semantic actions and return
3652 /// nullptr.
3653 //
3654 OMPClause *ParseOpenMPInteropClause(OpenMPClauseKind Kind, bool ParseOnly);
3655
3656 /// Parses a ompx_attribute clause
3657 ///
3658 /// \param ParseOnly true to skip the clause's semantic actions and return
3659 /// nullptr.
3660 //
3661 OMPClause *ParseOpenMPOMPXAttributesClause(bool ParseOnly);
3662
3663public:
3664 /// Parses simple expression in parens for single-expression clauses of OpenMP
3665 /// constructs.
3666 /// \param RLoc Returned location of right paren.
3667 ExprResult ParseOpenMPParensExpr(StringRef ClauseName, SourceLocation &RLoc,
3668 bool IsAddressOfOperand = false);
3669
3670 /// Parses a reserved locator like 'omp_all_memory'.
3672 SemaOpenMP::OpenMPVarListDataTy &Data,
3673 const LangOptions &LangOpts);
3674 /// Parses clauses with list.
3676 SmallVectorImpl<Expr *> &Vars,
3677 SemaOpenMP::OpenMPVarListDataTy &Data);
3678 bool ParseUnqualifiedId(CXXScopeSpec &SS, ParsedType ObjectType,
3679 bool ObjectHadErrors, bool EnteringContext,
3680 bool AllowDestructorName, bool AllowConstructorName,
3681 bool AllowDeductionGuide,
3682 SourceLocation *TemplateKWLoc, UnqualifiedId &Result);
3683
3684 /// Parses the mapper modifier in map, to, and from clauses.
3685 bool parseMapperModifier(SemaOpenMP::OpenMPVarListDataTy &Data);
3686 /// Parses map-type-modifiers in map clause.
3687 /// map([ [map-type-modifier[,] [map-type-modifier[,] ...] map-type : ] list)
3688 /// where, map-type-modifier ::= always | close | mapper(mapper-identifier)
3689 bool parseMapTypeModifiers(SemaOpenMP::OpenMPVarListDataTy &Data);
3690
3691 //===--------------------------------------------------------------------===//
3692 // OpenACC Parsing.
3693
3694 /// Placeholder for now, should just ignore the directives after emitting a
3695 /// diagnostic. Eventually will be split into a few functions to parse
3696 /// different situations.
3697public:
3700
3701private:
3702 /// A struct to hold the information that got parsed by ParseOpenACCDirective,
3703 /// so that the callers of it can use that to construct the appropriate AST
3704 /// nodes.
3705 struct OpenACCDirectiveParseInfo {
3706 OpenACCDirectiveKind DirKind;
3707 SourceLocation StartLoc;
3708 SourceLocation DirLoc;
3709 SourceLocation LParenLoc;
3710 SourceLocation RParenLoc;
3711 SourceLocation EndLoc;
3712 SourceLocation MiscLoc;
3713 SmallVector<Expr *> Exprs;
3714 SmallVector<OpenACCClause *> Clauses;
3715 // TODO OpenACC: As we implement support for the Atomic, Routine, and Cache
3716 // constructs, we likely want to put that information in here as well.
3717 };
3718
3719 struct OpenACCWaitParseInfo {
3720 bool Failed = false;
3721 Expr *DevNumExpr = nullptr;
3722 SourceLocation QueuesLoc;
3723 SmallVector<Expr *> QueueIdExprs;
3724
3725 SmallVector<Expr *> getAllExprs() {
3726 SmallVector<Expr *> Out;
3727 Out.push_back(DevNumExpr);
3728 Out.insert(Out.end(), QueueIdExprs.begin(), QueueIdExprs.end());
3729 return Out;
3730 }
3731 };
3732
3733 /// Represents the 'error' state of parsing an OpenACC Clause, and stores
3734 /// whether we can continue parsing, or should give up on the directive.
3735 enum class OpenACCParseCanContinue { Cannot = 0, Can = 1 };
3736
3737 /// A type to represent the state of parsing an OpenACC Clause. Situations
3738 /// that result in an OpenACCClause pointer are a success and can continue
3739 /// parsing, however some other situations can also continue.
3740 /// FIXME: This is better represented as a std::expected when we get C++23.
3741 using OpenACCClauseParseResult =
3742 llvm::PointerIntPair<OpenACCClause *, 1, OpenACCParseCanContinue>;
3743
3744 OpenACCClauseParseResult OpenACCCanContinue();
3745 OpenACCClauseParseResult OpenACCCannotContinue();
3746 OpenACCClauseParseResult OpenACCSuccess(OpenACCClause *Clause);
3747
3748 /// Parses the OpenACC directive (the entire pragma) including the clause
3749 /// list, but does not produce the main AST node.
3750 OpenACCDirectiveParseInfo ParseOpenACCDirective();
3751 /// Helper that parses an ID Expression based on the language options.
3752 ExprResult ParseOpenACCIDExpression();
3753 /// Parses the variable list for the `cache` construct.
3754 void ParseOpenACCCacheVarList();
3755
3756 using OpenACCVarParseResult = std::pair<ExprResult, OpenACCParseCanContinue>;
3757 /// Parses a single variable in a variable list for OpenACC.
3758 OpenACCVarParseResult ParseOpenACCVar(OpenACCClauseKind CK);
3759 /// Parses the variable list for the variety of places that take a var-list.
3760 llvm::SmallVector<Expr *> ParseOpenACCVarList(OpenACCClauseKind CK);
3761 /// Parses any parameters for an OpenACC Clause, including required/optional
3762 /// parens.
3763 OpenACCClauseParseResult
3764 ParseOpenACCClauseParams(ArrayRef<const OpenACCClause *> ExistingClauses,
3766 SourceLocation ClauseLoc);
3767 /// Parses a single clause in a clause-list for OpenACC. Returns nullptr on
3768 /// error.
3769 OpenACCClauseParseResult
3770 ParseOpenACCClause(ArrayRef<const OpenACCClause *> ExistingClauses,
3771 OpenACCDirectiveKind DirKind);
3772 /// Parses the clause-list for an OpenACC directive.
3773 SmallVector<OpenACCClause *>
3774 ParseOpenACCClauseList(OpenACCDirectiveKind DirKind);
3775 OpenACCWaitParseInfo ParseOpenACCWaitArgument(SourceLocation Loc,
3776 bool IsDirective);
3777 /// Parses the clause of the 'bind' argument, which can be a string literal or
3778 /// an ID expression.
3779 ExprResult ParseOpenACCBindClauseArgument();
3780
3781 /// A type to represent the state of parsing after an attempt to parse an
3782 /// OpenACC int-expr. This is useful to determine whether an int-expr list can
3783 /// continue parsing after a failed int-expr.
3784 using OpenACCIntExprParseResult =
3785 std::pair<ExprResult, OpenACCParseCanContinue>;
3786 /// Parses the clause kind of 'int-expr', which can be any integral
3787 /// expression.
3788 OpenACCIntExprParseResult ParseOpenACCIntExpr(OpenACCDirectiveKind DK,
3790 SourceLocation Loc);
3791 /// Parses the argument list for 'num_gangs', which allows up to 3
3792 /// 'int-expr's.
3793 bool ParseOpenACCIntExprList(OpenACCDirectiveKind DK, OpenACCClauseKind CK,
3794 SourceLocation Loc,
3796 /// Parses the 'device-type-list', which is a list of identifiers.
3797 bool ParseOpenACCDeviceTypeList(
3798 llvm::SmallVector<std::pair<IdentifierInfo *, SourceLocation>> &Archs);
3799 /// Parses the 'async-argument', which is an integral value with two
3800 /// 'special' values that are likely negative (but come from Macros).
3801 OpenACCIntExprParseResult ParseOpenACCAsyncArgument(OpenACCDirectiveKind DK,
3803 SourceLocation Loc);
3804
3805 /// Parses the 'size-expr', which is an integral value, or an asterisk.
3806 /// Asterisk is represented by a OpenACCAsteriskSizeExpr
3807 ExprResult ParseOpenACCSizeExpr(OpenACCClauseKind CK);
3808 /// Parses a comma delimited list of 'size-expr's.
3809 bool ParseOpenACCSizeExprList(OpenACCClauseKind CK,
3811 /// Parses a 'gang-arg-list', used for the 'gang' clause.
3812 bool ParseOpenACCGangArgList(SourceLocation GangLoc,
3815
3816 using OpenACCGangArgRes = std::pair<OpenACCGangKind, ExprResult>;
3817 /// Parses a 'gang-arg', used for the 'gang' clause. Returns a pair of the
3818 /// ExprResult (which contains the validity of the expression), plus the gang
3819 /// kind for the current argument.
3820 OpenACCGangArgRes ParseOpenACCGangArg(SourceLocation GangLoc);
3821 /// Parses a 'condition' expr, ensuring it results in a
3822 ExprResult ParseOpenACCConditionExpr();
3823
3824private:
3825 //===--------------------------------------------------------------------===//
3826 // C++ 14: Templates [temp]
3827
3828 // C++ 14.1: Template Parameters [temp.param]
3830 ParseDeclarationStartingWithTemplate(DeclaratorContext Context,
3831 SourceLocation &DeclEnd,
3832 ParsedAttributes &AccessAttrs);
3833 DeclGroupPtrTy ParseTemplateDeclarationOrSpecialization(
3834 DeclaratorContext Context, SourceLocation &DeclEnd,
3835 ParsedAttributes &AccessAttrs, AccessSpecifier AS);
3836 DeclGroupPtrTy ParseDeclarationAfterTemplate(
3837 DeclaratorContext Context, ParsedTemplateInfo &TemplateInfo,
3838 ParsingDeclRAIIObject &DiagsFromParams, SourceLocation &DeclEnd,
3839 ParsedAttributes &AccessAttrs, AccessSpecifier AS = AS_none);
3840 bool ParseTemplateParameters(MultiParseScope &TemplateScopes, unsigned Depth,
3841 SmallVectorImpl<NamedDecl *> &TemplateParams,
3842 SourceLocation &LAngleLoc,
3843 SourceLocation &RAngleLoc);
3844 bool ParseTemplateParameterList(unsigned Depth,
3845 SmallVectorImpl<NamedDecl*> &TemplateParams);
3846 TPResult isStartOfTemplateTypeParameter();
3847 NamedDecl *ParseTemplateParameter(unsigned Depth, unsigned Position);
3848 NamedDecl *ParseTypeParameter(unsigned Depth, unsigned Position);
3849 NamedDecl *ParseTemplateTemplateParameter(unsigned Depth, unsigned Position);
3850 NamedDecl *ParseNonTypeTemplateParameter(unsigned Depth, unsigned Position);
3851 bool isTypeConstraintAnnotation();
3852 bool TryAnnotateTypeConstraint();
3853 void DiagnoseMisplacedEllipsis(SourceLocation EllipsisLoc,
3854 SourceLocation CorrectLoc,
3855 bool AlreadyHasEllipsis,
3856 bool IdentifierHasName);
3857 void DiagnoseMisplacedEllipsisInDeclarator(SourceLocation EllipsisLoc,
3858 Declarator &D);
3859 // C++ 14.3: Template arguments [temp.arg]
3860 typedef SmallVector<ParsedTemplateArgument, 16> TemplateArgList;
3861
3862 bool ParseGreaterThanInTemplateList(SourceLocation LAngleLoc,
3863 SourceLocation &RAngleLoc,
3864 bool ConsumeLastToken,
3865 bool ObjCGenericList);
3866 bool ParseTemplateIdAfterTemplateName(bool ConsumeLastToken,
3867 SourceLocation &LAngleLoc,
3868 TemplateArgList &TemplateArgs,
3869 SourceLocation &RAngleLoc,
3870 TemplateTy NameHint = nullptr);
3871
3872 bool AnnotateTemplateIdToken(TemplateTy Template, TemplateNameKind TNK,
3873 CXXScopeSpec &SS,
3874 SourceLocation TemplateKWLoc,
3875 UnqualifiedId &TemplateName,
3876 bool AllowTypeAnnotation = true,
3877 bool TypeConstraint = false);
3878 void
3879 AnnotateTemplateIdTokenAsType(CXXScopeSpec &SS,
3880 ImplicitTypenameContext AllowImplicitTypename,
3881 bool IsClassName = false);
3882 bool ParseTemplateArgumentList(TemplateArgList &TemplateArgs,
3883 TemplateTy Template, SourceLocation OpenLoc);
3884 ParsedTemplateArgument ParseTemplateTemplateArgument();
3885 ParsedTemplateArgument ParseTemplateArgument();
3886 DeclGroupPtrTy ParseExplicitInstantiation(DeclaratorContext Context,
3887 SourceLocation ExternLoc,
3888 SourceLocation TemplateLoc,
3889 SourceLocation &DeclEnd,
3890 ParsedAttributes &AccessAttrs,
3892 // C++2a: Template, concept definition [temp]
3893 Decl *
3894 ParseConceptDefinition(const ParsedTemplateInfo &TemplateInfo,
3895 SourceLocation &DeclEnd);
3896
3897 /// Parse the given string as a type.
3898 ///
3899 /// This is a dangerous utility function currently employed only by API notes.
3900 /// It is not a general entry-point for safely parsing types from strings.
3901 ///
3902 /// \param TypeStr The string to be parsed as a type.
3903 /// \param Context The name of the context in which this string is being
3904 /// parsed, which will be used in diagnostics.
3905 /// \param IncludeLoc The location at which this parse was triggered.
3906 TypeResult ParseTypeFromString(StringRef TypeStr, StringRef Context,
3907 SourceLocation IncludeLoc);
3908
3909 //===--------------------------------------------------------------------===//
3910 // Modules
3911 DeclGroupPtrTy ParseModuleDecl(Sema::ModuleImportState &ImportState);
3912 Decl *ParseModuleImport(SourceLocation AtLoc,
3913 Sema::ModuleImportState &ImportState);
3914 bool parseMisplacedModuleImport();
3915 bool tryParseMisplacedModuleImport() {
3916 tok::TokenKind Kind = Tok.getKind();
3917 if (Kind == tok::annot_module_begin || Kind == tok::annot_module_end ||
3918 Kind == tok::annot_module_include)
3919 return parseMisplacedModuleImport();
3920 return false;
3921 }
3922
3923 bool ParseModuleName(
3924 SourceLocation UseLoc,
3925 SmallVectorImpl<std::pair<IdentifierInfo *, SourceLocation>> &Path,
3926 bool IsImport);
3927
3928 //===--------------------------------------------------------------------===//
3929 // C++11/G++: Type Traits [Type-Traits.html in the GCC manual]
3930 ExprResult ParseTypeTrait();
3931
3932 //===--------------------------------------------------------------------===//
3933 // Embarcadero: Arary and Expression Traits
3934 ExprResult ParseArrayTypeTrait();
3935 ExprResult ParseExpressionTrait();
3936
3937 ExprResult ParseBuiltinPtrauthTypeDiscriminator();
3938
3939 //===--------------------------------------------------------------------===//
3940 // Preprocessor code-completion pass-through
3941 void CodeCompleteDirective(bool InConditional) override;
3942 void CodeCompleteInConditionalExclusion() override;
3943 void CodeCompleteMacroName(bool IsDefinition) override;
3944 void CodeCompletePreprocessorExpression() override;
3945 void CodeCompleteMacroArgument(IdentifierInfo *Macro, MacroInfo *MacroInfo,
3946 unsigned ArgumentIndex) override;
3947 void CodeCompleteIncludedFile(llvm::StringRef Dir, bool IsAngled) override;
3948 void CodeCompleteNaturalLanguage() override;
3949
3950 class GNUAsmQualifiers {
3951 unsigned Qualifiers = AQ_unspecified;
3952
3953 public:
3954 enum AQ {
3955 AQ_unspecified = 0,
3956 AQ_volatile = 1,
3957 AQ_inline = 2,
3958 AQ_goto = 4,
3959 };
3960 static const char *getQualifierName(AQ Qualifier);
3961 bool setAsmQualifier(AQ Qualifier);
3962 inline bool isVolatile() const { return Qualifiers & AQ_volatile; };
3963 inline bool isInline() const { return Qualifiers & AQ_inline; };
3964 inline bool isGoto() const { return Qualifiers & AQ_goto; }
3965 };
3966 bool isGCCAsmStatement(const Token &TokAfterAsm) const;
3967 bool isGNUAsmQualifier(const Token &TokAfterAsm) const;
3968 GNUAsmQualifiers::AQ getGNUAsmQualifier(const Token &Tok) const;
3969 bool parseGNUAsmQualifierListOpt(GNUAsmQualifiers &AQ);
3970};
3971
3972} // end namespace clang
3973
3974#endif
StringRef P
const Decl * D
IndirectLocalPath & Path
Expr * E
enum clang::sema::@1712::IndirectLocalPathEntry::EntryKind Kind
int Priority
Definition: Format.cpp:3036
Defines some OpenACC-specific enums and functions.
Defines and computes precedence levels for binary/ternary operators.
Defines the clang::Preprocessor interface.
uint32_t Id
Definition: SemaARM.cpp:1134
This file declares facilities that support code completion.
SourceRange Range
Definition: SemaObjC.cpp:758
SourceLocation Loc
Definition: SemaObjC.cpp:759
This file declares semantic analysis for Objective-C.
This file declares semantic analysis for OpenMP constructs and clauses.
static bool isInvalid(LocType Loc, bool *Invalid)
The result of parsing/analyzing an expression, statement etc.
Definition: Ownership.h:153
bool isInvalid() const
Definition: Ownership.h:166
A factory, from which one makes pools, from which one creates individual attributes which are dealloc...
Definition: ParsedAttr.h:637
RAII class that helps handle the parsing of an open/close delimiter pair, such as braces { ....
Callback handler that receives notifications when performing code completion within the preprocessor.
ColonProtectionRAIIObject - This sets the Parser::ColonIsSacred bool and restores it when destroyed.
TypeSpecifierType TST
Definition: DeclSpec.h:277
static const TST TST_unspecified
Definition: DeclSpec.h:278
Decl - This represents one declaration (or definition), e.g.
Definition: DeclBase.h:86
A little helper class used to produce diagnostics.
Definition: Diagnostic.h:1220
Concrete class used by the front-end to report problems and issues.
Definition: Diagnostic.h:231
This represents one expression.
Definition: Expr.h:110
One of these records is kept for each identifier that is lexed.
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
Definition: LangOptions.h:499
ObjCContainerDecl - Represents a container for method declarations.
Definition: DeclObjC.h:947
Wrapper for void* pointer.
Definition: Ownership.h:50
static OpaquePtr getFromOpaquePtr(void *P)
Definition: Ownership.h:91
RAII object that makes sure paren/bracket/brace count is correct after declaration/statement parsing,...
Introduces zero or more scopes for parsing.
Definition: Parser.h:1209
MultiParseScope(Parser &Self)
Definition: Parser.h:1216
void Enter(unsigned ScopeFlags)
Definition: Parser.h:1217
ParseScope - Introduces a new scope for parsing.
Definition: Parser.h:1171
ParseScope(Parser *Self, unsigned ScopeFlags, bool EnteredScope=true, bool BeforeCompoundStmt=false)
Definition: Parser.h:1180
Parser - This implements a parser for the C family of languages.
Definition: Parser.h:58
bool ParseOpenMPVarList(OpenMPDirectiveKind DKind, OpenMPClauseKind Kind, SmallVectorImpl< Expr * > &Vars, SemaOpenMP::OpenMPVarListDataTy &Data)
Parses clauses with list.
TypeResult ParseTypeName(SourceRange *Range=nullptr, DeclaratorContext Context=DeclaratorContext::TypeName, AccessSpecifier AS=AS_none, Decl **OwnedType=nullptr, ParsedAttributes *Attrs=nullptr)
ParseTypeName type-name: [C99 6.7.6] specifier-qualifier-list abstract-declarator[opt].
Definition: ParseDecl.cpp:50
DiagnosticBuilder Diag(SourceLocation Loc, unsigned DiagID)
Definition: Parser.cpp:81
bool TryAnnotateTypeOrScopeTokenAfterScopeSpec(CXXScopeSpec &SS, bool IsNewScope, ImplicitTypenameContext AllowImplicitTypename)
Try to annotate a type or scope token, having already parsed an optional scope specifier.
Definition: Parser.cpp:2124
Preprocessor & getPreprocessor() const
Definition: Parser.h:497
bool parseMapTypeModifiers(SemaOpenMP::OpenMPVarListDataTy &Data)
Parses map-type-modifiers in map clause.
Sema::FullExprArg FullExprArg
Definition: Parser.h:518
SourceLocation ConsumeToken()
ConsumeToken - Consume the current 'peek token' and lex the next one.
Definition: Parser.h:548
DeclGroupPtrTy ParseOpenACCDirectiveDecl()
Placeholder for now, should just ignore the directives after emitting a diagnostic.
Parser(Preprocessor &PP, Sema &Actions, bool SkipFunctionBodies)
Definition: Parser.cpp:54
AttributeFactory & getAttrFactory()
Definition: Parser.h:499
void incrementMSManglingNumber() const
Definition: Parser.h:503
Sema & getActions() const
Definition: Parser.h:498
bool ParseTopLevelDecl()
Definition: Parser.h:537
static TypeResult getTypeAnnotation(const Token &Tok)
getTypeAnnotation - Read a parsed type out of an annotation token.
Definition: Parser.h:877
ExprResult ParseCaseExpression(SourceLocation CaseLoc)
Definition: ParseExpr.cpp:254
void EnterScope(unsigned ScopeFlags)
EnterScope - Start a new scope.
Definition: Parser.cpp:420
bool parseMapperModifier(SemaOpenMP::OpenMPVarListDataTy &Data)
Parses the mapper modifier in map, to, and from clauses.
ExprResult ParseConstraintLogicalOrExpression(bool IsTrailingRequiresClause)
Parse a constraint-logical-or-expression.
Definition: ParseExpr.cpp:382
ExprResult ParseMSAsmIdentifier(llvm::SmallVectorImpl< Token > &LineToks, unsigned &NumLineToksConsumed, bool IsUnevaluated)
Parse an identifier in an MS-style inline assembly block.
bool ParseUnqualifiedId(CXXScopeSpec &SS, ParsedType ObjectType, bool ObjectHadErrors, bool EnteringContext, bool AllowDestructorName, bool AllowConstructorName, bool AllowDeductionGuide, SourceLocation *TemplateKWLoc, UnqualifiedId &Result)
Parse a C++ unqualified-id (or a C identifier), which describes the name of an entity.
bool TryAnnotateOptionalCXXScopeToken(bool EnteringContext=false)
Definition: Parser.h:936
friend class ColonProtectionRAIIObject
Definition: Parser.h:59
bool SkipUntil(tok::TokenKind T1, tok::TokenKind T2, SkipUntilFlags Flags=static_cast< SkipUntilFlags >(0))
Definition: Parser.h:1298
~Parser() override
Definition: Parser.cpp:470
SourceLocation ConsumeAnyToken(bool ConsumeCodeCompletionTok=false)
ConsumeAnyToken - Dispatch to the right Consume* method based on the current token type.
Definition: Parser.h:576
ExprResult ParseConstantExpression()
Definition: ParseExpr.cpp:235
StmtResult ParseOpenACCDirectiveStmt()
ExprResult ParseConditionalExpression()
Definition: ParseExpr.cpp:190
bool TryConsumeToken(tok::TokenKind Expected)
Definition: Parser.h:556
friend constexpr SkipUntilFlags operator|(SkipUntilFlags L, SkipUntilFlags R)
Definition: Parser.h:1279
OpaquePtr< DeclGroupRef > DeclGroupPtrTy
Definition: Parser.h:513
Scope * getCurScope() const
Definition: Parser.h:502
SourceLocation getEndOfPreviousToken()
Definition: Parser.h:594
ExprResult ParseArrayBoundExpression()
Definition: ParseExpr.cpp:245
ExprResult ParseConstraintLogicalAndExpression(bool IsTrailingRequiresClause)
Parse a constraint-logical-and-expression.
Definition: ParseExpr.cpp:290
const TargetInfo & getTargetInfo() const
Definition: Parser.h:496
OpaquePtr< TemplateName > TemplateTy
Definition: Parser.h:514
bool SkipUntil(tok::TokenKind T, SkipUntilFlags Flags=static_cast< SkipUntilFlags >(0))
SkipUntil - Read tokens until we get to the specified token, then consume it (unless StopBeforeMatch ...
Definition: Parser.h:1294
void SkipMalformedDecl()
SkipMalformedDecl - Read tokens until we get to some likely good stopping point for skipping past a s...
Definition: ParseDecl.cpp:2239
const Token & getCurToken() const
Definition: Parser.h:501
IdentifierInfo * getNullabilityKeyword(NullabilityKind nullability)
Retrieve the underscored keyword (_Nonnull, _Nullable) that corresponds to the given nullability kind...
Definition: Parser.h:600
friend class ObjCDeclContextSwitch
Definition: Parser.h:65
bool SkipUntil(tok::TokenKind T1, tok::TokenKind T2, tok::TokenKind T3, SkipUntilFlags Flags=static_cast< SkipUntilFlags >(0))
Definition: Parser.h:1303
void ExitScope()
ExitScope - Pop a scope off the scope stack.
Definition: Parser.cpp:431
ExprResult ParseAssignmentExpression(TypeCastState isTypeCast=NotTypeCast)
Parse an expr that doesn't include (top-level) commas.
Definition: ParseExpr.cpp:171
ExprResult ParseOpenMPParensExpr(StringRef ClauseName, SourceLocation &RLoc, bool IsAddressOfOperand=false)
Parses simple expression in parens for single-expression clauses of OpenMP constructs.
ExprResult ParseConstantExpressionInExprEvalContext(TypeCastState isTypeCast=NotTypeCast)
Definition: ParseExpr.cpp:225
SourceLocation MisleadingIndentationElseLoc
The location of the first statement inside an else that might have a missleading indentation.
Definition: Parser.h:1318
const LangOptions & getLangOpts() const
Definition: Parser.h:495
ExprResult ParseExpression(TypeCastState isTypeCast=NotTypeCast)
Simple precedence-based parser for binary/ternary operators.
Definition: ParseExpr.cpp:134
bool ParseFirstTopLevelDecl(DeclGroupPtrTy &Result, Sema::ModuleImportState &ImportState)
Parse the first top-level declaration in a translation unit.
Definition: Parser.cpp:601
DiagnosticBuilder Diag(unsigned DiagID)
Definition: Parser.h:1260
SmallVector< Stmt *, 32 > StmtVector
A SmallVector of statements.
Definition: Parser.h:521
SkipUntilFlags
Control flags for SkipUntil functions.
Definition: Parser.h:1272
@ StopBeforeMatch
Stop skipping at specified token, but don't skip the token itself.
Definition: Parser.h:1275
@ StopAtCodeCompletion
Stop at code completion.
Definition: Parser.h:1276
@ StopAtSemi
Stop skipping at semicolon.
Definition: Parser.h:1273
bool TryAnnotateTypeOrScopeToken(ImplicitTypenameContext AllowImplicitTypename=ImplicitTypenameContext::No)
TryAnnotateTypeOrScopeToken - If the current token position is on a typename (possibly qualified in C...
Definition: Parser.cpp:1995
bool MightBeCXXScopeToken()
Definition: Parser.h:929
TypeCastState
TypeCastState - State whether an expression is or may be a type cast.
Definition: Parser.h:1841
ExprResult ParseUnevaluatedStringLiteralExpression()
ExprResult ParseStringLiteralExpression(bool AllowUserDefinedLiteral=false)
bool ParseOpenMPReservedLocator(OpenMPClauseKind Kind, SemaOpenMP::OpenMPVarListDataTy &Data, const LangOptions &LangOpts)
Parses a reserved locator like 'omp_all_memory'.
ObjCContainerDecl * getObjCDeclContext() const
Definition: Parser.h:507
const Token & NextToken()
NextToken - This peeks ahead one token and returns it without consuming it.
Definition: Parser.h:872
friend class BalancedDelimiterTracker
Definition: Parser.h:67
bool TryConsumeToken(tok::TokenKind Expected, SourceLocation &Loc)
Definition: Parser.h:566
ExprResult ParseConstraintExpression()
Parse a constraint-expression.
Definition: ParseExpr.cpp:268
SmallVector< TemplateParameterList *, 4 > TemplateParameterLists
Definition: Parser.h:516
void Initialize()
Initialize - Warm up the parser.
Definition: Parser.cpp:490
unsigned ReenterTemplateScopes(MultiParseScope &S, Decl *D)
Re-enter the template scopes for a declaration that might be a template.
bool TryAnnotateCXXScopeToken(bool EnteringContext=false)
TryAnnotateScopeToken - Like TryAnnotateTypeOrScopeToken but only annotates C++ scope specifiers and ...
Definition: Parser.cpp:2239
Activates OpenACC parsing mode to preseve OpenACC specific annotation tokens.
Activates OpenMP parsing mode to preseve OpenMP specific annotation tokens.
Tracks expected type during expression parsing, for use in code completion.
Definition: Sema.h:289
Engages in a tight little dance with the lexer to efficiently preprocess tokens.
Definition: Preprocessor.h:138
void EnterToken(const Token &Tok, bool IsReinject)
Enters a token in the token stream to be lexed next.
void setCodeCompletionReached()
Note that we hit the code-completion point.
bool mightHavePendingAnnotationTokens()
Determine whether it's possible for a future call to Lex to produce an annotation token created by a ...
void Lex(Token &Result)
Lex the next token for this preprocessor.
const Token & LookAhead(unsigned N)
Peeks ahead N tokens and returns that token without consuming any tokens.
IdentifierInfo * getIdentifierInfo(StringRef Name) const
Return information about the specified preprocessor identifier token.
const TargetInfo & getTargetInfo() const
bool isCodeCompletionEnabled() const
Determine if we are performing code completion.
const LangOptions & getLangOpts() const
SourceLocation getLocForEndOfToken(SourceLocation Loc, unsigned Offset=0)
Computes the source location just past the end of the token at this source location.
Scope - A scope is a transient data structure that is used while parsing the program.
Definition: Scope.h:41
ObjCContainerDecl * getObjCDeclContext() const
void startOpenMPLoop()
If the current region is a loop-based region, mark the start of the loop construct.
Sema - This implements semantic analysis and AST building for C.
Definition: Sema.h:463
Scope * getCurScope() const
Retrieve the parser's current scope.
Definition: Sema.h:731
SemaOpenMP & OpenMP()
Definition: Sema.h:1125
ConditionKind
Definition: Sema.h:7344
SemaObjC & ObjC()
Definition: Sema.h:1110
ProcessingContextState ParsingClassState
Definition: Sema.h:6073
IdentifierInfo * getNullabilityKeyword(NullabilityKind nullability)
Retrieve the keyword associated.
Definition: SemaType.cpp:3773
ModuleImportState
An enumeration to represent the transition of states in parsing module fragments and imports.
Definition: Sema.h:9608
@ NotACXX20Module
Not a C++20 TU, or an invalid state was found.
void incrementMSManglingNumber() const
Definition: Sema.h:873
OffsetOfKind
Definition: Sema.h:3859
@ OOK_Outside
Definition: Sema.h:3861
Encodes a location in the source.
A trivial tuple used to represent a source range.
Exposes information about the current target.
Definition: TargetInfo.h:220
Represents a C++ template name within the type system.
Definition: TemplateName.h:220
Token - This structure provides full information about a lexed token.
Definition: Token.h:36
SourceLocation getLocation() const
Return a source location identifier for the specified offset in the current file.
Definition: Token.h:132
void setKind(tok::TokenKind K)
Definition: Token.h:95
SourceLocation getAnnotationEndLoc() const
Definition: Token.h:146
bool is(tok::TokenKind K) const
is/isNot - Predicates to check if this token is a specific kind, as in "if (Tok.is(tok::l_brace)) {....
Definition: Token.h:99
void * getAnnotationValue() const
Definition: Token.h:234
tok::TokenKind getKind() const
Definition: Token.h:94
bool isOneOf(tok::TokenKind K1, tok::TokenKind K2) const
Definition: Token.h:101
bool isNot(tok::TokenKind K) const
Definition: Token.h:100
bool isAnnotation() const
Return true if this is any of tok::annot_* kind tokens.
Definition: Token.h:121
void setAnnotationValue(void *val)
Definition: Token.h:238
@ Decl
The l-value was an access to a declared entity or something equivalently strong, like the address of ...
const internal::VariadicAllOfMatcher< Type > type
Matches Types in the clang AST.
llvm::DenseMap< int, SourceRange > ParsedSubjectMatchRuleSet
bool Pop(InterpState &S, CodePtr OpPC)
Definition: Interp.h:1218
bool isStringLiteral(TokenKind K)
Return true if this is a C or C++ string-literal (or C++11 user-defined-string-literal) token.
Definition: TokenKinds.h:89
ObjCKeywordKind
Provides a namespace for Objective-C keywords which start with an '@'.
Definition: TokenKinds.h:41
TokenKind
Provides a simple uniform namespace for tokens from all C languages.
Definition: TokenKinds.h:25
CharSourceRange getSourceRange(const SourceRange &Range)
Returns the token CharSourceRange corresponding to Range.
Definition: FixIt.h:32
The JSON file list parser is used to communicate input to InstallAPI.
@ TST_unspecified
Definition: Specifiers.h:56
ImplicitTypenameContext
Definition: DeclSpec.h:1886
OpenACCDirectiveKind
Definition: OpenACCKinds.h:25
@ CPlusPlus
Definition: LangStandard.h:55
llvm::omp::Directive OpenMPDirectiveKind
OpenMP directives.
Definition: OpenMPKinds.h:25
NullabilityKind
Describes the nullability of a particular type.
Definition: Specifiers.h:336
OpenACCClauseKind
Represents the kind of an OpenACC clause.
Definition: OpenACCKinds.h:178
@ Self
'self' clause, allowed on Compute and Combined Constructs, plus 'update'.
llvm::omp::Clause OpenMPClauseKind
OpenMP clauses.
Definition: OpenMPKinds.h:28
TypeResult TypeError()
Definition: Ownership.h:266
ActionResult< CXXCtorInitializer * > MemInitResult
Definition: Ownership.h:252
DeclaratorContext
Definition: DeclSpec.h:1853
@ Result
The result type of a method or function.
TagUseKind
Definition: Sema.h:446
ActionResult< Expr * > ExprResult
Definition: Ownership.h:248
ActionResult< Stmt * > StmtResult
Definition: Ownership.h:249
TemplateNameKind
Specifies the kind of template name that an identifier refers to.
Definition: TemplateKinds.h:20
ActionResult< ParsedType > TypeResult
Definition: Ownership.h:250
OpaquePtr< QualType > ParsedType
An opaque type for threading parsed type information through the parser.
Definition: Ownership.h:229
const FunctionProtoType * T
@ Incomplete
Template argument deduction did not deduce a value for every template parameter.
SmallVector< Token, 4 > CachedTokens
A set of tokens that has been cached for later parsing.
Definition: DeclSpec.h:1245
@ Class
The "class" keyword introduces the elaborated-type-specifier.
ExceptionSpecificationType
The various types of exception specifications that exist in C++11.
ActionResult< CXXBaseSpecifier * > BaseResult
Definition: Ownership.h:251
AccessSpecifier
A C++ access specifier (public, private, protected), plus the special value "none" which means differ...
Definition: Specifiers.h:123
@ AS_none
Definition: Specifiers.h:127
#define false
Definition: stdbool.h:26
AngleBracketTracker::Priority Priority
Definition: Parser.h:394
bool isActive(Parser &P) const
Definition: Parser.h:397
bool isActiveOrNested(Parser &P) const
Definition: Parser.h:402