1 //===--- ParseExprCXX.cpp - C++ Expression Parsing ------------------------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 // 9 // This file implements the Expression parsing implementation for C++. 10 // 11 //===----------------------------------------------------------------------===// 12 #include "clang/AST/ASTContext.h" 13 #include "clang/AST/Decl.h" 14 #include "clang/AST/DeclTemplate.h" 15 #include "clang/AST/ExprCXX.h" 16 #include "clang/Basic/PrettyStackTrace.h" 17 #include "clang/Basic/TokenKinds.h" 18 #include "clang/Lex/LiteralSupport.h" 19 #include "clang/Parse/ParseDiagnostic.h" 20 #include "clang/Parse/Parser.h" 21 #include "clang/Parse/RAIIObjectsForParser.h" 22 #include "clang/Sema/DeclSpec.h" 23 #include "clang/Sema/EnterExpressionEvaluationContext.h" 24 #include "clang/Sema/ParsedTemplate.h" 25 #include "clang/Sema/Scope.h" 26 #include "llvm/Support/Compiler.h" 27 #include "llvm/Support/ErrorHandling.h" 28 #include <numeric> 29 30 using namespace clang; 31 32 static int SelectDigraphErrorMessage(tok::TokenKind Kind) { 33 switch (Kind) { 34 // template name 35 case tok::unknown: return 0; 36 // casts 37 case tok::kw_addrspace_cast: return 1; 38 case tok::kw_const_cast: return 2; 39 case tok::kw_dynamic_cast: return 3; 40 case tok::kw_reinterpret_cast: return 4; 41 case tok::kw_static_cast: return 5; 42 default: 43 llvm_unreachable("Unknown type for digraph error message."); 44 } 45 } 46 47 // Are the two tokens adjacent in the same source file? 48 bool Parser::areTokensAdjacent(const Token &First, const Token &Second) { 49 SourceManager &SM = PP.getSourceManager(); 50 SourceLocation FirstLoc = SM.getSpellingLoc(First.getLocation()); 51 SourceLocation FirstEnd = FirstLoc.getLocWithOffset(First.getLength()); 52 return FirstEnd == SM.getSpellingLoc(Second.getLocation()); 53 } 54 55 // Suggest fixit for "<::" after a cast. 56 static void FixDigraph(Parser &P, Preprocessor &PP, Token &DigraphToken, 57 Token &ColonToken, tok::TokenKind Kind, bool AtDigraph) { 58 // Pull '<:' and ':' off token stream. 59 if (!AtDigraph) 60 PP.Lex(DigraphToken); 61 PP.Lex(ColonToken); 62 63 SourceRange Range; 64 Range.setBegin(DigraphToken.getLocation()); 65 Range.setEnd(ColonToken.getLocation()); 66 P.Diag(DigraphToken.getLocation(), diag::err_missing_whitespace_digraph) 67 << SelectDigraphErrorMessage(Kind) 68 << FixItHint::CreateReplacement(Range, "< ::"); 69 70 // Update token information to reflect their change in token type. 71 ColonToken.setKind(tok::coloncolon); 72 ColonToken.setLocation(ColonToken.getLocation().getLocWithOffset(-1)); 73 ColonToken.setLength(2); 74 DigraphToken.setKind(tok::less); 75 DigraphToken.setLength(1); 76 77 // Push new tokens back to token stream. 78 PP.EnterToken(ColonToken, /*IsReinject*/ true); 79 if (!AtDigraph) 80 PP.EnterToken(DigraphToken, /*IsReinject*/ true); 81 } 82 83 // Check for '<::' which should be '< ::' instead of '[:' when following 84 // a template name. 85 void Parser::CheckForTemplateAndDigraph(Token &Next, ParsedType ObjectType, 86 bool EnteringContext, 87 IdentifierInfo &II, CXXScopeSpec &SS) { 88 if (!Next.is(tok::l_square) || Next.getLength() != 2) 89 return; 90 91 Token SecondToken = GetLookAheadToken(2); 92 if (!SecondToken.is(tok::colon) || !areTokensAdjacent(Next, SecondToken)) 93 return; 94 95 TemplateTy Template; 96 UnqualifiedId TemplateName; 97 TemplateName.setIdentifier(&II, Tok.getLocation()); 98 bool MemberOfUnknownSpecialization; 99 if (!Actions.isTemplateName(getCurScope(), SS, /*hasTemplateKeyword=*/false, 100 TemplateName, ObjectType, EnteringContext, 101 Template, MemberOfUnknownSpecialization)) 102 return; 103 104 FixDigraph(*this, PP, Next, SecondToken, tok::unknown, 105 /*AtDigraph*/false); 106 } 107 108 /// Parse global scope or nested-name-specifier if present. 109 /// 110 /// Parses a C++ global scope specifier ('::') or nested-name-specifier (which 111 /// may be preceded by '::'). Note that this routine will not parse ::new or 112 /// ::delete; it will just leave them in the token stream. 113 /// 114 /// '::'[opt] nested-name-specifier 115 /// '::' 116 /// 117 /// nested-name-specifier: 118 /// type-name '::' 119 /// namespace-name '::' 120 /// nested-name-specifier identifier '::' 121 /// nested-name-specifier 'template'[opt] simple-template-id '::' 122 /// 123 /// 124 /// \param SS the scope specifier that will be set to the parsed 125 /// nested-name-specifier (or empty) 126 /// 127 /// \param ObjectType if this nested-name-specifier is being parsed following 128 /// the "." or "->" of a member access expression, this parameter provides the 129 /// type of the object whose members are being accessed. 130 /// 131 /// \param ObjectHadErrors if this unqualified-id occurs within a member access 132 /// expression, indicates whether the original subexpressions had any errors. 133 /// When true, diagnostics for missing 'template' keyword will be supressed. 134 /// 135 /// \param EnteringContext whether we will be entering into the context of 136 /// the nested-name-specifier after parsing it. 137 /// 138 /// \param MayBePseudoDestructor When non-NULL, points to a flag that 139 /// indicates whether this nested-name-specifier may be part of a 140 /// pseudo-destructor name. In this case, the flag will be set false 141 /// if we don't actually end up parsing a destructor name. Moreover, 142 /// if we do end up determining that we are parsing a destructor name, 143 /// the last component of the nested-name-specifier is not parsed as 144 /// part of the scope specifier. 145 /// 146 /// \param IsTypename If \c true, this nested-name-specifier is known to be 147 /// part of a type name. This is used to improve error recovery. 148 /// 149 /// \param LastII When non-NULL, points to an IdentifierInfo* that will be 150 /// filled in with the leading identifier in the last component of the 151 /// nested-name-specifier, if any. 152 /// 153 /// \param OnlyNamespace If true, only considers namespaces in lookup. 154 /// 155 /// 156 /// \returns true if there was an error parsing a scope specifier 157 bool Parser::ParseOptionalCXXScopeSpecifier( 158 CXXScopeSpec &SS, ParsedType ObjectType, bool ObjectHadErrors, 159 bool EnteringContext, bool *MayBePseudoDestructor, bool IsTypename, 160 IdentifierInfo **LastII, bool OnlyNamespace, bool InUsingDeclaration) { 161 assert(getLangOpts().CPlusPlus && 162 "Call sites of this function should be guarded by checking for C++"); 163 164 if (Tok.is(tok::annot_cxxscope)) { 165 assert(!LastII && "want last identifier but have already annotated scope"); 166 assert(!MayBePseudoDestructor && "unexpected annot_cxxscope"); 167 Actions.RestoreNestedNameSpecifierAnnotation(Tok.getAnnotationValue(), 168 Tok.getAnnotationRange(), 169 SS); 170 ConsumeAnnotationToken(); 171 return false; 172 } 173 174 // Has to happen before any "return false"s in this function. 175 bool CheckForDestructor = false; 176 if (MayBePseudoDestructor && *MayBePseudoDestructor) { 177 CheckForDestructor = true; 178 *MayBePseudoDestructor = false; 179 } 180 181 if (LastII) 182 *LastII = nullptr; 183 184 bool HasScopeSpecifier = false; 185 186 if (Tok.is(tok::coloncolon)) { 187 // ::new and ::delete aren't nested-name-specifiers. 188 tok::TokenKind NextKind = NextToken().getKind(); 189 if (NextKind == tok::kw_new || NextKind == tok::kw_delete) 190 return false; 191 192 if (NextKind == tok::l_brace) { 193 // It is invalid to have :: {, consume the scope qualifier and pretend 194 // like we never saw it. 195 Diag(ConsumeToken(), diag::err_expected) << tok::identifier; 196 } else { 197 // '::' - Global scope qualifier. 198 if (Actions.ActOnCXXGlobalScopeSpecifier(ConsumeToken(), SS)) 199 return true; 200 201 HasScopeSpecifier = true; 202 } 203 } 204 205 if (Tok.is(tok::kw___super)) { 206 SourceLocation SuperLoc = ConsumeToken(); 207 if (!Tok.is(tok::coloncolon)) { 208 Diag(Tok.getLocation(), diag::err_expected_coloncolon_after_super); 209 return true; 210 } 211 212 return Actions.ActOnSuperScopeSpecifier(SuperLoc, ConsumeToken(), SS); 213 } 214 215 if (!HasScopeSpecifier && 216 Tok.isOneOf(tok::kw_decltype, tok::annot_decltype)) { 217 DeclSpec DS(AttrFactory); 218 SourceLocation DeclLoc = Tok.getLocation(); 219 SourceLocation EndLoc = ParseDecltypeSpecifier(DS); 220 221 SourceLocation CCLoc; 222 // Work around a standard defect: 'decltype(auto)::' is not a 223 // nested-name-specifier. 224 if (DS.getTypeSpecType() == DeclSpec::TST_decltype_auto || 225 !TryConsumeToken(tok::coloncolon, CCLoc)) { 226 AnnotateExistingDecltypeSpecifier(DS, DeclLoc, EndLoc); 227 return false; 228 } 229 230 if (Actions.ActOnCXXNestedNameSpecifierDecltype(SS, DS, CCLoc)) 231 SS.SetInvalid(SourceRange(DeclLoc, CCLoc)); 232 233 HasScopeSpecifier = true; 234 } 235 236 // Preferred type might change when parsing qualifiers, we need the original. 237 auto SavedType = PreferredType; 238 while (true) { 239 if (HasScopeSpecifier) { 240 if (Tok.is(tok::code_completion)) { 241 cutOffParsing(); 242 // Code completion for a nested-name-specifier, where the code 243 // completion token follows the '::'. 244 Actions.CodeCompleteQualifiedId(getCurScope(), SS, EnteringContext, 245 InUsingDeclaration, ObjectType.get(), 246 SavedType.get(SS.getBeginLoc())); 247 // Include code completion token into the range of the scope otherwise 248 // when we try to annotate the scope tokens the dangling code completion 249 // token will cause assertion in 250 // Preprocessor::AnnotatePreviousCachedTokens. 251 SS.setEndLoc(Tok.getLocation()); 252 return true; 253 } 254 255 // C++ [basic.lookup.classref]p5: 256 // If the qualified-id has the form 257 // 258 // ::class-name-or-namespace-name::... 259 // 260 // the class-name-or-namespace-name is looked up in global scope as a 261 // class-name or namespace-name. 262 // 263 // To implement this, we clear out the object type as soon as we've 264 // seen a leading '::' or part of a nested-name-specifier. 265 ObjectType = nullptr; 266 } 267 268 // nested-name-specifier: 269 // nested-name-specifier 'template'[opt] simple-template-id '::' 270 271 // Parse the optional 'template' keyword, then make sure we have 272 // 'identifier <' after it. 273 if (Tok.is(tok::kw_template)) { 274 // If we don't have a scope specifier or an object type, this isn't a 275 // nested-name-specifier, since they aren't allowed to start with 276 // 'template'. 277 if (!HasScopeSpecifier && !ObjectType) 278 break; 279 280 TentativeParsingAction TPA(*this); 281 SourceLocation TemplateKWLoc = ConsumeToken(); 282 283 UnqualifiedId TemplateName; 284 if (Tok.is(tok::identifier)) { 285 // Consume the identifier. 286 TemplateName.setIdentifier(Tok.getIdentifierInfo(), Tok.getLocation()); 287 ConsumeToken(); 288 } else if (Tok.is(tok::kw_operator)) { 289 // We don't need to actually parse the unqualified-id in this case, 290 // because a simple-template-id cannot start with 'operator', but 291 // go ahead and parse it anyway for consistency with the case where 292 // we already annotated the template-id. 293 if (ParseUnqualifiedIdOperator(SS, EnteringContext, ObjectType, 294 TemplateName)) { 295 TPA.Commit(); 296 break; 297 } 298 299 if (TemplateName.getKind() != UnqualifiedIdKind::IK_OperatorFunctionId && 300 TemplateName.getKind() != UnqualifiedIdKind::IK_LiteralOperatorId) { 301 Diag(TemplateName.getSourceRange().getBegin(), 302 diag::err_id_after_template_in_nested_name_spec) 303 << TemplateName.getSourceRange(); 304 TPA.Commit(); 305 break; 306 } 307 } else { 308 TPA.Revert(); 309 break; 310 } 311 312 // If the next token is not '<', we have a qualified-id that refers 313 // to a template name, such as T::template apply, but is not a 314 // template-id. 315 if (Tok.isNot(tok::less)) { 316 TPA.Revert(); 317 break; 318 } 319 320 // Commit to parsing the template-id. 321 TPA.Commit(); 322 TemplateTy Template; 323 TemplateNameKind TNK = Actions.ActOnTemplateName( 324 getCurScope(), SS, TemplateKWLoc, TemplateName, ObjectType, 325 EnteringContext, Template, /*AllowInjectedClassName*/ true); 326 if (AnnotateTemplateIdToken(Template, TNK, SS, TemplateKWLoc, 327 TemplateName, false)) 328 return true; 329 330 continue; 331 } 332 333 if (Tok.is(tok::annot_template_id) && NextToken().is(tok::coloncolon)) { 334 // We have 335 // 336 // template-id '::' 337 // 338 // So we need to check whether the template-id is a simple-template-id of 339 // the right kind (it should name a type or be dependent), and then 340 // convert it into a type within the nested-name-specifier. 341 TemplateIdAnnotation *TemplateId = takeTemplateIdAnnotation(Tok); 342 if (CheckForDestructor && GetLookAheadToken(2).is(tok::tilde)) { 343 *MayBePseudoDestructor = true; 344 return false; 345 } 346 347 if (LastII) 348 *LastII = TemplateId->Name; 349 350 // Consume the template-id token. 351 ConsumeAnnotationToken(); 352 353 assert(Tok.is(tok::coloncolon) && "NextToken() not working properly!"); 354 SourceLocation CCLoc = ConsumeToken(); 355 356 HasScopeSpecifier = true; 357 358 ASTTemplateArgsPtr TemplateArgsPtr(TemplateId->getTemplateArgs(), 359 TemplateId->NumArgs); 360 361 if (TemplateId->isInvalid() || 362 Actions.ActOnCXXNestedNameSpecifier(getCurScope(), 363 SS, 364 TemplateId->TemplateKWLoc, 365 TemplateId->Template, 366 TemplateId->TemplateNameLoc, 367 TemplateId->LAngleLoc, 368 TemplateArgsPtr, 369 TemplateId->RAngleLoc, 370 CCLoc, 371 EnteringContext)) { 372 SourceLocation StartLoc 373 = SS.getBeginLoc().isValid()? SS.getBeginLoc() 374 : TemplateId->TemplateNameLoc; 375 SS.SetInvalid(SourceRange(StartLoc, CCLoc)); 376 } 377 378 continue; 379 } 380 381 // The rest of the nested-name-specifier possibilities start with 382 // tok::identifier. 383 if (Tok.isNot(tok::identifier)) 384 break; 385 386 IdentifierInfo &II = *Tok.getIdentifierInfo(); 387 388 // nested-name-specifier: 389 // type-name '::' 390 // namespace-name '::' 391 // nested-name-specifier identifier '::' 392 Token Next = NextToken(); 393 Sema::NestedNameSpecInfo IdInfo(&II, Tok.getLocation(), Next.getLocation(), 394 ObjectType); 395 396 // If we get foo:bar, this is almost certainly a typo for foo::bar. Recover 397 // and emit a fixit hint for it. 398 if (Next.is(tok::colon) && !ColonIsSacred) { 399 if (Actions.IsInvalidUnlessNestedName(getCurScope(), SS, IdInfo, 400 EnteringContext) && 401 // If the token after the colon isn't an identifier, it's still an 402 // error, but they probably meant something else strange so don't 403 // recover like this. 404 PP.LookAhead(1).is(tok::identifier)) { 405 Diag(Next, diag::err_unexpected_colon_in_nested_name_spec) 406 << FixItHint::CreateReplacement(Next.getLocation(), "::"); 407 // Recover as if the user wrote '::'. 408 Next.setKind(tok::coloncolon); 409 } 410 } 411 412 if (Next.is(tok::coloncolon) && GetLookAheadToken(2).is(tok::l_brace)) { 413 // It is invalid to have :: {, consume the scope qualifier and pretend 414 // like we never saw it. 415 Token Identifier = Tok; // Stash away the identifier. 416 ConsumeToken(); // Eat the identifier, current token is now '::'. 417 Diag(PP.getLocForEndOfToken(ConsumeToken()), diag::err_expected) 418 << tok::identifier; 419 UnconsumeToken(Identifier); // Stick the identifier back. 420 Next = NextToken(); // Point Next at the '{' token. 421 } 422 423 if (Next.is(tok::coloncolon)) { 424 if (CheckForDestructor && GetLookAheadToken(2).is(tok::tilde)) { 425 *MayBePseudoDestructor = true; 426 return false; 427 } 428 429 if (ColonIsSacred) { 430 const Token &Next2 = GetLookAheadToken(2); 431 if (Next2.is(tok::kw_private) || Next2.is(tok::kw_protected) || 432 Next2.is(tok::kw_public) || Next2.is(tok::kw_virtual)) { 433 Diag(Next2, diag::err_unexpected_token_in_nested_name_spec) 434 << Next2.getName() 435 << FixItHint::CreateReplacement(Next.getLocation(), ":"); 436 Token ColonColon; 437 PP.Lex(ColonColon); 438 ColonColon.setKind(tok::colon); 439 PP.EnterToken(ColonColon, /*IsReinject*/ true); 440 break; 441 } 442 } 443 444 if (LastII) 445 *LastII = &II; 446 447 // We have an identifier followed by a '::'. Lookup this name 448 // as the name in a nested-name-specifier. 449 Token Identifier = Tok; 450 SourceLocation IdLoc = ConsumeToken(); 451 assert(Tok.isOneOf(tok::coloncolon, tok::colon) && 452 "NextToken() not working properly!"); 453 Token ColonColon = Tok; 454 SourceLocation CCLoc = ConsumeToken(); 455 456 bool IsCorrectedToColon = false; 457 bool *CorrectionFlagPtr = ColonIsSacred ? &IsCorrectedToColon : nullptr; 458 if (Actions.ActOnCXXNestedNameSpecifier( 459 getCurScope(), IdInfo, EnteringContext, SS, CorrectionFlagPtr, 460 OnlyNamespace)) { 461 // Identifier is not recognized as a nested name, but we can have 462 // mistyped '::' instead of ':'. 463 if (CorrectionFlagPtr && IsCorrectedToColon) { 464 ColonColon.setKind(tok::colon); 465 PP.EnterToken(Tok, /*IsReinject*/ true); 466 PP.EnterToken(ColonColon, /*IsReinject*/ true); 467 Tok = Identifier; 468 break; 469 } 470 SS.SetInvalid(SourceRange(IdLoc, CCLoc)); 471 } 472 HasScopeSpecifier = true; 473 continue; 474 } 475 476 CheckForTemplateAndDigraph(Next, ObjectType, EnteringContext, II, SS); 477 478 // nested-name-specifier: 479 // type-name '<' 480 if (Next.is(tok::less)) { 481 482 TemplateTy Template; 483 UnqualifiedId TemplateName; 484 TemplateName.setIdentifier(&II, Tok.getLocation()); 485 bool MemberOfUnknownSpecialization; 486 if (TemplateNameKind TNK = Actions.isTemplateName(getCurScope(), SS, 487 /*hasTemplateKeyword=*/false, 488 TemplateName, 489 ObjectType, 490 EnteringContext, 491 Template, 492 MemberOfUnknownSpecialization)) { 493 // If lookup didn't find anything, we treat the name as a template-name 494 // anyway. C++20 requires this, and in prior language modes it improves 495 // error recovery. But before we commit to this, check that we actually 496 // have something that looks like a template-argument-list next. 497 if (!IsTypename && TNK == TNK_Undeclared_template && 498 isTemplateArgumentList(1) == TPResult::False) 499 break; 500 501 // We have found a template name, so annotate this token 502 // with a template-id annotation. We do not permit the 503 // template-id to be translated into a type annotation, 504 // because some clients (e.g., the parsing of class template 505 // specializations) still want to see the original template-id 506 // token, and it might not be a type at all (e.g. a concept name in a 507 // type-constraint). 508 ConsumeToken(); 509 if (AnnotateTemplateIdToken(Template, TNK, SS, SourceLocation(), 510 TemplateName, false)) 511 return true; 512 continue; 513 } 514 515 if (MemberOfUnknownSpecialization && (ObjectType || SS.isSet()) && 516 (IsTypename || isTemplateArgumentList(1) == TPResult::True)) { 517 // If we had errors before, ObjectType can be dependent even without any 518 // templates. Do not report missing template keyword in that case. 519 if (!ObjectHadErrors) { 520 // We have something like t::getAs<T>, where getAs is a 521 // member of an unknown specialization. However, this will only 522 // parse correctly as a template, so suggest the keyword 'template' 523 // before 'getAs' and treat this as a dependent template name. 524 unsigned DiagID = diag::err_missing_dependent_template_keyword; 525 if (getLangOpts().MicrosoftExt) 526 DiagID = diag::warn_missing_dependent_template_keyword; 527 528 Diag(Tok.getLocation(), DiagID) 529 << II.getName() 530 << FixItHint::CreateInsertion(Tok.getLocation(), "template "); 531 } 532 533 SourceLocation TemplateNameLoc = ConsumeToken(); 534 535 TemplateNameKind TNK = Actions.ActOnTemplateName( 536 getCurScope(), SS, TemplateNameLoc, TemplateName, ObjectType, 537 EnteringContext, Template, /*AllowInjectedClassName*/ true); 538 if (AnnotateTemplateIdToken(Template, TNK, SS, SourceLocation(), 539 TemplateName, false)) 540 return true; 541 542 continue; 543 } 544 } 545 546 // We don't have any tokens that form the beginning of a 547 // nested-name-specifier, so we're done. 548 break; 549 } 550 551 // Even if we didn't see any pieces of a nested-name-specifier, we 552 // still check whether there is a tilde in this position, which 553 // indicates a potential pseudo-destructor. 554 if (CheckForDestructor && !HasScopeSpecifier && Tok.is(tok::tilde)) 555 *MayBePseudoDestructor = true; 556 557 return false; 558 } 559 560 ExprResult Parser::tryParseCXXIdExpression(CXXScopeSpec &SS, 561 bool isAddressOfOperand, 562 Token &Replacement) { 563 ExprResult E; 564 565 // We may have already annotated this id-expression. 566 switch (Tok.getKind()) { 567 case tok::annot_non_type: { 568 NamedDecl *ND = getNonTypeAnnotation(Tok); 569 SourceLocation Loc = ConsumeAnnotationToken(); 570 E = Actions.ActOnNameClassifiedAsNonType(getCurScope(), SS, ND, Loc, Tok); 571 break; 572 } 573 574 case tok::annot_non_type_dependent: { 575 IdentifierInfo *II = getIdentifierAnnotation(Tok); 576 SourceLocation Loc = ConsumeAnnotationToken(); 577 578 // This is only the direct operand of an & operator if it is not 579 // followed by a postfix-expression suffix. 580 if (isAddressOfOperand && isPostfixExpressionSuffixStart()) 581 isAddressOfOperand = false; 582 583 E = Actions.ActOnNameClassifiedAsDependentNonType(SS, II, Loc, 584 isAddressOfOperand); 585 break; 586 } 587 588 case tok::annot_non_type_undeclared: { 589 assert(SS.isEmpty() && 590 "undeclared non-type annotation should be unqualified"); 591 IdentifierInfo *II = getIdentifierAnnotation(Tok); 592 SourceLocation Loc = ConsumeAnnotationToken(); 593 E = Actions.ActOnNameClassifiedAsUndeclaredNonType(II, Loc); 594 break; 595 } 596 597 default: 598 SourceLocation TemplateKWLoc; 599 UnqualifiedId Name; 600 if (ParseUnqualifiedId(SS, /*ObjectType=*/nullptr, 601 /*ObjectHadErrors=*/false, 602 /*EnteringContext=*/false, 603 /*AllowDestructorName=*/false, 604 /*AllowConstructorName=*/false, 605 /*AllowDeductionGuide=*/false, &TemplateKWLoc, Name)) 606 return ExprError(); 607 608 // This is only the direct operand of an & operator if it is not 609 // followed by a postfix-expression suffix. 610 if (isAddressOfOperand && isPostfixExpressionSuffixStart()) 611 isAddressOfOperand = false; 612 613 E = Actions.ActOnIdExpression( 614 getCurScope(), SS, TemplateKWLoc, Name, Tok.is(tok::l_paren), 615 isAddressOfOperand, /*CCC=*/nullptr, /*IsInlineAsmIdentifier=*/false, 616 &Replacement); 617 break; 618 } 619 620 if (!E.isInvalid() && !E.isUnset() && Tok.is(tok::less)) 621 checkPotentialAngleBracket(E); 622 return E; 623 } 624 625 /// ParseCXXIdExpression - Handle id-expression. 626 /// 627 /// id-expression: 628 /// unqualified-id 629 /// qualified-id 630 /// 631 /// qualified-id: 632 /// '::'[opt] nested-name-specifier 'template'[opt] unqualified-id 633 /// '::' identifier 634 /// '::' operator-function-id 635 /// '::' template-id 636 /// 637 /// NOTE: The standard specifies that, for qualified-id, the parser does not 638 /// expect: 639 /// 640 /// '::' conversion-function-id 641 /// '::' '~' class-name 642 /// 643 /// This may cause a slight inconsistency on diagnostics: 644 /// 645 /// class C {}; 646 /// namespace A {} 647 /// void f() { 648 /// :: A :: ~ C(); // Some Sema error about using destructor with a 649 /// // namespace. 650 /// :: ~ C(); // Some Parser error like 'unexpected ~'. 651 /// } 652 /// 653 /// We simplify the parser a bit and make it work like: 654 /// 655 /// qualified-id: 656 /// '::'[opt] nested-name-specifier 'template'[opt] unqualified-id 657 /// '::' unqualified-id 658 /// 659 /// That way Sema can handle and report similar errors for namespaces and the 660 /// global scope. 661 /// 662 /// The isAddressOfOperand parameter indicates that this id-expression is a 663 /// direct operand of the address-of operator. This is, besides member contexts, 664 /// the only place where a qualified-id naming a non-static class member may 665 /// appear. 666 /// 667 ExprResult Parser::ParseCXXIdExpression(bool isAddressOfOperand) { 668 // qualified-id: 669 // '::'[opt] nested-name-specifier 'template'[opt] unqualified-id 670 // '::' unqualified-id 671 // 672 CXXScopeSpec SS; 673 ParseOptionalCXXScopeSpecifier(SS, /*ObjectType=*/nullptr, 674 /*ObjectHasErrors=*/false, 675 /*EnteringContext=*/false); 676 677 Token Replacement; 678 ExprResult Result = 679 tryParseCXXIdExpression(SS, isAddressOfOperand, Replacement); 680 if (Result.isUnset()) { 681 // If the ExprResult is valid but null, then typo correction suggested a 682 // keyword replacement that needs to be reparsed. 683 UnconsumeToken(Replacement); 684 Result = tryParseCXXIdExpression(SS, isAddressOfOperand, Replacement); 685 } 686 assert(!Result.isUnset() && "Typo correction suggested a keyword replacement " 687 "for a previous keyword suggestion"); 688 return Result; 689 } 690 691 /// ParseLambdaExpression - Parse a C++11 lambda expression. 692 /// 693 /// lambda-expression: 694 /// lambda-introducer lambda-declarator compound-statement 695 /// lambda-introducer '<' template-parameter-list '>' 696 /// requires-clause[opt] lambda-declarator compound-statement 697 /// 698 /// lambda-introducer: 699 /// '[' lambda-capture[opt] ']' 700 /// 701 /// lambda-capture: 702 /// capture-default 703 /// capture-list 704 /// capture-default ',' capture-list 705 /// 706 /// capture-default: 707 /// '&' 708 /// '=' 709 /// 710 /// capture-list: 711 /// capture 712 /// capture-list ',' capture 713 /// 714 /// capture: 715 /// simple-capture 716 /// init-capture [C++1y] 717 /// 718 /// simple-capture: 719 /// identifier 720 /// '&' identifier 721 /// 'this' 722 /// 723 /// init-capture: [C++1y] 724 /// identifier initializer 725 /// '&' identifier initializer 726 /// 727 /// lambda-declarator: 728 /// lambda-specifiers [C++23] 729 /// '(' parameter-declaration-clause ')' lambda-specifiers 730 /// requires-clause[opt] 731 /// 732 /// lambda-specifiers: 733 /// decl-specifier-seq[opt] noexcept-specifier[opt] 734 /// attribute-specifier-seq[opt] trailing-return-type[opt] 735 /// 736 ExprResult Parser::ParseLambdaExpression() { 737 // Parse lambda-introducer. 738 LambdaIntroducer Intro; 739 if (ParseLambdaIntroducer(Intro)) { 740 SkipUntil(tok::r_square, StopAtSemi); 741 SkipUntil(tok::l_brace, StopAtSemi); 742 SkipUntil(tok::r_brace, StopAtSemi); 743 return ExprError(); 744 } 745 746 return ParseLambdaExpressionAfterIntroducer(Intro); 747 } 748 749 /// Use lookahead and potentially tentative parsing to determine if we are 750 /// looking at a C++11 lambda expression, and parse it if we are. 751 /// 752 /// If we are not looking at a lambda expression, returns ExprError(). 753 ExprResult Parser::TryParseLambdaExpression() { 754 assert(getLangOpts().CPlusPlus11 755 && Tok.is(tok::l_square) 756 && "Not at the start of a possible lambda expression."); 757 758 const Token Next = NextToken(); 759 if (Next.is(tok::eof)) // Nothing else to lookup here... 760 return ExprEmpty(); 761 762 const Token After = GetLookAheadToken(2); 763 // If lookahead indicates this is a lambda... 764 if (Next.is(tok::r_square) || // [] 765 Next.is(tok::equal) || // [= 766 (Next.is(tok::amp) && // [&] or [&, 767 After.isOneOf(tok::r_square, tok::comma)) || 768 (Next.is(tok::identifier) && // [identifier] 769 After.is(tok::r_square)) || 770 Next.is(tok::ellipsis)) { // [... 771 return ParseLambdaExpression(); 772 } 773 774 // If lookahead indicates an ObjC message send... 775 // [identifier identifier 776 if (Next.is(tok::identifier) && After.is(tok::identifier)) 777 return ExprEmpty(); 778 779 // Here, we're stuck: lambda introducers and Objective-C message sends are 780 // unambiguous, but it requires arbitrary lookhead. [a,b,c,d,e,f,g] is a 781 // lambda, and [a,b,c,d,e,f,g h] is a Objective-C message send. Instead of 782 // writing two routines to parse a lambda introducer, just try to parse 783 // a lambda introducer first, and fall back if that fails. 784 LambdaIntroducer Intro; 785 { 786 TentativeParsingAction TPA(*this); 787 LambdaIntroducerTentativeParse Tentative; 788 if (ParseLambdaIntroducer(Intro, &Tentative)) { 789 TPA.Commit(); 790 return ExprError(); 791 } 792 793 switch (Tentative) { 794 case LambdaIntroducerTentativeParse::Success: 795 TPA.Commit(); 796 break; 797 798 case LambdaIntroducerTentativeParse::Incomplete: 799 // Didn't fully parse the lambda-introducer, try again with a 800 // non-tentative parse. 801 TPA.Revert(); 802 Intro = LambdaIntroducer(); 803 if (ParseLambdaIntroducer(Intro)) 804 return ExprError(); 805 break; 806 807 case LambdaIntroducerTentativeParse::MessageSend: 808 case LambdaIntroducerTentativeParse::Invalid: 809 // Not a lambda-introducer, might be a message send. 810 TPA.Revert(); 811 return ExprEmpty(); 812 } 813 } 814 815 return ParseLambdaExpressionAfterIntroducer(Intro); 816 } 817 818 /// Parse a lambda introducer. 819 /// \param Intro A LambdaIntroducer filled in with information about the 820 /// contents of the lambda-introducer. 821 /// \param Tentative If non-null, we are disambiguating between a 822 /// lambda-introducer and some other construct. In this mode, we do not 823 /// produce any diagnostics or take any other irreversible action unless 824 /// we're sure that this is a lambda-expression. 825 /// \return \c true if parsing (or disambiguation) failed with a diagnostic and 826 /// the caller should bail out / recover. 827 bool Parser::ParseLambdaIntroducer(LambdaIntroducer &Intro, 828 LambdaIntroducerTentativeParse *Tentative) { 829 if (Tentative) 830 *Tentative = LambdaIntroducerTentativeParse::Success; 831 832 assert(Tok.is(tok::l_square) && "Lambda expressions begin with '['."); 833 BalancedDelimiterTracker T(*this, tok::l_square); 834 T.consumeOpen(); 835 836 Intro.Range.setBegin(T.getOpenLocation()); 837 838 bool First = true; 839 840 // Produce a diagnostic if we're not tentatively parsing; otherwise track 841 // that our parse has failed. 842 auto Invalid = [&](llvm::function_ref<void()> Action) { 843 if (Tentative) { 844 *Tentative = LambdaIntroducerTentativeParse::Invalid; 845 return false; 846 } 847 Action(); 848 return true; 849 }; 850 851 // Perform some irreversible action if this is a non-tentative parse; 852 // otherwise note that our actions were incomplete. 853 auto NonTentativeAction = [&](llvm::function_ref<void()> Action) { 854 if (Tentative) 855 *Tentative = LambdaIntroducerTentativeParse::Incomplete; 856 else 857 Action(); 858 }; 859 860 // Parse capture-default. 861 if (Tok.is(tok::amp) && 862 (NextToken().is(tok::comma) || NextToken().is(tok::r_square))) { 863 Intro.Default = LCD_ByRef; 864 Intro.DefaultLoc = ConsumeToken(); 865 First = false; 866 if (!Tok.getIdentifierInfo()) { 867 // This can only be a lambda; no need for tentative parsing any more. 868 // '[[and]]' can still be an attribute, though. 869 Tentative = nullptr; 870 } 871 } else if (Tok.is(tok::equal)) { 872 Intro.Default = LCD_ByCopy; 873 Intro.DefaultLoc = ConsumeToken(); 874 First = false; 875 Tentative = nullptr; 876 } 877 878 while (Tok.isNot(tok::r_square)) { 879 if (!First) { 880 if (Tok.isNot(tok::comma)) { 881 // Provide a completion for a lambda introducer here. Except 882 // in Objective-C, where this is Almost Surely meant to be a message 883 // send. In that case, fail here and let the ObjC message 884 // expression parser perform the completion. 885 if (Tok.is(tok::code_completion) && 886 !(getLangOpts().ObjC && Tentative)) { 887 cutOffParsing(); 888 Actions.CodeCompleteLambdaIntroducer(getCurScope(), Intro, 889 /*AfterAmpersand=*/false); 890 break; 891 } 892 893 return Invalid([&] { 894 Diag(Tok.getLocation(), diag::err_expected_comma_or_rsquare); 895 }); 896 } 897 ConsumeToken(); 898 } 899 900 if (Tok.is(tok::code_completion)) { 901 cutOffParsing(); 902 // If we're in Objective-C++ and we have a bare '[', then this is more 903 // likely to be a message receiver. 904 if (getLangOpts().ObjC && Tentative && First) 905 Actions.CodeCompleteObjCMessageReceiver(getCurScope()); 906 else 907 Actions.CodeCompleteLambdaIntroducer(getCurScope(), Intro, 908 /*AfterAmpersand=*/false); 909 break; 910 } 911 912 First = false; 913 914 // Parse capture. 915 LambdaCaptureKind Kind = LCK_ByCopy; 916 LambdaCaptureInitKind InitKind = LambdaCaptureInitKind::NoInit; 917 SourceLocation Loc; 918 IdentifierInfo *Id = nullptr; 919 SourceLocation EllipsisLocs[4]; 920 ExprResult Init; 921 SourceLocation LocStart = Tok.getLocation(); 922 923 if (Tok.is(tok::star)) { 924 Loc = ConsumeToken(); 925 if (Tok.is(tok::kw_this)) { 926 ConsumeToken(); 927 Kind = LCK_StarThis; 928 } else { 929 return Invalid([&] { 930 Diag(Tok.getLocation(), diag::err_expected_star_this_capture); 931 }); 932 } 933 } else if (Tok.is(tok::kw_this)) { 934 Kind = LCK_This; 935 Loc = ConsumeToken(); 936 } else if (Tok.isOneOf(tok::amp, tok::equal) && 937 NextToken().isOneOf(tok::comma, tok::r_square) && 938 Intro.Default == LCD_None) { 939 // We have a lone "&" or "=" which is either a misplaced capture-default 940 // or the start of a capture (in the "&" case) with the rest of the 941 // capture missing. Both are an error but a misplaced capture-default 942 // is more likely if we don't already have a capture default. 943 return Invalid( 944 [&] { Diag(Tok.getLocation(), diag::err_capture_default_first); }); 945 } else { 946 TryConsumeToken(tok::ellipsis, EllipsisLocs[0]); 947 948 if (Tok.is(tok::amp)) { 949 Kind = LCK_ByRef; 950 ConsumeToken(); 951 952 if (Tok.is(tok::code_completion)) { 953 cutOffParsing(); 954 Actions.CodeCompleteLambdaIntroducer(getCurScope(), Intro, 955 /*AfterAmpersand=*/true); 956 break; 957 } 958 } 959 960 TryConsumeToken(tok::ellipsis, EllipsisLocs[1]); 961 962 if (Tok.is(tok::identifier)) { 963 Id = Tok.getIdentifierInfo(); 964 Loc = ConsumeToken(); 965 } else if (Tok.is(tok::kw_this)) { 966 return Invalid([&] { 967 // FIXME: Suggest a fixit here. 968 Diag(Tok.getLocation(), diag::err_this_captured_by_reference); 969 }); 970 } else { 971 return Invalid([&] { 972 Diag(Tok.getLocation(), diag::err_expected_capture); 973 }); 974 } 975 976 TryConsumeToken(tok::ellipsis, EllipsisLocs[2]); 977 978 if (Tok.is(tok::l_paren)) { 979 BalancedDelimiterTracker Parens(*this, tok::l_paren); 980 Parens.consumeOpen(); 981 982 InitKind = LambdaCaptureInitKind::DirectInit; 983 984 ExprVector Exprs; 985 if (Tentative) { 986 Parens.skipToEnd(); 987 *Tentative = LambdaIntroducerTentativeParse::Incomplete; 988 } else if (ParseExpressionList(Exprs)) { 989 Parens.skipToEnd(); 990 Init = ExprError(); 991 } else { 992 Parens.consumeClose(); 993 Init = Actions.ActOnParenListExpr(Parens.getOpenLocation(), 994 Parens.getCloseLocation(), 995 Exprs); 996 } 997 } else if (Tok.isOneOf(tok::l_brace, tok::equal)) { 998 // Each lambda init-capture forms its own full expression, which clears 999 // Actions.MaybeODRUseExprs. So create an expression evaluation context 1000 // to save the necessary state, and restore it later. 1001 EnterExpressionEvaluationContext EC( 1002 Actions, Sema::ExpressionEvaluationContext::PotentiallyEvaluated); 1003 1004 if (TryConsumeToken(tok::equal)) 1005 InitKind = LambdaCaptureInitKind::CopyInit; 1006 else 1007 InitKind = LambdaCaptureInitKind::ListInit; 1008 1009 if (!Tentative) { 1010 Init = ParseInitializer(); 1011 } else if (Tok.is(tok::l_brace)) { 1012 BalancedDelimiterTracker Braces(*this, tok::l_brace); 1013 Braces.consumeOpen(); 1014 Braces.skipToEnd(); 1015 *Tentative = LambdaIntroducerTentativeParse::Incomplete; 1016 } else { 1017 // We're disambiguating this: 1018 // 1019 // [..., x = expr 1020 // 1021 // We need to find the end of the following expression in order to 1022 // determine whether this is an Obj-C message send's receiver, a 1023 // C99 designator, or a lambda init-capture. 1024 // 1025 // Parse the expression to find where it ends, and annotate it back 1026 // onto the tokens. We would have parsed this expression the same way 1027 // in either case: both the RHS of an init-capture and the RHS of an 1028 // assignment expression are parsed as an initializer-clause, and in 1029 // neither case can anything be added to the scope between the '[' and 1030 // here. 1031 // 1032 // FIXME: This is horrible. Adding a mechanism to skip an expression 1033 // would be much cleaner. 1034 // FIXME: If there is a ',' before the next ']' or ':', we can skip to 1035 // that instead. (And if we see a ':' with no matching '?', we can 1036 // classify this as an Obj-C message send.) 1037 SourceLocation StartLoc = Tok.getLocation(); 1038 InMessageExpressionRAIIObject MaybeInMessageExpression(*this, true); 1039 Init = ParseInitializer(); 1040 if (!Init.isInvalid()) 1041 Init = Actions.CorrectDelayedTyposInExpr(Init.get()); 1042 1043 if (Tok.getLocation() != StartLoc) { 1044 // Back out the lexing of the token after the initializer. 1045 PP.RevertCachedTokens(1); 1046 1047 // Replace the consumed tokens with an appropriate annotation. 1048 Tok.setLocation(StartLoc); 1049 Tok.setKind(tok::annot_primary_expr); 1050 setExprAnnotation(Tok, Init); 1051 Tok.setAnnotationEndLoc(PP.getLastCachedTokenLocation()); 1052 PP.AnnotateCachedTokens(Tok); 1053 1054 // Consume the annotated initializer. 1055 ConsumeAnnotationToken(); 1056 } 1057 } 1058 } 1059 1060 TryConsumeToken(tok::ellipsis, EllipsisLocs[3]); 1061 } 1062 1063 // Check if this is a message send before we act on a possible init-capture. 1064 if (Tentative && Tok.is(tok::identifier) && 1065 NextToken().isOneOf(tok::colon, tok::r_square)) { 1066 // This can only be a message send. We're done with disambiguation. 1067 *Tentative = LambdaIntroducerTentativeParse::MessageSend; 1068 return false; 1069 } 1070 1071 // Ensure that any ellipsis was in the right place. 1072 SourceLocation EllipsisLoc; 1073 if (llvm::any_of(EllipsisLocs, 1074 [](SourceLocation Loc) { return Loc.isValid(); })) { 1075 // The '...' should appear before the identifier in an init-capture, and 1076 // after the identifier otherwise. 1077 bool InitCapture = InitKind != LambdaCaptureInitKind::NoInit; 1078 SourceLocation *ExpectedEllipsisLoc = 1079 !InitCapture ? &EllipsisLocs[2] : 1080 Kind == LCK_ByRef ? &EllipsisLocs[1] : 1081 &EllipsisLocs[0]; 1082 EllipsisLoc = *ExpectedEllipsisLoc; 1083 1084 unsigned DiagID = 0; 1085 if (EllipsisLoc.isInvalid()) { 1086 DiagID = diag::err_lambda_capture_misplaced_ellipsis; 1087 for (SourceLocation Loc : EllipsisLocs) { 1088 if (Loc.isValid()) 1089 EllipsisLoc = Loc; 1090 } 1091 } else { 1092 unsigned NumEllipses = std::accumulate( 1093 std::begin(EllipsisLocs), std::end(EllipsisLocs), 0, 1094 [](int N, SourceLocation Loc) { return N + Loc.isValid(); }); 1095 if (NumEllipses > 1) 1096 DiagID = diag::err_lambda_capture_multiple_ellipses; 1097 } 1098 if (DiagID) { 1099 NonTentativeAction([&] { 1100 // Point the diagnostic at the first misplaced ellipsis. 1101 SourceLocation DiagLoc; 1102 for (SourceLocation &Loc : EllipsisLocs) { 1103 if (&Loc != ExpectedEllipsisLoc && Loc.isValid()) { 1104 DiagLoc = Loc; 1105 break; 1106 } 1107 } 1108 assert(DiagLoc.isValid() && "no location for diagnostic"); 1109 1110 // Issue the diagnostic and produce fixits showing where the ellipsis 1111 // should have been written. 1112 auto &&D = Diag(DiagLoc, DiagID); 1113 if (DiagID == diag::err_lambda_capture_misplaced_ellipsis) { 1114 SourceLocation ExpectedLoc = 1115 InitCapture ? Loc 1116 : Lexer::getLocForEndOfToken( 1117 Loc, 0, PP.getSourceManager(), getLangOpts()); 1118 D << InitCapture << FixItHint::CreateInsertion(ExpectedLoc, "..."); 1119 } 1120 for (SourceLocation &Loc : EllipsisLocs) { 1121 if (&Loc != ExpectedEllipsisLoc && Loc.isValid()) 1122 D << FixItHint::CreateRemoval(Loc); 1123 } 1124 }); 1125 } 1126 } 1127 1128 // Process the init-capture initializers now rather than delaying until we 1129 // form the lambda-expression so that they can be handled in the context 1130 // enclosing the lambda-expression, rather than in the context of the 1131 // lambda-expression itself. 1132 ParsedType InitCaptureType; 1133 if (Init.isUsable()) 1134 Init = Actions.CorrectDelayedTyposInExpr(Init.get()); 1135 if (Init.isUsable()) { 1136 NonTentativeAction([&] { 1137 // Get the pointer and store it in an lvalue, so we can use it as an 1138 // out argument. 1139 Expr *InitExpr = Init.get(); 1140 // This performs any lvalue-to-rvalue conversions if necessary, which 1141 // can affect what gets captured in the containing decl-context. 1142 InitCaptureType = Actions.actOnLambdaInitCaptureInitialization( 1143 Loc, Kind == LCK_ByRef, EllipsisLoc, Id, InitKind, InitExpr); 1144 Init = InitExpr; 1145 }); 1146 } 1147 1148 SourceLocation LocEnd = PrevTokLocation; 1149 1150 Intro.addCapture(Kind, Loc, Id, EllipsisLoc, InitKind, Init, 1151 InitCaptureType, SourceRange(LocStart, LocEnd)); 1152 } 1153 1154 T.consumeClose(); 1155 Intro.Range.setEnd(T.getCloseLocation()); 1156 return false; 1157 } 1158 1159 static void tryConsumeLambdaSpecifierToken(Parser &P, 1160 SourceLocation &MutableLoc, 1161 SourceLocation &StaticLoc, 1162 SourceLocation &ConstexprLoc, 1163 SourceLocation &ConstevalLoc, 1164 SourceLocation &DeclEndLoc) { 1165 assert(MutableLoc.isInvalid()); 1166 assert(StaticLoc.isInvalid()); 1167 assert(ConstexprLoc.isInvalid()); 1168 assert(ConstevalLoc.isInvalid()); 1169 // Consume constexpr-opt mutable-opt in any sequence, and set the DeclEndLoc 1170 // to the final of those locations. Emit an error if we have multiple 1171 // copies of those keywords and recover. 1172 1173 auto ConsumeLocation = [&P, &DeclEndLoc](SourceLocation &SpecifierLoc, 1174 int DiagIndex) { 1175 if (SpecifierLoc.isValid()) { 1176 P.Diag(P.getCurToken().getLocation(), 1177 diag::err_lambda_decl_specifier_repeated) 1178 << DiagIndex 1179 << FixItHint::CreateRemoval(P.getCurToken().getLocation()); 1180 } 1181 SpecifierLoc = P.ConsumeToken(); 1182 DeclEndLoc = SpecifierLoc; 1183 }; 1184 1185 while (true) { 1186 switch (P.getCurToken().getKind()) { 1187 case tok::kw_mutable: 1188 ConsumeLocation(MutableLoc, 0); 1189 break; 1190 case tok::kw_static: 1191 ConsumeLocation(StaticLoc, 1); 1192 break; 1193 case tok::kw_constexpr: 1194 ConsumeLocation(ConstexprLoc, 2); 1195 break; 1196 case tok::kw_consteval: 1197 ConsumeLocation(ConstevalLoc, 3); 1198 break; 1199 default: 1200 return; 1201 } 1202 } 1203 } 1204 1205 static void addStaticToLambdaDeclSpecifier(Parser &P, SourceLocation StaticLoc, 1206 DeclSpec &DS) { 1207 if (StaticLoc.isValid()) { 1208 P.Diag(StaticLoc, !P.getLangOpts().CPlusPlus23 1209 ? diag::err_static_lambda 1210 : diag::warn_cxx20_compat_static_lambda); 1211 const char *PrevSpec = nullptr; 1212 unsigned DiagID = 0; 1213 DS.SetStorageClassSpec(P.getActions(), DeclSpec::SCS_static, StaticLoc, 1214 PrevSpec, DiagID, 1215 P.getActions().getASTContext().getPrintingPolicy()); 1216 assert(PrevSpec == nullptr && DiagID == 0 && 1217 "Static cannot have been set previously!"); 1218 } 1219 } 1220 1221 static void 1222 addConstexprToLambdaDeclSpecifier(Parser &P, SourceLocation ConstexprLoc, 1223 DeclSpec &DS) { 1224 if (ConstexprLoc.isValid()) { 1225 P.Diag(ConstexprLoc, !P.getLangOpts().CPlusPlus17 1226 ? diag::ext_constexpr_on_lambda_cxx17 1227 : diag::warn_cxx14_compat_constexpr_on_lambda); 1228 const char *PrevSpec = nullptr; 1229 unsigned DiagID = 0; 1230 DS.SetConstexprSpec(ConstexprSpecKind::Constexpr, ConstexprLoc, PrevSpec, 1231 DiagID); 1232 assert(PrevSpec == nullptr && DiagID == 0 && 1233 "Constexpr cannot have been set previously!"); 1234 } 1235 } 1236 1237 static void addConstevalToLambdaDeclSpecifier(Parser &P, 1238 SourceLocation ConstevalLoc, 1239 DeclSpec &DS) { 1240 if (ConstevalLoc.isValid()) { 1241 P.Diag(ConstevalLoc, diag::warn_cxx20_compat_consteval); 1242 const char *PrevSpec = nullptr; 1243 unsigned DiagID = 0; 1244 DS.SetConstexprSpec(ConstexprSpecKind::Consteval, ConstevalLoc, PrevSpec, 1245 DiagID); 1246 if (DiagID != 0) 1247 P.Diag(ConstevalLoc, DiagID) << PrevSpec; 1248 } 1249 } 1250 1251 static void DiagnoseStaticSpecifierRestrictions(Parser &P, 1252 SourceLocation StaticLoc, 1253 SourceLocation MutableLoc, 1254 const LambdaIntroducer &Intro) { 1255 if (StaticLoc.isInvalid()) 1256 return; 1257 1258 // [expr.prim.lambda.general] p4 1259 // The lambda-specifier-seq shall not contain both mutable and static. 1260 // If the lambda-specifier-seq contains static, there shall be no 1261 // lambda-capture. 1262 if (MutableLoc.isValid()) 1263 P.Diag(StaticLoc, diag::err_static_mutable_lambda); 1264 if (Intro.hasLambdaCapture()) { 1265 P.Diag(StaticLoc, diag::err_static_lambda_captures); 1266 } 1267 } 1268 1269 /// ParseLambdaExpressionAfterIntroducer - Parse the rest of a lambda 1270 /// expression. 1271 ExprResult Parser::ParseLambdaExpressionAfterIntroducer( 1272 LambdaIntroducer &Intro) { 1273 SourceLocation LambdaBeginLoc = Intro.Range.getBegin(); 1274 Diag(LambdaBeginLoc, diag::warn_cxx98_compat_lambda); 1275 1276 PrettyStackTraceLoc CrashInfo(PP.getSourceManager(), LambdaBeginLoc, 1277 "lambda expression parsing"); 1278 1279 // Parse lambda-declarator[opt]. 1280 DeclSpec DS(AttrFactory); 1281 Declarator D(DS, ParsedAttributesView::none(), DeclaratorContext::LambdaExpr); 1282 TemplateParameterDepthRAII CurTemplateDepthTracker(TemplateParameterDepth); 1283 1284 ParseScope LambdaScope(this, Scope::LambdaScope | Scope::DeclScope | 1285 Scope::FunctionDeclarationScope | 1286 Scope::FunctionPrototypeScope); 1287 1288 Actions.PushLambdaScope(); 1289 Actions.ActOnLambdaExpressionAfterIntroducer(Intro, getCurScope()); 1290 1291 ParsedAttributes Attributes(AttrFactory); 1292 if (getLangOpts().CUDA) { 1293 // In CUDA code, GNU attributes are allowed to appear immediately after the 1294 // "[...]", even if there is no "(...)" before the lambda body. 1295 // 1296 // Note that we support __noinline__ as a keyword in this mode and thus 1297 // it has to be separately handled. 1298 while (true) { 1299 if (Tok.is(tok::kw___noinline__)) { 1300 IdentifierInfo *AttrName = Tok.getIdentifierInfo(); 1301 SourceLocation AttrNameLoc = ConsumeToken(); 1302 Attributes.addNew(AttrName, AttrNameLoc, /*ScopeName=*/nullptr, 1303 AttrNameLoc, /*ArgsUnion=*/nullptr, 1304 /*numArgs=*/0, tok::kw___noinline__); 1305 } else if (Tok.is(tok::kw___attribute)) 1306 ParseGNUAttributes(Attributes, /*LatePArsedAttrList=*/nullptr, &D); 1307 else 1308 break; 1309 } 1310 1311 D.takeAttributes(Attributes); 1312 } 1313 1314 // Helper to emit a warning if we see a CUDA host/device/global attribute 1315 // after '(...)'. nvcc doesn't accept this. 1316 auto WarnIfHasCUDATargetAttr = [&] { 1317 if (getLangOpts().CUDA) 1318 for (const ParsedAttr &A : Attributes) 1319 if (A.getKind() == ParsedAttr::AT_CUDADevice || 1320 A.getKind() == ParsedAttr::AT_CUDAHost || 1321 A.getKind() == ParsedAttr::AT_CUDAGlobal) 1322 Diag(A.getLoc(), diag::warn_cuda_attr_lambda_position) 1323 << A.getAttrName()->getName(); 1324 }; 1325 1326 MultiParseScope TemplateParamScope(*this); 1327 if (Tok.is(tok::less)) { 1328 Diag(Tok, getLangOpts().CPlusPlus20 1329 ? diag::warn_cxx17_compat_lambda_template_parameter_list 1330 : diag::ext_lambda_template_parameter_list); 1331 1332 SmallVector<NamedDecl*, 4> TemplateParams; 1333 SourceLocation LAngleLoc, RAngleLoc; 1334 if (ParseTemplateParameters(TemplateParamScope, 1335 CurTemplateDepthTracker.getDepth(), 1336 TemplateParams, LAngleLoc, RAngleLoc)) { 1337 Actions.ActOnLambdaError(LambdaBeginLoc, getCurScope()); 1338 return ExprError(); 1339 } 1340 1341 if (TemplateParams.empty()) { 1342 Diag(RAngleLoc, 1343 diag::err_lambda_template_parameter_list_empty); 1344 } else { 1345 ExprResult RequiresClause; 1346 if (TryConsumeToken(tok::kw_requires)) { 1347 RequiresClause = 1348 Actions.ActOnRequiresClause(ParseConstraintLogicalOrExpression( 1349 /*IsTrailingRequiresClause=*/false)); 1350 if (RequiresClause.isInvalid()) 1351 SkipUntil({tok::l_brace, tok::l_paren}, StopAtSemi | StopBeforeMatch); 1352 } 1353 1354 Actions.ActOnLambdaExplicitTemplateParameterList( 1355 Intro, LAngleLoc, TemplateParams, RAngleLoc, RequiresClause); 1356 ++CurTemplateDepthTracker; 1357 } 1358 } 1359 1360 // Implement WG21 P2173, which allows attributes immediately before the 1361 // lambda declarator and applies them to the corresponding function operator 1362 // or operator template declaration. We accept this as a conforming extension 1363 // in all language modes that support lambdas. 1364 if (isCXX11AttributeSpecifier()) { 1365 Diag(Tok, getLangOpts().CPlusPlus23 1366 ? diag::warn_cxx20_compat_decl_attrs_on_lambda 1367 : diag::ext_decl_attrs_on_lambda) 1368 << Tok.getIdentifierInfo() << Tok.isRegularKeywordAttribute(); 1369 MaybeParseCXX11Attributes(D); 1370 } 1371 1372 TypeResult TrailingReturnType; 1373 SourceLocation TrailingReturnTypeLoc; 1374 SourceLocation LParenLoc, RParenLoc; 1375 SourceLocation DeclEndLoc; 1376 bool HasParentheses = false; 1377 bool HasSpecifiers = false; 1378 SourceLocation MutableLoc; 1379 1380 auto ParseConstexprAndMutableSpecifiers = [&] { 1381 // GNU-style attributes must be parsed before the mutable specifier to 1382 // be compatible with GCC. MSVC-style attributes must be parsed before 1383 // the mutable specifier to be compatible with MSVC. 1384 MaybeParseAttributes(PAKM_GNU | PAKM_Declspec, Attributes); 1385 // Parse mutable-opt and/or constexpr-opt or consteval-opt, and update 1386 // the DeclEndLoc. 1387 SourceLocation ConstexprLoc; 1388 SourceLocation ConstevalLoc; 1389 SourceLocation StaticLoc; 1390 1391 tryConsumeLambdaSpecifierToken(*this, MutableLoc, StaticLoc, ConstexprLoc, 1392 ConstevalLoc, DeclEndLoc); 1393 1394 DiagnoseStaticSpecifierRestrictions(*this, StaticLoc, MutableLoc, Intro); 1395 1396 addStaticToLambdaDeclSpecifier(*this, StaticLoc, DS); 1397 addConstexprToLambdaDeclSpecifier(*this, ConstexprLoc, DS); 1398 addConstevalToLambdaDeclSpecifier(*this, ConstevalLoc, DS); 1399 }; 1400 1401 auto ParseLambdaSpecifiers = 1402 [&](MutableArrayRef<DeclaratorChunk::ParamInfo> ParamInfo, 1403 SourceLocation EllipsisLoc) { 1404 // Parse exception-specification[opt]. 1405 ExceptionSpecificationType ESpecType = EST_None; 1406 SourceRange ESpecRange; 1407 SmallVector<ParsedType, 2> DynamicExceptions; 1408 SmallVector<SourceRange, 2> DynamicExceptionRanges; 1409 ExprResult NoexceptExpr; 1410 CachedTokens *ExceptionSpecTokens; 1411 1412 ESpecType = tryParseExceptionSpecification( 1413 /*Delayed=*/false, ESpecRange, DynamicExceptions, 1414 DynamicExceptionRanges, NoexceptExpr, ExceptionSpecTokens); 1415 1416 if (ESpecType != EST_None) 1417 DeclEndLoc = ESpecRange.getEnd(); 1418 1419 // Parse attribute-specifier[opt]. 1420 if (MaybeParseCXX11Attributes(Attributes)) 1421 DeclEndLoc = Attributes.Range.getEnd(); 1422 1423 // Parse OpenCL addr space attribute. 1424 if (Tok.isOneOf(tok::kw___private, tok::kw___global, tok::kw___local, 1425 tok::kw___constant, tok::kw___generic)) { 1426 ParseOpenCLQualifiers(DS.getAttributes()); 1427 ConsumeToken(); 1428 } 1429 1430 SourceLocation FunLocalRangeEnd = DeclEndLoc; 1431 1432 // Parse trailing-return-type[opt]. 1433 if (Tok.is(tok::arrow)) { 1434 FunLocalRangeEnd = Tok.getLocation(); 1435 SourceRange Range; 1436 TrailingReturnType = ParseTrailingReturnType( 1437 Range, /*MayBeFollowedByDirectInit*/ false); 1438 TrailingReturnTypeLoc = Range.getBegin(); 1439 if (Range.getEnd().isValid()) 1440 DeclEndLoc = Range.getEnd(); 1441 } 1442 1443 SourceLocation NoLoc; 1444 D.AddTypeInfo( 1445 DeclaratorChunk::getFunction( 1446 /*HasProto=*/true, 1447 /*IsAmbiguous=*/false, LParenLoc, ParamInfo.data(), 1448 ParamInfo.size(), EllipsisLoc, RParenLoc, 1449 /*RefQualifierIsLvalueRef=*/true, 1450 /*RefQualifierLoc=*/NoLoc, MutableLoc, ESpecType, ESpecRange, 1451 DynamicExceptions.data(), DynamicExceptionRanges.data(), 1452 DynamicExceptions.size(), 1453 NoexceptExpr.isUsable() ? NoexceptExpr.get() : nullptr, 1454 /*ExceptionSpecTokens*/ nullptr, 1455 /*DeclsInPrototype=*/std::nullopt, LParenLoc, FunLocalRangeEnd, 1456 D, TrailingReturnType, TrailingReturnTypeLoc, &DS), 1457 std::move(Attributes), DeclEndLoc); 1458 1459 Actions.ActOnLambdaClosureQualifiers(Intro, MutableLoc); 1460 1461 if (HasParentheses && Tok.is(tok::kw_requires)) 1462 ParseTrailingRequiresClause(D); 1463 }; 1464 1465 ParseScope Prototype(this, Scope::FunctionPrototypeScope | 1466 Scope::FunctionDeclarationScope | 1467 Scope::DeclScope); 1468 1469 // Parse parameter-declaration-clause. 1470 SmallVector<DeclaratorChunk::ParamInfo, 16> ParamInfo; 1471 SourceLocation EllipsisLoc; 1472 1473 if (Tok.is(tok::l_paren)) { 1474 BalancedDelimiterTracker T(*this, tok::l_paren); 1475 T.consumeOpen(); 1476 LParenLoc = T.getOpenLocation(); 1477 1478 if (Tok.isNot(tok::r_paren)) { 1479 Actions.RecordParsingTemplateParameterDepth( 1480 CurTemplateDepthTracker.getOriginalDepth()); 1481 1482 ParseParameterDeclarationClause(D, Attributes, ParamInfo, EllipsisLoc); 1483 // For a generic lambda, each 'auto' within the parameter declaration 1484 // clause creates a template type parameter, so increment the depth. 1485 // If we've parsed any explicit template parameters, then the depth will 1486 // have already been incremented. So we make sure that at most a single 1487 // depth level is added. 1488 if (Actions.getCurGenericLambda()) 1489 CurTemplateDepthTracker.setAddedDepth(1); 1490 } 1491 1492 T.consumeClose(); 1493 DeclEndLoc = RParenLoc = T.getCloseLocation(); 1494 HasParentheses = true; 1495 } 1496 1497 HasSpecifiers = 1498 Tok.isOneOf(tok::kw_mutable, tok::arrow, tok::kw___attribute, 1499 tok::kw_constexpr, tok::kw_consteval, tok::kw_static, 1500 tok::kw___private, tok::kw___global, tok::kw___local, 1501 tok::kw___constant, tok::kw___generic, tok::kw_groupshared, 1502 tok::kw_requires, tok::kw_noexcept) || 1503 Tok.isRegularKeywordAttribute() || 1504 (Tok.is(tok::l_square) && NextToken().is(tok::l_square)); 1505 1506 if (HasSpecifiers && !HasParentheses && !getLangOpts().CPlusPlus23) { 1507 // It's common to forget that one needs '()' before 'mutable', an 1508 // attribute specifier, the result type, or the requires clause. Deal with 1509 // this. 1510 Diag(Tok, diag::ext_lambda_missing_parens) 1511 << FixItHint::CreateInsertion(Tok.getLocation(), "() "); 1512 } 1513 1514 if (HasParentheses || HasSpecifiers) 1515 ParseConstexprAndMutableSpecifiers(); 1516 1517 Actions.ActOnLambdaClosureParameters(getCurScope(), ParamInfo); 1518 1519 if (!HasParentheses) 1520 Actions.ActOnLambdaClosureQualifiers(Intro, MutableLoc); 1521 1522 if (HasSpecifiers || HasParentheses) 1523 ParseLambdaSpecifiers(ParamInfo, EllipsisLoc); 1524 1525 WarnIfHasCUDATargetAttr(); 1526 1527 Prototype.Exit(); 1528 1529 // FIXME: Rename BlockScope -> ClosureScope if we decide to continue using 1530 // it. 1531 unsigned ScopeFlags = Scope::BlockScope | Scope::FnScope | Scope::DeclScope | 1532 Scope::CompoundStmtScope; 1533 ParseScope BodyScope(this, ScopeFlags); 1534 1535 Actions.ActOnStartOfLambdaDefinition(Intro, D, DS); 1536 1537 // Parse compound-statement. 1538 if (!Tok.is(tok::l_brace)) { 1539 Diag(Tok, diag::err_expected_lambda_body); 1540 Actions.ActOnLambdaError(LambdaBeginLoc, getCurScope()); 1541 return ExprError(); 1542 } 1543 1544 StmtResult Stmt(ParseCompoundStatementBody()); 1545 BodyScope.Exit(); 1546 TemplateParamScope.Exit(); 1547 LambdaScope.Exit(); 1548 1549 if (!Stmt.isInvalid() && !TrailingReturnType.isInvalid()) 1550 return Actions.ActOnLambdaExpr(LambdaBeginLoc, Stmt.get(), getCurScope()); 1551 1552 Actions.ActOnLambdaError(LambdaBeginLoc, getCurScope()); 1553 return ExprError(); 1554 } 1555 1556 /// ParseCXXCasts - This handles the various ways to cast expressions to another 1557 /// type. 1558 /// 1559 /// postfix-expression: [C++ 5.2p1] 1560 /// 'dynamic_cast' '<' type-name '>' '(' expression ')' 1561 /// 'static_cast' '<' type-name '>' '(' expression ')' 1562 /// 'reinterpret_cast' '<' type-name '>' '(' expression ')' 1563 /// 'const_cast' '<' type-name '>' '(' expression ')' 1564 /// 1565 /// C++ for OpenCL s2.3.1 adds: 1566 /// 'addrspace_cast' '<' type-name '>' '(' expression ')' 1567 ExprResult Parser::ParseCXXCasts() { 1568 tok::TokenKind Kind = Tok.getKind(); 1569 const char *CastName = nullptr; // For error messages 1570 1571 switch (Kind) { 1572 default: llvm_unreachable("Unknown C++ cast!"); 1573 case tok::kw_addrspace_cast: CastName = "addrspace_cast"; break; 1574 case tok::kw_const_cast: CastName = "const_cast"; break; 1575 case tok::kw_dynamic_cast: CastName = "dynamic_cast"; break; 1576 case tok::kw_reinterpret_cast: CastName = "reinterpret_cast"; break; 1577 case tok::kw_static_cast: CastName = "static_cast"; break; 1578 } 1579 1580 SourceLocation OpLoc = ConsumeToken(); 1581 SourceLocation LAngleBracketLoc = Tok.getLocation(); 1582 1583 // Check for "<::" which is parsed as "[:". If found, fix token stream, 1584 // diagnose error, suggest fix, and recover parsing. 1585 if (Tok.is(tok::l_square) && Tok.getLength() == 2) { 1586 Token Next = NextToken(); 1587 if (Next.is(tok::colon) && areTokensAdjacent(Tok, Next)) 1588 FixDigraph(*this, PP, Tok, Next, Kind, /*AtDigraph*/true); 1589 } 1590 1591 if (ExpectAndConsume(tok::less, diag::err_expected_less_after, CastName)) 1592 return ExprError(); 1593 1594 // Parse the common declaration-specifiers piece. 1595 DeclSpec DS(AttrFactory); 1596 ParseSpecifierQualifierList(DS, /*AccessSpecifier=*/AS_none, 1597 DeclSpecContext::DSC_type_specifier); 1598 1599 // Parse the abstract-declarator, if present. 1600 Declarator DeclaratorInfo(DS, ParsedAttributesView::none(), 1601 DeclaratorContext::TypeName); 1602 ParseDeclarator(DeclaratorInfo); 1603 1604 SourceLocation RAngleBracketLoc = Tok.getLocation(); 1605 1606 if (ExpectAndConsume(tok::greater)) 1607 return ExprError(Diag(LAngleBracketLoc, diag::note_matching) << tok::less); 1608 1609 BalancedDelimiterTracker T(*this, tok::l_paren); 1610 1611 if (T.expectAndConsume(diag::err_expected_lparen_after, CastName)) 1612 return ExprError(); 1613 1614 ExprResult Result = ParseExpression(); 1615 1616 // Match the ')'. 1617 T.consumeClose(); 1618 1619 if (!Result.isInvalid() && !DeclaratorInfo.isInvalidType()) 1620 Result = Actions.ActOnCXXNamedCast(OpLoc, Kind, 1621 LAngleBracketLoc, DeclaratorInfo, 1622 RAngleBracketLoc, 1623 T.getOpenLocation(), Result.get(), 1624 T.getCloseLocation()); 1625 1626 return Result; 1627 } 1628 1629 /// ParseCXXTypeid - This handles the C++ typeid expression. 1630 /// 1631 /// postfix-expression: [C++ 5.2p1] 1632 /// 'typeid' '(' expression ')' 1633 /// 'typeid' '(' type-id ')' 1634 /// 1635 ExprResult Parser::ParseCXXTypeid() { 1636 assert(Tok.is(tok::kw_typeid) && "Not 'typeid'!"); 1637 1638 SourceLocation OpLoc = ConsumeToken(); 1639 SourceLocation LParenLoc, RParenLoc; 1640 BalancedDelimiterTracker T(*this, tok::l_paren); 1641 1642 // typeid expressions are always parenthesized. 1643 if (T.expectAndConsume(diag::err_expected_lparen_after, "typeid")) 1644 return ExprError(); 1645 LParenLoc = T.getOpenLocation(); 1646 1647 ExprResult Result; 1648 1649 // C++0x [expr.typeid]p3: 1650 // When typeid is applied to an expression other than an lvalue of a 1651 // polymorphic class type [...] The expression is an unevaluated 1652 // operand (Clause 5). 1653 // 1654 // Note that we can't tell whether the expression is an lvalue of a 1655 // polymorphic class type until after we've parsed the expression; we 1656 // speculatively assume the subexpression is unevaluated, and fix it up 1657 // later. 1658 // 1659 // We enter the unevaluated context before trying to determine whether we 1660 // have a type-id, because the tentative parse logic will try to resolve 1661 // names, and must treat them as unevaluated. 1662 EnterExpressionEvaluationContext Unevaluated( 1663 Actions, Sema::ExpressionEvaluationContext::Unevaluated, 1664 Sema::ReuseLambdaContextDecl); 1665 1666 if (isTypeIdInParens()) { 1667 TypeResult Ty = ParseTypeName(); 1668 1669 // Match the ')'. 1670 T.consumeClose(); 1671 RParenLoc = T.getCloseLocation(); 1672 if (Ty.isInvalid() || RParenLoc.isInvalid()) 1673 return ExprError(); 1674 1675 Result = Actions.ActOnCXXTypeid(OpLoc, LParenLoc, /*isType=*/true, 1676 Ty.get().getAsOpaquePtr(), RParenLoc); 1677 } else { 1678 Result = ParseExpression(); 1679 1680 // Match the ')'. 1681 if (Result.isInvalid()) 1682 SkipUntil(tok::r_paren, StopAtSemi); 1683 else { 1684 T.consumeClose(); 1685 RParenLoc = T.getCloseLocation(); 1686 if (RParenLoc.isInvalid()) 1687 return ExprError(); 1688 1689 Result = Actions.ActOnCXXTypeid(OpLoc, LParenLoc, /*isType=*/false, 1690 Result.get(), RParenLoc); 1691 } 1692 } 1693 1694 return Result; 1695 } 1696 1697 /// ParseCXXUuidof - This handles the Microsoft C++ __uuidof expression. 1698 /// 1699 /// '__uuidof' '(' expression ')' 1700 /// '__uuidof' '(' type-id ')' 1701 /// 1702 ExprResult Parser::ParseCXXUuidof() { 1703 assert(Tok.is(tok::kw___uuidof) && "Not '__uuidof'!"); 1704 1705 SourceLocation OpLoc = ConsumeToken(); 1706 BalancedDelimiterTracker T(*this, tok::l_paren); 1707 1708 // __uuidof expressions are always parenthesized. 1709 if (T.expectAndConsume(diag::err_expected_lparen_after, "__uuidof")) 1710 return ExprError(); 1711 1712 ExprResult Result; 1713 1714 if (isTypeIdInParens()) { 1715 TypeResult Ty = ParseTypeName(); 1716 1717 // Match the ')'. 1718 T.consumeClose(); 1719 1720 if (Ty.isInvalid()) 1721 return ExprError(); 1722 1723 Result = Actions.ActOnCXXUuidof(OpLoc, T.getOpenLocation(), /*isType=*/true, 1724 Ty.get().getAsOpaquePtr(), 1725 T.getCloseLocation()); 1726 } else { 1727 EnterExpressionEvaluationContext Unevaluated( 1728 Actions, Sema::ExpressionEvaluationContext::Unevaluated); 1729 Result = ParseExpression(); 1730 1731 // Match the ')'. 1732 if (Result.isInvalid()) 1733 SkipUntil(tok::r_paren, StopAtSemi); 1734 else { 1735 T.consumeClose(); 1736 1737 Result = Actions.ActOnCXXUuidof(OpLoc, T.getOpenLocation(), 1738 /*isType=*/false, 1739 Result.get(), T.getCloseLocation()); 1740 } 1741 } 1742 1743 return Result; 1744 } 1745 1746 /// Parse a C++ pseudo-destructor expression after the base, 1747 /// . or -> operator, and nested-name-specifier have already been 1748 /// parsed. We're handling this fragment of the grammar: 1749 /// 1750 /// postfix-expression: [C++2a expr.post] 1751 /// postfix-expression . template[opt] id-expression 1752 /// postfix-expression -> template[opt] id-expression 1753 /// 1754 /// id-expression: 1755 /// qualified-id 1756 /// unqualified-id 1757 /// 1758 /// qualified-id: 1759 /// nested-name-specifier template[opt] unqualified-id 1760 /// 1761 /// nested-name-specifier: 1762 /// type-name :: 1763 /// decltype-specifier :: FIXME: not implemented, but probably only 1764 /// allowed in C++ grammar by accident 1765 /// nested-name-specifier identifier :: 1766 /// nested-name-specifier template[opt] simple-template-id :: 1767 /// [...] 1768 /// 1769 /// unqualified-id: 1770 /// ~ type-name 1771 /// ~ decltype-specifier 1772 /// [...] 1773 /// 1774 /// ... where the all but the last component of the nested-name-specifier 1775 /// has already been parsed, and the base expression is not of a non-dependent 1776 /// class type. 1777 ExprResult 1778 Parser::ParseCXXPseudoDestructor(Expr *Base, SourceLocation OpLoc, 1779 tok::TokenKind OpKind, 1780 CXXScopeSpec &SS, 1781 ParsedType ObjectType) { 1782 // If the last component of the (optional) nested-name-specifier is 1783 // template[opt] simple-template-id, it has already been annotated. 1784 UnqualifiedId FirstTypeName; 1785 SourceLocation CCLoc; 1786 if (Tok.is(tok::identifier)) { 1787 FirstTypeName.setIdentifier(Tok.getIdentifierInfo(), Tok.getLocation()); 1788 ConsumeToken(); 1789 assert(Tok.is(tok::coloncolon) &&"ParseOptionalCXXScopeSpecifier fail"); 1790 CCLoc = ConsumeToken(); 1791 } else if (Tok.is(tok::annot_template_id)) { 1792 TemplateIdAnnotation *TemplateId = takeTemplateIdAnnotation(Tok); 1793 // FIXME: Carry on and build an AST representation for tooling. 1794 if (TemplateId->isInvalid()) 1795 return ExprError(); 1796 FirstTypeName.setTemplateId(TemplateId); 1797 ConsumeAnnotationToken(); 1798 assert(Tok.is(tok::coloncolon) &&"ParseOptionalCXXScopeSpecifier fail"); 1799 CCLoc = ConsumeToken(); 1800 } else { 1801 assert(SS.isEmpty() && "missing last component of nested name specifier"); 1802 FirstTypeName.setIdentifier(nullptr, SourceLocation()); 1803 } 1804 1805 // Parse the tilde. 1806 assert(Tok.is(tok::tilde) && "ParseOptionalCXXScopeSpecifier fail"); 1807 SourceLocation TildeLoc = ConsumeToken(); 1808 1809 if (Tok.is(tok::kw_decltype) && !FirstTypeName.isValid()) { 1810 DeclSpec DS(AttrFactory); 1811 ParseDecltypeSpecifier(DS); 1812 if (DS.getTypeSpecType() == TST_error) 1813 return ExprError(); 1814 return Actions.ActOnPseudoDestructorExpr(getCurScope(), Base, OpLoc, OpKind, 1815 TildeLoc, DS); 1816 } 1817 1818 if (!Tok.is(tok::identifier)) { 1819 Diag(Tok, diag::err_destructor_tilde_identifier); 1820 return ExprError(); 1821 } 1822 1823 // Parse the second type. 1824 UnqualifiedId SecondTypeName; 1825 IdentifierInfo *Name = Tok.getIdentifierInfo(); 1826 SourceLocation NameLoc = ConsumeToken(); 1827 SecondTypeName.setIdentifier(Name, NameLoc); 1828 1829 // If there is a '<', the second type name is a template-id. Parse 1830 // it as such. 1831 // 1832 // FIXME: This is not a context in which a '<' is assumed to start a template 1833 // argument list. This affects examples such as 1834 // void f(auto *p) { p->~X<int>(); } 1835 // ... but there's no ambiguity, and nowhere to write 'template' in such an 1836 // example, so we accept it anyway. 1837 if (Tok.is(tok::less) && 1838 ParseUnqualifiedIdTemplateId( 1839 SS, ObjectType, Base && Base->containsErrors(), SourceLocation(), 1840 Name, NameLoc, false, SecondTypeName, 1841 /*AssumeTemplateId=*/true)) 1842 return ExprError(); 1843 1844 return Actions.ActOnPseudoDestructorExpr(getCurScope(), Base, OpLoc, OpKind, 1845 SS, FirstTypeName, CCLoc, TildeLoc, 1846 SecondTypeName); 1847 } 1848 1849 /// ParseCXXBoolLiteral - This handles the C++ Boolean literals. 1850 /// 1851 /// boolean-literal: [C++ 2.13.5] 1852 /// 'true' 1853 /// 'false' 1854 ExprResult Parser::ParseCXXBoolLiteral() { 1855 tok::TokenKind Kind = Tok.getKind(); 1856 return Actions.ActOnCXXBoolLiteral(ConsumeToken(), Kind); 1857 } 1858 1859 /// ParseThrowExpression - This handles the C++ throw expression. 1860 /// 1861 /// throw-expression: [C++ 15] 1862 /// 'throw' assignment-expression[opt] 1863 ExprResult Parser::ParseThrowExpression() { 1864 assert(Tok.is(tok::kw_throw) && "Not throw!"); 1865 SourceLocation ThrowLoc = ConsumeToken(); // Eat the throw token. 1866 1867 // If the current token isn't the start of an assignment-expression, 1868 // then the expression is not present. This handles things like: 1869 // "C ? throw : (void)42", which is crazy but legal. 1870 switch (Tok.getKind()) { // FIXME: move this predicate somewhere common. 1871 case tok::semi: 1872 case tok::r_paren: 1873 case tok::r_square: 1874 case tok::r_brace: 1875 case tok::colon: 1876 case tok::comma: 1877 return Actions.ActOnCXXThrow(getCurScope(), ThrowLoc, nullptr); 1878 1879 default: 1880 ExprResult Expr(ParseAssignmentExpression()); 1881 if (Expr.isInvalid()) return Expr; 1882 return Actions.ActOnCXXThrow(getCurScope(), ThrowLoc, Expr.get()); 1883 } 1884 } 1885 1886 /// Parse the C++ Coroutines co_yield expression. 1887 /// 1888 /// co_yield-expression: 1889 /// 'co_yield' assignment-expression[opt] 1890 ExprResult Parser::ParseCoyieldExpression() { 1891 assert(Tok.is(tok::kw_co_yield) && "Not co_yield!"); 1892 1893 SourceLocation Loc = ConsumeToken(); 1894 ExprResult Expr = Tok.is(tok::l_brace) ? ParseBraceInitializer() 1895 : ParseAssignmentExpression(); 1896 if (!Expr.isInvalid()) 1897 Expr = Actions.ActOnCoyieldExpr(getCurScope(), Loc, Expr.get()); 1898 return Expr; 1899 } 1900 1901 /// ParseCXXThis - This handles the C++ 'this' pointer. 1902 /// 1903 /// C++ 9.3.2: In the body of a non-static member function, the keyword this is 1904 /// a non-lvalue expression whose value is the address of the object for which 1905 /// the function is called. 1906 ExprResult Parser::ParseCXXThis() { 1907 assert(Tok.is(tok::kw_this) && "Not 'this'!"); 1908 SourceLocation ThisLoc = ConsumeToken(); 1909 return Actions.ActOnCXXThis(ThisLoc); 1910 } 1911 1912 /// ParseCXXTypeConstructExpression - Parse construction of a specified type. 1913 /// Can be interpreted either as function-style casting ("int(x)") 1914 /// or class type construction ("ClassType(x,y,z)") 1915 /// or creation of a value-initialized type ("int()"). 1916 /// See [C++ 5.2.3]. 1917 /// 1918 /// postfix-expression: [C++ 5.2p1] 1919 /// simple-type-specifier '(' expression-list[opt] ')' 1920 /// [C++0x] simple-type-specifier braced-init-list 1921 /// typename-specifier '(' expression-list[opt] ')' 1922 /// [C++0x] typename-specifier braced-init-list 1923 /// 1924 /// In C++1z onwards, the type specifier can also be a template-name. 1925 ExprResult 1926 Parser::ParseCXXTypeConstructExpression(const DeclSpec &DS) { 1927 Declarator DeclaratorInfo(DS, ParsedAttributesView::none(), 1928 DeclaratorContext::FunctionalCast); 1929 ParsedType TypeRep = Actions.ActOnTypeName(getCurScope(), DeclaratorInfo).get(); 1930 1931 assert((Tok.is(tok::l_paren) || 1932 (getLangOpts().CPlusPlus11 && Tok.is(tok::l_brace))) 1933 && "Expected '(' or '{'!"); 1934 1935 if (Tok.is(tok::l_brace)) { 1936 PreferredType.enterTypeCast(Tok.getLocation(), TypeRep.get()); 1937 ExprResult Init = ParseBraceInitializer(); 1938 if (Init.isInvalid()) 1939 return Init; 1940 Expr *InitList = Init.get(); 1941 return Actions.ActOnCXXTypeConstructExpr( 1942 TypeRep, InitList->getBeginLoc(), MultiExprArg(&InitList, 1), 1943 InitList->getEndLoc(), /*ListInitialization=*/true); 1944 } else { 1945 BalancedDelimiterTracker T(*this, tok::l_paren); 1946 T.consumeOpen(); 1947 1948 PreferredType.enterTypeCast(Tok.getLocation(), TypeRep.get()); 1949 1950 ExprVector Exprs; 1951 1952 auto RunSignatureHelp = [&]() { 1953 QualType PreferredType; 1954 if (TypeRep) 1955 PreferredType = Actions.ProduceConstructorSignatureHelp( 1956 TypeRep.get()->getCanonicalTypeInternal(), DS.getEndLoc(), Exprs, 1957 T.getOpenLocation(), /*Braced=*/false); 1958 CalledSignatureHelp = true; 1959 return PreferredType; 1960 }; 1961 1962 if (Tok.isNot(tok::r_paren)) { 1963 if (ParseExpressionList(Exprs, [&] { 1964 PreferredType.enterFunctionArgument(Tok.getLocation(), 1965 RunSignatureHelp); 1966 })) { 1967 if (PP.isCodeCompletionReached() && !CalledSignatureHelp) 1968 RunSignatureHelp(); 1969 SkipUntil(tok::r_paren, StopAtSemi); 1970 return ExprError(); 1971 } 1972 } 1973 1974 // Match the ')'. 1975 T.consumeClose(); 1976 1977 // TypeRep could be null, if it references an invalid typedef. 1978 if (!TypeRep) 1979 return ExprError(); 1980 1981 return Actions.ActOnCXXTypeConstructExpr(TypeRep, T.getOpenLocation(), 1982 Exprs, T.getCloseLocation(), 1983 /*ListInitialization=*/false); 1984 } 1985 } 1986 1987 Parser::DeclGroupPtrTy 1988 Parser::ParseAliasDeclarationInInitStatement(DeclaratorContext Context, 1989 ParsedAttributes &Attrs) { 1990 assert(Tok.is(tok::kw_using) && "Expected using"); 1991 assert((Context == DeclaratorContext::ForInit || 1992 Context == DeclaratorContext::SelectionInit) && 1993 "Unexpected Declarator Context"); 1994 DeclGroupPtrTy DG; 1995 SourceLocation DeclStart = ConsumeToken(), DeclEnd; 1996 1997 DG = ParseUsingDeclaration(Context, {}, DeclStart, DeclEnd, Attrs, AS_none); 1998 if (!DG) 1999 return DG; 2000 2001 Diag(DeclStart, !getLangOpts().CPlusPlus23 2002 ? diag::ext_alias_in_init_statement 2003 : diag::warn_cxx20_alias_in_init_statement) 2004 << SourceRange(DeclStart, DeclEnd); 2005 2006 return DG; 2007 } 2008 2009 /// ParseCXXCondition - if/switch/while condition expression. 2010 /// 2011 /// condition: 2012 /// expression 2013 /// type-specifier-seq declarator '=' assignment-expression 2014 /// [C++11] type-specifier-seq declarator '=' initializer-clause 2015 /// [C++11] type-specifier-seq declarator braced-init-list 2016 /// [Clang] type-specifier-seq ref-qualifier[opt] '[' identifier-list ']' 2017 /// brace-or-equal-initializer 2018 /// [GNU] type-specifier-seq declarator simple-asm-expr[opt] attributes[opt] 2019 /// '=' assignment-expression 2020 /// 2021 /// In C++1z, a condition may in some contexts be preceded by an 2022 /// optional init-statement. This function will parse that too. 2023 /// 2024 /// \param InitStmt If non-null, an init-statement is permitted, and if present 2025 /// will be parsed and stored here. 2026 /// 2027 /// \param Loc The location of the start of the statement that requires this 2028 /// condition, e.g., the "for" in a for loop. 2029 /// 2030 /// \param MissingOK Whether an empty condition is acceptable here. Otherwise 2031 /// it is considered an error to be recovered from. 2032 /// 2033 /// \param FRI If non-null, a for range declaration is permitted, and if 2034 /// present will be parsed and stored here, and a null result will be returned. 2035 /// 2036 /// \param EnterForConditionScope If true, enter a continue/break scope at the 2037 /// appropriate moment for a 'for' loop. 2038 /// 2039 /// \returns The parsed condition. 2040 Sema::ConditionResult 2041 Parser::ParseCXXCondition(StmtResult *InitStmt, SourceLocation Loc, 2042 Sema::ConditionKind CK, bool MissingOK, 2043 ForRangeInfo *FRI, bool EnterForConditionScope) { 2044 // Helper to ensure we always enter a continue/break scope if requested. 2045 struct ForConditionScopeRAII { 2046 Scope *S; 2047 void enter(bool IsConditionVariable) { 2048 if (S) { 2049 S->AddFlags(Scope::BreakScope | Scope::ContinueScope); 2050 S->setIsConditionVarScope(IsConditionVariable); 2051 } 2052 } 2053 ~ForConditionScopeRAII() { 2054 if (S) 2055 S->setIsConditionVarScope(false); 2056 } 2057 } ForConditionScope{EnterForConditionScope ? getCurScope() : nullptr}; 2058 2059 ParenBraceBracketBalancer BalancerRAIIObj(*this); 2060 PreferredType.enterCondition(Actions, Tok.getLocation()); 2061 2062 if (Tok.is(tok::code_completion)) { 2063 cutOffParsing(); 2064 Actions.CodeCompleteOrdinaryName(getCurScope(), Sema::PCC_Condition); 2065 return Sema::ConditionError(); 2066 } 2067 2068 ParsedAttributes attrs(AttrFactory); 2069 MaybeParseCXX11Attributes(attrs); 2070 2071 const auto WarnOnInit = [this, &CK] { 2072 Diag(Tok.getLocation(), getLangOpts().CPlusPlus17 2073 ? diag::warn_cxx14_compat_init_statement 2074 : diag::ext_init_statement) 2075 << (CK == Sema::ConditionKind::Switch); 2076 }; 2077 2078 // Determine what kind of thing we have. 2079 switch (isCXXConditionDeclarationOrInitStatement(InitStmt, FRI)) { 2080 case ConditionOrInitStatement::Expression: { 2081 // If this is a for loop, we're entering its condition. 2082 ForConditionScope.enter(/*IsConditionVariable=*/false); 2083 2084 ProhibitAttributes(attrs); 2085 2086 // We can have an empty expression here. 2087 // if (; true); 2088 if (InitStmt && Tok.is(tok::semi)) { 2089 WarnOnInit(); 2090 SourceLocation SemiLoc = Tok.getLocation(); 2091 if (!Tok.hasLeadingEmptyMacro() && !SemiLoc.isMacroID()) { 2092 Diag(SemiLoc, diag::warn_empty_init_statement) 2093 << (CK == Sema::ConditionKind::Switch) 2094 << FixItHint::CreateRemoval(SemiLoc); 2095 } 2096 ConsumeToken(); 2097 *InitStmt = Actions.ActOnNullStmt(SemiLoc); 2098 return ParseCXXCondition(nullptr, Loc, CK, MissingOK); 2099 } 2100 2101 // Parse the expression. 2102 ExprResult Expr = ParseExpression(); // expression 2103 if (Expr.isInvalid()) 2104 return Sema::ConditionError(); 2105 2106 if (InitStmt && Tok.is(tok::semi)) { 2107 WarnOnInit(); 2108 *InitStmt = Actions.ActOnExprStmt(Expr.get()); 2109 ConsumeToken(); 2110 return ParseCXXCondition(nullptr, Loc, CK, MissingOK); 2111 } 2112 2113 return Actions.ActOnCondition(getCurScope(), Loc, Expr.get(), CK, 2114 MissingOK); 2115 } 2116 2117 case ConditionOrInitStatement::InitStmtDecl: { 2118 WarnOnInit(); 2119 DeclGroupPtrTy DG; 2120 SourceLocation DeclStart = Tok.getLocation(), DeclEnd; 2121 if (Tok.is(tok::kw_using)) 2122 DG = ParseAliasDeclarationInInitStatement( 2123 DeclaratorContext::SelectionInit, attrs); 2124 else { 2125 ParsedAttributes DeclSpecAttrs(AttrFactory); 2126 DG = ParseSimpleDeclaration(DeclaratorContext::SelectionInit, DeclEnd, 2127 attrs, DeclSpecAttrs, /*RequireSemi=*/true); 2128 } 2129 *InitStmt = Actions.ActOnDeclStmt(DG, DeclStart, DeclEnd); 2130 return ParseCXXCondition(nullptr, Loc, CK, MissingOK); 2131 } 2132 2133 case ConditionOrInitStatement::ForRangeDecl: { 2134 // This is 'for (init-stmt; for-range-decl : range-expr)'. 2135 // We're not actually in a for loop yet, so 'break' and 'continue' aren't 2136 // permitted here. 2137 assert(FRI && "should not parse a for range declaration here"); 2138 SourceLocation DeclStart = Tok.getLocation(), DeclEnd; 2139 ParsedAttributes DeclSpecAttrs(AttrFactory); 2140 DeclGroupPtrTy DG = ParseSimpleDeclaration( 2141 DeclaratorContext::ForInit, DeclEnd, attrs, DeclSpecAttrs, false, FRI); 2142 FRI->LoopVar = Actions.ActOnDeclStmt(DG, DeclStart, Tok.getLocation()); 2143 return Sema::ConditionResult(); 2144 } 2145 2146 case ConditionOrInitStatement::ConditionDecl: 2147 case ConditionOrInitStatement::Error: 2148 break; 2149 } 2150 2151 // If this is a for loop, we're entering its condition. 2152 ForConditionScope.enter(/*IsConditionVariable=*/true); 2153 2154 // type-specifier-seq 2155 DeclSpec DS(AttrFactory); 2156 ParseSpecifierQualifierList(DS, AS_none, DeclSpecContext::DSC_condition); 2157 2158 // declarator 2159 Declarator DeclaratorInfo(DS, attrs, DeclaratorContext::Condition); 2160 ParseDeclarator(DeclaratorInfo); 2161 2162 // simple-asm-expr[opt] 2163 if (Tok.is(tok::kw_asm)) { 2164 SourceLocation Loc; 2165 ExprResult AsmLabel(ParseSimpleAsm(/*ForAsmLabel*/ true, &Loc)); 2166 if (AsmLabel.isInvalid()) { 2167 SkipUntil(tok::semi, StopAtSemi); 2168 return Sema::ConditionError(); 2169 } 2170 DeclaratorInfo.setAsmLabel(AsmLabel.get()); 2171 DeclaratorInfo.SetRangeEnd(Loc); 2172 } 2173 2174 // If attributes are present, parse them. 2175 MaybeParseGNUAttributes(DeclaratorInfo); 2176 2177 // Type-check the declaration itself. 2178 DeclResult Dcl = Actions.ActOnCXXConditionDeclaration(getCurScope(), 2179 DeclaratorInfo); 2180 if (Dcl.isInvalid()) 2181 return Sema::ConditionError(); 2182 Decl *DeclOut = Dcl.get(); 2183 2184 // '=' assignment-expression 2185 // If a '==' or '+=' is found, suggest a fixit to '='. 2186 bool CopyInitialization = isTokenEqualOrEqualTypo(); 2187 if (CopyInitialization) 2188 ConsumeToken(); 2189 2190 ExprResult InitExpr = ExprError(); 2191 if (getLangOpts().CPlusPlus11 && Tok.is(tok::l_brace)) { 2192 Diag(Tok.getLocation(), 2193 diag::warn_cxx98_compat_generalized_initializer_lists); 2194 InitExpr = ParseBraceInitializer(); 2195 } else if (CopyInitialization) { 2196 PreferredType.enterVariableInit(Tok.getLocation(), DeclOut); 2197 InitExpr = ParseAssignmentExpression(); 2198 } else if (Tok.is(tok::l_paren)) { 2199 // This was probably an attempt to initialize the variable. 2200 SourceLocation LParen = ConsumeParen(), RParen = LParen; 2201 if (SkipUntil(tok::r_paren, StopAtSemi | StopBeforeMatch)) 2202 RParen = ConsumeParen(); 2203 Diag(DeclOut->getLocation(), 2204 diag::err_expected_init_in_condition_lparen) 2205 << SourceRange(LParen, RParen); 2206 } else { 2207 Diag(DeclOut->getLocation(), diag::err_expected_init_in_condition); 2208 } 2209 2210 if (!InitExpr.isInvalid()) 2211 Actions.AddInitializerToDecl(DeclOut, InitExpr.get(), !CopyInitialization); 2212 else 2213 Actions.ActOnInitializerError(DeclOut); 2214 2215 Actions.FinalizeDeclaration(DeclOut); 2216 return Actions.ActOnConditionVariable(DeclOut, Loc, CK); 2217 } 2218 2219 /// ParseCXXSimpleTypeSpecifier - [C++ 7.1.5.2] Simple type specifiers. 2220 /// This should only be called when the current token is known to be part of 2221 /// simple-type-specifier. 2222 /// 2223 /// simple-type-specifier: 2224 /// '::'[opt] nested-name-specifier[opt] type-name 2225 /// '::'[opt] nested-name-specifier 'template' simple-template-id [TODO] 2226 /// char 2227 /// wchar_t 2228 /// bool 2229 /// short 2230 /// int 2231 /// long 2232 /// signed 2233 /// unsigned 2234 /// float 2235 /// double 2236 /// void 2237 /// [GNU] typeof-specifier 2238 /// [C++0x] auto [TODO] 2239 /// 2240 /// type-name: 2241 /// class-name 2242 /// enum-name 2243 /// typedef-name 2244 /// 2245 void Parser::ParseCXXSimpleTypeSpecifier(DeclSpec &DS) { 2246 DS.SetRangeStart(Tok.getLocation()); 2247 const char *PrevSpec; 2248 unsigned DiagID; 2249 SourceLocation Loc = Tok.getLocation(); 2250 const clang::PrintingPolicy &Policy = 2251 Actions.getASTContext().getPrintingPolicy(); 2252 2253 switch (Tok.getKind()) { 2254 case tok::identifier: // foo::bar 2255 case tok::coloncolon: // ::foo::bar 2256 llvm_unreachable("Annotation token should already be formed!"); 2257 default: 2258 llvm_unreachable("Not a simple-type-specifier token!"); 2259 2260 // type-name 2261 case tok::annot_typename: { 2262 DS.SetTypeSpecType(DeclSpec::TST_typename, Loc, PrevSpec, DiagID, 2263 getTypeAnnotation(Tok), Policy); 2264 DS.SetRangeEnd(Tok.getAnnotationEndLoc()); 2265 ConsumeAnnotationToken(); 2266 2267 DS.Finish(Actions, Policy); 2268 return; 2269 } 2270 2271 case tok::kw__ExtInt: 2272 case tok::kw__BitInt: { 2273 DiagnoseBitIntUse(Tok); 2274 ExprResult ER = ParseExtIntegerArgument(); 2275 if (ER.isInvalid()) 2276 DS.SetTypeSpecError(); 2277 else 2278 DS.SetBitIntType(Loc, ER.get(), PrevSpec, DiagID, Policy); 2279 2280 // Do this here because we have already consumed the close paren. 2281 DS.SetRangeEnd(PrevTokLocation); 2282 DS.Finish(Actions, Policy); 2283 return; 2284 } 2285 2286 // builtin types 2287 case tok::kw_short: 2288 DS.SetTypeSpecWidth(TypeSpecifierWidth::Short, Loc, PrevSpec, DiagID, 2289 Policy); 2290 break; 2291 case tok::kw_long: 2292 DS.SetTypeSpecWidth(TypeSpecifierWidth::Long, Loc, PrevSpec, DiagID, 2293 Policy); 2294 break; 2295 case tok::kw___int64: 2296 DS.SetTypeSpecWidth(TypeSpecifierWidth::LongLong, Loc, PrevSpec, DiagID, 2297 Policy); 2298 break; 2299 case tok::kw_signed: 2300 DS.SetTypeSpecSign(TypeSpecifierSign::Signed, Loc, PrevSpec, DiagID); 2301 break; 2302 case tok::kw_unsigned: 2303 DS.SetTypeSpecSign(TypeSpecifierSign::Unsigned, Loc, PrevSpec, DiagID); 2304 break; 2305 case tok::kw_void: 2306 DS.SetTypeSpecType(DeclSpec::TST_void, Loc, PrevSpec, DiagID, Policy); 2307 break; 2308 case tok::kw_auto: 2309 DS.SetTypeSpecType(DeclSpec::TST_auto, Loc, PrevSpec, DiagID, Policy); 2310 break; 2311 case tok::kw_char: 2312 DS.SetTypeSpecType(DeclSpec::TST_char, Loc, PrevSpec, DiagID, Policy); 2313 break; 2314 case tok::kw_int: 2315 DS.SetTypeSpecType(DeclSpec::TST_int, Loc, PrevSpec, DiagID, Policy); 2316 break; 2317 case tok::kw___int128: 2318 DS.SetTypeSpecType(DeclSpec::TST_int128, Loc, PrevSpec, DiagID, Policy); 2319 break; 2320 case tok::kw___bf16: 2321 DS.SetTypeSpecType(DeclSpec::TST_BFloat16, Loc, PrevSpec, DiagID, Policy); 2322 break; 2323 case tok::kw_half: 2324 DS.SetTypeSpecType(DeclSpec::TST_half, Loc, PrevSpec, DiagID, Policy); 2325 break; 2326 case tok::kw_float: 2327 DS.SetTypeSpecType(DeclSpec::TST_float, Loc, PrevSpec, DiagID, Policy); 2328 break; 2329 case tok::kw_double: 2330 DS.SetTypeSpecType(DeclSpec::TST_double, Loc, PrevSpec, DiagID, Policy); 2331 break; 2332 case tok::kw__Float16: 2333 DS.SetTypeSpecType(DeclSpec::TST_float16, Loc, PrevSpec, DiagID, Policy); 2334 break; 2335 case tok::kw___float128: 2336 DS.SetTypeSpecType(DeclSpec::TST_float128, Loc, PrevSpec, DiagID, Policy); 2337 break; 2338 case tok::kw___ibm128: 2339 DS.SetTypeSpecType(DeclSpec::TST_ibm128, Loc, PrevSpec, DiagID, Policy); 2340 break; 2341 case tok::kw_wchar_t: 2342 DS.SetTypeSpecType(DeclSpec::TST_wchar, Loc, PrevSpec, DiagID, Policy); 2343 break; 2344 case tok::kw_char8_t: 2345 DS.SetTypeSpecType(DeclSpec::TST_char8, Loc, PrevSpec, DiagID, Policy); 2346 break; 2347 case tok::kw_char16_t: 2348 DS.SetTypeSpecType(DeclSpec::TST_char16, Loc, PrevSpec, DiagID, Policy); 2349 break; 2350 case tok::kw_char32_t: 2351 DS.SetTypeSpecType(DeclSpec::TST_char32, Loc, PrevSpec, DiagID, Policy); 2352 break; 2353 case tok::kw_bool: 2354 DS.SetTypeSpecType(DeclSpec::TST_bool, Loc, PrevSpec, DiagID, Policy); 2355 break; 2356 #define GENERIC_IMAGE_TYPE(ImgType, Id) \ 2357 case tok::kw_##ImgType##_t: \ 2358 DS.SetTypeSpecType(DeclSpec::TST_##ImgType##_t, Loc, PrevSpec, DiagID, \ 2359 Policy); \ 2360 break; 2361 #include "clang/Basic/OpenCLImageTypes.def" 2362 2363 case tok::annot_decltype: 2364 case tok::kw_decltype: 2365 DS.SetRangeEnd(ParseDecltypeSpecifier(DS)); 2366 return DS.Finish(Actions, Policy); 2367 2368 // GNU typeof support. 2369 case tok::kw_typeof: 2370 ParseTypeofSpecifier(DS); 2371 DS.Finish(Actions, Policy); 2372 return; 2373 } 2374 ConsumeAnyToken(); 2375 DS.SetRangeEnd(PrevTokLocation); 2376 DS.Finish(Actions, Policy); 2377 } 2378 2379 /// ParseCXXTypeSpecifierSeq - Parse a C++ type-specifier-seq (C++ 2380 /// [dcl.name]), which is a non-empty sequence of type-specifiers, 2381 /// e.g., "const short int". Note that the DeclSpec is *not* finished 2382 /// by parsing the type-specifier-seq, because these sequences are 2383 /// typically followed by some form of declarator. Returns true and 2384 /// emits diagnostics if this is not a type-specifier-seq, false 2385 /// otherwise. 2386 /// 2387 /// type-specifier-seq: [C++ 8.1] 2388 /// type-specifier type-specifier-seq[opt] 2389 /// 2390 bool Parser::ParseCXXTypeSpecifierSeq(DeclSpec &DS, DeclaratorContext Context) { 2391 ParseSpecifierQualifierList(DS, AS_none, 2392 getDeclSpecContextFromDeclaratorContext(Context)); 2393 DS.Finish(Actions, Actions.getASTContext().getPrintingPolicy()); 2394 return false; 2395 } 2396 2397 /// Finish parsing a C++ unqualified-id that is a template-id of 2398 /// some form. 2399 /// 2400 /// This routine is invoked when a '<' is encountered after an identifier or 2401 /// operator-function-id is parsed by \c ParseUnqualifiedId() to determine 2402 /// whether the unqualified-id is actually a template-id. This routine will 2403 /// then parse the template arguments and form the appropriate template-id to 2404 /// return to the caller. 2405 /// 2406 /// \param SS the nested-name-specifier that precedes this template-id, if 2407 /// we're actually parsing a qualified-id. 2408 /// 2409 /// \param ObjectType if this unqualified-id occurs within a member access 2410 /// expression, the type of the base object whose member is being accessed. 2411 /// 2412 /// \param ObjectHadErrors this unqualified-id occurs within a member access 2413 /// expression, indicates whether the original subexpressions had any errors. 2414 /// 2415 /// \param Name for constructor and destructor names, this is the actual 2416 /// identifier that may be a template-name. 2417 /// 2418 /// \param NameLoc the location of the class-name in a constructor or 2419 /// destructor. 2420 /// 2421 /// \param EnteringContext whether we're entering the scope of the 2422 /// nested-name-specifier. 2423 /// 2424 /// \param Id as input, describes the template-name or operator-function-id 2425 /// that precedes the '<'. If template arguments were parsed successfully, 2426 /// will be updated with the template-id. 2427 /// 2428 /// \param AssumeTemplateId When true, this routine will assume that the name 2429 /// refers to a template without performing name lookup to verify. 2430 /// 2431 /// \returns true if a parse error occurred, false otherwise. 2432 bool Parser::ParseUnqualifiedIdTemplateId( 2433 CXXScopeSpec &SS, ParsedType ObjectType, bool ObjectHadErrors, 2434 SourceLocation TemplateKWLoc, IdentifierInfo *Name, SourceLocation NameLoc, 2435 bool EnteringContext, UnqualifiedId &Id, bool AssumeTemplateId) { 2436 assert(Tok.is(tok::less) && "Expected '<' to finish parsing a template-id"); 2437 2438 TemplateTy Template; 2439 TemplateNameKind TNK = TNK_Non_template; 2440 switch (Id.getKind()) { 2441 case UnqualifiedIdKind::IK_Identifier: 2442 case UnqualifiedIdKind::IK_OperatorFunctionId: 2443 case UnqualifiedIdKind::IK_LiteralOperatorId: 2444 if (AssumeTemplateId) { 2445 // We defer the injected-class-name checks until we've found whether 2446 // this template-id is used to form a nested-name-specifier or not. 2447 TNK = Actions.ActOnTemplateName(getCurScope(), SS, TemplateKWLoc, Id, 2448 ObjectType, EnteringContext, Template, 2449 /*AllowInjectedClassName*/ true); 2450 } else { 2451 bool MemberOfUnknownSpecialization; 2452 TNK = Actions.isTemplateName(getCurScope(), SS, 2453 TemplateKWLoc.isValid(), Id, 2454 ObjectType, EnteringContext, Template, 2455 MemberOfUnknownSpecialization); 2456 // If lookup found nothing but we're assuming that this is a template 2457 // name, double-check that makes sense syntactically before committing 2458 // to it. 2459 if (TNK == TNK_Undeclared_template && 2460 isTemplateArgumentList(0) == TPResult::False) 2461 return false; 2462 2463 if (TNK == TNK_Non_template && MemberOfUnknownSpecialization && 2464 ObjectType && isTemplateArgumentList(0) == TPResult::True) { 2465 // If we had errors before, ObjectType can be dependent even without any 2466 // templates, do not report missing template keyword in that case. 2467 if (!ObjectHadErrors) { 2468 // We have something like t->getAs<T>(), where getAs is a 2469 // member of an unknown specialization. However, this will only 2470 // parse correctly as a template, so suggest the keyword 'template' 2471 // before 'getAs' and treat this as a dependent template name. 2472 std::string Name; 2473 if (Id.getKind() == UnqualifiedIdKind::IK_Identifier) 2474 Name = std::string(Id.Identifier->getName()); 2475 else { 2476 Name = "operator "; 2477 if (Id.getKind() == UnqualifiedIdKind::IK_OperatorFunctionId) 2478 Name += getOperatorSpelling(Id.OperatorFunctionId.Operator); 2479 else 2480 Name += Id.Identifier->getName(); 2481 } 2482 Diag(Id.StartLocation, diag::err_missing_dependent_template_keyword) 2483 << Name 2484 << FixItHint::CreateInsertion(Id.StartLocation, "template "); 2485 } 2486 TNK = Actions.ActOnTemplateName( 2487 getCurScope(), SS, TemplateKWLoc, Id, ObjectType, EnteringContext, 2488 Template, /*AllowInjectedClassName*/ true); 2489 } else if (TNK == TNK_Non_template) { 2490 return false; 2491 } 2492 } 2493 break; 2494 2495 case UnqualifiedIdKind::IK_ConstructorName: { 2496 UnqualifiedId TemplateName; 2497 bool MemberOfUnknownSpecialization; 2498 TemplateName.setIdentifier(Name, NameLoc); 2499 TNK = Actions.isTemplateName(getCurScope(), SS, TemplateKWLoc.isValid(), 2500 TemplateName, ObjectType, 2501 EnteringContext, Template, 2502 MemberOfUnknownSpecialization); 2503 if (TNK == TNK_Non_template) 2504 return false; 2505 break; 2506 } 2507 2508 case UnqualifiedIdKind::IK_DestructorName: { 2509 UnqualifiedId TemplateName; 2510 bool MemberOfUnknownSpecialization; 2511 TemplateName.setIdentifier(Name, NameLoc); 2512 if (ObjectType) { 2513 TNK = Actions.ActOnTemplateName( 2514 getCurScope(), SS, TemplateKWLoc, TemplateName, ObjectType, 2515 EnteringContext, Template, /*AllowInjectedClassName*/ true); 2516 } else { 2517 TNK = Actions.isTemplateName(getCurScope(), SS, TemplateKWLoc.isValid(), 2518 TemplateName, ObjectType, 2519 EnteringContext, Template, 2520 MemberOfUnknownSpecialization); 2521 2522 if (TNK == TNK_Non_template && !Id.DestructorName.get()) { 2523 Diag(NameLoc, diag::err_destructor_template_id) 2524 << Name << SS.getRange(); 2525 // Carry on to parse the template arguments before bailing out. 2526 } 2527 } 2528 break; 2529 } 2530 2531 default: 2532 return false; 2533 } 2534 2535 // Parse the enclosed template argument list. 2536 SourceLocation LAngleLoc, RAngleLoc; 2537 TemplateArgList TemplateArgs; 2538 if (ParseTemplateIdAfterTemplateName(true, LAngleLoc, TemplateArgs, RAngleLoc, 2539 Template)) 2540 return true; 2541 2542 // If this is a non-template, we already issued a diagnostic. 2543 if (TNK == TNK_Non_template) 2544 return true; 2545 2546 if (Id.getKind() == UnqualifiedIdKind::IK_Identifier || 2547 Id.getKind() == UnqualifiedIdKind::IK_OperatorFunctionId || 2548 Id.getKind() == UnqualifiedIdKind::IK_LiteralOperatorId) { 2549 // Form a parsed representation of the template-id to be stored in the 2550 // UnqualifiedId. 2551 2552 // FIXME: Store name for literal operator too. 2553 IdentifierInfo *TemplateII = 2554 Id.getKind() == UnqualifiedIdKind::IK_Identifier ? Id.Identifier 2555 : nullptr; 2556 OverloadedOperatorKind OpKind = 2557 Id.getKind() == UnqualifiedIdKind::IK_Identifier 2558 ? OO_None 2559 : Id.OperatorFunctionId.Operator; 2560 2561 TemplateIdAnnotation *TemplateId = TemplateIdAnnotation::Create( 2562 TemplateKWLoc, Id.StartLocation, TemplateII, OpKind, Template, TNK, 2563 LAngleLoc, RAngleLoc, TemplateArgs, /*ArgsInvalid*/false, TemplateIds); 2564 2565 Id.setTemplateId(TemplateId); 2566 return false; 2567 } 2568 2569 // Bundle the template arguments together. 2570 ASTTemplateArgsPtr TemplateArgsPtr(TemplateArgs); 2571 2572 // Constructor and destructor names. 2573 TypeResult Type = Actions.ActOnTemplateIdType( 2574 getCurScope(), SS, TemplateKWLoc, Template, Name, NameLoc, LAngleLoc, 2575 TemplateArgsPtr, RAngleLoc, /*IsCtorOrDtorName=*/true); 2576 if (Type.isInvalid()) 2577 return true; 2578 2579 if (Id.getKind() == UnqualifiedIdKind::IK_ConstructorName) 2580 Id.setConstructorName(Type.get(), NameLoc, RAngleLoc); 2581 else 2582 Id.setDestructorName(Id.StartLocation, Type.get(), RAngleLoc); 2583 2584 return false; 2585 } 2586 2587 /// Parse an operator-function-id or conversion-function-id as part 2588 /// of a C++ unqualified-id. 2589 /// 2590 /// This routine is responsible only for parsing the operator-function-id or 2591 /// conversion-function-id; it does not handle template arguments in any way. 2592 /// 2593 /// \code 2594 /// operator-function-id: [C++ 13.5] 2595 /// 'operator' operator 2596 /// 2597 /// operator: one of 2598 /// new delete new[] delete[] 2599 /// + - * / % ^ & | ~ 2600 /// ! = < > += -= *= /= %= 2601 /// ^= &= |= << >> >>= <<= == != 2602 /// <= >= && || ++ -- , ->* -> 2603 /// () [] <=> 2604 /// 2605 /// conversion-function-id: [C++ 12.3.2] 2606 /// operator conversion-type-id 2607 /// 2608 /// conversion-type-id: 2609 /// type-specifier-seq conversion-declarator[opt] 2610 /// 2611 /// conversion-declarator: 2612 /// ptr-operator conversion-declarator[opt] 2613 /// \endcode 2614 /// 2615 /// \param SS The nested-name-specifier that preceded this unqualified-id. If 2616 /// non-empty, then we are parsing the unqualified-id of a qualified-id. 2617 /// 2618 /// \param EnteringContext whether we are entering the scope of the 2619 /// nested-name-specifier. 2620 /// 2621 /// \param ObjectType if this unqualified-id occurs within a member access 2622 /// expression, the type of the base object whose member is being accessed. 2623 /// 2624 /// \param Result on a successful parse, contains the parsed unqualified-id. 2625 /// 2626 /// \returns true if parsing fails, false otherwise. 2627 bool Parser::ParseUnqualifiedIdOperator(CXXScopeSpec &SS, bool EnteringContext, 2628 ParsedType ObjectType, 2629 UnqualifiedId &Result) { 2630 assert(Tok.is(tok::kw_operator) && "Expected 'operator' keyword"); 2631 2632 // Consume the 'operator' keyword. 2633 SourceLocation KeywordLoc = ConsumeToken(); 2634 2635 // Determine what kind of operator name we have. 2636 unsigned SymbolIdx = 0; 2637 SourceLocation SymbolLocations[3]; 2638 OverloadedOperatorKind Op = OO_None; 2639 switch (Tok.getKind()) { 2640 case tok::kw_new: 2641 case tok::kw_delete: { 2642 bool isNew = Tok.getKind() == tok::kw_new; 2643 // Consume the 'new' or 'delete'. 2644 SymbolLocations[SymbolIdx++] = ConsumeToken(); 2645 // Check for array new/delete. 2646 if (Tok.is(tok::l_square) && 2647 (!getLangOpts().CPlusPlus11 || NextToken().isNot(tok::l_square))) { 2648 // Consume the '[' and ']'. 2649 BalancedDelimiterTracker T(*this, tok::l_square); 2650 T.consumeOpen(); 2651 T.consumeClose(); 2652 if (T.getCloseLocation().isInvalid()) 2653 return true; 2654 2655 SymbolLocations[SymbolIdx++] = T.getOpenLocation(); 2656 SymbolLocations[SymbolIdx++] = T.getCloseLocation(); 2657 Op = isNew? OO_Array_New : OO_Array_Delete; 2658 } else { 2659 Op = isNew? OO_New : OO_Delete; 2660 } 2661 break; 2662 } 2663 2664 #define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \ 2665 case tok::Token: \ 2666 SymbolLocations[SymbolIdx++] = ConsumeToken(); \ 2667 Op = OO_##Name; \ 2668 break; 2669 #define OVERLOADED_OPERATOR_MULTI(Name,Spelling,Unary,Binary,MemberOnly) 2670 #include "clang/Basic/OperatorKinds.def" 2671 2672 case tok::l_paren: { 2673 // Consume the '(' and ')'. 2674 BalancedDelimiterTracker T(*this, tok::l_paren); 2675 T.consumeOpen(); 2676 T.consumeClose(); 2677 if (T.getCloseLocation().isInvalid()) 2678 return true; 2679 2680 SymbolLocations[SymbolIdx++] = T.getOpenLocation(); 2681 SymbolLocations[SymbolIdx++] = T.getCloseLocation(); 2682 Op = OO_Call; 2683 break; 2684 } 2685 2686 case tok::l_square: { 2687 // Consume the '[' and ']'. 2688 BalancedDelimiterTracker T(*this, tok::l_square); 2689 T.consumeOpen(); 2690 T.consumeClose(); 2691 if (T.getCloseLocation().isInvalid()) 2692 return true; 2693 2694 SymbolLocations[SymbolIdx++] = T.getOpenLocation(); 2695 SymbolLocations[SymbolIdx++] = T.getCloseLocation(); 2696 Op = OO_Subscript; 2697 break; 2698 } 2699 2700 case tok::code_completion: { 2701 // Don't try to parse any further. 2702 cutOffParsing(); 2703 // Code completion for the operator name. 2704 Actions.CodeCompleteOperatorName(getCurScope()); 2705 return true; 2706 } 2707 2708 default: 2709 break; 2710 } 2711 2712 if (Op != OO_None) { 2713 // We have parsed an operator-function-id. 2714 Result.setOperatorFunctionId(KeywordLoc, Op, SymbolLocations); 2715 return false; 2716 } 2717 2718 // Parse a literal-operator-id. 2719 // 2720 // literal-operator-id: C++11 [over.literal] 2721 // operator string-literal identifier 2722 // operator user-defined-string-literal 2723 2724 if (getLangOpts().CPlusPlus11 && isTokenStringLiteral()) { 2725 Diag(Tok.getLocation(), diag::warn_cxx98_compat_literal_operator); 2726 2727 SourceLocation DiagLoc; 2728 unsigned DiagId = 0; 2729 2730 // We're past translation phase 6, so perform string literal concatenation 2731 // before checking for "". 2732 SmallVector<Token, 4> Toks; 2733 SmallVector<SourceLocation, 4> TokLocs; 2734 while (isTokenStringLiteral()) { 2735 if (!Tok.is(tok::string_literal) && !DiagId) { 2736 // C++11 [over.literal]p1: 2737 // The string-literal or user-defined-string-literal in a 2738 // literal-operator-id shall have no encoding-prefix [...]. 2739 DiagLoc = Tok.getLocation(); 2740 DiagId = diag::err_literal_operator_string_prefix; 2741 } 2742 Toks.push_back(Tok); 2743 TokLocs.push_back(ConsumeStringToken()); 2744 } 2745 2746 StringLiteralParser Literal(Toks, PP); 2747 if (Literal.hadError) 2748 return true; 2749 2750 // Grab the literal operator's suffix, which will be either the next token 2751 // or a ud-suffix from the string literal. 2752 bool IsUDSuffix = !Literal.getUDSuffix().empty(); 2753 IdentifierInfo *II = nullptr; 2754 SourceLocation SuffixLoc; 2755 if (IsUDSuffix) { 2756 II = &PP.getIdentifierTable().get(Literal.getUDSuffix()); 2757 SuffixLoc = 2758 Lexer::AdvanceToTokenCharacter(TokLocs[Literal.getUDSuffixToken()], 2759 Literal.getUDSuffixOffset(), 2760 PP.getSourceManager(), getLangOpts()); 2761 } else if (Tok.is(tok::identifier)) { 2762 II = Tok.getIdentifierInfo(); 2763 SuffixLoc = ConsumeToken(); 2764 TokLocs.push_back(SuffixLoc); 2765 } else { 2766 Diag(Tok.getLocation(), diag::err_expected) << tok::identifier; 2767 return true; 2768 } 2769 2770 // The string literal must be empty. 2771 if (!Literal.GetString().empty() || Literal.Pascal) { 2772 // C++11 [over.literal]p1: 2773 // The string-literal or user-defined-string-literal in a 2774 // literal-operator-id shall [...] contain no characters 2775 // other than the implicit terminating '\0'. 2776 DiagLoc = TokLocs.front(); 2777 DiagId = diag::err_literal_operator_string_not_empty; 2778 } 2779 2780 if (DiagId) { 2781 // This isn't a valid literal-operator-id, but we think we know 2782 // what the user meant. Tell them what they should have written. 2783 SmallString<32> Str; 2784 Str += "\"\""; 2785 Str += II->getName(); 2786 Diag(DiagLoc, DiagId) << FixItHint::CreateReplacement( 2787 SourceRange(TokLocs.front(), TokLocs.back()), Str); 2788 } 2789 2790 Result.setLiteralOperatorId(II, KeywordLoc, SuffixLoc); 2791 2792 return Actions.checkLiteralOperatorId(SS, Result, IsUDSuffix); 2793 } 2794 2795 // Parse a conversion-function-id. 2796 // 2797 // conversion-function-id: [C++ 12.3.2] 2798 // operator conversion-type-id 2799 // 2800 // conversion-type-id: 2801 // type-specifier-seq conversion-declarator[opt] 2802 // 2803 // conversion-declarator: 2804 // ptr-operator conversion-declarator[opt] 2805 2806 // Parse the type-specifier-seq. 2807 DeclSpec DS(AttrFactory); 2808 if (ParseCXXTypeSpecifierSeq( 2809 DS, DeclaratorContext::ConversionId)) // FIXME: ObjectType? 2810 return true; 2811 2812 // Parse the conversion-declarator, which is merely a sequence of 2813 // ptr-operators. 2814 Declarator D(DS, ParsedAttributesView::none(), 2815 DeclaratorContext::ConversionId); 2816 ParseDeclaratorInternal(D, /*DirectDeclParser=*/nullptr); 2817 2818 // Finish up the type. 2819 TypeResult Ty = Actions.ActOnTypeName(getCurScope(), D); 2820 if (Ty.isInvalid()) 2821 return true; 2822 2823 // Note that this is a conversion-function-id. 2824 Result.setConversionFunctionId(KeywordLoc, Ty.get(), 2825 D.getSourceRange().getEnd()); 2826 return false; 2827 } 2828 2829 /// Parse a C++ unqualified-id (or a C identifier), which describes the 2830 /// name of an entity. 2831 /// 2832 /// \code 2833 /// unqualified-id: [C++ expr.prim.general] 2834 /// identifier 2835 /// operator-function-id 2836 /// conversion-function-id 2837 /// [C++0x] literal-operator-id [TODO] 2838 /// ~ class-name 2839 /// template-id 2840 /// 2841 /// \endcode 2842 /// 2843 /// \param SS The nested-name-specifier that preceded this unqualified-id. If 2844 /// non-empty, then we are parsing the unqualified-id of a qualified-id. 2845 /// 2846 /// \param ObjectType if this unqualified-id occurs within a member access 2847 /// expression, the type of the base object whose member is being accessed. 2848 /// 2849 /// \param ObjectHadErrors if this unqualified-id occurs within a member access 2850 /// expression, indicates whether the original subexpressions had any errors. 2851 /// When true, diagnostics for missing 'template' keyword will be supressed. 2852 /// 2853 /// \param EnteringContext whether we are entering the scope of the 2854 /// nested-name-specifier. 2855 /// 2856 /// \param AllowDestructorName whether we allow parsing of a destructor name. 2857 /// 2858 /// \param AllowConstructorName whether we allow parsing a constructor name. 2859 /// 2860 /// \param AllowDeductionGuide whether we allow parsing a deduction guide name. 2861 /// 2862 /// \param Result on a successful parse, contains the parsed unqualified-id. 2863 /// 2864 /// \returns true if parsing fails, false otherwise. 2865 bool Parser::ParseUnqualifiedId(CXXScopeSpec &SS, ParsedType ObjectType, 2866 bool ObjectHadErrors, bool EnteringContext, 2867 bool AllowDestructorName, 2868 bool AllowConstructorName, 2869 bool AllowDeductionGuide, 2870 SourceLocation *TemplateKWLoc, 2871 UnqualifiedId &Result) { 2872 if (TemplateKWLoc) 2873 *TemplateKWLoc = SourceLocation(); 2874 2875 // Handle 'A::template B'. This is for template-ids which have not 2876 // already been annotated by ParseOptionalCXXScopeSpecifier(). 2877 bool TemplateSpecified = false; 2878 if (Tok.is(tok::kw_template)) { 2879 if (TemplateKWLoc && (ObjectType || SS.isSet())) { 2880 TemplateSpecified = true; 2881 *TemplateKWLoc = ConsumeToken(); 2882 } else { 2883 SourceLocation TemplateLoc = ConsumeToken(); 2884 Diag(TemplateLoc, diag::err_unexpected_template_in_unqualified_id) 2885 << FixItHint::CreateRemoval(TemplateLoc); 2886 } 2887 } 2888 2889 // unqualified-id: 2890 // identifier 2891 // template-id (when it hasn't already been annotated) 2892 if (Tok.is(tok::identifier)) { 2893 ParseIdentifier: 2894 // Consume the identifier. 2895 IdentifierInfo *Id = Tok.getIdentifierInfo(); 2896 SourceLocation IdLoc = ConsumeToken(); 2897 2898 if (!getLangOpts().CPlusPlus) { 2899 // If we're not in C++, only identifiers matter. Record the 2900 // identifier and return. 2901 Result.setIdentifier(Id, IdLoc); 2902 return false; 2903 } 2904 2905 ParsedTemplateTy TemplateName; 2906 if (AllowConstructorName && 2907 Actions.isCurrentClassName(*Id, getCurScope(), &SS)) { 2908 // We have parsed a constructor name. 2909 ParsedType Ty = Actions.getConstructorName(*Id, IdLoc, getCurScope(), SS, 2910 EnteringContext); 2911 if (!Ty) 2912 return true; 2913 Result.setConstructorName(Ty, IdLoc, IdLoc); 2914 } else if (getLangOpts().CPlusPlus17 && AllowDeductionGuide && 2915 SS.isEmpty() && 2916 Actions.isDeductionGuideName(getCurScope(), *Id, IdLoc, SS, 2917 &TemplateName)) { 2918 // We have parsed a template-name naming a deduction guide. 2919 Result.setDeductionGuideName(TemplateName, IdLoc); 2920 } else { 2921 // We have parsed an identifier. 2922 Result.setIdentifier(Id, IdLoc); 2923 } 2924 2925 // If the next token is a '<', we may have a template. 2926 TemplateTy Template; 2927 if (Tok.is(tok::less)) 2928 return ParseUnqualifiedIdTemplateId( 2929 SS, ObjectType, ObjectHadErrors, 2930 TemplateKWLoc ? *TemplateKWLoc : SourceLocation(), Id, IdLoc, 2931 EnteringContext, Result, TemplateSpecified); 2932 else if (TemplateSpecified && 2933 Actions.ActOnTemplateName( 2934 getCurScope(), SS, *TemplateKWLoc, Result, ObjectType, 2935 EnteringContext, Template, 2936 /*AllowInjectedClassName*/ true) == TNK_Non_template) 2937 return true; 2938 2939 return false; 2940 } 2941 2942 // unqualified-id: 2943 // template-id (already parsed and annotated) 2944 if (Tok.is(tok::annot_template_id)) { 2945 TemplateIdAnnotation *TemplateId = takeTemplateIdAnnotation(Tok); 2946 2947 // FIXME: Consider passing invalid template-ids on to callers; they may 2948 // be able to recover better than we can. 2949 if (TemplateId->isInvalid()) { 2950 ConsumeAnnotationToken(); 2951 return true; 2952 } 2953 2954 // If the template-name names the current class, then this is a constructor 2955 if (AllowConstructorName && TemplateId->Name && 2956 Actions.isCurrentClassName(*TemplateId->Name, getCurScope(), &SS)) { 2957 if (SS.isSet()) { 2958 // C++ [class.qual]p2 specifies that a qualified template-name 2959 // is taken as the constructor name where a constructor can be 2960 // declared. Thus, the template arguments are extraneous, so 2961 // complain about them and remove them entirely. 2962 Diag(TemplateId->TemplateNameLoc, 2963 diag::err_out_of_line_constructor_template_id) 2964 << TemplateId->Name 2965 << FixItHint::CreateRemoval( 2966 SourceRange(TemplateId->LAngleLoc, TemplateId->RAngleLoc)); 2967 ParsedType Ty = Actions.getConstructorName( 2968 *TemplateId->Name, TemplateId->TemplateNameLoc, getCurScope(), SS, 2969 EnteringContext); 2970 if (!Ty) 2971 return true; 2972 Result.setConstructorName(Ty, TemplateId->TemplateNameLoc, 2973 TemplateId->RAngleLoc); 2974 ConsumeAnnotationToken(); 2975 return false; 2976 } 2977 2978 Result.setConstructorTemplateId(TemplateId); 2979 ConsumeAnnotationToken(); 2980 return false; 2981 } 2982 2983 // We have already parsed a template-id; consume the annotation token as 2984 // our unqualified-id. 2985 Result.setTemplateId(TemplateId); 2986 SourceLocation TemplateLoc = TemplateId->TemplateKWLoc; 2987 if (TemplateLoc.isValid()) { 2988 if (TemplateKWLoc && (ObjectType || SS.isSet())) 2989 *TemplateKWLoc = TemplateLoc; 2990 else 2991 Diag(TemplateLoc, diag::err_unexpected_template_in_unqualified_id) 2992 << FixItHint::CreateRemoval(TemplateLoc); 2993 } 2994 ConsumeAnnotationToken(); 2995 return false; 2996 } 2997 2998 // unqualified-id: 2999 // operator-function-id 3000 // conversion-function-id 3001 if (Tok.is(tok::kw_operator)) { 3002 if (ParseUnqualifiedIdOperator(SS, EnteringContext, ObjectType, Result)) 3003 return true; 3004 3005 // If we have an operator-function-id or a literal-operator-id and the next 3006 // token is a '<', we may have a 3007 // 3008 // template-id: 3009 // operator-function-id < template-argument-list[opt] > 3010 TemplateTy Template; 3011 if ((Result.getKind() == UnqualifiedIdKind::IK_OperatorFunctionId || 3012 Result.getKind() == UnqualifiedIdKind::IK_LiteralOperatorId) && 3013 Tok.is(tok::less)) 3014 return ParseUnqualifiedIdTemplateId( 3015 SS, ObjectType, ObjectHadErrors, 3016 TemplateKWLoc ? *TemplateKWLoc : SourceLocation(), nullptr, 3017 SourceLocation(), EnteringContext, Result, TemplateSpecified); 3018 else if (TemplateSpecified && 3019 Actions.ActOnTemplateName( 3020 getCurScope(), SS, *TemplateKWLoc, Result, ObjectType, 3021 EnteringContext, Template, 3022 /*AllowInjectedClassName*/ true) == TNK_Non_template) 3023 return true; 3024 3025 return false; 3026 } 3027 3028 if (getLangOpts().CPlusPlus && 3029 (AllowDestructorName || SS.isSet()) && Tok.is(tok::tilde)) { 3030 // C++ [expr.unary.op]p10: 3031 // There is an ambiguity in the unary-expression ~X(), where X is a 3032 // class-name. The ambiguity is resolved in favor of treating ~ as a 3033 // unary complement rather than treating ~X as referring to a destructor. 3034 3035 // Parse the '~'. 3036 SourceLocation TildeLoc = ConsumeToken(); 3037 3038 if (TemplateSpecified) { 3039 // C++ [temp.names]p3: 3040 // A name prefixed by the keyword template shall be a template-id [...] 3041 // 3042 // A template-id cannot begin with a '~' token. This would never work 3043 // anyway: x.~A<int>() would specify that the destructor is a template, 3044 // not that 'A' is a template. 3045 // 3046 // FIXME: Suggest replacing the attempted destructor name with a correct 3047 // destructor name and recover. (This is not trivial if this would become 3048 // a pseudo-destructor name). 3049 Diag(*TemplateKWLoc, diag::err_unexpected_template_in_destructor_name) 3050 << Tok.getLocation(); 3051 return true; 3052 } 3053 3054 if (SS.isEmpty() && Tok.is(tok::kw_decltype)) { 3055 DeclSpec DS(AttrFactory); 3056 SourceLocation EndLoc = ParseDecltypeSpecifier(DS); 3057 if (ParsedType Type = 3058 Actions.getDestructorTypeForDecltype(DS, ObjectType)) { 3059 Result.setDestructorName(TildeLoc, Type, EndLoc); 3060 return false; 3061 } 3062 return true; 3063 } 3064 3065 // Parse the class-name. 3066 if (Tok.isNot(tok::identifier)) { 3067 Diag(Tok, diag::err_destructor_tilde_identifier); 3068 return true; 3069 } 3070 3071 // If the user wrote ~T::T, correct it to T::~T. 3072 DeclaratorScopeObj DeclScopeObj(*this, SS); 3073 if (NextToken().is(tok::coloncolon)) { 3074 // Don't let ParseOptionalCXXScopeSpecifier() "correct" 3075 // `int A; struct { ~A::A(); };` to `int A; struct { ~A:A(); };`, 3076 // it will confuse this recovery logic. 3077 ColonProtectionRAIIObject ColonRAII(*this, false); 3078 3079 if (SS.isSet()) { 3080 AnnotateScopeToken(SS, /*NewAnnotation*/true); 3081 SS.clear(); 3082 } 3083 if (ParseOptionalCXXScopeSpecifier(SS, ObjectType, ObjectHadErrors, 3084 EnteringContext)) 3085 return true; 3086 if (SS.isNotEmpty()) 3087 ObjectType = nullptr; 3088 if (Tok.isNot(tok::identifier) || NextToken().is(tok::coloncolon) || 3089 !SS.isSet()) { 3090 Diag(TildeLoc, diag::err_destructor_tilde_scope); 3091 return true; 3092 } 3093 3094 // Recover as if the tilde had been written before the identifier. 3095 Diag(TildeLoc, diag::err_destructor_tilde_scope) 3096 << FixItHint::CreateRemoval(TildeLoc) 3097 << FixItHint::CreateInsertion(Tok.getLocation(), "~"); 3098 3099 // Temporarily enter the scope for the rest of this function. 3100 if (Actions.ShouldEnterDeclaratorScope(getCurScope(), SS)) 3101 DeclScopeObj.EnterDeclaratorScope(); 3102 } 3103 3104 // Parse the class-name (or template-name in a simple-template-id). 3105 IdentifierInfo *ClassName = Tok.getIdentifierInfo(); 3106 SourceLocation ClassNameLoc = ConsumeToken(); 3107 3108 if (Tok.is(tok::less)) { 3109 Result.setDestructorName(TildeLoc, nullptr, ClassNameLoc); 3110 return ParseUnqualifiedIdTemplateId( 3111 SS, ObjectType, ObjectHadErrors, 3112 TemplateKWLoc ? *TemplateKWLoc : SourceLocation(), ClassName, 3113 ClassNameLoc, EnteringContext, Result, TemplateSpecified); 3114 } 3115 3116 // Note that this is a destructor name. 3117 ParsedType Ty = Actions.getDestructorName(TildeLoc, *ClassName, 3118 ClassNameLoc, getCurScope(), 3119 SS, ObjectType, 3120 EnteringContext); 3121 if (!Ty) 3122 return true; 3123 3124 Result.setDestructorName(TildeLoc, Ty, ClassNameLoc); 3125 return false; 3126 } 3127 3128 switch (Tok.getKind()) { 3129 #define TRANSFORM_TYPE_TRAIT_DEF(_, Trait) case tok::kw___##Trait: 3130 #include "clang/Basic/TransformTypeTraits.def" 3131 if (!NextToken().is(tok::l_paren)) { 3132 Tok.setKind(tok::identifier); 3133 Diag(Tok, diag::ext_keyword_as_ident) 3134 << Tok.getIdentifierInfo()->getName() << 0; 3135 goto ParseIdentifier; 3136 } 3137 [[fallthrough]]; 3138 default: 3139 Diag(Tok, diag::err_expected_unqualified_id) << getLangOpts().CPlusPlus; 3140 return true; 3141 } 3142 } 3143 3144 /// ParseCXXNewExpression - Parse a C++ new-expression. New is used to allocate 3145 /// memory in a typesafe manner and call constructors. 3146 /// 3147 /// This method is called to parse the new expression after the optional :: has 3148 /// been already parsed. If the :: was present, "UseGlobal" is true and "Start" 3149 /// is its location. Otherwise, "Start" is the location of the 'new' token. 3150 /// 3151 /// new-expression: 3152 /// '::'[opt] 'new' new-placement[opt] new-type-id 3153 /// new-initializer[opt] 3154 /// '::'[opt] 'new' new-placement[opt] '(' type-id ')' 3155 /// new-initializer[opt] 3156 /// 3157 /// new-placement: 3158 /// '(' expression-list ')' 3159 /// 3160 /// new-type-id: 3161 /// type-specifier-seq new-declarator[opt] 3162 /// [GNU] attributes type-specifier-seq new-declarator[opt] 3163 /// 3164 /// new-declarator: 3165 /// ptr-operator new-declarator[opt] 3166 /// direct-new-declarator 3167 /// 3168 /// new-initializer: 3169 /// '(' expression-list[opt] ')' 3170 /// [C++0x] braced-init-list 3171 /// 3172 ExprResult 3173 Parser::ParseCXXNewExpression(bool UseGlobal, SourceLocation Start) { 3174 assert(Tok.is(tok::kw_new) && "expected 'new' token"); 3175 ConsumeToken(); // Consume 'new' 3176 3177 // A '(' now can be a new-placement or the '(' wrapping the type-id in the 3178 // second form of new-expression. It can't be a new-type-id. 3179 3180 ExprVector PlacementArgs; 3181 SourceLocation PlacementLParen, PlacementRParen; 3182 3183 SourceRange TypeIdParens; 3184 DeclSpec DS(AttrFactory); 3185 Declarator DeclaratorInfo(DS, ParsedAttributesView::none(), 3186 DeclaratorContext::CXXNew); 3187 if (Tok.is(tok::l_paren)) { 3188 // If it turns out to be a placement, we change the type location. 3189 BalancedDelimiterTracker T(*this, tok::l_paren); 3190 T.consumeOpen(); 3191 PlacementLParen = T.getOpenLocation(); 3192 if (ParseExpressionListOrTypeId(PlacementArgs, DeclaratorInfo)) { 3193 SkipUntil(tok::semi, StopAtSemi | StopBeforeMatch); 3194 return ExprError(); 3195 } 3196 3197 T.consumeClose(); 3198 PlacementRParen = T.getCloseLocation(); 3199 if (PlacementRParen.isInvalid()) { 3200 SkipUntil(tok::semi, StopAtSemi | StopBeforeMatch); 3201 return ExprError(); 3202 } 3203 3204 if (PlacementArgs.empty()) { 3205 // Reset the placement locations. There was no placement. 3206 TypeIdParens = T.getRange(); 3207 PlacementLParen = PlacementRParen = SourceLocation(); 3208 } else { 3209 // We still need the type. 3210 if (Tok.is(tok::l_paren)) { 3211 BalancedDelimiterTracker T(*this, tok::l_paren); 3212 T.consumeOpen(); 3213 MaybeParseGNUAttributes(DeclaratorInfo); 3214 ParseSpecifierQualifierList(DS); 3215 DeclaratorInfo.SetSourceRange(DS.getSourceRange()); 3216 ParseDeclarator(DeclaratorInfo); 3217 T.consumeClose(); 3218 TypeIdParens = T.getRange(); 3219 } else { 3220 MaybeParseGNUAttributes(DeclaratorInfo); 3221 if (ParseCXXTypeSpecifierSeq(DS)) 3222 DeclaratorInfo.setInvalidType(true); 3223 else { 3224 DeclaratorInfo.SetSourceRange(DS.getSourceRange()); 3225 ParseDeclaratorInternal(DeclaratorInfo, 3226 &Parser::ParseDirectNewDeclarator); 3227 } 3228 } 3229 } 3230 } else { 3231 // A new-type-id is a simplified type-id, where essentially the 3232 // direct-declarator is replaced by a direct-new-declarator. 3233 MaybeParseGNUAttributes(DeclaratorInfo); 3234 if (ParseCXXTypeSpecifierSeq(DS, DeclaratorContext::CXXNew)) 3235 DeclaratorInfo.setInvalidType(true); 3236 else { 3237 DeclaratorInfo.SetSourceRange(DS.getSourceRange()); 3238 ParseDeclaratorInternal(DeclaratorInfo, 3239 &Parser::ParseDirectNewDeclarator); 3240 } 3241 } 3242 if (DeclaratorInfo.isInvalidType()) { 3243 SkipUntil(tok::semi, StopAtSemi | StopBeforeMatch); 3244 return ExprError(); 3245 } 3246 3247 ExprResult Initializer; 3248 3249 if (Tok.is(tok::l_paren)) { 3250 SourceLocation ConstructorLParen, ConstructorRParen; 3251 ExprVector ConstructorArgs; 3252 BalancedDelimiterTracker T(*this, tok::l_paren); 3253 T.consumeOpen(); 3254 ConstructorLParen = T.getOpenLocation(); 3255 if (Tok.isNot(tok::r_paren)) { 3256 auto RunSignatureHelp = [&]() { 3257 ParsedType TypeRep = 3258 Actions.ActOnTypeName(getCurScope(), DeclaratorInfo).get(); 3259 QualType PreferredType; 3260 // ActOnTypeName might adjust DeclaratorInfo and return a null type even 3261 // the passing DeclaratorInfo is valid, e.g. running SignatureHelp on 3262 // `new decltype(invalid) (^)`. 3263 if (TypeRep) 3264 PreferredType = Actions.ProduceConstructorSignatureHelp( 3265 TypeRep.get()->getCanonicalTypeInternal(), 3266 DeclaratorInfo.getEndLoc(), ConstructorArgs, ConstructorLParen, 3267 /*Braced=*/false); 3268 CalledSignatureHelp = true; 3269 return PreferredType; 3270 }; 3271 if (ParseExpressionList(ConstructorArgs, [&] { 3272 PreferredType.enterFunctionArgument(Tok.getLocation(), 3273 RunSignatureHelp); 3274 })) { 3275 if (PP.isCodeCompletionReached() && !CalledSignatureHelp) 3276 RunSignatureHelp(); 3277 SkipUntil(tok::semi, StopAtSemi | StopBeforeMatch); 3278 return ExprError(); 3279 } 3280 } 3281 T.consumeClose(); 3282 ConstructorRParen = T.getCloseLocation(); 3283 if (ConstructorRParen.isInvalid()) { 3284 SkipUntil(tok::semi, StopAtSemi | StopBeforeMatch); 3285 return ExprError(); 3286 } 3287 Initializer = Actions.ActOnParenListExpr(ConstructorLParen, 3288 ConstructorRParen, 3289 ConstructorArgs); 3290 } else if (Tok.is(tok::l_brace) && getLangOpts().CPlusPlus11) { 3291 Diag(Tok.getLocation(), 3292 diag::warn_cxx98_compat_generalized_initializer_lists); 3293 Initializer = ParseBraceInitializer(); 3294 } 3295 if (Initializer.isInvalid()) 3296 return Initializer; 3297 3298 return Actions.ActOnCXXNew(Start, UseGlobal, PlacementLParen, 3299 PlacementArgs, PlacementRParen, 3300 TypeIdParens, DeclaratorInfo, Initializer.get()); 3301 } 3302 3303 /// ParseDirectNewDeclarator - Parses a direct-new-declarator. Intended to be 3304 /// passed to ParseDeclaratorInternal. 3305 /// 3306 /// direct-new-declarator: 3307 /// '[' expression[opt] ']' 3308 /// direct-new-declarator '[' constant-expression ']' 3309 /// 3310 void Parser::ParseDirectNewDeclarator(Declarator &D) { 3311 // Parse the array dimensions. 3312 bool First = true; 3313 while (Tok.is(tok::l_square)) { 3314 // An array-size expression can't start with a lambda. 3315 if (CheckProhibitedCXX11Attribute()) 3316 continue; 3317 3318 BalancedDelimiterTracker T(*this, tok::l_square); 3319 T.consumeOpen(); 3320 3321 ExprResult Size = 3322 First ? (Tok.is(tok::r_square) ? ExprResult() : ParseExpression()) 3323 : ParseConstantExpression(); 3324 if (Size.isInvalid()) { 3325 // Recover 3326 SkipUntil(tok::r_square, StopAtSemi); 3327 return; 3328 } 3329 First = false; 3330 3331 T.consumeClose(); 3332 3333 // Attributes here appertain to the array type. C++11 [expr.new]p5. 3334 ParsedAttributes Attrs(AttrFactory); 3335 MaybeParseCXX11Attributes(Attrs); 3336 3337 D.AddTypeInfo(DeclaratorChunk::getArray(0, 3338 /*isStatic=*/false, /*isStar=*/false, 3339 Size.get(), T.getOpenLocation(), 3340 T.getCloseLocation()), 3341 std::move(Attrs), T.getCloseLocation()); 3342 3343 if (T.getCloseLocation().isInvalid()) 3344 return; 3345 } 3346 } 3347 3348 /// ParseExpressionListOrTypeId - Parse either an expression-list or a type-id. 3349 /// This ambiguity appears in the syntax of the C++ new operator. 3350 /// 3351 /// new-expression: 3352 /// '::'[opt] 'new' new-placement[opt] '(' type-id ')' 3353 /// new-initializer[opt] 3354 /// 3355 /// new-placement: 3356 /// '(' expression-list ')' 3357 /// 3358 bool Parser::ParseExpressionListOrTypeId( 3359 SmallVectorImpl<Expr*> &PlacementArgs, 3360 Declarator &D) { 3361 // The '(' was already consumed. 3362 if (isTypeIdInParens()) { 3363 ParseSpecifierQualifierList(D.getMutableDeclSpec()); 3364 D.SetSourceRange(D.getDeclSpec().getSourceRange()); 3365 ParseDeclarator(D); 3366 return D.isInvalidType(); 3367 } 3368 3369 // It's not a type, it has to be an expression list. 3370 return ParseExpressionList(PlacementArgs); 3371 } 3372 3373 /// ParseCXXDeleteExpression - Parse a C++ delete-expression. Delete is used 3374 /// to free memory allocated by new. 3375 /// 3376 /// This method is called to parse the 'delete' expression after the optional 3377 /// '::' has been already parsed. If the '::' was present, "UseGlobal" is true 3378 /// and "Start" is its location. Otherwise, "Start" is the location of the 3379 /// 'delete' token. 3380 /// 3381 /// delete-expression: 3382 /// '::'[opt] 'delete' cast-expression 3383 /// '::'[opt] 'delete' '[' ']' cast-expression 3384 ExprResult 3385 Parser::ParseCXXDeleteExpression(bool UseGlobal, SourceLocation Start) { 3386 assert(Tok.is(tok::kw_delete) && "Expected 'delete' keyword"); 3387 ConsumeToken(); // Consume 'delete' 3388 3389 // Array delete? 3390 bool ArrayDelete = false; 3391 if (Tok.is(tok::l_square) && NextToken().is(tok::r_square)) { 3392 // C++11 [expr.delete]p1: 3393 // Whenever the delete keyword is followed by empty square brackets, it 3394 // shall be interpreted as [array delete]. 3395 // [Footnote: A lambda expression with a lambda-introducer that consists 3396 // of empty square brackets can follow the delete keyword if 3397 // the lambda expression is enclosed in parentheses.] 3398 3399 const Token Next = GetLookAheadToken(2); 3400 3401 // Basic lookahead to check if we have a lambda expression. 3402 if (Next.isOneOf(tok::l_brace, tok::less) || 3403 (Next.is(tok::l_paren) && 3404 (GetLookAheadToken(3).is(tok::r_paren) || 3405 (GetLookAheadToken(3).is(tok::identifier) && 3406 GetLookAheadToken(4).is(tok::identifier))))) { 3407 TentativeParsingAction TPA(*this); 3408 SourceLocation LSquareLoc = Tok.getLocation(); 3409 SourceLocation RSquareLoc = NextToken().getLocation(); 3410 3411 // SkipUntil can't skip pairs of </*...*/>; don't emit a FixIt in this 3412 // case. 3413 SkipUntil({tok::l_brace, tok::less}, StopBeforeMatch); 3414 SourceLocation RBraceLoc; 3415 bool EmitFixIt = false; 3416 if (Tok.is(tok::l_brace)) { 3417 ConsumeBrace(); 3418 SkipUntil(tok::r_brace, StopBeforeMatch); 3419 RBraceLoc = Tok.getLocation(); 3420 EmitFixIt = true; 3421 } 3422 3423 TPA.Revert(); 3424 3425 if (EmitFixIt) 3426 Diag(Start, diag::err_lambda_after_delete) 3427 << SourceRange(Start, RSquareLoc) 3428 << FixItHint::CreateInsertion(LSquareLoc, "(") 3429 << FixItHint::CreateInsertion( 3430 Lexer::getLocForEndOfToken( 3431 RBraceLoc, 0, Actions.getSourceManager(), getLangOpts()), 3432 ")"); 3433 else 3434 Diag(Start, diag::err_lambda_after_delete) 3435 << SourceRange(Start, RSquareLoc); 3436 3437 // Warn that the non-capturing lambda isn't surrounded by parentheses 3438 // to disambiguate it from 'delete[]'. 3439 ExprResult Lambda = ParseLambdaExpression(); 3440 if (Lambda.isInvalid()) 3441 return ExprError(); 3442 3443 // Evaluate any postfix expressions used on the lambda. 3444 Lambda = ParsePostfixExpressionSuffix(Lambda); 3445 if (Lambda.isInvalid()) 3446 return ExprError(); 3447 return Actions.ActOnCXXDelete(Start, UseGlobal, /*ArrayForm=*/false, 3448 Lambda.get()); 3449 } 3450 3451 ArrayDelete = true; 3452 BalancedDelimiterTracker T(*this, tok::l_square); 3453 3454 T.consumeOpen(); 3455 T.consumeClose(); 3456 if (T.getCloseLocation().isInvalid()) 3457 return ExprError(); 3458 } 3459 3460 ExprResult Operand(ParseCastExpression(AnyCastExpr)); 3461 if (Operand.isInvalid()) 3462 return Operand; 3463 3464 return Actions.ActOnCXXDelete(Start, UseGlobal, ArrayDelete, Operand.get()); 3465 } 3466 3467 /// ParseRequiresExpression - Parse a C++2a requires-expression. 3468 /// C++2a [expr.prim.req]p1 3469 /// A requires-expression provides a concise way to express requirements on 3470 /// template arguments. A requirement is one that can be checked by name 3471 /// lookup (6.4) or by checking properties of types and expressions. 3472 /// 3473 /// requires-expression: 3474 /// 'requires' requirement-parameter-list[opt] requirement-body 3475 /// 3476 /// requirement-parameter-list: 3477 /// '(' parameter-declaration-clause[opt] ')' 3478 /// 3479 /// requirement-body: 3480 /// '{' requirement-seq '}' 3481 /// 3482 /// requirement-seq: 3483 /// requirement 3484 /// requirement-seq requirement 3485 /// 3486 /// requirement: 3487 /// simple-requirement 3488 /// type-requirement 3489 /// compound-requirement 3490 /// nested-requirement 3491 ExprResult Parser::ParseRequiresExpression() { 3492 assert(Tok.is(tok::kw_requires) && "Expected 'requires' keyword"); 3493 SourceLocation RequiresKWLoc = ConsumeToken(); // Consume 'requires' 3494 3495 llvm::SmallVector<ParmVarDecl *, 2> LocalParameterDecls; 3496 if (Tok.is(tok::l_paren)) { 3497 // requirement parameter list is present. 3498 ParseScope LocalParametersScope(this, Scope::FunctionPrototypeScope | 3499 Scope::DeclScope); 3500 BalancedDelimiterTracker Parens(*this, tok::l_paren); 3501 Parens.consumeOpen(); 3502 if (!Tok.is(tok::r_paren)) { 3503 ParsedAttributes FirstArgAttrs(getAttrFactory()); 3504 SourceLocation EllipsisLoc; 3505 llvm::SmallVector<DeclaratorChunk::ParamInfo, 2> LocalParameters; 3506 ParseParameterDeclarationClause(DeclaratorContext::RequiresExpr, 3507 FirstArgAttrs, LocalParameters, 3508 EllipsisLoc); 3509 if (EllipsisLoc.isValid()) 3510 Diag(EllipsisLoc, diag::err_requires_expr_parameter_list_ellipsis); 3511 for (auto &ParamInfo : LocalParameters) 3512 LocalParameterDecls.push_back(cast<ParmVarDecl>(ParamInfo.Param)); 3513 } 3514 Parens.consumeClose(); 3515 } 3516 3517 BalancedDelimiterTracker Braces(*this, tok::l_brace); 3518 if (Braces.expectAndConsume()) 3519 return ExprError(); 3520 3521 // Start of requirement list 3522 llvm::SmallVector<concepts::Requirement *, 2> Requirements; 3523 3524 // C++2a [expr.prim.req]p2 3525 // Expressions appearing within a requirement-body are unevaluated operands. 3526 EnterExpressionEvaluationContext Ctx( 3527 Actions, Sema::ExpressionEvaluationContext::Unevaluated); 3528 3529 ParseScope BodyScope(this, Scope::DeclScope); 3530 // Create a separate diagnostic pool for RequiresExprBodyDecl. 3531 // Dependent diagnostics are attached to this Decl and non-depenedent 3532 // diagnostics are surfaced after this parse. 3533 ParsingDeclRAIIObject ParsingBodyDecl(*this, ParsingDeclRAIIObject::NoParent); 3534 RequiresExprBodyDecl *Body = Actions.ActOnStartRequiresExpr( 3535 RequiresKWLoc, LocalParameterDecls, getCurScope()); 3536 3537 if (Tok.is(tok::r_brace)) { 3538 // Grammar does not allow an empty body. 3539 // requirement-body: 3540 // { requirement-seq } 3541 // requirement-seq: 3542 // requirement 3543 // requirement-seq requirement 3544 Diag(Tok, diag::err_empty_requires_expr); 3545 // Continue anyway and produce a requires expr with no requirements. 3546 } else { 3547 while (!Tok.is(tok::r_brace)) { 3548 switch (Tok.getKind()) { 3549 case tok::l_brace: { 3550 // Compound requirement 3551 // C++ [expr.prim.req.compound] 3552 // compound-requirement: 3553 // '{' expression '}' 'noexcept'[opt] 3554 // return-type-requirement[opt] ';' 3555 // return-type-requirement: 3556 // trailing-return-type 3557 // '->' cv-qualifier-seq[opt] constrained-parameter 3558 // cv-qualifier-seq[opt] abstract-declarator[opt] 3559 BalancedDelimiterTracker ExprBraces(*this, tok::l_brace); 3560 ExprBraces.consumeOpen(); 3561 ExprResult Expression = 3562 Actions.CorrectDelayedTyposInExpr(ParseExpression()); 3563 if (!Expression.isUsable()) { 3564 ExprBraces.skipToEnd(); 3565 SkipUntil(tok::semi, tok::r_brace, SkipUntilFlags::StopBeforeMatch); 3566 break; 3567 } 3568 if (ExprBraces.consumeClose()) 3569 ExprBraces.skipToEnd(); 3570 3571 concepts::Requirement *Req = nullptr; 3572 SourceLocation NoexceptLoc; 3573 TryConsumeToken(tok::kw_noexcept, NoexceptLoc); 3574 if (Tok.is(tok::semi)) { 3575 Req = Actions.ActOnCompoundRequirement(Expression.get(), NoexceptLoc); 3576 if (Req) 3577 Requirements.push_back(Req); 3578 break; 3579 } 3580 if (!TryConsumeToken(tok::arrow)) 3581 // User probably forgot the arrow, remind them and try to continue. 3582 Diag(Tok, diag::err_requires_expr_missing_arrow) 3583 << FixItHint::CreateInsertion(Tok.getLocation(), "->"); 3584 // Try to parse a 'type-constraint' 3585 if (TryAnnotateTypeConstraint()) { 3586 SkipUntil(tok::semi, tok::r_brace, SkipUntilFlags::StopBeforeMatch); 3587 break; 3588 } 3589 if (!isTypeConstraintAnnotation()) { 3590 Diag(Tok, diag::err_requires_expr_expected_type_constraint); 3591 SkipUntil(tok::semi, tok::r_brace, SkipUntilFlags::StopBeforeMatch); 3592 break; 3593 } 3594 CXXScopeSpec SS; 3595 if (Tok.is(tok::annot_cxxscope)) { 3596 Actions.RestoreNestedNameSpecifierAnnotation(Tok.getAnnotationValue(), 3597 Tok.getAnnotationRange(), 3598 SS); 3599 ConsumeAnnotationToken(); 3600 } 3601 3602 Req = Actions.ActOnCompoundRequirement( 3603 Expression.get(), NoexceptLoc, SS, takeTemplateIdAnnotation(Tok), 3604 TemplateParameterDepth); 3605 ConsumeAnnotationToken(); 3606 if (Req) 3607 Requirements.push_back(Req); 3608 break; 3609 } 3610 default: { 3611 bool PossibleRequiresExprInSimpleRequirement = false; 3612 if (Tok.is(tok::kw_requires)) { 3613 auto IsNestedRequirement = [&] { 3614 RevertingTentativeParsingAction TPA(*this); 3615 ConsumeToken(); // 'requires' 3616 if (Tok.is(tok::l_brace)) 3617 // This is a requires expression 3618 // requires (T t) { 3619 // requires { t++; }; 3620 // ... ^ 3621 // } 3622 return false; 3623 if (Tok.is(tok::l_paren)) { 3624 // This might be the parameter list of a requires expression 3625 ConsumeParen(); 3626 auto Res = TryParseParameterDeclarationClause(); 3627 if (Res != TPResult::False) { 3628 // Skip to the closing parenthesis 3629 // FIXME: Don't traverse these tokens twice (here and in 3630 // TryParseParameterDeclarationClause). 3631 unsigned Depth = 1; 3632 while (Depth != 0) { 3633 if (Tok.is(tok::l_paren)) 3634 Depth++; 3635 else if (Tok.is(tok::r_paren)) 3636 Depth--; 3637 ConsumeAnyToken(); 3638 } 3639 // requires (T t) { 3640 // requires () ? 3641 // ... ^ 3642 // - OR - 3643 // requires (int x) ? 3644 // ... ^ 3645 // } 3646 if (Tok.is(tok::l_brace)) 3647 // requires (...) { 3648 // ^ - a requires expression as a 3649 // simple-requirement. 3650 return false; 3651 } 3652 } 3653 return true; 3654 }; 3655 if (IsNestedRequirement()) { 3656 ConsumeToken(); 3657 // Nested requirement 3658 // C++ [expr.prim.req.nested] 3659 // nested-requirement: 3660 // 'requires' constraint-expression ';' 3661 ExprResult ConstraintExpr = 3662 Actions.CorrectDelayedTyposInExpr(ParseConstraintExpression()); 3663 if (ConstraintExpr.isInvalid() || !ConstraintExpr.isUsable()) { 3664 SkipUntil(tok::semi, tok::r_brace, 3665 SkipUntilFlags::StopBeforeMatch); 3666 break; 3667 } 3668 if (auto *Req = 3669 Actions.ActOnNestedRequirement(ConstraintExpr.get())) 3670 Requirements.push_back(Req); 3671 else { 3672 SkipUntil(tok::semi, tok::r_brace, 3673 SkipUntilFlags::StopBeforeMatch); 3674 break; 3675 } 3676 break; 3677 } else 3678 PossibleRequiresExprInSimpleRequirement = true; 3679 } else if (Tok.is(tok::kw_typename)) { 3680 // This might be 'typename T::value_type;' (a type requirement) or 3681 // 'typename T::value_type{};' (a simple requirement). 3682 TentativeParsingAction TPA(*this); 3683 3684 // We need to consume the typename to allow 'requires { typename a; }' 3685 SourceLocation TypenameKWLoc = ConsumeToken(); 3686 if (TryAnnotateOptionalCXXScopeToken()) { 3687 TPA.Commit(); 3688 SkipUntil(tok::semi, tok::r_brace, SkipUntilFlags::StopBeforeMatch); 3689 break; 3690 } 3691 CXXScopeSpec SS; 3692 if (Tok.is(tok::annot_cxxscope)) { 3693 Actions.RestoreNestedNameSpecifierAnnotation( 3694 Tok.getAnnotationValue(), Tok.getAnnotationRange(), SS); 3695 ConsumeAnnotationToken(); 3696 } 3697 3698 if (Tok.isOneOf(tok::identifier, tok::annot_template_id) && 3699 !NextToken().isOneOf(tok::l_brace, tok::l_paren)) { 3700 TPA.Commit(); 3701 SourceLocation NameLoc = Tok.getLocation(); 3702 IdentifierInfo *II = nullptr; 3703 TemplateIdAnnotation *TemplateId = nullptr; 3704 if (Tok.is(tok::identifier)) { 3705 II = Tok.getIdentifierInfo(); 3706 ConsumeToken(); 3707 } else { 3708 TemplateId = takeTemplateIdAnnotation(Tok); 3709 ConsumeAnnotationToken(); 3710 if (TemplateId->isInvalid()) 3711 break; 3712 } 3713 3714 if (auto *Req = Actions.ActOnTypeRequirement(TypenameKWLoc, SS, 3715 NameLoc, II, 3716 TemplateId)) { 3717 Requirements.push_back(Req); 3718 } 3719 break; 3720 } 3721 TPA.Revert(); 3722 } 3723 // Simple requirement 3724 // C++ [expr.prim.req.simple] 3725 // simple-requirement: 3726 // expression ';' 3727 SourceLocation StartLoc = Tok.getLocation(); 3728 ExprResult Expression = 3729 Actions.CorrectDelayedTyposInExpr(ParseExpression()); 3730 if (!Expression.isUsable()) { 3731 SkipUntil(tok::semi, tok::r_brace, SkipUntilFlags::StopBeforeMatch); 3732 break; 3733 } 3734 if (!Expression.isInvalid() && PossibleRequiresExprInSimpleRequirement) 3735 Diag(StartLoc, diag::err_requires_expr_in_simple_requirement) 3736 << FixItHint::CreateInsertion(StartLoc, "requires"); 3737 if (auto *Req = Actions.ActOnSimpleRequirement(Expression.get())) 3738 Requirements.push_back(Req); 3739 else { 3740 SkipUntil(tok::semi, tok::r_brace, SkipUntilFlags::StopBeforeMatch); 3741 break; 3742 } 3743 // User may have tried to put some compound requirement stuff here 3744 if (Tok.is(tok::kw_noexcept)) { 3745 Diag(Tok, diag::err_requires_expr_simple_requirement_noexcept) 3746 << FixItHint::CreateInsertion(StartLoc, "{") 3747 << FixItHint::CreateInsertion(Tok.getLocation(), "}"); 3748 SkipUntil(tok::semi, tok::r_brace, SkipUntilFlags::StopBeforeMatch); 3749 break; 3750 } 3751 break; 3752 } 3753 } 3754 if (ExpectAndConsumeSemi(diag::err_expected_semi_requirement)) { 3755 SkipUntil(tok::semi, tok::r_brace, SkipUntilFlags::StopBeforeMatch); 3756 TryConsumeToken(tok::semi); 3757 break; 3758 } 3759 } 3760 if (Requirements.empty()) { 3761 // Don't emit an empty requires expr here to avoid confusing the user with 3762 // other diagnostics quoting an empty requires expression they never 3763 // wrote. 3764 Braces.consumeClose(); 3765 Actions.ActOnFinishRequiresExpr(); 3766 return ExprError(); 3767 } 3768 } 3769 Braces.consumeClose(); 3770 Actions.ActOnFinishRequiresExpr(); 3771 ParsingBodyDecl.complete(Body); 3772 return Actions.ActOnRequiresExpr(RequiresKWLoc, Body, LocalParameterDecls, 3773 Requirements, Braces.getCloseLocation()); 3774 } 3775 3776 static TypeTrait TypeTraitFromTokKind(tok::TokenKind kind) { 3777 switch (kind) { 3778 default: llvm_unreachable("Not a known type trait"); 3779 #define TYPE_TRAIT_1(Spelling, Name, Key) \ 3780 case tok::kw_ ## Spelling: return UTT_ ## Name; 3781 #define TYPE_TRAIT_2(Spelling, Name, Key) \ 3782 case tok::kw_ ## Spelling: return BTT_ ## Name; 3783 #include "clang/Basic/TokenKinds.def" 3784 #define TYPE_TRAIT_N(Spelling, Name, Key) \ 3785 case tok::kw_ ## Spelling: return TT_ ## Name; 3786 #include "clang/Basic/TokenKinds.def" 3787 } 3788 } 3789 3790 static ArrayTypeTrait ArrayTypeTraitFromTokKind(tok::TokenKind kind) { 3791 switch (kind) { 3792 default: 3793 llvm_unreachable("Not a known array type trait"); 3794 #define ARRAY_TYPE_TRAIT(Spelling, Name, Key) \ 3795 case tok::kw_##Spelling: \ 3796 return ATT_##Name; 3797 #include "clang/Basic/TokenKinds.def" 3798 } 3799 } 3800 3801 static ExpressionTrait ExpressionTraitFromTokKind(tok::TokenKind kind) { 3802 switch (kind) { 3803 default: 3804 llvm_unreachable("Not a known unary expression trait."); 3805 #define EXPRESSION_TRAIT(Spelling, Name, Key) \ 3806 case tok::kw_##Spelling: \ 3807 return ET_##Name; 3808 #include "clang/Basic/TokenKinds.def" 3809 } 3810 } 3811 3812 /// Parse the built-in type-trait pseudo-functions that allow 3813 /// implementation of the TR1/C++11 type traits templates. 3814 /// 3815 /// primary-expression: 3816 /// unary-type-trait '(' type-id ')' 3817 /// binary-type-trait '(' type-id ',' type-id ')' 3818 /// type-trait '(' type-id-seq ')' 3819 /// 3820 /// type-id-seq: 3821 /// type-id ...[opt] type-id-seq[opt] 3822 /// 3823 ExprResult Parser::ParseTypeTrait() { 3824 tok::TokenKind Kind = Tok.getKind(); 3825 3826 SourceLocation Loc = ConsumeToken(); 3827 3828 BalancedDelimiterTracker Parens(*this, tok::l_paren); 3829 if (Parens.expectAndConsume()) 3830 return ExprError(); 3831 3832 SmallVector<ParsedType, 2> Args; 3833 do { 3834 // Parse the next type. 3835 TypeResult Ty = ParseTypeName(); 3836 if (Ty.isInvalid()) { 3837 Parens.skipToEnd(); 3838 return ExprError(); 3839 } 3840 3841 // Parse the ellipsis, if present. 3842 if (Tok.is(tok::ellipsis)) { 3843 Ty = Actions.ActOnPackExpansion(Ty.get(), ConsumeToken()); 3844 if (Ty.isInvalid()) { 3845 Parens.skipToEnd(); 3846 return ExprError(); 3847 } 3848 } 3849 3850 // Add this type to the list of arguments. 3851 Args.push_back(Ty.get()); 3852 } while (TryConsumeToken(tok::comma)); 3853 3854 if (Parens.consumeClose()) 3855 return ExprError(); 3856 3857 SourceLocation EndLoc = Parens.getCloseLocation(); 3858 3859 return Actions.ActOnTypeTrait(TypeTraitFromTokKind(Kind), Loc, Args, EndLoc); 3860 } 3861 3862 /// ParseArrayTypeTrait - Parse the built-in array type-trait 3863 /// pseudo-functions. 3864 /// 3865 /// primary-expression: 3866 /// [Embarcadero] '__array_rank' '(' type-id ')' 3867 /// [Embarcadero] '__array_extent' '(' type-id ',' expression ')' 3868 /// 3869 ExprResult Parser::ParseArrayTypeTrait() { 3870 ArrayTypeTrait ATT = ArrayTypeTraitFromTokKind(Tok.getKind()); 3871 SourceLocation Loc = ConsumeToken(); 3872 3873 BalancedDelimiterTracker T(*this, tok::l_paren); 3874 if (T.expectAndConsume()) 3875 return ExprError(); 3876 3877 TypeResult Ty = ParseTypeName(); 3878 if (Ty.isInvalid()) { 3879 SkipUntil(tok::comma, StopAtSemi); 3880 SkipUntil(tok::r_paren, StopAtSemi); 3881 return ExprError(); 3882 } 3883 3884 switch (ATT) { 3885 case ATT_ArrayRank: { 3886 T.consumeClose(); 3887 return Actions.ActOnArrayTypeTrait(ATT, Loc, Ty.get(), nullptr, 3888 T.getCloseLocation()); 3889 } 3890 case ATT_ArrayExtent: { 3891 if (ExpectAndConsume(tok::comma)) { 3892 SkipUntil(tok::r_paren, StopAtSemi); 3893 return ExprError(); 3894 } 3895 3896 ExprResult DimExpr = ParseExpression(); 3897 T.consumeClose(); 3898 3899 return Actions.ActOnArrayTypeTrait(ATT, Loc, Ty.get(), DimExpr.get(), 3900 T.getCloseLocation()); 3901 } 3902 } 3903 llvm_unreachable("Invalid ArrayTypeTrait!"); 3904 } 3905 3906 /// ParseExpressionTrait - Parse built-in expression-trait 3907 /// pseudo-functions like __is_lvalue_expr( xxx ). 3908 /// 3909 /// primary-expression: 3910 /// [Embarcadero] expression-trait '(' expression ')' 3911 /// 3912 ExprResult Parser::ParseExpressionTrait() { 3913 ExpressionTrait ET = ExpressionTraitFromTokKind(Tok.getKind()); 3914 SourceLocation Loc = ConsumeToken(); 3915 3916 BalancedDelimiterTracker T(*this, tok::l_paren); 3917 if (T.expectAndConsume()) 3918 return ExprError(); 3919 3920 ExprResult Expr = ParseExpression(); 3921 3922 T.consumeClose(); 3923 3924 return Actions.ActOnExpressionTrait(ET, Loc, Expr.get(), 3925 T.getCloseLocation()); 3926 } 3927 3928 3929 /// ParseCXXAmbiguousParenExpression - We have parsed the left paren of a 3930 /// parenthesized ambiguous type-id. This uses tentative parsing to disambiguate 3931 /// based on the context past the parens. 3932 ExprResult 3933 Parser::ParseCXXAmbiguousParenExpression(ParenParseOption &ExprType, 3934 ParsedType &CastTy, 3935 BalancedDelimiterTracker &Tracker, 3936 ColonProtectionRAIIObject &ColonProt) { 3937 assert(getLangOpts().CPlusPlus && "Should only be called for C++!"); 3938 assert(ExprType == CastExpr && "Compound literals are not ambiguous!"); 3939 assert(isTypeIdInParens() && "Not a type-id!"); 3940 3941 ExprResult Result(true); 3942 CastTy = nullptr; 3943 3944 // We need to disambiguate a very ugly part of the C++ syntax: 3945 // 3946 // (T())x; - type-id 3947 // (T())*x; - type-id 3948 // (T())/x; - expression 3949 // (T()); - expression 3950 // 3951 // The bad news is that we cannot use the specialized tentative parser, since 3952 // it can only verify that the thing inside the parens can be parsed as 3953 // type-id, it is not useful for determining the context past the parens. 3954 // 3955 // The good news is that the parser can disambiguate this part without 3956 // making any unnecessary Action calls. 3957 // 3958 // It uses a scheme similar to parsing inline methods. The parenthesized 3959 // tokens are cached, the context that follows is determined (possibly by 3960 // parsing a cast-expression), and then we re-introduce the cached tokens 3961 // into the token stream and parse them appropriately. 3962 3963 ParenParseOption ParseAs; 3964 CachedTokens Toks; 3965 3966 // Store the tokens of the parentheses. We will parse them after we determine 3967 // the context that follows them. 3968 if (!ConsumeAndStoreUntil(tok::r_paren, Toks)) { 3969 // We didn't find the ')' we expected. 3970 Tracker.consumeClose(); 3971 return ExprError(); 3972 } 3973 3974 if (Tok.is(tok::l_brace)) { 3975 ParseAs = CompoundLiteral; 3976 } else { 3977 bool NotCastExpr; 3978 if (Tok.is(tok::l_paren) && NextToken().is(tok::r_paren)) { 3979 NotCastExpr = true; 3980 } else { 3981 // Try parsing the cast-expression that may follow. 3982 // If it is not a cast-expression, NotCastExpr will be true and no token 3983 // will be consumed. 3984 ColonProt.restore(); 3985 Result = ParseCastExpression(AnyCastExpr, 3986 false/*isAddressofOperand*/, 3987 NotCastExpr, 3988 // type-id has priority. 3989 IsTypeCast); 3990 } 3991 3992 // If we parsed a cast-expression, it's really a type-id, otherwise it's 3993 // an expression. 3994 ParseAs = NotCastExpr ? SimpleExpr : CastExpr; 3995 } 3996 3997 // Create a fake EOF to mark end of Toks buffer. 3998 Token AttrEnd; 3999 AttrEnd.startToken(); 4000 AttrEnd.setKind(tok::eof); 4001 AttrEnd.setLocation(Tok.getLocation()); 4002 AttrEnd.setEofData(Toks.data()); 4003 Toks.push_back(AttrEnd); 4004 4005 // The current token should go after the cached tokens. 4006 Toks.push_back(Tok); 4007 // Re-enter the stored parenthesized tokens into the token stream, so we may 4008 // parse them now. 4009 PP.EnterTokenStream(Toks, /*DisableMacroExpansion*/ true, 4010 /*IsReinject*/ true); 4011 // Drop the current token and bring the first cached one. It's the same token 4012 // as when we entered this function. 4013 ConsumeAnyToken(); 4014 4015 if (ParseAs >= CompoundLiteral) { 4016 // Parse the type declarator. 4017 DeclSpec DS(AttrFactory); 4018 Declarator DeclaratorInfo(DS, ParsedAttributesView::none(), 4019 DeclaratorContext::TypeName); 4020 { 4021 ColonProtectionRAIIObject InnerColonProtection(*this); 4022 ParseSpecifierQualifierList(DS); 4023 ParseDeclarator(DeclaratorInfo); 4024 } 4025 4026 // Match the ')'. 4027 Tracker.consumeClose(); 4028 ColonProt.restore(); 4029 4030 // Consume EOF marker for Toks buffer. 4031 assert(Tok.is(tok::eof) && Tok.getEofData() == AttrEnd.getEofData()); 4032 ConsumeAnyToken(); 4033 4034 if (ParseAs == CompoundLiteral) { 4035 ExprType = CompoundLiteral; 4036 if (DeclaratorInfo.isInvalidType()) 4037 return ExprError(); 4038 4039 TypeResult Ty = Actions.ActOnTypeName(getCurScope(), DeclaratorInfo); 4040 return ParseCompoundLiteralExpression(Ty.get(), 4041 Tracker.getOpenLocation(), 4042 Tracker.getCloseLocation()); 4043 } 4044 4045 // We parsed '(' type-id ')' and the thing after it wasn't a '{'. 4046 assert(ParseAs == CastExpr); 4047 4048 if (DeclaratorInfo.isInvalidType()) 4049 return ExprError(); 4050 4051 // Result is what ParseCastExpression returned earlier. 4052 if (!Result.isInvalid()) 4053 Result = Actions.ActOnCastExpr(getCurScope(), Tracker.getOpenLocation(), 4054 DeclaratorInfo, CastTy, 4055 Tracker.getCloseLocation(), Result.get()); 4056 return Result; 4057 } 4058 4059 // Not a compound literal, and not followed by a cast-expression. 4060 assert(ParseAs == SimpleExpr); 4061 4062 ExprType = SimpleExpr; 4063 Result = ParseExpression(); 4064 if (!Result.isInvalid() && Tok.is(tok::r_paren)) 4065 Result = Actions.ActOnParenExpr(Tracker.getOpenLocation(), 4066 Tok.getLocation(), Result.get()); 4067 4068 // Match the ')'. 4069 if (Result.isInvalid()) { 4070 while (Tok.isNot(tok::eof)) 4071 ConsumeAnyToken(); 4072 assert(Tok.getEofData() == AttrEnd.getEofData()); 4073 ConsumeAnyToken(); 4074 return ExprError(); 4075 } 4076 4077 Tracker.consumeClose(); 4078 // Consume EOF marker for Toks buffer. 4079 assert(Tok.is(tok::eof) && Tok.getEofData() == AttrEnd.getEofData()); 4080 ConsumeAnyToken(); 4081 return Result; 4082 } 4083 4084 /// Parse a __builtin_bit_cast(T, E). 4085 ExprResult Parser::ParseBuiltinBitCast() { 4086 SourceLocation KWLoc = ConsumeToken(); 4087 4088 BalancedDelimiterTracker T(*this, tok::l_paren); 4089 if (T.expectAndConsume(diag::err_expected_lparen_after, "__builtin_bit_cast")) 4090 return ExprError(); 4091 4092 // Parse the common declaration-specifiers piece. 4093 DeclSpec DS(AttrFactory); 4094 ParseSpecifierQualifierList(DS); 4095 4096 // Parse the abstract-declarator, if present. 4097 Declarator DeclaratorInfo(DS, ParsedAttributesView::none(), 4098 DeclaratorContext::TypeName); 4099 ParseDeclarator(DeclaratorInfo); 4100 4101 if (ExpectAndConsume(tok::comma)) { 4102 Diag(Tok.getLocation(), diag::err_expected) << tok::comma; 4103 SkipUntil(tok::r_paren, StopAtSemi); 4104 return ExprError(); 4105 } 4106 4107 ExprResult Operand = ParseExpression(); 4108 4109 if (T.consumeClose()) 4110 return ExprError(); 4111 4112 if (Operand.isInvalid() || DeclaratorInfo.isInvalidType()) 4113 return ExprError(); 4114 4115 return Actions.ActOnBuiltinBitCastExpr(KWLoc, DeclaratorInfo, Operand, 4116 T.getCloseLocation()); 4117 } 4118