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