1 //===--- Parser.h - C Language Parser ---------------------------*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 // This file defines the Parser interface. 11 // 12 //===----------------------------------------------------------------------===// 13 14 #ifndef LLVM_CLANG_PARSE_PARSER_H 15 #define LLVM_CLANG_PARSE_PARSER_H 16 17 #include "clang/Basic/Specifiers.h" 18 #include "clang/Basic/DelayedCleanupPool.h" 19 #include "clang/Lex/Preprocessor.h" 20 #include "clang/Lex/CodeCompletionHandler.h" 21 #include "clang/Sema/Sema.h" 22 #include "clang/Sema/DeclSpec.h" 23 #include "llvm/Support/PrettyStackTrace.h" 24 #include "llvm/ADT/OwningPtr.h" 25 #include "llvm/ADT/SmallVector.h" 26 #include <stack> 27 28 namespace clang { 29 class PragmaHandler; 30 class Scope; 31 class DeclGroupRef; 32 class DiagnosticBuilder; 33 class Parser; 34 class PragmaUnusedHandler; 35 class ColonProtectionRAIIObject; 36 class InMessageExpressionRAIIObject; 37 class PoisonSEHIdentifiersRAIIObject; 38 class VersionTuple; 39 40 /// PrettyStackTraceParserEntry - If a crash happens while the parser is active, 41 /// an entry is printed for it. 42 class PrettyStackTraceParserEntry : public llvm::PrettyStackTraceEntry { 43 const Parser &P; 44 public: 45 PrettyStackTraceParserEntry(const Parser &p) : P(p) {} 46 virtual void print(raw_ostream &OS) const; 47 }; 48 49 /// PrecedenceLevels - These are precedences for the binary/ternary 50 /// operators in the C99 grammar. These have been named to relate 51 /// with the C99 grammar productions. Low precedences numbers bind 52 /// more weakly than high numbers. 53 namespace prec { 54 enum Level { 55 Unknown = 0, // Not binary operator. 56 Comma = 1, // , 57 Assignment = 2, // =, *=, /=, %=, +=, -=, <<=, >>=, &=, ^=, |= 58 Conditional = 3, // ? 59 LogicalOr = 4, // || 60 LogicalAnd = 5, // && 61 InclusiveOr = 6, // | 62 ExclusiveOr = 7, // ^ 63 And = 8, // & 64 Equality = 9, // ==, != 65 Relational = 10, // >=, <=, >, < 66 Shift = 11, // <<, >> 67 Additive = 12, // -, + 68 Multiplicative = 13, // *, /, % 69 PointerToMember = 14 // .*, ->* 70 }; 71 } 72 73 /// Parser - This implements a parser for the C family of languages. After 74 /// parsing units of the grammar, productions are invoked to handle whatever has 75 /// been read. 76 /// 77 class Parser : public CodeCompletionHandler { 78 friend class PragmaUnusedHandler; 79 friend class ColonProtectionRAIIObject; 80 friend class InMessageExpressionRAIIObject; 81 friend class PoisonSEHIdentifiersRAIIObject; 82 friend class ParenBraceBracketBalancer; 83 84 Preprocessor &PP; 85 86 /// Tok - The current token we are peeking ahead. All parsing methods assume 87 /// that this is valid. 88 Token Tok; 89 90 // PrevTokLocation - The location of the token we previously 91 // consumed. This token is used for diagnostics where we expected to 92 // see a token following another token (e.g., the ';' at the end of 93 // a statement). 94 SourceLocation PrevTokLocation; 95 96 unsigned short ParenCount, BracketCount, BraceCount; 97 98 /// Actions - These are the callbacks we invoke as we parse various constructs 99 /// in the file. 100 Sema &Actions; 101 102 DiagnosticsEngine &Diags; 103 104 /// ScopeCache - Cache scopes to reduce malloc traffic. 105 enum { ScopeCacheSize = 16 }; 106 unsigned NumCachedScopes; 107 Scope *ScopeCache[ScopeCacheSize]; 108 109 /// Identifiers used for SEH handling in Borland. These are only 110 /// allowed in particular circumstances 111 IdentifierInfo *Ident__exception_code, *Ident___exception_code, *Ident_GetExceptionCode; // __except block 112 IdentifierInfo *Ident__exception_info, *Ident___exception_info, *Ident_GetExceptionInfo; // __except filter expression 113 IdentifierInfo *Ident__abnormal_termination, *Ident___abnormal_termination, *Ident_AbnormalTermination; // __finally 114 115 /// Ident_super - IdentifierInfo for "super", to support fast 116 /// comparison. 117 IdentifierInfo *Ident_super; 118 /// Ident_vector and Ident_pixel - cached IdentifierInfo's for 119 /// "vector" and "pixel" fast comparison. Only present if 120 /// AltiVec enabled. 121 IdentifierInfo *Ident_vector; 122 IdentifierInfo *Ident_pixel; 123 124 /// Objective-C contextual keywords. 125 mutable IdentifierInfo *Ident_instancetype; 126 127 /// \brief Identifier for "introduced". 128 IdentifierInfo *Ident_introduced; 129 130 /// \brief Identifier for "deprecated". 131 IdentifierInfo *Ident_deprecated; 132 133 /// \brief Identifier for "obsoleted". 134 IdentifierInfo *Ident_obsoleted; 135 136 /// \brief Identifier for "unavailable". 137 IdentifierInfo *Ident_unavailable; 138 139 /// C++0x contextual keywords. 140 mutable IdentifierInfo *Ident_final; 141 mutable IdentifierInfo *Ident_override; 142 143 llvm::OwningPtr<PragmaHandler> AlignHandler; 144 llvm::OwningPtr<PragmaHandler> GCCVisibilityHandler; 145 llvm::OwningPtr<PragmaHandler> OptionsHandler; 146 llvm::OwningPtr<PragmaHandler> PackHandler; 147 llvm::OwningPtr<PragmaHandler> MSStructHandler; 148 llvm::OwningPtr<PragmaHandler> UnusedHandler; 149 llvm::OwningPtr<PragmaHandler> WeakHandler; 150 llvm::OwningPtr<PragmaHandler> FPContractHandler; 151 llvm::OwningPtr<PragmaHandler> OpenCLExtensionHandler; 152 153 /// Whether the '>' token acts as an operator or not. This will be 154 /// true except when we are parsing an expression within a C++ 155 /// template argument list, where the '>' closes the template 156 /// argument list. 157 bool GreaterThanIsOperator; 158 159 /// ColonIsSacred - When this is false, we aggressively try to recover from 160 /// code like "foo : bar" as if it were a typo for "foo :: bar". This is not 161 /// safe in case statements and a few other things. This is managed by the 162 /// ColonProtectionRAIIObject RAII object. 163 bool ColonIsSacred; 164 165 /// \brief When true, we are directly inside an Objective-C messsage 166 /// send expression. 167 /// 168 /// This is managed by the \c InMessageExpressionRAIIObject class, and 169 /// should not be set directly. 170 bool InMessageExpression; 171 172 /// The "depth" of the template parameters currently being parsed. 173 unsigned TemplateParameterDepth; 174 175 /// Factory object for creating AttributeList objects. 176 AttributeFactory AttrFactory; 177 178 /// \brief Gathers and cleans up objects when parsing of a top-level 179 /// declaration is finished. 180 DelayedCleanupPool TopLevelDeclCleanupPool; 181 182 public: 183 Parser(Preprocessor &PP, Sema &Actions); 184 ~Parser(); 185 186 const LangOptions &getLang() const { return PP.getLangOptions(); } 187 const TargetInfo &getTargetInfo() const { return PP.getTargetInfo(); } 188 Preprocessor &getPreprocessor() const { return PP; } 189 Sema &getActions() const { return Actions; } 190 191 const Token &getCurToken() const { return Tok; } 192 Scope *getCurScope() const { return Actions.getCurScope(); } 193 194 Decl *getObjCDeclContext() const { return Actions.getObjCDeclContext(); } 195 196 // Type forwarding. All of these are statically 'void*', but they may all be 197 // different actual classes based on the actions in place. 198 typedef OpaquePtr<DeclGroupRef> DeclGroupPtrTy; 199 typedef OpaquePtr<TemplateName> TemplateTy; 200 201 typedef SmallVector<TemplateParameterList *, 4> TemplateParameterLists; 202 203 typedef clang::ExprResult ExprResult; 204 typedef clang::StmtResult StmtResult; 205 typedef clang::BaseResult BaseResult; 206 typedef clang::MemInitResult MemInitResult; 207 typedef clang::TypeResult TypeResult; 208 209 typedef Expr *ExprArg; 210 typedef ASTMultiPtr<Stmt*> MultiStmtArg; 211 typedef Sema::FullExprArg FullExprArg; 212 213 /// Adorns a ExprResult with Actions to make it an ExprResult 214 ExprResult Owned(ExprResult res) { 215 return ExprResult(res); 216 } 217 /// Adorns a StmtResult with Actions to make it an StmtResult 218 StmtResult Owned(StmtResult res) { 219 return StmtResult(res); 220 } 221 222 ExprResult ExprError() { return ExprResult(true); } 223 StmtResult StmtError() { return StmtResult(true); } 224 225 ExprResult ExprError(const DiagnosticBuilder &) { return ExprError(); } 226 StmtResult StmtError(const DiagnosticBuilder &) { return StmtError(); } 227 228 ExprResult ExprEmpty() { return ExprResult(false); } 229 230 // Parsing methods. 231 232 /// ParseTranslationUnit - All in one method that initializes parses, and 233 /// shuts down the parser. 234 void ParseTranslationUnit(); 235 236 /// Initialize - Warm up the parser. 237 /// 238 void Initialize(); 239 240 /// ParseTopLevelDecl - Parse one top-level declaration. Returns true if 241 /// the EOF was encountered. 242 bool ParseTopLevelDecl(DeclGroupPtrTy &Result); 243 244 DeclGroupPtrTy FinishPendingObjCActions(); 245 246 private: 247 //===--------------------------------------------------------------------===// 248 // Low-Level token peeking and consumption methods. 249 // 250 251 /// isTokenParen - Return true if the cur token is '(' or ')'. 252 bool isTokenParen() const { 253 return Tok.getKind() == tok::l_paren || Tok.getKind() == tok::r_paren; 254 } 255 /// isTokenBracket - Return true if the cur token is '[' or ']'. 256 bool isTokenBracket() const { 257 return Tok.getKind() == tok::l_square || Tok.getKind() == tok::r_square; 258 } 259 /// isTokenBrace - Return true if the cur token is '{' or '}'. 260 bool isTokenBrace() const { 261 return Tok.getKind() == tok::l_brace || Tok.getKind() == tok::r_brace; 262 } 263 264 /// isTokenStringLiteral - True if this token is a string-literal. 265 /// 266 bool isTokenStringLiteral() const { 267 return Tok.getKind() == tok::string_literal || 268 Tok.getKind() == tok::wide_string_literal || 269 Tok.getKind() == tok::utf8_string_literal || 270 Tok.getKind() == tok::utf16_string_literal || 271 Tok.getKind() == tok::utf32_string_literal; 272 } 273 274 /// \brief Returns true if the current token is a '=' or '==' and 275 /// false otherwise. If it's '==', we assume that it's a typo and we emit 276 /// DiagID and a fixit hint to turn '==' -> '='. 277 bool isTokenEqualOrMistypedEqualEqual(unsigned DiagID); 278 279 /// ConsumeToken - Consume the current 'peek token' and lex the next one. 280 /// This does not work with all kinds of tokens: strings and specific other 281 /// tokens must be consumed with custom methods below. This returns the 282 /// location of the consumed token. 283 SourceLocation ConsumeToken() { 284 assert(!isTokenStringLiteral() && !isTokenParen() && !isTokenBracket() && 285 !isTokenBrace() && 286 "Should consume special tokens with Consume*Token"); 287 288 if (Tok.is(tok::code_completion)) 289 return handleUnexpectedCodeCompletionToken(); 290 291 PrevTokLocation = Tok.getLocation(); 292 PP.Lex(Tok); 293 return PrevTokLocation; 294 } 295 296 /// ConsumeAnyToken - Dispatch to the right Consume* method based on the 297 /// current token type. This should only be used in cases where the type of 298 /// the token really isn't known, e.g. in error recovery. 299 SourceLocation ConsumeAnyToken() { 300 if (isTokenParen()) 301 return ConsumeParen(); 302 else if (isTokenBracket()) 303 return ConsumeBracket(); 304 else if (isTokenBrace()) 305 return ConsumeBrace(); 306 else if (isTokenStringLiteral()) 307 return ConsumeStringToken(); 308 else 309 return ConsumeToken(); 310 } 311 312 /// ConsumeParen - This consume method keeps the paren count up-to-date. 313 /// 314 SourceLocation ConsumeParen() { 315 assert(isTokenParen() && "wrong consume method"); 316 if (Tok.getKind() == tok::l_paren) 317 ++ParenCount; 318 else if (ParenCount) 319 --ParenCount; // Don't let unbalanced )'s drive the count negative. 320 PrevTokLocation = Tok.getLocation(); 321 PP.Lex(Tok); 322 return PrevTokLocation; 323 } 324 325 /// ConsumeBracket - This consume method keeps the bracket count up-to-date. 326 /// 327 SourceLocation ConsumeBracket() { 328 assert(isTokenBracket() && "wrong consume method"); 329 if (Tok.getKind() == tok::l_square) 330 ++BracketCount; 331 else if (BracketCount) 332 --BracketCount; // Don't let unbalanced ]'s drive the count negative. 333 334 PrevTokLocation = Tok.getLocation(); 335 PP.Lex(Tok); 336 return PrevTokLocation; 337 } 338 339 /// ConsumeBrace - This consume method keeps the brace count up-to-date. 340 /// 341 SourceLocation ConsumeBrace() { 342 assert(isTokenBrace() && "wrong consume method"); 343 if (Tok.getKind() == tok::l_brace) 344 ++BraceCount; 345 else if (BraceCount) 346 --BraceCount; // Don't let unbalanced }'s drive the count negative. 347 348 PrevTokLocation = Tok.getLocation(); 349 PP.Lex(Tok); 350 return PrevTokLocation; 351 } 352 353 /// ConsumeStringToken - Consume the current 'peek token', lexing a new one 354 /// and returning the token kind. This method is specific to strings, as it 355 /// handles string literal concatenation, as per C99 5.1.1.2, translation 356 /// phase #6. 357 SourceLocation ConsumeStringToken() { 358 assert(isTokenStringLiteral() && 359 "Should only consume string literals with this method"); 360 PrevTokLocation = Tok.getLocation(); 361 PP.Lex(Tok); 362 return PrevTokLocation; 363 } 364 365 /// \brief Consume the current code-completion token. 366 /// 367 /// This routine should be called to consume the code-completion token once 368 /// a code-completion action has already been invoked. 369 SourceLocation ConsumeCodeCompletionToken() { 370 assert(Tok.is(tok::code_completion)); 371 PrevTokLocation = Tok.getLocation(); 372 PP.Lex(Tok); 373 return PrevTokLocation; 374 } 375 376 ///\ brief When we are consuming a code-completion token without having 377 /// matched specific position in the grammar, provide code-completion results 378 /// based on context. 379 /// 380 /// \returns the source location of the code-completion token. 381 SourceLocation handleUnexpectedCodeCompletionToken(); 382 383 /// \brief Abruptly cut off parsing; mainly used when we have reached the 384 /// code-completion point. 385 void cutOffParsing() { 386 PP.setCodeCompletionReached(); 387 // Cut off parsing by acting as if we reached the end-of-file. 388 Tok.setKind(tok::eof); 389 } 390 391 /// \brief Handle the annotation token produced for #pragma unused(...) 392 void HandlePragmaUnused(); 393 394 /// GetLookAheadToken - This peeks ahead N tokens and returns that token 395 /// without consuming any tokens. LookAhead(0) returns 'Tok', LookAhead(1) 396 /// returns the token after Tok, etc. 397 /// 398 /// Note that this differs from the Preprocessor's LookAhead method, because 399 /// the Parser always has one token lexed that the preprocessor doesn't. 400 /// 401 const Token &GetLookAheadToken(unsigned N) { 402 if (N == 0 || Tok.is(tok::eof)) return Tok; 403 return PP.LookAhead(N-1); 404 } 405 406 /// NextToken - This peeks ahead one token and returns it without 407 /// consuming it. 408 const Token &NextToken() { 409 return PP.LookAhead(0); 410 } 411 412 /// \brief Tracks information about the current nesting depth of 413 /// opening delimiters of each kind. 414 class DelimiterTracker { 415 private: 416 friend class Parser; 417 418 unsigned Paren, Brace, Square, Less, LLLess; 419 unsigned& get(tok::TokenKind t) { 420 switch (t) { 421 default: llvm_unreachable("Unexpected balanced token"); 422 case tok::l_brace: return Brace; 423 case tok::l_paren: return Paren; 424 case tok::l_square: return Square; 425 case tok::less: return Less; 426 case tok::lesslessless: return LLLess; 427 } 428 } 429 430 void push(tok::TokenKind t) { 431 get(t)++; 432 } 433 434 void pop(tok::TokenKind t) { 435 get(t)--; 436 } 437 438 unsigned getDepth(tok::TokenKind t) { 439 return get(t); 440 } 441 442 public: 443 DelimiterTracker() : Paren(0), Brace(0), Square(0), Less(0), LLLess(0) { } 444 }; 445 446 /// \brief RAII class that helps handle the parsing of an open/close delimiter 447 /// pair, such as braces { ... } or parentheses ( ... ). 448 class BalancedDelimiterTracker { 449 tok::TokenKind Kind, Close; 450 Parser& P; 451 bool Cleanup; 452 const unsigned MaxDepth; 453 SourceLocation LOpen, LClose; 454 455 void assignClosingDelimiter() { 456 switch (Kind) { 457 default: llvm_unreachable("Unexpected balanced token"); 458 case tok::l_brace: Close = tok::r_brace; break; 459 case tok::l_paren: Close = tok::r_paren; break; 460 case tok::l_square: Close = tok::r_square; break; 461 case tok::less: Close = tok::greater; break; 462 case tok::lesslessless: Close = tok::greatergreatergreater; break; 463 } 464 } 465 466 public: 467 BalancedDelimiterTracker(Parser& p, tok::TokenKind k) 468 : Kind(k), P(p), Cleanup(false), MaxDepth(256) { 469 assignClosingDelimiter(); 470 } 471 472 ~BalancedDelimiterTracker() { 473 if (Cleanup) 474 P.QuantityTracker.pop(Kind); 475 } 476 477 SourceLocation getOpenLocation() const { return LOpen; } 478 SourceLocation getCloseLocation() const { return LClose; } 479 SourceRange getRange() const { return SourceRange(LOpen, LClose); } 480 481 bool consumeOpen(); 482 bool expectAndConsume(unsigned DiagID, 483 const char *Msg = "", 484 tok::TokenKind SkipToTok = tok::unknown); 485 bool consumeClose(); 486 }; 487 488 DelimiterTracker QuantityTracker; 489 490 /// getTypeAnnotation - Read a parsed type out of an annotation token. 491 static ParsedType getTypeAnnotation(Token &Tok) { 492 return ParsedType::getFromOpaquePtr(Tok.getAnnotationValue()); 493 } 494 495 static void setTypeAnnotation(Token &Tok, ParsedType T) { 496 Tok.setAnnotationValue(T.getAsOpaquePtr()); 497 } 498 499 /// \brief Read an already-translated primary expression out of an annotation 500 /// token. 501 static ExprResult getExprAnnotation(Token &Tok) { 502 if (Tok.getAnnotationValue()) 503 return ExprResult((Expr *)Tok.getAnnotationValue()); 504 505 return ExprResult(true); 506 } 507 508 /// \brief Set the primary expression corresponding to the given annotation 509 /// token. 510 static void setExprAnnotation(Token &Tok, ExprResult ER) { 511 if (ER.isInvalid()) 512 Tok.setAnnotationValue(0); 513 else 514 Tok.setAnnotationValue(ER.get()); 515 } 516 517 // If NeedType is true, then TryAnnotateTypeOrScopeToken will try harder to 518 // find a type name by attempting typo correction. 519 bool TryAnnotateTypeOrScopeToken(bool EnteringContext = false, 520 bool NeedType = false); 521 bool TryAnnotateCXXScopeToken(bool EnteringContext = false); 522 523 /// TryAltiVecToken - Check for context-sensitive AltiVec identifier tokens, 524 /// replacing them with the non-context-sensitive keywords. This returns 525 /// true if the token was replaced. 526 bool TryAltiVecToken(DeclSpec &DS, SourceLocation Loc, 527 const char *&PrevSpec, unsigned &DiagID, 528 bool &isInvalid) { 529 if (!getLang().AltiVec || 530 (Tok.getIdentifierInfo() != Ident_vector && 531 Tok.getIdentifierInfo() != Ident_pixel)) 532 return false; 533 534 return TryAltiVecTokenOutOfLine(DS, Loc, PrevSpec, DiagID, isInvalid); 535 } 536 537 /// TryAltiVecVectorToken - Check for context-sensitive AltiVec vector 538 /// identifier token, replacing it with the non-context-sensitive __vector. 539 /// This returns true if the token was replaced. 540 bool TryAltiVecVectorToken() { 541 if (!getLang().AltiVec || 542 Tok.getIdentifierInfo() != Ident_vector) return false; 543 return TryAltiVecVectorTokenOutOfLine(); 544 } 545 546 bool TryAltiVecVectorTokenOutOfLine(); 547 bool TryAltiVecTokenOutOfLine(DeclSpec &DS, SourceLocation Loc, 548 const char *&PrevSpec, unsigned &DiagID, 549 bool &isInvalid); 550 551 /// \brief Get the TemplateIdAnnotation from the token and put it in the 552 /// cleanup pool so that it gets destroyed when parsing the current top level 553 /// declaration is finished. 554 TemplateIdAnnotation *takeTemplateIdAnnotation(const Token &tok); 555 556 /// TentativeParsingAction - An object that is used as a kind of "tentative 557 /// parsing transaction". It gets instantiated to mark the token position and 558 /// after the token consumption is done, Commit() or Revert() is called to 559 /// either "commit the consumed tokens" or revert to the previously marked 560 /// token position. Example: 561 /// 562 /// TentativeParsingAction TPA(*this); 563 /// ConsumeToken(); 564 /// .... 565 /// TPA.Revert(); 566 /// 567 class TentativeParsingAction { 568 Parser &P; 569 Token PrevTok; 570 bool isActive; 571 572 public: 573 explicit TentativeParsingAction(Parser& p) : P(p) { 574 PrevTok = P.Tok; 575 P.PP.EnableBacktrackAtThisPos(); 576 isActive = true; 577 } 578 void Commit() { 579 assert(isActive && "Parsing action was finished!"); 580 P.PP.CommitBacktrackedTokens(); 581 isActive = false; 582 } 583 void Revert() { 584 assert(isActive && "Parsing action was finished!"); 585 P.PP.Backtrack(); 586 P.Tok = PrevTok; 587 isActive = false; 588 } 589 ~TentativeParsingAction() { 590 assert(!isActive && "Forgot to call Commit or Revert!"); 591 } 592 }; 593 594 /// ObjCDeclContextSwitch - An object used to switch context from 595 /// an objective-c decl context to its enclosing decl context and 596 /// back. 597 class ObjCDeclContextSwitch { 598 Parser &P; 599 Decl *DC; 600 public: 601 explicit ObjCDeclContextSwitch(Parser &p) : P(p), 602 DC(p.getObjCDeclContext()) { 603 if (DC) 604 P.Actions.ActOnObjCTemporaryExitContainerContext(); 605 } 606 ~ObjCDeclContextSwitch() { 607 if (DC) 608 P.Actions.ActOnObjCReenterContainerContext(); 609 } 610 }; 611 612 /// ExpectAndConsume - The parser expects that 'ExpectedTok' is next in the 613 /// input. If so, it is consumed and false is returned. 614 /// 615 /// If the input is malformed, this emits the specified diagnostic. Next, if 616 /// SkipToTok is specified, it calls SkipUntil(SkipToTok). Finally, true is 617 /// returned. 618 bool ExpectAndConsume(tok::TokenKind ExpectedTok, unsigned Diag, 619 const char *DiagMsg = "", 620 tok::TokenKind SkipToTok = tok::unknown); 621 622 /// \brief The parser expects a semicolon and, if present, will consume it. 623 /// 624 /// If the next token is not a semicolon, this emits the specified diagnostic, 625 /// or, if there's just some closing-delimiter noise (e.g., ')' or ']') prior 626 /// to the semicolon, consumes that extra token. 627 bool ExpectAndConsumeSemi(unsigned DiagID); 628 629 //===--------------------------------------------------------------------===// 630 // Scope manipulation 631 632 /// ParseScope - Introduces a new scope for parsing. The kind of 633 /// scope is determined by ScopeFlags. Objects of this type should 634 /// be created on the stack to coincide with the position where the 635 /// parser enters the new scope, and this object's constructor will 636 /// create that new scope. Similarly, once the object is destroyed 637 /// the parser will exit the scope. 638 class ParseScope { 639 Parser *Self; 640 ParseScope(const ParseScope&); // do not implement 641 ParseScope& operator=(const ParseScope&); // do not implement 642 643 public: 644 // ParseScope - Construct a new object to manage a scope in the 645 // parser Self where the new Scope is created with the flags 646 // ScopeFlags, but only when ManageScope is true (the default). If 647 // ManageScope is false, this object does nothing. 648 ParseScope(Parser *Self, unsigned ScopeFlags, bool ManageScope = true) 649 : Self(Self) { 650 if (ManageScope) 651 Self->EnterScope(ScopeFlags); 652 else 653 this->Self = 0; 654 } 655 656 // Exit - Exit the scope associated with this object now, rather 657 // than waiting until the object is destroyed. 658 void Exit() { 659 if (Self) { 660 Self->ExitScope(); 661 Self = 0; 662 } 663 } 664 665 ~ParseScope() { 666 Exit(); 667 } 668 }; 669 670 /// EnterScope - Start a new scope. 671 void EnterScope(unsigned ScopeFlags); 672 673 /// ExitScope - Pop a scope off the scope stack. 674 void ExitScope(); 675 676 /// \brief RAII object used to modify the scope flags for the current scope. 677 class ParseScopeFlags { 678 Scope *CurScope; 679 unsigned OldFlags; 680 ParseScopeFlags(const ParseScopeFlags &); // do not implement 681 void operator=(const ParseScopeFlags &); // do not implement 682 683 public: 684 ParseScopeFlags(Parser *Self, unsigned ScopeFlags, bool ManageFlags = true); 685 ~ParseScopeFlags(); 686 }; 687 688 //===--------------------------------------------------------------------===// 689 // Diagnostic Emission and Error recovery. 690 691 public: 692 DiagnosticBuilder Diag(SourceLocation Loc, unsigned DiagID); 693 DiagnosticBuilder Diag(const Token &Tok, unsigned DiagID); 694 695 private: 696 void SuggestParentheses(SourceLocation Loc, unsigned DK, 697 SourceRange ParenRange); 698 699 /// SkipUntil - Read tokens until we get to the specified token, then consume 700 /// it (unless DontConsume is true). Because we cannot guarantee that the 701 /// token will ever occur, this skips to the next token, or to some likely 702 /// good stopping point. If StopAtSemi is true, skipping will stop at a ';' 703 /// character. 704 /// 705 /// If SkipUntil finds the specified token, it returns true, otherwise it 706 /// returns false. 707 bool SkipUntil(tok::TokenKind T, bool StopAtSemi = true, 708 bool DontConsume = false, bool StopAtCodeCompletion = false) { 709 return SkipUntil(&T, 1, StopAtSemi, DontConsume, StopAtCodeCompletion); 710 } 711 bool SkipUntil(tok::TokenKind T1, tok::TokenKind T2, bool StopAtSemi = true, 712 bool DontConsume = false, bool StopAtCodeCompletion = false) { 713 tok::TokenKind TokArray[] = {T1, T2}; 714 return SkipUntil(TokArray, 2, StopAtSemi, DontConsume,StopAtCodeCompletion); 715 } 716 bool SkipUntil(const tok::TokenKind *Toks, unsigned NumToks, 717 bool StopAtSemi = true, bool DontConsume = false, 718 bool StopAtCodeCompletion = false); 719 720 //===--------------------------------------------------------------------===// 721 // Lexing and parsing of C++ inline methods. 722 723 struct ParsingClass; 724 725 /// [class.mem]p1: "... the class is regarded as complete within 726 /// - function bodies 727 /// - default arguments 728 /// - exception-specifications (TODO: C++0x) 729 /// - and brace-or-equal-initializers for non-static data members 730 /// (including such things in nested classes)." 731 /// LateParsedDeclarations build the tree of those elements so they can 732 /// be parsed after parsing the top-level class. 733 class LateParsedDeclaration { 734 public: 735 virtual ~LateParsedDeclaration(); 736 737 virtual void ParseLexedMethodDeclarations(); 738 virtual void ParseLexedMemberInitializers(); 739 virtual void ParseLexedMethodDefs(); 740 virtual void ParseLexedAttributes(); 741 }; 742 743 /// Inner node of the LateParsedDeclaration tree that parses 744 /// all its members recursively. 745 class LateParsedClass : public LateParsedDeclaration { 746 public: 747 LateParsedClass(Parser *P, ParsingClass *C); 748 virtual ~LateParsedClass(); 749 750 virtual void ParseLexedMethodDeclarations(); 751 virtual void ParseLexedMemberInitializers(); 752 virtual void ParseLexedMethodDefs(); 753 virtual void ParseLexedAttributes(); 754 755 private: 756 Parser *Self; 757 ParsingClass *Class; 758 }; 759 760 /// Contains the lexed tokens of an attribute with arguments that 761 /// may reference member variables and so need to be parsed at the 762 /// end of the class declaration after parsing all other member 763 /// member declarations. 764 /// FIXME: Perhaps we should change the name of LateParsedDeclaration to 765 /// LateParsedTokens. 766 struct LateParsedAttribute : public LateParsedDeclaration { 767 Parser *Self; 768 CachedTokens Toks; 769 IdentifierInfo &AttrName; 770 SourceLocation AttrNameLoc; 771 Decl *D; 772 773 explicit LateParsedAttribute(Parser *P, IdentifierInfo &Name, 774 SourceLocation Loc) 775 : Self(P), AttrName(Name), AttrNameLoc(Loc), D(0) {} 776 777 virtual void ParseLexedAttributes(); 778 779 void setDecl(Decl *Dec) { D = Dec; } 780 }; 781 782 /// A list of late parsed attributes. Used by ParseGNUAttributes. 783 typedef llvm::SmallVector<LateParsedAttribute*, 2> LateParsedAttrList; 784 785 786 /// Contains the lexed tokens of a member function definition 787 /// which needs to be parsed at the end of the class declaration 788 /// after parsing all other member declarations. 789 struct LexedMethod : public LateParsedDeclaration { 790 Parser *Self; 791 Decl *D; 792 CachedTokens Toks; 793 794 /// \brief Whether this member function had an associated template 795 /// scope. When true, D is a template declaration. 796 /// othewise, it is a member function declaration. 797 bool TemplateScope; 798 799 explicit LexedMethod(Parser* P, Decl *MD) 800 : Self(P), D(MD), TemplateScope(false) {} 801 802 virtual void ParseLexedMethodDefs(); 803 }; 804 805 /// LateParsedDefaultArgument - Keeps track of a parameter that may 806 /// have a default argument that cannot be parsed yet because it 807 /// occurs within a member function declaration inside the class 808 /// (C++ [class.mem]p2). 809 struct LateParsedDefaultArgument { 810 explicit LateParsedDefaultArgument(Decl *P, 811 CachedTokens *Toks = 0) 812 : Param(P), Toks(Toks) { } 813 814 /// Param - The parameter declaration for this parameter. 815 Decl *Param; 816 817 /// Toks - The sequence of tokens that comprises the default 818 /// argument expression, not including the '=' or the terminating 819 /// ')' or ','. This will be NULL for parameters that have no 820 /// default argument. 821 CachedTokens *Toks; 822 }; 823 824 /// LateParsedMethodDeclaration - A method declaration inside a class that 825 /// contains at least one entity whose parsing needs to be delayed 826 /// until the class itself is completely-defined, such as a default 827 /// argument (C++ [class.mem]p2). 828 struct LateParsedMethodDeclaration : public LateParsedDeclaration { 829 explicit LateParsedMethodDeclaration(Parser *P, Decl *M) 830 : Self(P), Method(M), TemplateScope(false) { } 831 832 virtual void ParseLexedMethodDeclarations(); 833 834 Parser* Self; 835 836 /// Method - The method declaration. 837 Decl *Method; 838 839 /// \brief Whether this member function had an associated template 840 /// scope. When true, D is a template declaration. 841 /// othewise, it is a member function declaration. 842 bool TemplateScope; 843 844 /// DefaultArgs - Contains the parameters of the function and 845 /// their default arguments. At least one of the parameters will 846 /// have a default argument, but all of the parameters of the 847 /// method will be stored so that they can be reintroduced into 848 /// scope at the appropriate times. 849 SmallVector<LateParsedDefaultArgument, 8> DefaultArgs; 850 }; 851 852 /// LateParsedMemberInitializer - An initializer for a non-static class data 853 /// member whose parsing must to be delayed until the class is completely 854 /// defined (C++11 [class.mem]p2). 855 struct LateParsedMemberInitializer : public LateParsedDeclaration { 856 LateParsedMemberInitializer(Parser *P, Decl *FD) 857 : Self(P), Field(FD) { } 858 859 virtual void ParseLexedMemberInitializers(); 860 861 Parser *Self; 862 863 /// Field - The field declaration. 864 Decl *Field; 865 866 /// CachedTokens - The sequence of tokens that comprises the initializer, 867 /// including any leading '='. 868 CachedTokens Toks; 869 }; 870 871 /// LateParsedDeclarationsContainer - During parsing of a top (non-nested) 872 /// C++ class, its method declarations that contain parts that won't be 873 /// parsed until after the definition is completed (C++ [class.mem]p2), 874 /// the method declarations and possibly attached inline definitions 875 /// will be stored here with the tokens that will be parsed to create those entities. 876 typedef SmallVector<LateParsedDeclaration*, 2> LateParsedDeclarationsContainer; 877 878 /// \brief Representation of a class that has been parsed, including 879 /// any member function declarations or definitions that need to be 880 /// parsed after the corresponding top-level class is complete. 881 struct ParsingClass { 882 ParsingClass(Decl *TagOrTemplate, bool TopLevelClass) 883 : TopLevelClass(TopLevelClass), TemplateScope(false), 884 TagOrTemplate(TagOrTemplate) { } 885 886 /// \brief Whether this is a "top-level" class, meaning that it is 887 /// not nested within another class. 888 bool TopLevelClass : 1; 889 890 /// \brief Whether this class had an associated template 891 /// scope. When true, TagOrTemplate is a template declaration; 892 /// othewise, it is a tag declaration. 893 bool TemplateScope : 1; 894 895 /// \brief The class or class template whose definition we are parsing. 896 Decl *TagOrTemplate; 897 898 /// LateParsedDeclarations - Method declarations, inline definitions and 899 /// nested classes that contain pieces whose parsing will be delayed until 900 /// the top-level class is fully defined. 901 LateParsedDeclarationsContainer LateParsedDeclarations; 902 }; 903 904 /// \brief The stack of classes that is currently being 905 /// parsed. Nested and local classes will be pushed onto this stack 906 /// when they are parsed, and removed afterward. 907 std::stack<ParsingClass *> ClassStack; 908 909 ParsingClass &getCurrentClass() { 910 assert(!ClassStack.empty() && "No lexed method stacks!"); 911 return *ClassStack.top(); 912 } 913 914 /// \brief RAII object used to inform the actions that we're 915 /// currently parsing a declaration. This is active when parsing a 916 /// variable's initializer, but not when parsing the body of a 917 /// class or function definition. 918 class ParsingDeclRAIIObject { 919 Sema &Actions; 920 Sema::ParsingDeclState State; 921 bool Popped; 922 923 public: 924 ParsingDeclRAIIObject(Parser &P) : Actions(P.Actions) { 925 push(); 926 } 927 928 ParsingDeclRAIIObject(Parser &P, ParsingDeclRAIIObject *Other) 929 : Actions(P.Actions) { 930 if (Other) steal(*Other); 931 else push(); 932 } 933 934 /// Creates a RAII object which steals the state from a different 935 /// object instead of pushing. 936 ParsingDeclRAIIObject(ParsingDeclRAIIObject &Other) 937 : Actions(Other.Actions) { 938 steal(Other); 939 } 940 941 ~ParsingDeclRAIIObject() { 942 abort(); 943 } 944 945 /// Resets the RAII object for a new declaration. 946 void reset() { 947 abort(); 948 push(); 949 } 950 951 /// Signals that the context was completed without an appropriate 952 /// declaration being parsed. 953 void abort() { 954 pop(0); 955 } 956 957 void complete(Decl *D) { 958 assert(!Popped && "ParsingDeclaration has already been popped!"); 959 pop(D); 960 } 961 962 private: 963 void steal(ParsingDeclRAIIObject &Other) { 964 State = Other.State; 965 Popped = Other.Popped; 966 Other.Popped = true; 967 } 968 969 void push() { 970 State = Actions.PushParsingDeclaration(); 971 Popped = false; 972 } 973 974 void pop(Decl *D) { 975 if (!Popped) { 976 Actions.PopParsingDeclaration(State, D); 977 Popped = true; 978 } 979 } 980 }; 981 982 /// A class for parsing a DeclSpec. 983 class ParsingDeclSpec : public DeclSpec { 984 ParsingDeclRAIIObject ParsingRAII; 985 986 public: 987 ParsingDeclSpec(Parser &P) : DeclSpec(P.AttrFactory), ParsingRAII(P) {} 988 ParsingDeclSpec(Parser &P, ParsingDeclRAIIObject *RAII) 989 : DeclSpec(P.AttrFactory), ParsingRAII(P, RAII) {} 990 991 void complete(Decl *D) { 992 ParsingRAII.complete(D); 993 } 994 995 void abort() { 996 ParsingRAII.abort(); 997 } 998 }; 999 1000 /// A class for parsing a declarator. 1001 class ParsingDeclarator : public Declarator { 1002 ParsingDeclRAIIObject ParsingRAII; 1003 1004 public: 1005 ParsingDeclarator(Parser &P, const ParsingDeclSpec &DS, TheContext C) 1006 : Declarator(DS, C), ParsingRAII(P) { 1007 } 1008 1009 const ParsingDeclSpec &getDeclSpec() const { 1010 return static_cast<const ParsingDeclSpec&>(Declarator::getDeclSpec()); 1011 } 1012 1013 ParsingDeclSpec &getMutableDeclSpec() const { 1014 return const_cast<ParsingDeclSpec&>(getDeclSpec()); 1015 } 1016 1017 void clear() { 1018 Declarator::clear(); 1019 ParsingRAII.reset(); 1020 } 1021 1022 void complete(Decl *D) { 1023 ParsingRAII.complete(D); 1024 } 1025 }; 1026 1027 /// \brief RAII object used to 1028 class ParsingClassDefinition { 1029 Parser &P; 1030 bool Popped; 1031 Sema::ParsingClassState State; 1032 1033 public: 1034 ParsingClassDefinition(Parser &P, Decl *TagOrTemplate, bool TopLevelClass) 1035 : P(P), Popped(false), 1036 State(P.PushParsingClass(TagOrTemplate, TopLevelClass)) { 1037 } 1038 1039 /// \brief Pop this class of the stack. 1040 void Pop() { 1041 assert(!Popped && "Nested class has already been popped"); 1042 Popped = true; 1043 P.PopParsingClass(State); 1044 } 1045 1046 ~ParsingClassDefinition() { 1047 if (!Popped) 1048 P.PopParsingClass(State); 1049 } 1050 }; 1051 1052 /// \brief Contains information about any template-specific 1053 /// information that has been parsed prior to parsing declaration 1054 /// specifiers. 1055 struct ParsedTemplateInfo { 1056 ParsedTemplateInfo() 1057 : Kind(NonTemplate), TemplateParams(0), TemplateLoc() { } 1058 1059 ParsedTemplateInfo(TemplateParameterLists *TemplateParams, 1060 bool isSpecialization, 1061 bool lastParameterListWasEmpty = false) 1062 : Kind(isSpecialization? ExplicitSpecialization : Template), 1063 TemplateParams(TemplateParams), 1064 LastParameterListWasEmpty(lastParameterListWasEmpty) { } 1065 1066 explicit ParsedTemplateInfo(SourceLocation ExternLoc, 1067 SourceLocation TemplateLoc) 1068 : Kind(ExplicitInstantiation), TemplateParams(0), 1069 ExternLoc(ExternLoc), TemplateLoc(TemplateLoc), 1070 LastParameterListWasEmpty(false){ } 1071 1072 /// \brief The kind of template we are parsing. 1073 enum { 1074 /// \brief We are not parsing a template at all. 1075 NonTemplate = 0, 1076 /// \brief We are parsing a template declaration. 1077 Template, 1078 /// \brief We are parsing an explicit specialization. 1079 ExplicitSpecialization, 1080 /// \brief We are parsing an explicit instantiation. 1081 ExplicitInstantiation 1082 } Kind; 1083 1084 /// \brief The template parameter lists, for template declarations 1085 /// and explicit specializations. 1086 TemplateParameterLists *TemplateParams; 1087 1088 /// \brief The location of the 'extern' keyword, if any, for an explicit 1089 /// instantiation 1090 SourceLocation ExternLoc; 1091 1092 /// \brief The location of the 'template' keyword, for an explicit 1093 /// instantiation. 1094 SourceLocation TemplateLoc; 1095 1096 /// \brief Whether the last template parameter list was empty. 1097 bool LastParameterListWasEmpty; 1098 1099 SourceRange getSourceRange() const; 1100 }; 1101 1102 /// \brief Contains a late templated function. 1103 /// Will be parsed at the end of the translation unit. 1104 struct LateParsedTemplatedFunction { 1105 explicit LateParsedTemplatedFunction(Parser* P, Decl *MD) 1106 : D(MD) {} 1107 1108 CachedTokens Toks; 1109 1110 /// \brief The template function declaration to be late parsed. 1111 Decl *D; 1112 }; 1113 1114 void LexTemplateFunctionForLateParsing(CachedTokens &Toks); 1115 void ParseLateTemplatedFuncDef(LateParsedTemplatedFunction &LMT); 1116 typedef llvm::DenseMap<const FunctionDecl*, LateParsedTemplatedFunction*> 1117 LateParsedTemplateMapT; 1118 LateParsedTemplateMapT LateParsedTemplateMap; 1119 1120 static void LateTemplateParserCallback(void *P, const FunctionDecl *FD); 1121 void LateTemplateParser(const FunctionDecl *FD); 1122 1123 Sema::ParsingClassState 1124 PushParsingClass(Decl *TagOrTemplate, bool TopLevelClass); 1125 void DeallocateParsedClasses(ParsingClass *Class); 1126 void PopParsingClass(Sema::ParsingClassState); 1127 1128 Decl *ParseCXXInlineMethodDef(AccessSpecifier AS, AttributeList *AccessAttrs, 1129 ParsingDeclarator &D, 1130 const ParsedTemplateInfo &TemplateInfo, 1131 const VirtSpecifiers& VS, ExprResult& Init); 1132 void ParseCXXNonStaticMemberInitializer(Decl *VarD); 1133 void ParseLexedAttributes(ParsingClass &Class); 1134 void ParseLexedAttribute(LateParsedAttribute &LA); 1135 void ParseLexedMethodDeclarations(ParsingClass &Class); 1136 void ParseLexedMethodDeclaration(LateParsedMethodDeclaration &LM); 1137 void ParseLexedMethodDefs(ParsingClass &Class); 1138 void ParseLexedMethodDef(LexedMethod &LM); 1139 void ParseLexedMemberInitializers(ParsingClass &Class); 1140 void ParseLexedMemberInitializer(LateParsedMemberInitializer &MI); 1141 Decl *ParseLexedObjCMethodDefs(LexedMethod &LM); 1142 bool ConsumeAndStoreFunctionPrologue(CachedTokens &Toks); 1143 bool ConsumeAndStoreUntil(tok::TokenKind T1, 1144 CachedTokens &Toks, 1145 bool StopAtSemi = true, 1146 bool ConsumeFinalToken = true) { 1147 return ConsumeAndStoreUntil(T1, T1, Toks, StopAtSemi, ConsumeFinalToken); 1148 } 1149 bool ConsumeAndStoreUntil(tok::TokenKind T1, tok::TokenKind T2, 1150 CachedTokens &Toks, 1151 bool StopAtSemi = true, 1152 bool ConsumeFinalToken = true); 1153 1154 //===--------------------------------------------------------------------===// 1155 // C99 6.9: External Definitions. 1156 struct ParsedAttributesWithRange : ParsedAttributes { 1157 ParsedAttributesWithRange(AttributeFactory &factory) 1158 : ParsedAttributes(factory) {} 1159 1160 SourceRange Range; 1161 }; 1162 1163 DeclGroupPtrTy ParseExternalDeclaration(ParsedAttributesWithRange &attrs, 1164 ParsingDeclSpec *DS = 0); 1165 bool isDeclarationAfterDeclarator(); 1166 bool isStartOfFunctionDefinition(const ParsingDeclarator &Declarator); 1167 DeclGroupPtrTy ParseDeclarationOrFunctionDefinition(ParsedAttributes &attrs, 1168 AccessSpecifier AS = AS_none); 1169 DeclGroupPtrTy ParseDeclarationOrFunctionDefinition(ParsingDeclSpec &DS, 1170 AccessSpecifier AS = AS_none); 1171 1172 Decl *ParseFunctionDefinition(ParsingDeclarator &D, 1173 const ParsedTemplateInfo &TemplateInfo = ParsedTemplateInfo()); 1174 void ParseKNRParamDeclarations(Declarator &D); 1175 // EndLoc, if non-NULL, is filled with the location of the last token of 1176 // the simple-asm. 1177 ExprResult ParseSimpleAsm(SourceLocation *EndLoc = 0); 1178 ExprResult ParseAsmStringLiteral(); 1179 1180 // Objective-C External Declarations 1181 Parser::DeclGroupPtrTy ParseObjCAtDirectives(); 1182 Parser::DeclGroupPtrTy ParseObjCAtClassDeclaration(SourceLocation atLoc); 1183 Decl *ParseObjCAtInterfaceDeclaration(SourceLocation atLoc, 1184 ParsedAttributes &prefixAttrs); 1185 void ParseObjCClassInstanceVariables(Decl *interfaceDecl, 1186 tok::ObjCKeywordKind visibility, 1187 SourceLocation atLoc); 1188 bool ParseObjCProtocolReferences(SmallVectorImpl<Decl *> &P, 1189 SmallVectorImpl<SourceLocation> &PLocs, 1190 bool WarnOnDeclarations, 1191 SourceLocation &LAngleLoc, 1192 SourceLocation &EndProtoLoc); 1193 bool ParseObjCProtocolQualifiers(DeclSpec &DS); 1194 void ParseObjCInterfaceDeclList(tok::ObjCKeywordKind contextKey, 1195 Decl *CDecl); 1196 Decl *ParseObjCAtProtocolDeclaration(SourceLocation atLoc, 1197 ParsedAttributes &prefixAttrs); 1198 1199 Decl *ObjCImpDecl; 1200 SmallVector<Decl *, 4> PendingObjCImpDecl; 1201 typedef SmallVector<LexedMethod*, 2> LateParsedObjCMethodContainer; 1202 LateParsedObjCMethodContainer LateParsedObjCMethods; 1203 1204 Decl *ParseObjCAtImplementationDeclaration(SourceLocation atLoc); 1205 DeclGroupPtrTy ParseObjCAtEndDeclaration(SourceRange atEnd); 1206 Decl *ParseObjCAtAliasDeclaration(SourceLocation atLoc); 1207 Decl *ParseObjCPropertySynthesize(SourceLocation atLoc); 1208 Decl *ParseObjCPropertyDynamic(SourceLocation atLoc); 1209 1210 IdentifierInfo *ParseObjCSelectorPiece(SourceLocation &MethodLocation); 1211 // Definitions for Objective-c context sensitive keywords recognition. 1212 enum ObjCTypeQual { 1213 objc_in=0, objc_out, objc_inout, objc_oneway, objc_bycopy, objc_byref, 1214 objc_NumQuals 1215 }; 1216 IdentifierInfo *ObjCTypeQuals[objc_NumQuals]; 1217 1218 bool isTokIdentifier_in() const; 1219 1220 ParsedType ParseObjCTypeName(ObjCDeclSpec &DS, Declarator::TheContext Ctx, 1221 ParsedAttributes *ParamAttrs); 1222 void ParseObjCMethodRequirement(); 1223 Decl *ParseObjCMethodPrototype( 1224 tok::ObjCKeywordKind MethodImplKind = tok::objc_not_keyword, 1225 bool MethodDefinition = true); 1226 Decl *ParseObjCMethodDecl(SourceLocation mLoc, tok::TokenKind mType, 1227 tok::ObjCKeywordKind MethodImplKind = tok::objc_not_keyword, 1228 bool MethodDefinition=true); 1229 void ParseObjCPropertyAttribute(ObjCDeclSpec &DS); 1230 1231 Decl *ParseObjCMethodDefinition(); 1232 1233 //===--------------------------------------------------------------------===// 1234 // C99 6.5: Expressions. 1235 1236 ExprResult ParseExpression(); 1237 ExprResult ParseConstantExpression(); 1238 // Expr that doesn't include commas. 1239 ExprResult ParseAssignmentExpression(); 1240 1241 ExprResult ParseExpressionWithLeadingAt(SourceLocation AtLoc); 1242 1243 ExprResult ParseExpressionWithLeadingExtension(SourceLocation ExtLoc); 1244 1245 ExprResult ParseRHSOfBinaryExpression(ExprResult LHS, 1246 prec::Level MinPrec); 1247 ExprResult ParseCastExpression(bool isUnaryExpression, 1248 bool isAddressOfOperand, 1249 bool &NotCastExpr, 1250 bool isTypeCast); 1251 ExprResult ParseCastExpression(bool isUnaryExpression, 1252 bool isAddressOfOperand = false, 1253 bool isTypeCast = false); 1254 1255 /// Returns true if the next token would start a postfix-expression 1256 /// suffix. 1257 bool isPostfixExpressionSuffixStart() { 1258 tok::TokenKind K = Tok.getKind(); 1259 return (K == tok::l_square || K == tok::l_paren || 1260 K == tok::period || K == tok::arrow || 1261 K == tok::plusplus || K == tok::minusminus); 1262 } 1263 1264 ExprResult ParsePostfixExpressionSuffix(ExprResult LHS); 1265 ExprResult ParseUnaryExprOrTypeTraitExpression(); 1266 ExprResult ParseBuiltinPrimaryExpression(); 1267 1268 ExprResult ParseExprAfterUnaryExprOrTypeTrait(const Token &OpTok, 1269 bool &isCastExpr, 1270 ParsedType &CastTy, 1271 SourceRange &CastRange); 1272 1273 typedef SmallVector<Expr*, 20> ExprListTy; 1274 typedef SmallVector<SourceLocation, 20> CommaLocsTy; 1275 1276 /// ParseExpressionList - Used for C/C++ (argument-)expression-list. 1277 bool ParseExpressionList(SmallVectorImpl<Expr*> &Exprs, 1278 SmallVectorImpl<SourceLocation> &CommaLocs, 1279 void (Sema::*Completer)(Scope *S, 1280 Expr *Data, 1281 Expr **Args, 1282 unsigned NumArgs) = 0, 1283 Expr *Data = 0); 1284 1285 /// ParenParseOption - Control what ParseParenExpression will parse. 1286 enum ParenParseOption { 1287 SimpleExpr, // Only parse '(' expression ')' 1288 CompoundStmt, // Also allow '(' compound-statement ')' 1289 CompoundLiteral, // Also allow '(' type-name ')' '{' ... '}' 1290 CastExpr // Also allow '(' type-name ')' <anything> 1291 }; 1292 ExprResult ParseParenExpression(ParenParseOption &ExprType, 1293 bool stopIfCastExpr, 1294 bool isTypeCast, 1295 ParsedType &CastTy, 1296 SourceLocation &RParenLoc); 1297 1298 ExprResult ParseCXXAmbiguousParenExpression(ParenParseOption &ExprType, 1299 ParsedType &CastTy, 1300 BalancedDelimiterTracker &Tracker); 1301 ExprResult ParseCompoundLiteralExpression(ParsedType Ty, 1302 SourceLocation LParenLoc, 1303 SourceLocation RParenLoc); 1304 1305 ExprResult ParseStringLiteralExpression(); 1306 1307 ExprResult ParseGenericSelectionExpression(); 1308 1309 //===--------------------------------------------------------------------===// 1310 // C++ Expressions 1311 ExprResult ParseCXXIdExpression(bool isAddressOfOperand = false); 1312 1313 void CheckForTemplateAndDigraph(Token &Next, ParsedType ObjectTypePtr, 1314 bool EnteringContext, IdentifierInfo &II, 1315 CXXScopeSpec &SS); 1316 1317 bool ParseOptionalCXXScopeSpecifier(CXXScopeSpec &SS, 1318 ParsedType ObjectType, 1319 bool EnteringContext, 1320 bool *MayBePseudoDestructor = 0, 1321 bool IsTypename = false); 1322 1323 //===--------------------------------------------------------------------===// 1324 // C++0x 5.1.2: Lambda expressions 1325 1326 // [...] () -> type {...} 1327 ExprResult ParseLambdaExpression(); 1328 ExprResult TryParseLambdaExpression(); 1329 llvm::Optional<unsigned> ParseLambdaIntroducer(LambdaIntroducer &Intro); 1330 bool TryParseLambdaIntroducer(LambdaIntroducer &Intro); 1331 ExprResult ParseLambdaExpressionAfterIntroducer( 1332 LambdaIntroducer &Intro); 1333 1334 //===--------------------------------------------------------------------===// 1335 // C++ 5.2p1: C++ Casts 1336 ExprResult ParseCXXCasts(); 1337 1338 //===--------------------------------------------------------------------===// 1339 // C++ 5.2p1: C++ Type Identification 1340 ExprResult ParseCXXTypeid(); 1341 1342 //===--------------------------------------------------------------------===// 1343 // C++ : Microsoft __uuidof Expression 1344 ExprResult ParseCXXUuidof(); 1345 1346 //===--------------------------------------------------------------------===// 1347 // C++ 5.2.4: C++ Pseudo-Destructor Expressions 1348 ExprResult ParseCXXPseudoDestructor(ExprArg Base, SourceLocation OpLoc, 1349 tok::TokenKind OpKind, 1350 CXXScopeSpec &SS, 1351 ParsedType ObjectType); 1352 1353 //===--------------------------------------------------------------------===// 1354 // C++ 9.3.2: C++ 'this' pointer 1355 ExprResult ParseCXXThis(); 1356 1357 //===--------------------------------------------------------------------===// 1358 // C++ 15: C++ Throw Expression 1359 ExprResult ParseThrowExpression(); 1360 1361 ExceptionSpecificationType MaybeParseExceptionSpecification( 1362 SourceRange &SpecificationRange, 1363 SmallVectorImpl<ParsedType> &DynamicExceptions, 1364 SmallVectorImpl<SourceRange> &DynamicExceptionRanges, 1365 ExprResult &NoexceptExpr); 1366 1367 // EndLoc is filled with the location of the last token of the specification. 1368 ExceptionSpecificationType ParseDynamicExceptionSpecification( 1369 SourceRange &SpecificationRange, 1370 SmallVectorImpl<ParsedType> &Exceptions, 1371 SmallVectorImpl<SourceRange> &Ranges); 1372 1373 //===--------------------------------------------------------------------===// 1374 // C++0x 8: Function declaration trailing-return-type 1375 TypeResult ParseTrailingReturnType(SourceRange &Range); 1376 1377 //===--------------------------------------------------------------------===// 1378 // C++ 2.13.5: C++ Boolean Literals 1379 ExprResult ParseCXXBoolLiteral(); 1380 1381 //===--------------------------------------------------------------------===// 1382 // C++ 5.2.3: Explicit type conversion (functional notation) 1383 ExprResult ParseCXXTypeConstructExpression(const DeclSpec &DS); 1384 1385 bool isCXXSimpleTypeSpecifier() const; 1386 1387 /// ParseCXXSimpleTypeSpecifier - [C++ 7.1.5.2] Simple type specifiers. 1388 /// This should only be called when the current token is known to be part of 1389 /// simple-type-specifier. 1390 void ParseCXXSimpleTypeSpecifier(DeclSpec &DS); 1391 1392 bool ParseCXXTypeSpecifierSeq(DeclSpec &DS); 1393 1394 //===--------------------------------------------------------------------===// 1395 // C++ 5.3.4 and 5.3.5: C++ new and delete 1396 bool ParseExpressionListOrTypeId(SmallVectorImpl<Expr*> &Exprs, 1397 Declarator &D); 1398 void ParseDirectNewDeclarator(Declarator &D); 1399 ExprResult ParseCXXNewExpression(bool UseGlobal, SourceLocation Start); 1400 ExprResult ParseCXXDeleteExpression(bool UseGlobal, 1401 SourceLocation Start); 1402 1403 //===--------------------------------------------------------------------===// 1404 // C++ if/switch/while condition expression. 1405 bool ParseCXXCondition(ExprResult &ExprResult, Decl *&DeclResult, 1406 SourceLocation Loc, bool ConvertToBoolean); 1407 1408 //===--------------------------------------------------------------------===// 1409 // C++ types 1410 1411 //===--------------------------------------------------------------------===// 1412 // C99 6.7.8: Initialization. 1413 1414 /// ParseInitializer 1415 /// initializer: [C99 6.7.8] 1416 /// assignment-expression 1417 /// '{' ... 1418 ExprResult ParseInitializer() { 1419 if (Tok.isNot(tok::l_brace)) 1420 return ParseAssignmentExpression(); 1421 return ParseBraceInitializer(); 1422 } 1423 ExprResult ParseBraceInitializer(); 1424 ExprResult ParseInitializerWithPotentialDesignator(); 1425 1426 //===--------------------------------------------------------------------===// 1427 // clang Expressions 1428 1429 ExprResult ParseBlockLiteralExpression(); // ^{...} 1430 1431 //===--------------------------------------------------------------------===// 1432 // Objective-C Expressions 1433 ExprResult ParseObjCAtExpression(SourceLocation AtLocation); 1434 ExprResult ParseObjCStringLiteral(SourceLocation AtLoc); 1435 ExprResult ParseObjCEncodeExpression(SourceLocation AtLoc); 1436 ExprResult ParseObjCSelectorExpression(SourceLocation AtLoc); 1437 ExprResult ParseObjCProtocolExpression(SourceLocation AtLoc); 1438 bool isSimpleObjCMessageExpression(); 1439 ExprResult ParseObjCMessageExpression(); 1440 ExprResult ParseObjCMessageExpressionBody(SourceLocation LBracloc, 1441 SourceLocation SuperLoc, 1442 ParsedType ReceiverType, 1443 ExprArg ReceiverExpr); 1444 ExprResult ParseAssignmentExprWithObjCMessageExprStart( 1445 SourceLocation LBracloc, SourceLocation SuperLoc, 1446 ParsedType ReceiverType, ExprArg ReceiverExpr); 1447 bool ParseObjCXXMessageReceiver(bool &IsExpr, void *&TypeOrExpr); 1448 1449 //===--------------------------------------------------------------------===// 1450 // C99 6.8: Statements and Blocks. 1451 1452 StmtResult ParseStatement() { 1453 StmtVector Stmts(Actions); 1454 return ParseStatementOrDeclaration(Stmts, true); 1455 } 1456 StmtResult ParseStatementOrDeclaration(StmtVector& Stmts, 1457 bool OnlyStatement = false); 1458 StmtResult ParseExprStatement(ParsedAttributes &Attrs); 1459 StmtResult ParseLabeledStatement(ParsedAttributes &Attr); 1460 StmtResult ParseCaseStatement(ParsedAttributes &Attr, 1461 bool MissingCase = false, 1462 ExprResult Expr = ExprResult()); 1463 StmtResult ParseDefaultStatement(ParsedAttributes &Attr); 1464 StmtResult ParseCompoundStatement(ParsedAttributes &Attr, 1465 bool isStmtExpr = false); 1466 StmtResult ParseCompoundStatement(ParsedAttributes &Attr, 1467 bool isStmtExpr, 1468 unsigned ScopeFlags); 1469 StmtResult ParseCompoundStatementBody(bool isStmtExpr = false); 1470 bool ParseParenExprOrCondition(ExprResult &ExprResult, 1471 Decl *&DeclResult, 1472 SourceLocation Loc, 1473 bool ConvertToBoolean); 1474 StmtResult ParseIfStatement(ParsedAttributes &Attr); 1475 StmtResult ParseSwitchStatement(ParsedAttributes &Attr); 1476 StmtResult ParseWhileStatement(ParsedAttributes &Attr); 1477 StmtResult ParseDoStatement(ParsedAttributes &Attr); 1478 StmtResult ParseForStatement(ParsedAttributes &Attr); 1479 StmtResult ParseGotoStatement(ParsedAttributes &Attr); 1480 StmtResult ParseContinueStatement(ParsedAttributes &Attr); 1481 StmtResult ParseBreakStatement(ParsedAttributes &Attr); 1482 StmtResult ParseReturnStatement(ParsedAttributes &Attr); 1483 StmtResult ParseAsmStatement(bool &msAsm); 1484 StmtResult ParseMicrosoftAsmStatement(SourceLocation AsmLoc); 1485 bool ParseMicrosoftIfExistsCondition(bool& Result); 1486 void ParseMicrosoftIfExistsStatement(StmtVector &Stmts); 1487 void ParseMicrosoftIfExistsExternalDeclaration(); 1488 void ParseMicrosoftIfExistsClassDeclaration(DeclSpec::TST TagType, 1489 AccessSpecifier& CurAS); 1490 bool ParseAsmOperandsOpt(SmallVectorImpl<IdentifierInfo *> &Names, 1491 SmallVectorImpl<Expr *> &Constraints, 1492 SmallVectorImpl<Expr *> &Exprs); 1493 1494 //===--------------------------------------------------------------------===// 1495 // C++ 6: Statements and Blocks 1496 1497 StmtResult ParseCXXTryBlock(ParsedAttributes &Attr); 1498 StmtResult ParseCXXTryBlockCommon(SourceLocation TryLoc); 1499 StmtResult ParseCXXCatchBlock(); 1500 1501 //===--------------------------------------------------------------------===// 1502 // MS: SEH Statements and Blocks 1503 1504 StmtResult ParseSEHTryBlock(ParsedAttributes &Attr); 1505 StmtResult ParseSEHTryBlockCommon(SourceLocation Loc); 1506 StmtResult ParseSEHExceptBlock(SourceLocation Loc); 1507 StmtResult ParseSEHFinallyBlock(SourceLocation Loc); 1508 1509 //===--------------------------------------------------------------------===// 1510 // Objective-C Statements 1511 1512 StmtResult ParseObjCAtStatement(SourceLocation atLoc); 1513 StmtResult ParseObjCTryStmt(SourceLocation atLoc); 1514 StmtResult ParseObjCThrowStmt(SourceLocation atLoc); 1515 StmtResult ParseObjCSynchronizedStmt(SourceLocation atLoc); 1516 StmtResult ParseObjCAutoreleasePoolStmt(SourceLocation atLoc); 1517 1518 1519 //===--------------------------------------------------------------------===// 1520 // C99 6.7: Declarations. 1521 1522 /// A context for parsing declaration specifiers. TODO: flesh this 1523 /// out, there are other significant restrictions on specifiers than 1524 /// would be best implemented in the parser. 1525 enum DeclSpecContext { 1526 DSC_normal, // normal context 1527 DSC_class, // class context, enables 'friend' 1528 DSC_top_level // top-level/namespace declaration context 1529 }; 1530 1531 /// Information on a C++0x for-range-initializer found while parsing a 1532 /// declaration which turns out to be a for-range-declaration. 1533 struct ForRangeInit { 1534 SourceLocation ColonLoc; 1535 ExprResult RangeExpr; 1536 1537 bool ParsedForRangeDecl() { return !ColonLoc.isInvalid(); } 1538 }; 1539 1540 DeclGroupPtrTy ParseDeclaration(StmtVector &Stmts, 1541 unsigned Context, SourceLocation &DeclEnd, 1542 ParsedAttributesWithRange &attrs); 1543 DeclGroupPtrTy ParseSimpleDeclaration(StmtVector &Stmts, 1544 unsigned Context, 1545 SourceLocation &DeclEnd, 1546 ParsedAttributes &attrs, 1547 bool RequireSemi, 1548 ForRangeInit *FRI = 0); 1549 DeclGroupPtrTy ParseDeclGroup(ParsingDeclSpec &DS, unsigned Context, 1550 bool AllowFunctionDefinitions, 1551 SourceLocation *DeclEnd = 0, 1552 ForRangeInit *FRI = 0); 1553 Decl *ParseDeclarationAfterDeclarator(Declarator &D, 1554 const ParsedTemplateInfo &TemplateInfo = ParsedTemplateInfo()); 1555 bool ParseAttributesAfterDeclarator(Declarator &D); 1556 Decl *ParseDeclarationAfterDeclaratorAndAttributes(Declarator &D, 1557 const ParsedTemplateInfo &TemplateInfo = ParsedTemplateInfo()); 1558 Decl *ParseFunctionStatementBody(Decl *Decl, ParseScope &BodyScope); 1559 Decl *ParseFunctionTryBlock(Decl *Decl, ParseScope &BodyScope); 1560 1561 /// \brief When in code-completion, skip parsing of the function/method body 1562 /// unless the body contains the code-completion point. 1563 /// 1564 /// \returns true if the function body was skipped. 1565 bool trySkippingFunctionBodyForCodeCompletion(); 1566 1567 bool ParseImplicitInt(DeclSpec &DS, CXXScopeSpec *SS, 1568 const ParsedTemplateInfo &TemplateInfo, 1569 AccessSpecifier AS); 1570 DeclSpecContext getDeclSpecContextFromDeclaratorContext(unsigned Context); 1571 void ParseDeclarationSpecifiers(DeclSpec &DS, 1572 const ParsedTemplateInfo &TemplateInfo = ParsedTemplateInfo(), 1573 AccessSpecifier AS = AS_none, 1574 DeclSpecContext DSC = DSC_normal); 1575 bool ParseOptionalTypeSpecifier(DeclSpec &DS, bool &isInvalid, 1576 const char *&PrevSpec, 1577 unsigned &DiagID, 1578 const ParsedTemplateInfo &TemplateInfo = ParsedTemplateInfo(), 1579 bool SuppressDeclarations = false); 1580 1581 void ParseSpecifierQualifierList(DeclSpec &DS, AccessSpecifier AS = AS_none); 1582 1583 void ParseObjCTypeQualifierList(ObjCDeclSpec &DS, 1584 Declarator::TheContext Context); 1585 1586 void ParseEnumSpecifier(SourceLocation TagLoc, DeclSpec &DS, 1587 const ParsedTemplateInfo &TemplateInfo = ParsedTemplateInfo(), 1588 AccessSpecifier AS = AS_none); 1589 void ParseEnumBody(SourceLocation StartLoc, Decl *TagDecl); 1590 void ParseStructUnionBody(SourceLocation StartLoc, unsigned TagType, 1591 Decl *TagDecl); 1592 1593 struct FieldCallback { 1594 virtual Decl *invoke(FieldDeclarator &Field) = 0; 1595 virtual ~FieldCallback() {} 1596 1597 private: 1598 virtual void _anchor(); 1599 }; 1600 struct ObjCPropertyCallback; 1601 1602 void ParseStructDeclaration(DeclSpec &DS, FieldCallback &Callback); 1603 1604 bool isDeclarationSpecifier(bool DisambiguatingWithExpression = false); 1605 bool isTypeSpecifierQualifier(); 1606 bool isTypeQualifier() const; 1607 1608 /// isKnownToBeTypeSpecifier - Return true if we know that the specified token 1609 /// is definitely a type-specifier. Return false if it isn't part of a type 1610 /// specifier or if we're not sure. 1611 bool isKnownToBeTypeSpecifier(const Token &Tok) const; 1612 1613 /// isDeclarationStatement - Disambiguates between a declaration or an 1614 /// expression statement, when parsing function bodies. 1615 /// Returns true for declaration, false for expression. 1616 bool isDeclarationStatement() { 1617 if (getLang().CPlusPlus) 1618 return isCXXDeclarationStatement(); 1619 return isDeclarationSpecifier(true); 1620 } 1621 1622 /// isSimpleDeclaration - Disambiguates between a declaration or an 1623 /// expression, mainly used for the C 'clause-1' or the C++ 1624 // 'for-init-statement' part of a 'for' statement. 1625 /// Returns true for declaration, false for expression. 1626 bool isSimpleDeclaration() { 1627 if (getLang().CPlusPlus) 1628 return isCXXSimpleDeclaration(); 1629 return isDeclarationSpecifier(true); 1630 } 1631 1632 /// \brief Determine whether we are currently at the start of an Objective-C 1633 /// class message that appears to be missing the open bracket '['. 1634 bool isStartOfObjCClassMessageMissingOpenBracket(); 1635 1636 /// \brief Starting with a scope specifier, identifier, or 1637 /// template-id that refers to the current class, determine whether 1638 /// this is a constructor declarator. 1639 bool isConstructorDeclarator(); 1640 1641 /// \brief Specifies the context in which type-id/expression 1642 /// disambiguation will occur. 1643 enum TentativeCXXTypeIdContext { 1644 TypeIdInParens, 1645 TypeIdAsTemplateArgument 1646 }; 1647 1648 1649 /// isTypeIdInParens - Assumes that a '(' was parsed and now we want to know 1650 /// whether the parens contain an expression or a type-id. 1651 /// Returns true for a type-id and false for an expression. 1652 bool isTypeIdInParens(bool &isAmbiguous) { 1653 if (getLang().CPlusPlus) 1654 return isCXXTypeId(TypeIdInParens, isAmbiguous); 1655 isAmbiguous = false; 1656 return isTypeSpecifierQualifier(); 1657 } 1658 bool isTypeIdInParens() { 1659 bool isAmbiguous; 1660 return isTypeIdInParens(isAmbiguous); 1661 } 1662 1663 /// isCXXDeclarationStatement - C++-specialized function that disambiguates 1664 /// between a declaration or an expression statement, when parsing function 1665 /// bodies. Returns true for declaration, false for expression. 1666 bool isCXXDeclarationStatement(); 1667 1668 /// isCXXSimpleDeclaration - C++-specialized function that disambiguates 1669 /// between a simple-declaration or an expression-statement. 1670 /// If during the disambiguation process a parsing error is encountered, 1671 /// the function returns true to let the declaration parsing code handle it. 1672 /// Returns false if the statement is disambiguated as expression. 1673 bool isCXXSimpleDeclaration(); 1674 1675 /// isCXXFunctionDeclarator - Disambiguates between a function declarator or 1676 /// a constructor-style initializer, when parsing declaration statements. 1677 /// Returns true for function declarator and false for constructor-style 1678 /// initializer. If 'warnIfAmbiguous' is true a warning will be emitted to 1679 /// indicate that the parens were disambiguated as function declarator. 1680 /// If during the disambiguation process a parsing error is encountered, 1681 /// the function returns true to let the declaration parsing code handle it. 1682 bool isCXXFunctionDeclarator(bool warnIfAmbiguous); 1683 1684 /// isCXXConditionDeclaration - Disambiguates between a declaration or an 1685 /// expression for a condition of a if/switch/while/for statement. 1686 /// If during the disambiguation process a parsing error is encountered, 1687 /// the function returns true to let the declaration parsing code handle it. 1688 bool isCXXConditionDeclaration(); 1689 1690 bool isCXXTypeId(TentativeCXXTypeIdContext Context, bool &isAmbiguous); 1691 bool isCXXTypeId(TentativeCXXTypeIdContext Context) { 1692 bool isAmbiguous; 1693 return isCXXTypeId(Context, isAmbiguous); 1694 } 1695 1696 /// TPResult - Used as the result value for functions whose purpose is to 1697 /// disambiguate C++ constructs by "tentatively parsing" them. 1698 /// This is a class instead of a simple enum because the implicit enum-to-bool 1699 /// conversions may cause subtle bugs. 1700 class TPResult { 1701 enum Result { 1702 TPR_true, 1703 TPR_false, 1704 TPR_ambiguous, 1705 TPR_error 1706 }; 1707 Result Res; 1708 TPResult(Result result) : Res(result) {} 1709 public: 1710 static TPResult True() { return TPR_true; } 1711 static TPResult False() { return TPR_false; } 1712 static TPResult Ambiguous() { return TPR_ambiguous; } 1713 static TPResult Error() { return TPR_error; } 1714 1715 bool operator==(const TPResult &RHS) const { return Res == RHS.Res; } 1716 bool operator!=(const TPResult &RHS) const { return Res != RHS.Res; } 1717 }; 1718 1719 /// \brief Based only on the given token kind, determine whether we know that 1720 /// we're at the start of an expression or a type-specifier-seq (which may 1721 /// be an expression, in C++). 1722 /// 1723 /// This routine does not attempt to resolve any of the trick cases, e.g., 1724 /// those involving lookup of identifiers. 1725 /// 1726 /// \returns \c TPR_true if this token starts an expression, \c TPR_false if 1727 /// this token starts a type-specifier-seq, or \c TPR_ambiguous if it cannot 1728 /// tell. 1729 TPResult isExpressionOrTypeSpecifierSimple(tok::TokenKind Kind); 1730 1731 /// isCXXDeclarationSpecifier - Returns TPResult::True() if it is a 1732 /// declaration specifier, TPResult::False() if it is not, 1733 /// TPResult::Ambiguous() if it could be either a decl-specifier or a 1734 /// function-style cast, and TPResult::Error() if a parsing error was 1735 /// encountered. 1736 /// Doesn't consume tokens. 1737 TPResult isCXXDeclarationSpecifier(); 1738 1739 // "Tentative parsing" functions, used for disambiguation. If a parsing error 1740 // is encountered they will return TPResult::Error(). 1741 // Returning TPResult::True()/False() indicates that the ambiguity was 1742 // resolved and tentative parsing may stop. TPResult::Ambiguous() indicates 1743 // that more tentative parsing is necessary for disambiguation. 1744 // They all consume tokens, so backtracking should be used after calling them. 1745 1746 TPResult TryParseDeclarationSpecifier(); 1747 TPResult TryParseSimpleDeclaration(); 1748 TPResult TryParseTypeofSpecifier(); 1749 TPResult TryParseProtocolQualifiers(); 1750 TPResult TryParseInitDeclaratorList(); 1751 TPResult TryParseDeclarator(bool mayBeAbstract, bool mayHaveIdentifier=true); 1752 TPResult TryParseParameterDeclarationClause(); 1753 TPResult TryParseFunctionDeclarator(); 1754 TPResult TryParseBracketDeclarator(); 1755 1756 TypeResult ParseTypeName(SourceRange *Range = 0, 1757 Declarator::TheContext Context 1758 = Declarator::TypeNameContext, 1759 AccessSpecifier AS = AS_none, 1760 Decl **OwnedType = 0); 1761 void ParseBlockId(); 1762 1763 void ProhibitAttributes(ParsedAttributesWithRange &attrs) { 1764 if (!attrs.Range.isValid()) return; 1765 DiagnoseProhibitedAttributes(attrs); 1766 } 1767 void DiagnoseProhibitedAttributes(ParsedAttributesWithRange &attrs); 1768 1769 void MaybeParseGNUAttributes(Declarator &D, 1770 LateParsedAttrList *LateAttrs = 0) { 1771 if (Tok.is(tok::kw___attribute)) { 1772 ParsedAttributes attrs(AttrFactory); 1773 SourceLocation endLoc; 1774 ParseGNUAttributes(attrs, &endLoc, LateAttrs); 1775 D.takeAttributes(attrs, endLoc); 1776 } 1777 } 1778 void MaybeParseGNUAttributes(ParsedAttributes &attrs, 1779 SourceLocation *endLoc = 0, 1780 LateParsedAttrList *LateAttrs = 0) { 1781 if (Tok.is(tok::kw___attribute)) 1782 ParseGNUAttributes(attrs, endLoc, LateAttrs); 1783 } 1784 void ParseGNUAttributes(ParsedAttributes &attrs, 1785 SourceLocation *endLoc = 0, 1786 LateParsedAttrList *LateAttrs = 0); 1787 void ParseGNUAttributeArgs(IdentifierInfo *AttrName, 1788 SourceLocation AttrNameLoc, 1789 ParsedAttributes &Attrs, 1790 SourceLocation *EndLoc); 1791 1792 void MaybeParseCXX0XAttributes(Declarator &D) { 1793 if (getLang().CPlusPlus0x && isCXX0XAttributeSpecifier()) { 1794 ParsedAttributesWithRange attrs(AttrFactory); 1795 SourceLocation endLoc; 1796 ParseCXX0XAttributes(attrs, &endLoc); 1797 D.takeAttributes(attrs, endLoc); 1798 } 1799 } 1800 void MaybeParseCXX0XAttributes(ParsedAttributes &attrs, 1801 SourceLocation *endLoc = 0) { 1802 if (getLang().CPlusPlus0x && isCXX0XAttributeSpecifier()) { 1803 ParsedAttributesWithRange attrsWithRange(AttrFactory); 1804 ParseCXX0XAttributes(attrsWithRange, endLoc); 1805 attrs.takeAllFrom(attrsWithRange); 1806 } 1807 } 1808 void MaybeParseCXX0XAttributes(ParsedAttributesWithRange &attrs, 1809 SourceLocation *endLoc = 0) { 1810 if (getLang().CPlusPlus0x && isCXX0XAttributeSpecifier()) 1811 ParseCXX0XAttributes(attrs, endLoc); 1812 } 1813 1814 void ParseCXX0XAttributeSpecifier(ParsedAttributes &attrs, 1815 SourceLocation *EndLoc = 0); 1816 void ParseCXX0XAttributes(ParsedAttributesWithRange &attrs, 1817 SourceLocation *EndLoc = 0); 1818 1819 void MaybeParseMicrosoftAttributes(ParsedAttributes &attrs, 1820 SourceLocation *endLoc = 0) { 1821 if (getLang().MicrosoftExt && Tok.is(tok::l_square)) 1822 ParseMicrosoftAttributes(attrs, endLoc); 1823 } 1824 void ParseMicrosoftAttributes(ParsedAttributes &attrs, 1825 SourceLocation *endLoc = 0); 1826 void ParseMicrosoftDeclSpec(ParsedAttributes &attrs); 1827 void ParseMicrosoftTypeAttributes(ParsedAttributes &attrs); 1828 void ParseBorlandTypeAttributes(ParsedAttributes &attrs); 1829 void ParseOpenCLAttributes(ParsedAttributes &attrs); 1830 void ParseOpenCLQualifiers(DeclSpec &DS); 1831 1832 VersionTuple ParseVersionTuple(SourceRange &Range); 1833 void ParseAvailabilityAttribute(IdentifierInfo &Availability, 1834 SourceLocation AvailabilityLoc, 1835 ParsedAttributes &attrs, 1836 SourceLocation *endLoc); 1837 1838 bool IsThreadSafetyAttribute(llvm::StringRef AttrName); 1839 void ParseThreadSafetyAttribute(IdentifierInfo &AttrName, 1840 SourceLocation AttrNameLoc, 1841 ParsedAttributes &Attrs, 1842 SourceLocation *EndLoc); 1843 1844 1845 void ParseTypeofSpecifier(DeclSpec &DS); 1846 void ParseDecltypeSpecifier(DeclSpec &DS); 1847 void ParseUnderlyingTypeSpecifier(DeclSpec &DS); 1848 void ParseAtomicSpecifier(DeclSpec &DS); 1849 1850 ExprResult ParseAlignArgument(SourceLocation Start); 1851 void ParseAlignmentSpecifier(ParsedAttributes &Attrs, 1852 SourceLocation *endLoc = 0); 1853 1854 VirtSpecifiers::Specifier isCXX0XVirtSpecifier() const; 1855 void ParseOptionalCXX0XVirtSpecifierSeq(VirtSpecifiers &VS); 1856 1857 bool isCXX0XFinalKeyword() const; 1858 1859 /// DeclaratorScopeObj - RAII object used in Parser::ParseDirectDeclarator to 1860 /// enter a new C++ declarator scope and exit it when the function is 1861 /// finished. 1862 class DeclaratorScopeObj { 1863 Parser &P; 1864 CXXScopeSpec &SS; 1865 bool EnteredScope; 1866 bool CreatedScope; 1867 public: 1868 DeclaratorScopeObj(Parser &p, CXXScopeSpec &ss) 1869 : P(p), SS(ss), EnteredScope(false), CreatedScope(false) {} 1870 1871 void EnterDeclaratorScope() { 1872 assert(!EnteredScope && "Already entered the scope!"); 1873 assert(SS.isSet() && "C++ scope was not set!"); 1874 1875 CreatedScope = true; 1876 P.EnterScope(0); // Not a decl scope. 1877 1878 if (!P.Actions.ActOnCXXEnterDeclaratorScope(P.getCurScope(), SS)) 1879 EnteredScope = true; 1880 } 1881 1882 ~DeclaratorScopeObj() { 1883 if (EnteredScope) { 1884 assert(SS.isSet() && "C++ scope was cleared ?"); 1885 P.Actions.ActOnCXXExitDeclaratorScope(P.getCurScope(), SS); 1886 } 1887 if (CreatedScope) 1888 P.ExitScope(); 1889 } 1890 }; 1891 1892 /// ParseDeclarator - Parse and verify a newly-initialized declarator. 1893 void ParseDeclarator(Declarator &D); 1894 /// A function that parses a variant of direct-declarator. 1895 typedef void (Parser::*DirectDeclParseFunction)(Declarator&); 1896 void ParseDeclaratorInternal(Declarator &D, 1897 DirectDeclParseFunction DirectDeclParser); 1898 1899 void ParseTypeQualifierListOpt(DeclSpec &DS, bool GNUAttributesAllowed = true, 1900 bool CXX0XAttributesAllowed = true); 1901 void ParseDirectDeclarator(Declarator &D); 1902 void ParseParenDeclarator(Declarator &D); 1903 void ParseFunctionDeclarator(Declarator &D, 1904 ParsedAttributes &attrs, 1905 BalancedDelimiterTracker &Tracker, 1906 bool RequiresArg = false); 1907 bool isFunctionDeclaratorIdentifierList(); 1908 void ParseFunctionDeclaratorIdentifierList( 1909 Declarator &D, 1910 SmallVector<DeclaratorChunk::ParamInfo, 16> &ParamInfo); 1911 void ParseParameterDeclarationClause( 1912 Declarator &D, 1913 ParsedAttributes &attrs, 1914 SmallVector<DeclaratorChunk::ParamInfo, 16> &ParamInfo, 1915 SourceLocation &EllipsisLoc); 1916 void ParseBracketDeclarator(Declarator &D); 1917 1918 //===--------------------------------------------------------------------===// 1919 // C++ 7: Declarations [dcl.dcl] 1920 1921 bool isCXX0XAttributeSpecifier(bool FullLookahead = false, 1922 tok::TokenKind *After = 0); 1923 1924 Decl *ParseNamespace(unsigned Context, SourceLocation &DeclEnd, 1925 SourceLocation InlineLoc = SourceLocation()); 1926 void ParseInnerNamespace(std::vector<SourceLocation>& IdentLoc, 1927 std::vector<IdentifierInfo*>& Ident, 1928 std::vector<SourceLocation>& NamespaceLoc, 1929 unsigned int index, SourceLocation& InlineLoc, 1930 ParsedAttributes& attrs, 1931 BalancedDelimiterTracker &Tracker); 1932 Decl *ParseLinkage(ParsingDeclSpec &DS, unsigned Context); 1933 Decl *ParseUsingDirectiveOrDeclaration(unsigned Context, 1934 const ParsedTemplateInfo &TemplateInfo, 1935 SourceLocation &DeclEnd, 1936 ParsedAttributesWithRange &attrs, 1937 Decl **OwnedType = 0); 1938 Decl *ParseUsingDirective(unsigned Context, 1939 SourceLocation UsingLoc, 1940 SourceLocation &DeclEnd, 1941 ParsedAttributes &attrs); 1942 Decl *ParseUsingDeclaration(unsigned Context, 1943 const ParsedTemplateInfo &TemplateInfo, 1944 SourceLocation UsingLoc, 1945 SourceLocation &DeclEnd, 1946 AccessSpecifier AS = AS_none, 1947 Decl **OwnedType = 0); 1948 Decl *ParseStaticAssertDeclaration(SourceLocation &DeclEnd); 1949 Decl *ParseNamespaceAlias(SourceLocation NamespaceLoc, 1950 SourceLocation AliasLoc, IdentifierInfo *Alias, 1951 SourceLocation &DeclEnd); 1952 1953 //===--------------------------------------------------------------------===// 1954 // C++ 9: classes [class] and C structs/unions. 1955 TypeResult ParseClassName(SourceLocation &EndLocation, CXXScopeSpec &SS); 1956 void ParseClassSpecifier(tok::TokenKind TagTokKind, SourceLocation TagLoc, 1957 DeclSpec &DS, 1958 const ParsedTemplateInfo &TemplateInfo = ParsedTemplateInfo(), 1959 AccessSpecifier AS = AS_none, 1960 bool SuppressDeclarations = false); 1961 void ParseCXXMemberSpecification(SourceLocation StartLoc, unsigned TagType, 1962 Decl *TagDecl); 1963 ExprResult ParseCXXMemberInitializer(bool IsFunction, 1964 SourceLocation &EqualLoc); 1965 void ParseCXXClassMemberDeclaration(AccessSpecifier AS, AttributeList *Attr, 1966 const ParsedTemplateInfo &TemplateInfo = ParsedTemplateInfo(), 1967 ParsingDeclRAIIObject *DiagsFromTParams = 0); 1968 void ParseConstructorInitializer(Decl *ConstructorDecl); 1969 MemInitResult ParseMemInitializer(Decl *ConstructorDecl); 1970 void HandleMemberFunctionDefaultArgs(Declarator& DeclaratorInfo, 1971 Decl *ThisDecl); 1972 1973 //===--------------------------------------------------------------------===// 1974 // C++ 10: Derived classes [class.derived] 1975 void ParseBaseClause(Decl *ClassDecl); 1976 BaseResult ParseBaseSpecifier(Decl *ClassDecl); 1977 AccessSpecifier getAccessSpecifierIfPresent() const; 1978 1979 bool ParseUnqualifiedIdTemplateId(CXXScopeSpec &SS, 1980 IdentifierInfo *Name, 1981 SourceLocation NameLoc, 1982 bool EnteringContext, 1983 ParsedType ObjectType, 1984 UnqualifiedId &Id, 1985 bool AssumeTemplateId, 1986 SourceLocation TemplateKWLoc); 1987 bool ParseUnqualifiedIdOperator(CXXScopeSpec &SS, bool EnteringContext, 1988 ParsedType ObjectType, 1989 UnqualifiedId &Result); 1990 bool ParseUnqualifiedId(CXXScopeSpec &SS, bool EnteringContext, 1991 bool AllowDestructorName, 1992 bool AllowConstructorName, 1993 ParsedType ObjectType, 1994 UnqualifiedId &Result); 1995 1996 //===--------------------------------------------------------------------===// 1997 // C++ 14: Templates [temp] 1998 1999 // C++ 14.1: Template Parameters [temp.param] 2000 Decl *ParseDeclarationStartingWithTemplate(unsigned Context, 2001 SourceLocation &DeclEnd, 2002 AccessSpecifier AS = AS_none, 2003 AttributeList *AccessAttrs = 0); 2004 Decl *ParseTemplateDeclarationOrSpecialization(unsigned Context, 2005 SourceLocation &DeclEnd, 2006 AccessSpecifier AS, 2007 AttributeList *AccessAttrs); 2008 Decl *ParseSingleDeclarationAfterTemplate( 2009 unsigned Context, 2010 const ParsedTemplateInfo &TemplateInfo, 2011 ParsingDeclRAIIObject &DiagsFromParams, 2012 SourceLocation &DeclEnd, 2013 AccessSpecifier AS=AS_none, 2014 AttributeList *AccessAttrs = 0); 2015 bool ParseTemplateParameters(unsigned Depth, 2016 SmallVectorImpl<Decl*> &TemplateParams, 2017 SourceLocation &LAngleLoc, 2018 SourceLocation &RAngleLoc); 2019 bool ParseTemplateParameterList(unsigned Depth, 2020 SmallVectorImpl<Decl*> &TemplateParams); 2021 bool isStartOfTemplateTypeParameter(); 2022 Decl *ParseTemplateParameter(unsigned Depth, unsigned Position); 2023 Decl *ParseTypeParameter(unsigned Depth, unsigned Position); 2024 Decl *ParseTemplateTemplateParameter(unsigned Depth, unsigned Position); 2025 Decl *ParseNonTypeTemplateParameter(unsigned Depth, unsigned Position); 2026 // C++ 14.3: Template arguments [temp.arg] 2027 typedef SmallVector<ParsedTemplateArgument, 16> TemplateArgList; 2028 2029 bool ParseTemplateIdAfterTemplateName(TemplateTy Template, 2030 SourceLocation TemplateNameLoc, 2031 const CXXScopeSpec &SS, 2032 bool ConsumeLastToken, 2033 SourceLocation &LAngleLoc, 2034 TemplateArgList &TemplateArgs, 2035 SourceLocation &RAngleLoc); 2036 2037 bool AnnotateTemplateIdToken(TemplateTy Template, TemplateNameKind TNK, 2038 CXXScopeSpec &SS, 2039 UnqualifiedId &TemplateName, 2040 SourceLocation TemplateKWLoc = SourceLocation(), 2041 bool AllowTypeAnnotation = true); 2042 void AnnotateTemplateIdTokenAsType(); 2043 bool IsTemplateArgumentList(unsigned Skip = 0); 2044 bool ParseTemplateArgumentList(TemplateArgList &TemplateArgs); 2045 ParsedTemplateArgument ParseTemplateTemplateArgument(); 2046 ParsedTemplateArgument ParseTemplateArgument(); 2047 Decl *ParseExplicitInstantiation(SourceLocation ExternLoc, 2048 SourceLocation TemplateLoc, 2049 SourceLocation &DeclEnd); 2050 2051 //===--------------------------------------------------------------------===// 2052 // Modules 2053 DeclGroupPtrTy ParseModuleImport(); 2054 2055 //===--------------------------------------------------------------------===// 2056 // GNU G++: Type Traits [Type-Traits.html in the GCC manual] 2057 ExprResult ParseUnaryTypeTrait(); 2058 ExprResult ParseBinaryTypeTrait(); 2059 2060 //===--------------------------------------------------------------------===// 2061 // Embarcadero: Arary and Expression Traits 2062 ExprResult ParseArrayTypeTrait(); 2063 ExprResult ParseExpressionTrait(); 2064 2065 //===--------------------------------------------------------------------===// 2066 // Preprocessor code-completion pass-through 2067 virtual void CodeCompleteDirective(bool InConditional); 2068 virtual void CodeCompleteInConditionalExclusion(); 2069 virtual void CodeCompleteMacroName(bool IsDefinition); 2070 virtual void CodeCompletePreprocessorExpression(); 2071 virtual void CodeCompleteMacroArgument(IdentifierInfo *Macro, 2072 MacroInfo *MacroInfo, 2073 unsigned ArgumentIndex); 2074 virtual void CodeCompleteNaturalLanguage(); 2075 }; 2076 2077 } // end namespace clang 2078 2079 #endif 2080