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