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 MultiParseScope TemplateParamScope(*this); 1315 if (Tok.is(tok::less)) { 1316 Diag(Tok, getLangOpts().CPlusPlus20 1317 ? diag::warn_cxx17_compat_lambda_template_parameter_list 1318 : diag::ext_lambda_template_parameter_list); 1319 1320 SmallVector<NamedDecl*, 4> TemplateParams; 1321 SourceLocation LAngleLoc, RAngleLoc; 1322 if (ParseTemplateParameters(TemplateParamScope, 1323 CurTemplateDepthTracker.getDepth(), 1324 TemplateParams, LAngleLoc, RAngleLoc)) { 1325 Actions.ActOnLambdaError(LambdaBeginLoc, getCurScope()); 1326 return ExprError(); 1327 } 1328 1329 if (TemplateParams.empty()) { 1330 Diag(RAngleLoc, 1331 diag::err_lambda_template_parameter_list_empty); 1332 } else { 1333 ExprResult RequiresClause; 1334 if (TryConsumeToken(tok::kw_requires)) { 1335 RequiresClause = 1336 Actions.ActOnRequiresClause(ParseConstraintLogicalOrExpression( 1337 /*IsTrailingRequiresClause=*/false)); 1338 if (RequiresClause.isInvalid()) 1339 SkipUntil({tok::l_brace, tok::l_paren}, StopAtSemi | StopBeforeMatch); 1340 } 1341 1342 Actions.ActOnLambdaExplicitTemplateParameterList( 1343 Intro, LAngleLoc, TemplateParams, RAngleLoc, RequiresClause); 1344 ++CurTemplateDepthTracker; 1345 } 1346 } 1347 1348 // Implement WG21 P2173, which allows attributes immediately before the 1349 // lambda declarator and applies them to the corresponding function operator 1350 // or operator template declaration. We accept this as a conforming extension 1351 // in all language modes that support lambdas. 1352 if (isCXX11AttributeSpecifier()) { 1353 Diag(Tok, getLangOpts().CPlusPlus23 1354 ? diag::warn_cxx20_compat_decl_attrs_on_lambda 1355 : diag::ext_decl_attrs_on_lambda) 1356 << Tok.getIdentifierInfo() << Tok.isRegularKeywordAttribute(); 1357 MaybeParseCXX11Attributes(D); 1358 } 1359 1360 TypeResult TrailingReturnType; 1361 SourceLocation TrailingReturnTypeLoc; 1362 SourceLocation LParenLoc, RParenLoc; 1363 SourceLocation DeclEndLoc; 1364 bool HasParentheses = false; 1365 bool HasSpecifiers = false; 1366 SourceLocation MutableLoc; 1367 1368 ParseScope Prototype(this, Scope::FunctionPrototypeScope | 1369 Scope::FunctionDeclarationScope | 1370 Scope::DeclScope); 1371 1372 // Parse parameter-declaration-clause. 1373 SmallVector<DeclaratorChunk::ParamInfo, 16> ParamInfo; 1374 SourceLocation EllipsisLoc; 1375 1376 if (Tok.is(tok::l_paren)) { 1377 BalancedDelimiterTracker T(*this, tok::l_paren); 1378 T.consumeOpen(); 1379 LParenLoc = T.getOpenLocation(); 1380 1381 if (Tok.isNot(tok::r_paren)) { 1382 Actions.RecordParsingTemplateParameterDepth( 1383 CurTemplateDepthTracker.getOriginalDepth()); 1384 1385 ParseParameterDeclarationClause(D, Attributes, ParamInfo, EllipsisLoc); 1386 // For a generic lambda, each 'auto' within the parameter declaration 1387 // clause creates a template type parameter, so increment the depth. 1388 // If we've parsed any explicit template parameters, then the depth will 1389 // have already been incremented. So we make sure that at most a single 1390 // depth level is added. 1391 if (Actions.getCurGenericLambda()) 1392 CurTemplateDepthTracker.setAddedDepth(1); 1393 } 1394 1395 T.consumeClose(); 1396 DeclEndLoc = RParenLoc = T.getCloseLocation(); 1397 HasParentheses = true; 1398 } 1399 1400 HasSpecifiers = 1401 Tok.isOneOf(tok::kw_mutable, tok::arrow, tok::kw___attribute, 1402 tok::kw_constexpr, tok::kw_consteval, tok::kw_static, 1403 tok::kw___private, tok::kw___global, tok::kw___local, 1404 tok::kw___constant, tok::kw___generic, tok::kw_groupshared, 1405 tok::kw_requires, tok::kw_noexcept) || 1406 Tok.isRegularKeywordAttribute() || 1407 (Tok.is(tok::l_square) && NextToken().is(tok::l_square)); 1408 1409 if (HasSpecifiers && !HasParentheses && !getLangOpts().CPlusPlus23) { 1410 // It's common to forget that one needs '()' before 'mutable', an 1411 // attribute specifier, the result type, or the requires clause. Deal with 1412 // this. 1413 Diag(Tok, diag::ext_lambda_missing_parens) 1414 << FixItHint::CreateInsertion(Tok.getLocation(), "() "); 1415 } 1416 1417 if (HasParentheses || HasSpecifiers) { 1418 // GNU-style attributes must be parsed before the mutable specifier to 1419 // be compatible with GCC. MSVC-style attributes must be parsed before 1420 // the mutable specifier to be compatible with MSVC. 1421 MaybeParseAttributes(PAKM_GNU | PAKM_Declspec, Attributes); 1422 // Parse mutable-opt and/or constexpr-opt or consteval-opt, and update 1423 // the DeclEndLoc. 1424 SourceLocation ConstexprLoc; 1425 SourceLocation ConstevalLoc; 1426 SourceLocation StaticLoc; 1427 1428 tryConsumeLambdaSpecifierToken(*this, MutableLoc, StaticLoc, ConstexprLoc, 1429 ConstevalLoc, DeclEndLoc); 1430 1431 DiagnoseStaticSpecifierRestrictions(*this, StaticLoc, MutableLoc, Intro); 1432 1433 addStaticToLambdaDeclSpecifier(*this, StaticLoc, DS); 1434 addConstexprToLambdaDeclSpecifier(*this, ConstexprLoc, DS); 1435 addConstevalToLambdaDeclSpecifier(*this, ConstevalLoc, DS); 1436 } 1437 1438 Actions.ActOnLambdaClosureParameters(getCurScope(), ParamInfo); 1439 1440 if (!HasParentheses) 1441 Actions.ActOnLambdaClosureQualifiers(Intro, MutableLoc); 1442 1443 if (HasSpecifiers || HasParentheses) { 1444 // Parse exception-specification[opt]. 1445 ExceptionSpecificationType ESpecType = EST_None; 1446 SourceRange ESpecRange; 1447 SmallVector<ParsedType, 2> DynamicExceptions; 1448 SmallVector<SourceRange, 2> DynamicExceptionRanges; 1449 ExprResult NoexceptExpr; 1450 CachedTokens *ExceptionSpecTokens; 1451 1452 ESpecType = tryParseExceptionSpecification( 1453 /*Delayed=*/false, ESpecRange, DynamicExceptions, 1454 DynamicExceptionRanges, NoexceptExpr, ExceptionSpecTokens); 1455 1456 if (ESpecType != EST_None) 1457 DeclEndLoc = ESpecRange.getEnd(); 1458 1459 // Parse attribute-specifier[opt]. 1460 if (MaybeParseCXX11Attributes(Attributes)) 1461 DeclEndLoc = Attributes.Range.getEnd(); 1462 1463 // Parse OpenCL addr space attribute. 1464 if (Tok.isOneOf(tok::kw___private, tok::kw___global, tok::kw___local, 1465 tok::kw___constant, tok::kw___generic)) { 1466 ParseOpenCLQualifiers(DS.getAttributes()); 1467 ConsumeToken(); 1468 } 1469 1470 SourceLocation FunLocalRangeEnd = DeclEndLoc; 1471 1472 // Parse trailing-return-type[opt]. 1473 if (Tok.is(tok::arrow)) { 1474 FunLocalRangeEnd = Tok.getLocation(); 1475 SourceRange Range; 1476 TrailingReturnType = 1477 ParseTrailingReturnType(Range, /*MayBeFollowedByDirectInit=*/false); 1478 TrailingReturnTypeLoc = Range.getBegin(); 1479 if (Range.getEnd().isValid()) 1480 DeclEndLoc = Range.getEnd(); 1481 } 1482 1483 SourceLocation NoLoc; 1484 D.AddTypeInfo(DeclaratorChunk::getFunction( 1485 /*HasProto=*/true, 1486 /*IsAmbiguous=*/false, LParenLoc, ParamInfo.data(), 1487 ParamInfo.size(), EllipsisLoc, RParenLoc, 1488 /*RefQualifierIsLvalueRef=*/true, 1489 /*RefQualifierLoc=*/NoLoc, MutableLoc, ESpecType, 1490 ESpecRange, DynamicExceptions.data(), 1491 DynamicExceptionRanges.data(), DynamicExceptions.size(), 1492 NoexceptExpr.isUsable() ? NoexceptExpr.get() : nullptr, 1493 /*ExceptionSpecTokens*/ nullptr, 1494 /*DeclsInPrototype=*/std::nullopt, LParenLoc, 1495 FunLocalRangeEnd, D, TrailingReturnType, 1496 TrailingReturnTypeLoc, &DS), 1497 std::move(Attributes), DeclEndLoc); 1498 1499 Actions.ActOnLambdaClosureQualifiers(Intro, MutableLoc); 1500 1501 if (HasParentheses && Tok.is(tok::kw_requires)) 1502 ParseTrailingRequiresClause(D); 1503 } 1504 1505 // Emit a warning if we see a CUDA host/device/global attribute 1506 // after '(...)'. nvcc doesn't accept this. 1507 if (getLangOpts().CUDA) { 1508 for (const ParsedAttr &A : Attributes) 1509 if (A.getKind() == ParsedAttr::AT_CUDADevice || 1510 A.getKind() == ParsedAttr::AT_CUDAHost || 1511 A.getKind() == ParsedAttr::AT_CUDAGlobal) 1512 Diag(A.getLoc(), diag::warn_cuda_attr_lambda_position) 1513 << A.getAttrName()->getName(); 1514 } 1515 1516 Prototype.Exit(); 1517 1518 // FIXME: Rename BlockScope -> ClosureScope if we decide to continue using 1519 // it. 1520 unsigned ScopeFlags = Scope::BlockScope | Scope::FnScope | Scope::DeclScope | 1521 Scope::CompoundStmtScope; 1522 ParseScope BodyScope(this, ScopeFlags); 1523 1524 Actions.ActOnStartOfLambdaDefinition(Intro, D, DS); 1525 1526 // Parse compound-statement. 1527 if (!Tok.is(tok::l_brace)) { 1528 Diag(Tok, diag::err_expected_lambda_body); 1529 Actions.ActOnLambdaError(LambdaBeginLoc, getCurScope()); 1530 return ExprError(); 1531 } 1532 1533 StmtResult Stmt(ParseCompoundStatementBody()); 1534 BodyScope.Exit(); 1535 TemplateParamScope.Exit(); 1536 LambdaScope.Exit(); 1537 1538 if (!Stmt.isInvalid() && !TrailingReturnType.isInvalid() && 1539 !D.isInvalidType()) 1540 return Actions.ActOnLambdaExpr(LambdaBeginLoc, Stmt.get()); 1541 1542 Actions.ActOnLambdaError(LambdaBeginLoc, getCurScope()); 1543 return ExprError(); 1544 } 1545 1546 /// ParseCXXCasts - This handles the various ways to cast expressions to another 1547 /// type. 1548 /// 1549 /// postfix-expression: [C++ 5.2p1] 1550 /// 'dynamic_cast' '<' type-name '>' '(' expression ')' 1551 /// 'static_cast' '<' type-name '>' '(' expression ')' 1552 /// 'reinterpret_cast' '<' type-name '>' '(' expression ')' 1553 /// 'const_cast' '<' type-name '>' '(' expression ')' 1554 /// 1555 /// C++ for OpenCL s2.3.1 adds: 1556 /// 'addrspace_cast' '<' type-name '>' '(' expression ')' 1557 ExprResult Parser::ParseCXXCasts() { 1558 tok::TokenKind Kind = Tok.getKind(); 1559 const char *CastName = nullptr; // For error messages 1560 1561 switch (Kind) { 1562 default: llvm_unreachable("Unknown C++ cast!"); 1563 case tok::kw_addrspace_cast: CastName = "addrspace_cast"; break; 1564 case tok::kw_const_cast: CastName = "const_cast"; break; 1565 case tok::kw_dynamic_cast: CastName = "dynamic_cast"; break; 1566 case tok::kw_reinterpret_cast: CastName = "reinterpret_cast"; break; 1567 case tok::kw_static_cast: CastName = "static_cast"; break; 1568 } 1569 1570 SourceLocation OpLoc = ConsumeToken(); 1571 SourceLocation LAngleBracketLoc = Tok.getLocation(); 1572 1573 // Check for "<::" which is parsed as "[:". If found, fix token stream, 1574 // diagnose error, suggest fix, and recover parsing. 1575 if (Tok.is(tok::l_square) && Tok.getLength() == 2) { 1576 Token Next = NextToken(); 1577 if (Next.is(tok::colon) && areTokensAdjacent(Tok, Next)) 1578 FixDigraph(*this, PP, Tok, Next, Kind, /*AtDigraph*/true); 1579 } 1580 1581 if (ExpectAndConsume(tok::less, diag::err_expected_less_after, CastName)) 1582 return ExprError(); 1583 1584 // Parse the common declaration-specifiers piece. 1585 DeclSpec DS(AttrFactory); 1586 ParseSpecifierQualifierList(DS, /*AccessSpecifier=*/AS_none, 1587 DeclSpecContext::DSC_type_specifier); 1588 1589 // Parse the abstract-declarator, if present. 1590 Declarator DeclaratorInfo(DS, ParsedAttributesView::none(), 1591 DeclaratorContext::TypeName); 1592 ParseDeclarator(DeclaratorInfo); 1593 1594 SourceLocation RAngleBracketLoc = Tok.getLocation(); 1595 1596 if (ExpectAndConsume(tok::greater)) 1597 return ExprError(Diag(LAngleBracketLoc, diag::note_matching) << tok::less); 1598 1599 BalancedDelimiterTracker T(*this, tok::l_paren); 1600 1601 if (T.expectAndConsume(diag::err_expected_lparen_after, CastName)) 1602 return ExprError(); 1603 1604 ExprResult Result = ParseExpression(); 1605 1606 // Match the ')'. 1607 T.consumeClose(); 1608 1609 if (!Result.isInvalid() && !DeclaratorInfo.isInvalidType()) 1610 Result = Actions.ActOnCXXNamedCast(OpLoc, Kind, 1611 LAngleBracketLoc, DeclaratorInfo, 1612 RAngleBracketLoc, 1613 T.getOpenLocation(), Result.get(), 1614 T.getCloseLocation()); 1615 1616 return Result; 1617 } 1618 1619 /// ParseCXXTypeid - This handles the C++ typeid expression. 1620 /// 1621 /// postfix-expression: [C++ 5.2p1] 1622 /// 'typeid' '(' expression ')' 1623 /// 'typeid' '(' type-id ')' 1624 /// 1625 ExprResult Parser::ParseCXXTypeid() { 1626 assert(Tok.is(tok::kw_typeid) && "Not 'typeid'!"); 1627 1628 SourceLocation OpLoc = ConsumeToken(); 1629 SourceLocation LParenLoc, RParenLoc; 1630 BalancedDelimiterTracker T(*this, tok::l_paren); 1631 1632 // typeid expressions are always parenthesized. 1633 if (T.expectAndConsume(diag::err_expected_lparen_after, "typeid")) 1634 return ExprError(); 1635 LParenLoc = T.getOpenLocation(); 1636 1637 ExprResult Result; 1638 1639 // C++0x [expr.typeid]p3: 1640 // When typeid is applied to an expression other than an lvalue of a 1641 // polymorphic class type [...] The expression is an unevaluated 1642 // operand (Clause 5). 1643 // 1644 // Note that we can't tell whether the expression is an lvalue of a 1645 // polymorphic class type until after we've parsed the expression; we 1646 // speculatively assume the subexpression is unevaluated, and fix it up 1647 // later. 1648 // 1649 // We enter the unevaluated context before trying to determine whether we 1650 // have a type-id, because the tentative parse logic will try to resolve 1651 // names, and must treat them as unevaluated. 1652 EnterExpressionEvaluationContext Unevaluated( 1653 Actions, Sema::ExpressionEvaluationContext::Unevaluated, 1654 Sema::ReuseLambdaContextDecl); 1655 1656 if (isTypeIdInParens()) { 1657 TypeResult Ty = ParseTypeName(); 1658 1659 // Match the ')'. 1660 T.consumeClose(); 1661 RParenLoc = T.getCloseLocation(); 1662 if (Ty.isInvalid() || RParenLoc.isInvalid()) 1663 return ExprError(); 1664 1665 Result = Actions.ActOnCXXTypeid(OpLoc, LParenLoc, /*isType=*/true, 1666 Ty.get().getAsOpaquePtr(), RParenLoc); 1667 } else { 1668 Result = ParseExpression(); 1669 1670 // Match the ')'. 1671 if (Result.isInvalid()) 1672 SkipUntil(tok::r_paren, StopAtSemi); 1673 else { 1674 T.consumeClose(); 1675 RParenLoc = T.getCloseLocation(); 1676 if (RParenLoc.isInvalid()) 1677 return ExprError(); 1678 1679 Result = Actions.ActOnCXXTypeid(OpLoc, LParenLoc, /*isType=*/false, 1680 Result.get(), RParenLoc); 1681 } 1682 } 1683 1684 return Result; 1685 } 1686 1687 /// ParseCXXUuidof - This handles the Microsoft C++ __uuidof expression. 1688 /// 1689 /// '__uuidof' '(' expression ')' 1690 /// '__uuidof' '(' type-id ')' 1691 /// 1692 ExprResult Parser::ParseCXXUuidof() { 1693 assert(Tok.is(tok::kw___uuidof) && "Not '__uuidof'!"); 1694 1695 SourceLocation OpLoc = ConsumeToken(); 1696 BalancedDelimiterTracker T(*this, tok::l_paren); 1697 1698 // __uuidof expressions are always parenthesized. 1699 if (T.expectAndConsume(diag::err_expected_lparen_after, "__uuidof")) 1700 return ExprError(); 1701 1702 ExprResult Result; 1703 1704 if (isTypeIdInParens()) { 1705 TypeResult Ty = ParseTypeName(); 1706 1707 // Match the ')'. 1708 T.consumeClose(); 1709 1710 if (Ty.isInvalid()) 1711 return ExprError(); 1712 1713 Result = Actions.ActOnCXXUuidof(OpLoc, T.getOpenLocation(), /*isType=*/true, 1714 Ty.get().getAsOpaquePtr(), 1715 T.getCloseLocation()); 1716 } else { 1717 EnterExpressionEvaluationContext Unevaluated( 1718 Actions, Sema::ExpressionEvaluationContext::Unevaluated); 1719 Result = ParseExpression(); 1720 1721 // Match the ')'. 1722 if (Result.isInvalid()) 1723 SkipUntil(tok::r_paren, StopAtSemi); 1724 else { 1725 T.consumeClose(); 1726 1727 Result = Actions.ActOnCXXUuidof(OpLoc, T.getOpenLocation(), 1728 /*isType=*/false, 1729 Result.get(), T.getCloseLocation()); 1730 } 1731 } 1732 1733 return Result; 1734 } 1735 1736 /// Parse a C++ pseudo-destructor expression after the base, 1737 /// . or -> operator, and nested-name-specifier have already been 1738 /// parsed. We're handling this fragment of the grammar: 1739 /// 1740 /// postfix-expression: [C++2a expr.post] 1741 /// postfix-expression . template[opt] id-expression 1742 /// postfix-expression -> template[opt] id-expression 1743 /// 1744 /// id-expression: 1745 /// qualified-id 1746 /// unqualified-id 1747 /// 1748 /// qualified-id: 1749 /// nested-name-specifier template[opt] unqualified-id 1750 /// 1751 /// nested-name-specifier: 1752 /// type-name :: 1753 /// decltype-specifier :: FIXME: not implemented, but probably only 1754 /// allowed in C++ grammar by accident 1755 /// nested-name-specifier identifier :: 1756 /// nested-name-specifier template[opt] simple-template-id :: 1757 /// [...] 1758 /// 1759 /// unqualified-id: 1760 /// ~ type-name 1761 /// ~ decltype-specifier 1762 /// [...] 1763 /// 1764 /// ... where the all but the last component of the nested-name-specifier 1765 /// has already been parsed, and the base expression is not of a non-dependent 1766 /// class type. 1767 ExprResult 1768 Parser::ParseCXXPseudoDestructor(Expr *Base, SourceLocation OpLoc, 1769 tok::TokenKind OpKind, 1770 CXXScopeSpec &SS, 1771 ParsedType ObjectType) { 1772 // If the last component of the (optional) nested-name-specifier is 1773 // template[opt] simple-template-id, it has already been annotated. 1774 UnqualifiedId FirstTypeName; 1775 SourceLocation CCLoc; 1776 if (Tok.is(tok::identifier)) { 1777 FirstTypeName.setIdentifier(Tok.getIdentifierInfo(), Tok.getLocation()); 1778 ConsumeToken(); 1779 assert(Tok.is(tok::coloncolon) &&"ParseOptionalCXXScopeSpecifier fail"); 1780 CCLoc = ConsumeToken(); 1781 } else if (Tok.is(tok::annot_template_id)) { 1782 TemplateIdAnnotation *TemplateId = takeTemplateIdAnnotation(Tok); 1783 // FIXME: Carry on and build an AST representation for tooling. 1784 if (TemplateId->isInvalid()) 1785 return ExprError(); 1786 FirstTypeName.setTemplateId(TemplateId); 1787 ConsumeAnnotationToken(); 1788 assert(Tok.is(tok::coloncolon) &&"ParseOptionalCXXScopeSpecifier fail"); 1789 CCLoc = ConsumeToken(); 1790 } else { 1791 assert(SS.isEmpty() && "missing last component of nested name specifier"); 1792 FirstTypeName.setIdentifier(nullptr, SourceLocation()); 1793 } 1794 1795 // Parse the tilde. 1796 assert(Tok.is(tok::tilde) && "ParseOptionalCXXScopeSpecifier fail"); 1797 SourceLocation TildeLoc = ConsumeToken(); 1798 1799 if (Tok.is(tok::kw_decltype) && !FirstTypeName.isValid()) { 1800 DeclSpec DS(AttrFactory); 1801 ParseDecltypeSpecifier(DS); 1802 if (DS.getTypeSpecType() == TST_error) 1803 return ExprError(); 1804 return Actions.ActOnPseudoDestructorExpr(getCurScope(), Base, OpLoc, OpKind, 1805 TildeLoc, DS); 1806 } 1807 1808 if (!Tok.is(tok::identifier)) { 1809 Diag(Tok, diag::err_destructor_tilde_identifier); 1810 return ExprError(); 1811 } 1812 1813 // Parse the second type. 1814 UnqualifiedId SecondTypeName; 1815 IdentifierInfo *Name = Tok.getIdentifierInfo(); 1816 SourceLocation NameLoc = ConsumeToken(); 1817 SecondTypeName.setIdentifier(Name, NameLoc); 1818 1819 // If there is a '<', the second type name is a template-id. Parse 1820 // it as such. 1821 // 1822 // FIXME: This is not a context in which a '<' is assumed to start a template 1823 // argument list. This affects examples such as 1824 // void f(auto *p) { p->~X<int>(); } 1825 // ... but there's no ambiguity, and nowhere to write 'template' in such an 1826 // example, so we accept it anyway. 1827 if (Tok.is(tok::less) && 1828 ParseUnqualifiedIdTemplateId( 1829 SS, ObjectType, Base && Base->containsErrors(), SourceLocation(), 1830 Name, NameLoc, false, SecondTypeName, 1831 /*AssumeTemplateId=*/true)) 1832 return ExprError(); 1833 1834 return Actions.ActOnPseudoDestructorExpr(getCurScope(), Base, OpLoc, OpKind, 1835 SS, FirstTypeName, CCLoc, TildeLoc, 1836 SecondTypeName); 1837 } 1838 1839 /// ParseCXXBoolLiteral - This handles the C++ Boolean literals. 1840 /// 1841 /// boolean-literal: [C++ 2.13.5] 1842 /// 'true' 1843 /// 'false' 1844 ExprResult Parser::ParseCXXBoolLiteral() { 1845 tok::TokenKind Kind = Tok.getKind(); 1846 return Actions.ActOnCXXBoolLiteral(ConsumeToken(), Kind); 1847 } 1848 1849 /// ParseThrowExpression - This handles the C++ throw expression. 1850 /// 1851 /// throw-expression: [C++ 15] 1852 /// 'throw' assignment-expression[opt] 1853 ExprResult Parser::ParseThrowExpression() { 1854 assert(Tok.is(tok::kw_throw) && "Not throw!"); 1855 SourceLocation ThrowLoc = ConsumeToken(); // Eat the throw token. 1856 1857 // If the current token isn't the start of an assignment-expression, 1858 // then the expression is not present. This handles things like: 1859 // "C ? throw : (void)42", which is crazy but legal. 1860 switch (Tok.getKind()) { // FIXME: move this predicate somewhere common. 1861 case tok::semi: 1862 case tok::r_paren: 1863 case tok::r_square: 1864 case tok::r_brace: 1865 case tok::colon: 1866 case tok::comma: 1867 return Actions.ActOnCXXThrow(getCurScope(), ThrowLoc, nullptr); 1868 1869 default: 1870 ExprResult Expr(ParseAssignmentExpression()); 1871 if (Expr.isInvalid()) return Expr; 1872 return Actions.ActOnCXXThrow(getCurScope(), ThrowLoc, Expr.get()); 1873 } 1874 } 1875 1876 /// Parse the C++ Coroutines co_yield expression. 1877 /// 1878 /// co_yield-expression: 1879 /// 'co_yield' assignment-expression[opt] 1880 ExprResult Parser::ParseCoyieldExpression() { 1881 assert(Tok.is(tok::kw_co_yield) && "Not co_yield!"); 1882 1883 SourceLocation Loc = ConsumeToken(); 1884 ExprResult Expr = Tok.is(tok::l_brace) ? ParseBraceInitializer() 1885 : ParseAssignmentExpression(); 1886 if (!Expr.isInvalid()) 1887 Expr = Actions.ActOnCoyieldExpr(getCurScope(), Loc, Expr.get()); 1888 return Expr; 1889 } 1890 1891 /// ParseCXXThis - This handles the C++ 'this' pointer. 1892 /// 1893 /// C++ 9.3.2: In the body of a non-static member function, the keyword this is 1894 /// a non-lvalue expression whose value is the address of the object for which 1895 /// the function is called. 1896 ExprResult Parser::ParseCXXThis() { 1897 assert(Tok.is(tok::kw_this) && "Not 'this'!"); 1898 SourceLocation ThisLoc = ConsumeToken(); 1899 return Actions.ActOnCXXThis(ThisLoc); 1900 } 1901 1902 /// ParseCXXTypeConstructExpression - Parse construction of a specified type. 1903 /// Can be interpreted either as function-style casting ("int(x)") 1904 /// or class type construction ("ClassType(x,y,z)") 1905 /// or creation of a value-initialized type ("int()"). 1906 /// See [C++ 5.2.3]. 1907 /// 1908 /// postfix-expression: [C++ 5.2p1] 1909 /// simple-type-specifier '(' expression-list[opt] ')' 1910 /// [C++0x] simple-type-specifier braced-init-list 1911 /// typename-specifier '(' expression-list[opt] ')' 1912 /// [C++0x] typename-specifier braced-init-list 1913 /// 1914 /// In C++1z onwards, the type specifier can also be a template-name. 1915 ExprResult 1916 Parser::ParseCXXTypeConstructExpression(const DeclSpec &DS) { 1917 Declarator DeclaratorInfo(DS, ParsedAttributesView::none(), 1918 DeclaratorContext::FunctionalCast); 1919 ParsedType TypeRep = Actions.ActOnTypeName(DeclaratorInfo).get(); 1920 1921 assert((Tok.is(tok::l_paren) || 1922 (getLangOpts().CPlusPlus11 && Tok.is(tok::l_brace))) 1923 && "Expected '(' or '{'!"); 1924 1925 if (Tok.is(tok::l_brace)) { 1926 PreferredType.enterTypeCast(Tok.getLocation(), TypeRep.get()); 1927 ExprResult Init = ParseBraceInitializer(); 1928 if (Init.isInvalid()) 1929 return Init; 1930 Expr *InitList = Init.get(); 1931 return Actions.ActOnCXXTypeConstructExpr( 1932 TypeRep, InitList->getBeginLoc(), MultiExprArg(&InitList, 1), 1933 InitList->getEndLoc(), /*ListInitialization=*/true); 1934 } else { 1935 BalancedDelimiterTracker T(*this, tok::l_paren); 1936 T.consumeOpen(); 1937 1938 PreferredType.enterTypeCast(Tok.getLocation(), TypeRep.get()); 1939 1940 ExprVector Exprs; 1941 1942 auto RunSignatureHelp = [&]() { 1943 QualType PreferredType; 1944 if (TypeRep) 1945 PreferredType = Actions.ProduceConstructorSignatureHelp( 1946 TypeRep.get()->getCanonicalTypeInternal(), DS.getEndLoc(), Exprs, 1947 T.getOpenLocation(), /*Braced=*/false); 1948 CalledSignatureHelp = true; 1949 return PreferredType; 1950 }; 1951 1952 if (Tok.isNot(tok::r_paren)) { 1953 if (ParseExpressionList(Exprs, [&] { 1954 PreferredType.enterFunctionArgument(Tok.getLocation(), 1955 RunSignatureHelp); 1956 })) { 1957 if (PP.isCodeCompletionReached() && !CalledSignatureHelp) 1958 RunSignatureHelp(); 1959 SkipUntil(tok::r_paren, StopAtSemi); 1960 return ExprError(); 1961 } 1962 } 1963 1964 // Match the ')'. 1965 T.consumeClose(); 1966 1967 // TypeRep could be null, if it references an invalid typedef. 1968 if (!TypeRep) 1969 return ExprError(); 1970 1971 return Actions.ActOnCXXTypeConstructExpr(TypeRep, T.getOpenLocation(), 1972 Exprs, T.getCloseLocation(), 1973 /*ListInitialization=*/false); 1974 } 1975 } 1976 1977 Parser::DeclGroupPtrTy 1978 Parser::ParseAliasDeclarationInInitStatement(DeclaratorContext Context, 1979 ParsedAttributes &Attrs) { 1980 assert(Tok.is(tok::kw_using) && "Expected using"); 1981 assert((Context == DeclaratorContext::ForInit || 1982 Context == DeclaratorContext::SelectionInit) && 1983 "Unexpected Declarator Context"); 1984 DeclGroupPtrTy DG; 1985 SourceLocation DeclStart = ConsumeToken(), DeclEnd; 1986 1987 DG = ParseUsingDeclaration(Context, {}, DeclStart, DeclEnd, Attrs, AS_none); 1988 if (!DG) 1989 return DG; 1990 1991 Diag(DeclStart, !getLangOpts().CPlusPlus23 1992 ? diag::ext_alias_in_init_statement 1993 : diag::warn_cxx20_alias_in_init_statement) 1994 << SourceRange(DeclStart, DeclEnd); 1995 1996 return DG; 1997 } 1998 1999 /// ParseCXXCondition - if/switch/while condition expression. 2000 /// 2001 /// condition: 2002 /// expression 2003 /// type-specifier-seq declarator '=' assignment-expression 2004 /// [C++11] type-specifier-seq declarator '=' initializer-clause 2005 /// [C++11] type-specifier-seq declarator braced-init-list 2006 /// [Clang] type-specifier-seq ref-qualifier[opt] '[' identifier-list ']' 2007 /// brace-or-equal-initializer 2008 /// [GNU] type-specifier-seq declarator simple-asm-expr[opt] attributes[opt] 2009 /// '=' assignment-expression 2010 /// 2011 /// In C++1z, a condition may in some contexts be preceded by an 2012 /// optional init-statement. This function will parse that too. 2013 /// 2014 /// \param InitStmt If non-null, an init-statement is permitted, and if present 2015 /// will be parsed and stored here. 2016 /// 2017 /// \param Loc The location of the start of the statement that requires this 2018 /// condition, e.g., the "for" in a for loop. 2019 /// 2020 /// \param MissingOK Whether an empty condition is acceptable here. Otherwise 2021 /// it is considered an error to be recovered from. 2022 /// 2023 /// \param FRI If non-null, a for range declaration is permitted, and if 2024 /// present will be parsed and stored here, and a null result will be returned. 2025 /// 2026 /// \param EnterForConditionScope If true, enter a continue/break scope at the 2027 /// appropriate moment for a 'for' loop. 2028 /// 2029 /// \returns The parsed condition. 2030 Sema::ConditionResult 2031 Parser::ParseCXXCondition(StmtResult *InitStmt, SourceLocation Loc, 2032 Sema::ConditionKind CK, bool MissingOK, 2033 ForRangeInfo *FRI, bool EnterForConditionScope) { 2034 // Helper to ensure we always enter a continue/break scope if requested. 2035 struct ForConditionScopeRAII { 2036 Scope *S; 2037 void enter(bool IsConditionVariable) { 2038 if (S) { 2039 S->AddFlags(Scope::BreakScope | Scope::ContinueScope); 2040 S->setIsConditionVarScope(IsConditionVariable); 2041 } 2042 } 2043 ~ForConditionScopeRAII() { 2044 if (S) 2045 S->setIsConditionVarScope(false); 2046 } 2047 } ForConditionScope{EnterForConditionScope ? getCurScope() : nullptr}; 2048 2049 ParenBraceBracketBalancer BalancerRAIIObj(*this); 2050 PreferredType.enterCondition(Actions, Tok.getLocation()); 2051 2052 if (Tok.is(tok::code_completion)) { 2053 cutOffParsing(); 2054 Actions.CodeCompleteOrdinaryName(getCurScope(), Sema::PCC_Condition); 2055 return Sema::ConditionError(); 2056 } 2057 2058 ParsedAttributes attrs(AttrFactory); 2059 MaybeParseCXX11Attributes(attrs); 2060 2061 const auto WarnOnInit = [this, &CK] { 2062 Diag(Tok.getLocation(), getLangOpts().CPlusPlus17 2063 ? diag::warn_cxx14_compat_init_statement 2064 : diag::ext_init_statement) 2065 << (CK == Sema::ConditionKind::Switch); 2066 }; 2067 2068 // Determine what kind of thing we have. 2069 switch (isCXXConditionDeclarationOrInitStatement(InitStmt, FRI)) { 2070 case ConditionOrInitStatement::Expression: { 2071 // If this is a for loop, we're entering its condition. 2072 ForConditionScope.enter(/*IsConditionVariable=*/false); 2073 2074 ProhibitAttributes(attrs); 2075 2076 // We can have an empty expression here. 2077 // if (; true); 2078 if (InitStmt && Tok.is(tok::semi)) { 2079 WarnOnInit(); 2080 SourceLocation SemiLoc = Tok.getLocation(); 2081 if (!Tok.hasLeadingEmptyMacro() && !SemiLoc.isMacroID()) { 2082 Diag(SemiLoc, diag::warn_empty_init_statement) 2083 << (CK == Sema::ConditionKind::Switch) 2084 << FixItHint::CreateRemoval(SemiLoc); 2085 } 2086 ConsumeToken(); 2087 *InitStmt = Actions.ActOnNullStmt(SemiLoc); 2088 return ParseCXXCondition(nullptr, Loc, CK, MissingOK); 2089 } 2090 2091 // Parse the expression. 2092 ExprResult Expr = ParseExpression(); // expression 2093 if (Expr.isInvalid()) 2094 return Sema::ConditionError(); 2095 2096 if (InitStmt && Tok.is(tok::semi)) { 2097 WarnOnInit(); 2098 *InitStmt = Actions.ActOnExprStmt(Expr.get()); 2099 ConsumeToken(); 2100 return ParseCXXCondition(nullptr, Loc, CK, MissingOK); 2101 } 2102 2103 return Actions.ActOnCondition(getCurScope(), Loc, Expr.get(), CK, 2104 MissingOK); 2105 } 2106 2107 case ConditionOrInitStatement::InitStmtDecl: { 2108 WarnOnInit(); 2109 DeclGroupPtrTy DG; 2110 SourceLocation DeclStart = Tok.getLocation(), DeclEnd; 2111 if (Tok.is(tok::kw_using)) 2112 DG = ParseAliasDeclarationInInitStatement( 2113 DeclaratorContext::SelectionInit, attrs); 2114 else { 2115 ParsedAttributes DeclSpecAttrs(AttrFactory); 2116 DG = ParseSimpleDeclaration(DeclaratorContext::SelectionInit, DeclEnd, 2117 attrs, DeclSpecAttrs, /*RequireSemi=*/true); 2118 } 2119 *InitStmt = Actions.ActOnDeclStmt(DG, DeclStart, DeclEnd); 2120 return ParseCXXCondition(nullptr, Loc, CK, MissingOK); 2121 } 2122 2123 case ConditionOrInitStatement::ForRangeDecl: { 2124 // This is 'for (init-stmt; for-range-decl : range-expr)'. 2125 // We're not actually in a for loop yet, so 'break' and 'continue' aren't 2126 // permitted here. 2127 assert(FRI && "should not parse a for range declaration here"); 2128 SourceLocation DeclStart = Tok.getLocation(), DeclEnd; 2129 ParsedAttributes DeclSpecAttrs(AttrFactory); 2130 DeclGroupPtrTy DG = ParseSimpleDeclaration( 2131 DeclaratorContext::ForInit, DeclEnd, attrs, DeclSpecAttrs, false, FRI); 2132 FRI->LoopVar = Actions.ActOnDeclStmt(DG, DeclStart, Tok.getLocation()); 2133 return Sema::ConditionResult(); 2134 } 2135 2136 case ConditionOrInitStatement::ConditionDecl: 2137 case ConditionOrInitStatement::Error: 2138 break; 2139 } 2140 2141 // If this is a for loop, we're entering its condition. 2142 ForConditionScope.enter(/*IsConditionVariable=*/true); 2143 2144 // type-specifier-seq 2145 DeclSpec DS(AttrFactory); 2146 ParseSpecifierQualifierList(DS, AS_none, DeclSpecContext::DSC_condition); 2147 2148 // declarator 2149 Declarator DeclaratorInfo(DS, attrs, DeclaratorContext::Condition); 2150 ParseDeclarator(DeclaratorInfo); 2151 2152 // simple-asm-expr[opt] 2153 if (Tok.is(tok::kw_asm)) { 2154 SourceLocation Loc; 2155 ExprResult AsmLabel(ParseSimpleAsm(/*ForAsmLabel*/ true, &Loc)); 2156 if (AsmLabel.isInvalid()) { 2157 SkipUntil(tok::semi, StopAtSemi); 2158 return Sema::ConditionError(); 2159 } 2160 DeclaratorInfo.setAsmLabel(AsmLabel.get()); 2161 DeclaratorInfo.SetRangeEnd(Loc); 2162 } 2163 2164 // If attributes are present, parse them. 2165 MaybeParseGNUAttributes(DeclaratorInfo); 2166 2167 // Type-check the declaration itself. 2168 DeclResult Dcl = Actions.ActOnCXXConditionDeclaration(getCurScope(), 2169 DeclaratorInfo); 2170 if (Dcl.isInvalid()) 2171 return Sema::ConditionError(); 2172 Decl *DeclOut = Dcl.get(); 2173 2174 // '=' assignment-expression 2175 // If a '==' or '+=' is found, suggest a fixit to '='. 2176 bool CopyInitialization = isTokenEqualOrEqualTypo(); 2177 if (CopyInitialization) 2178 ConsumeToken(); 2179 2180 ExprResult InitExpr = ExprError(); 2181 if (getLangOpts().CPlusPlus11 && Tok.is(tok::l_brace)) { 2182 Diag(Tok.getLocation(), 2183 diag::warn_cxx98_compat_generalized_initializer_lists); 2184 InitExpr = ParseBraceInitializer(); 2185 } else if (CopyInitialization) { 2186 PreferredType.enterVariableInit(Tok.getLocation(), DeclOut); 2187 InitExpr = ParseAssignmentExpression(); 2188 } else if (Tok.is(tok::l_paren)) { 2189 // This was probably an attempt to initialize the variable. 2190 SourceLocation LParen = ConsumeParen(), RParen = LParen; 2191 if (SkipUntil(tok::r_paren, StopAtSemi | StopBeforeMatch)) 2192 RParen = ConsumeParen(); 2193 Diag(DeclOut->getLocation(), 2194 diag::err_expected_init_in_condition_lparen) 2195 << SourceRange(LParen, RParen); 2196 } else { 2197 Diag(DeclOut->getLocation(), diag::err_expected_init_in_condition); 2198 } 2199 2200 if (!InitExpr.isInvalid()) 2201 Actions.AddInitializerToDecl(DeclOut, InitExpr.get(), !CopyInitialization); 2202 else 2203 Actions.ActOnInitializerError(DeclOut); 2204 2205 Actions.FinalizeDeclaration(DeclOut); 2206 return Actions.ActOnConditionVariable(DeclOut, Loc, CK); 2207 } 2208 2209 /// ParseCXXSimpleTypeSpecifier - [C++ 7.1.5.2] Simple type specifiers. 2210 /// This should only be called when the current token is known to be part of 2211 /// simple-type-specifier. 2212 /// 2213 /// simple-type-specifier: 2214 /// '::'[opt] nested-name-specifier[opt] type-name 2215 /// '::'[opt] nested-name-specifier 'template' simple-template-id [TODO] 2216 /// char 2217 /// wchar_t 2218 /// bool 2219 /// short 2220 /// int 2221 /// long 2222 /// signed 2223 /// unsigned 2224 /// float 2225 /// double 2226 /// void 2227 /// [GNU] typeof-specifier 2228 /// [C++0x] auto [TODO] 2229 /// 2230 /// type-name: 2231 /// class-name 2232 /// enum-name 2233 /// typedef-name 2234 /// 2235 void Parser::ParseCXXSimpleTypeSpecifier(DeclSpec &DS) { 2236 DS.SetRangeStart(Tok.getLocation()); 2237 const char *PrevSpec; 2238 unsigned DiagID; 2239 SourceLocation Loc = Tok.getLocation(); 2240 const clang::PrintingPolicy &Policy = 2241 Actions.getASTContext().getPrintingPolicy(); 2242 2243 switch (Tok.getKind()) { 2244 case tok::identifier: // foo::bar 2245 case tok::coloncolon: // ::foo::bar 2246 llvm_unreachable("Annotation token should already be formed!"); 2247 default: 2248 llvm_unreachable("Not a simple-type-specifier token!"); 2249 2250 // type-name 2251 case tok::annot_typename: { 2252 DS.SetTypeSpecType(DeclSpec::TST_typename, Loc, PrevSpec, DiagID, 2253 getTypeAnnotation(Tok), Policy); 2254 DS.SetRangeEnd(Tok.getAnnotationEndLoc()); 2255 ConsumeAnnotationToken(); 2256 2257 DS.Finish(Actions, Policy); 2258 return; 2259 } 2260 2261 case tok::kw__ExtInt: 2262 case tok::kw__BitInt: { 2263 DiagnoseBitIntUse(Tok); 2264 ExprResult ER = ParseExtIntegerArgument(); 2265 if (ER.isInvalid()) 2266 DS.SetTypeSpecError(); 2267 else 2268 DS.SetBitIntType(Loc, ER.get(), PrevSpec, DiagID, Policy); 2269 2270 // Do this here because we have already consumed the close paren. 2271 DS.SetRangeEnd(PrevTokLocation); 2272 DS.Finish(Actions, Policy); 2273 return; 2274 } 2275 2276 // builtin types 2277 case tok::kw_short: 2278 DS.SetTypeSpecWidth(TypeSpecifierWidth::Short, Loc, PrevSpec, DiagID, 2279 Policy); 2280 break; 2281 case tok::kw_long: 2282 DS.SetTypeSpecWidth(TypeSpecifierWidth::Long, Loc, PrevSpec, DiagID, 2283 Policy); 2284 break; 2285 case tok::kw___int64: 2286 DS.SetTypeSpecWidth(TypeSpecifierWidth::LongLong, Loc, PrevSpec, DiagID, 2287 Policy); 2288 break; 2289 case tok::kw_signed: 2290 DS.SetTypeSpecSign(TypeSpecifierSign::Signed, Loc, PrevSpec, DiagID); 2291 break; 2292 case tok::kw_unsigned: 2293 DS.SetTypeSpecSign(TypeSpecifierSign::Unsigned, Loc, PrevSpec, DiagID); 2294 break; 2295 case tok::kw_void: 2296 DS.SetTypeSpecType(DeclSpec::TST_void, Loc, PrevSpec, DiagID, Policy); 2297 break; 2298 case tok::kw_auto: 2299 DS.SetTypeSpecType(DeclSpec::TST_auto, Loc, PrevSpec, DiagID, Policy); 2300 break; 2301 case tok::kw_char: 2302 DS.SetTypeSpecType(DeclSpec::TST_char, Loc, PrevSpec, DiagID, Policy); 2303 break; 2304 case tok::kw_int: 2305 DS.SetTypeSpecType(DeclSpec::TST_int, Loc, PrevSpec, DiagID, Policy); 2306 break; 2307 case tok::kw___int128: 2308 DS.SetTypeSpecType(DeclSpec::TST_int128, Loc, PrevSpec, DiagID, Policy); 2309 break; 2310 case tok::kw___bf16: 2311 DS.SetTypeSpecType(DeclSpec::TST_BFloat16, Loc, PrevSpec, DiagID, Policy); 2312 break; 2313 case tok::kw_half: 2314 DS.SetTypeSpecType(DeclSpec::TST_half, Loc, PrevSpec, DiagID, Policy); 2315 break; 2316 case tok::kw_float: 2317 DS.SetTypeSpecType(DeclSpec::TST_float, Loc, PrevSpec, DiagID, Policy); 2318 break; 2319 case tok::kw_double: 2320 DS.SetTypeSpecType(DeclSpec::TST_double, Loc, PrevSpec, DiagID, Policy); 2321 break; 2322 case tok::kw__Float16: 2323 DS.SetTypeSpecType(DeclSpec::TST_float16, Loc, PrevSpec, DiagID, Policy); 2324 break; 2325 case tok::kw___float128: 2326 DS.SetTypeSpecType(DeclSpec::TST_float128, Loc, PrevSpec, DiagID, Policy); 2327 break; 2328 case tok::kw___ibm128: 2329 DS.SetTypeSpecType(DeclSpec::TST_ibm128, Loc, PrevSpec, DiagID, Policy); 2330 break; 2331 case tok::kw_wchar_t: 2332 DS.SetTypeSpecType(DeclSpec::TST_wchar, Loc, PrevSpec, DiagID, Policy); 2333 break; 2334 case tok::kw_char8_t: 2335 DS.SetTypeSpecType(DeclSpec::TST_char8, Loc, PrevSpec, DiagID, Policy); 2336 break; 2337 case tok::kw_char16_t: 2338 DS.SetTypeSpecType(DeclSpec::TST_char16, Loc, PrevSpec, DiagID, Policy); 2339 break; 2340 case tok::kw_char32_t: 2341 DS.SetTypeSpecType(DeclSpec::TST_char32, Loc, PrevSpec, DiagID, Policy); 2342 break; 2343 case tok::kw_bool: 2344 DS.SetTypeSpecType(DeclSpec::TST_bool, Loc, PrevSpec, DiagID, Policy); 2345 break; 2346 case tok::kw__Accum: 2347 DS.SetTypeSpecType(DeclSpec::TST_accum, Loc, PrevSpec, DiagID, Policy); 2348 break; 2349 case tok::kw__Fract: 2350 DS.SetTypeSpecType(DeclSpec::TST_fract, Loc, PrevSpec, DiagID, Policy); 2351 break; 2352 case tok::kw__Sat: 2353 DS.SetTypeSpecSat(Loc, PrevSpec, DiagID); 2354 break; 2355 #define GENERIC_IMAGE_TYPE(ImgType, Id) \ 2356 case tok::kw_##ImgType##_t: \ 2357 DS.SetTypeSpecType(DeclSpec::TST_##ImgType##_t, Loc, PrevSpec, DiagID, \ 2358 Policy); \ 2359 break; 2360 #include "clang/Basic/OpenCLImageTypes.def" 2361 2362 case tok::annot_decltype: 2363 case tok::kw_decltype: 2364 DS.SetRangeEnd(ParseDecltypeSpecifier(DS)); 2365 return DS.Finish(Actions, Policy); 2366 2367 // GNU typeof support. 2368 case tok::kw_typeof: 2369 ParseTypeofSpecifier(DS); 2370 DS.Finish(Actions, Policy); 2371 return; 2372 } 2373 ConsumeAnyToken(); 2374 DS.SetRangeEnd(PrevTokLocation); 2375 DS.Finish(Actions, Policy); 2376 } 2377 2378 /// ParseCXXTypeSpecifierSeq - Parse a C++ type-specifier-seq (C++ 2379 /// [dcl.name]), which is a non-empty sequence of type-specifiers, 2380 /// e.g., "const short int". Note that the DeclSpec is *not* finished 2381 /// by parsing the type-specifier-seq, because these sequences are 2382 /// typically followed by some form of declarator. Returns true and 2383 /// emits diagnostics if this is not a type-specifier-seq, false 2384 /// otherwise. 2385 /// 2386 /// type-specifier-seq: [C++ 8.1] 2387 /// type-specifier type-specifier-seq[opt] 2388 /// 2389 bool Parser::ParseCXXTypeSpecifierSeq(DeclSpec &DS, DeclaratorContext Context) { 2390 ParseSpecifierQualifierList(DS, AS_none, 2391 getDeclSpecContextFromDeclaratorContext(Context)); 2392 DS.Finish(Actions, Actions.getASTContext().getPrintingPolicy()); 2393 return false; 2394 } 2395 2396 /// Finish parsing a C++ unqualified-id that is a template-id of 2397 /// some form. 2398 /// 2399 /// This routine is invoked when a '<' is encountered after an identifier or 2400 /// operator-function-id is parsed by \c ParseUnqualifiedId() to determine 2401 /// whether the unqualified-id is actually a template-id. This routine will 2402 /// then parse the template arguments and form the appropriate template-id to 2403 /// return to the caller. 2404 /// 2405 /// \param SS the nested-name-specifier that precedes this template-id, if 2406 /// we're actually parsing a qualified-id. 2407 /// 2408 /// \param ObjectType if this unqualified-id occurs within a member access 2409 /// expression, the type of the base object whose member is being accessed. 2410 /// 2411 /// \param ObjectHadErrors this unqualified-id occurs within a member access 2412 /// expression, indicates whether the original subexpressions had any errors. 2413 /// 2414 /// \param Name for constructor and destructor names, this is the actual 2415 /// identifier that may be a template-name. 2416 /// 2417 /// \param NameLoc the location of the class-name in a constructor or 2418 /// destructor. 2419 /// 2420 /// \param EnteringContext whether we're entering the scope of the 2421 /// nested-name-specifier. 2422 /// 2423 /// \param Id as input, describes the template-name or operator-function-id 2424 /// that precedes the '<'. If template arguments were parsed successfully, 2425 /// will be updated with the template-id. 2426 /// 2427 /// \param AssumeTemplateId When true, this routine will assume that the name 2428 /// refers to a template without performing name lookup to verify. 2429 /// 2430 /// \returns true if a parse error occurred, false otherwise. 2431 bool Parser::ParseUnqualifiedIdTemplateId( 2432 CXXScopeSpec &SS, ParsedType ObjectType, bool ObjectHadErrors, 2433 SourceLocation TemplateKWLoc, IdentifierInfo *Name, SourceLocation NameLoc, 2434 bool EnteringContext, UnqualifiedId &Id, bool AssumeTemplateId) { 2435 assert(Tok.is(tok::less) && "Expected '<' to finish parsing a template-id"); 2436 2437 TemplateTy Template; 2438 TemplateNameKind TNK = TNK_Non_template; 2439 switch (Id.getKind()) { 2440 case UnqualifiedIdKind::IK_Identifier: 2441 case UnqualifiedIdKind::IK_OperatorFunctionId: 2442 case UnqualifiedIdKind::IK_LiteralOperatorId: 2443 if (AssumeTemplateId) { 2444 // We defer the injected-class-name checks until we've found whether 2445 // this template-id is used to form a nested-name-specifier or not. 2446 TNK = Actions.ActOnTemplateName(getCurScope(), SS, TemplateKWLoc, Id, 2447 ObjectType, EnteringContext, Template, 2448 /*AllowInjectedClassName*/ true); 2449 } else { 2450 bool MemberOfUnknownSpecialization; 2451 TNK = Actions.isTemplateName(getCurScope(), SS, 2452 TemplateKWLoc.isValid(), Id, 2453 ObjectType, EnteringContext, Template, 2454 MemberOfUnknownSpecialization); 2455 // If lookup found nothing but we're assuming that this is a template 2456 // name, double-check that makes sense syntactically before committing 2457 // to it. 2458 if (TNK == TNK_Undeclared_template && 2459 isTemplateArgumentList(0) == TPResult::False) 2460 return false; 2461 2462 if (TNK == TNK_Non_template && MemberOfUnknownSpecialization && 2463 ObjectType && isTemplateArgumentList(0) == TPResult::True) { 2464 // If we had errors before, ObjectType can be dependent even without any 2465 // templates, do not report missing template keyword in that case. 2466 if (!ObjectHadErrors) { 2467 // We have something like t->getAs<T>(), where getAs is a 2468 // member of an unknown specialization. However, this will only 2469 // parse correctly as a template, so suggest the keyword 'template' 2470 // before 'getAs' and treat this as a dependent template name. 2471 std::string Name; 2472 if (Id.getKind() == UnqualifiedIdKind::IK_Identifier) 2473 Name = std::string(Id.Identifier->getName()); 2474 else { 2475 Name = "operator "; 2476 if (Id.getKind() == UnqualifiedIdKind::IK_OperatorFunctionId) 2477 Name += getOperatorSpelling(Id.OperatorFunctionId.Operator); 2478 else 2479 Name += Id.Identifier->getName(); 2480 } 2481 Diag(Id.StartLocation, diag::err_missing_dependent_template_keyword) 2482 << Name 2483 << FixItHint::CreateInsertion(Id.StartLocation, "template "); 2484 } 2485 TNK = Actions.ActOnTemplateName( 2486 getCurScope(), SS, TemplateKWLoc, Id, ObjectType, EnteringContext, 2487 Template, /*AllowInjectedClassName*/ true); 2488 } else if (TNK == TNK_Non_template) { 2489 return false; 2490 } 2491 } 2492 break; 2493 2494 case UnqualifiedIdKind::IK_ConstructorName: { 2495 UnqualifiedId TemplateName; 2496 bool MemberOfUnknownSpecialization; 2497 TemplateName.setIdentifier(Name, NameLoc); 2498 TNK = Actions.isTemplateName(getCurScope(), SS, TemplateKWLoc.isValid(), 2499 TemplateName, ObjectType, 2500 EnteringContext, Template, 2501 MemberOfUnknownSpecialization); 2502 if (TNK == TNK_Non_template) 2503 return false; 2504 break; 2505 } 2506 2507 case UnqualifiedIdKind::IK_DestructorName: { 2508 UnqualifiedId TemplateName; 2509 bool MemberOfUnknownSpecialization; 2510 TemplateName.setIdentifier(Name, NameLoc); 2511 if (ObjectType) { 2512 TNK = Actions.ActOnTemplateName( 2513 getCurScope(), SS, TemplateKWLoc, TemplateName, ObjectType, 2514 EnteringContext, Template, /*AllowInjectedClassName*/ true); 2515 } else { 2516 TNK = Actions.isTemplateName(getCurScope(), SS, TemplateKWLoc.isValid(), 2517 TemplateName, ObjectType, 2518 EnteringContext, Template, 2519 MemberOfUnknownSpecialization); 2520 2521 if (TNK == TNK_Non_template && !Id.DestructorName.get()) { 2522 Diag(NameLoc, diag::err_destructor_template_id) 2523 << Name << SS.getRange(); 2524 // Carry on to parse the template arguments before bailing out. 2525 } 2526 } 2527 break; 2528 } 2529 2530 default: 2531 return false; 2532 } 2533 2534 // Parse the enclosed template argument list. 2535 SourceLocation LAngleLoc, RAngleLoc; 2536 TemplateArgList TemplateArgs; 2537 if (ParseTemplateIdAfterTemplateName(true, LAngleLoc, TemplateArgs, RAngleLoc, 2538 Template)) 2539 return true; 2540 2541 // If this is a non-template, we already issued a diagnostic. 2542 if (TNK == TNK_Non_template) 2543 return true; 2544 2545 if (Id.getKind() == UnqualifiedIdKind::IK_Identifier || 2546 Id.getKind() == UnqualifiedIdKind::IK_OperatorFunctionId || 2547 Id.getKind() == UnqualifiedIdKind::IK_LiteralOperatorId) { 2548 // Form a parsed representation of the template-id to be stored in the 2549 // UnqualifiedId. 2550 2551 // FIXME: Store name for literal operator too. 2552 IdentifierInfo *TemplateII = 2553 Id.getKind() == UnqualifiedIdKind::IK_Identifier ? Id.Identifier 2554 : nullptr; 2555 OverloadedOperatorKind OpKind = 2556 Id.getKind() == UnqualifiedIdKind::IK_Identifier 2557 ? OO_None 2558 : Id.OperatorFunctionId.Operator; 2559 2560 TemplateIdAnnotation *TemplateId = TemplateIdAnnotation::Create( 2561 TemplateKWLoc, Id.StartLocation, TemplateII, OpKind, Template, TNK, 2562 LAngleLoc, RAngleLoc, TemplateArgs, /*ArgsInvalid*/false, TemplateIds); 2563 2564 Id.setTemplateId(TemplateId); 2565 return false; 2566 } 2567 2568 // Bundle the template arguments together. 2569 ASTTemplateArgsPtr TemplateArgsPtr(TemplateArgs); 2570 2571 // Constructor and destructor names. 2572 TypeResult Type = Actions.ActOnTemplateIdType( 2573 getCurScope(), SS, TemplateKWLoc, Template, Name, NameLoc, LAngleLoc, 2574 TemplateArgsPtr, RAngleLoc, /*IsCtorOrDtorName=*/true); 2575 if (Type.isInvalid()) 2576 return true; 2577 2578 if (Id.getKind() == UnqualifiedIdKind::IK_ConstructorName) 2579 Id.setConstructorName(Type.get(), NameLoc, RAngleLoc); 2580 else 2581 Id.setDestructorName(Id.StartLocation, Type.get(), RAngleLoc); 2582 2583 return false; 2584 } 2585 2586 /// Parse an operator-function-id or conversion-function-id as part 2587 /// of a C++ unqualified-id. 2588 /// 2589 /// This routine is responsible only for parsing the operator-function-id or 2590 /// conversion-function-id; it does not handle template arguments in any way. 2591 /// 2592 /// \code 2593 /// operator-function-id: [C++ 13.5] 2594 /// 'operator' operator 2595 /// 2596 /// operator: one of 2597 /// new delete new[] delete[] 2598 /// + - * / % ^ & | ~ 2599 /// ! = < > += -= *= /= %= 2600 /// ^= &= |= << >> >>= <<= == != 2601 /// <= >= && || ++ -- , ->* -> 2602 /// () [] <=> 2603 /// 2604 /// conversion-function-id: [C++ 12.3.2] 2605 /// operator conversion-type-id 2606 /// 2607 /// conversion-type-id: 2608 /// type-specifier-seq conversion-declarator[opt] 2609 /// 2610 /// conversion-declarator: 2611 /// ptr-operator conversion-declarator[opt] 2612 /// \endcode 2613 /// 2614 /// \param SS The nested-name-specifier that preceded this unqualified-id. If 2615 /// non-empty, then we are parsing the unqualified-id of a qualified-id. 2616 /// 2617 /// \param EnteringContext whether we are entering the scope of the 2618 /// nested-name-specifier. 2619 /// 2620 /// \param ObjectType if this unqualified-id occurs within a member access 2621 /// expression, the type of the base object whose member is being accessed. 2622 /// 2623 /// \param Result on a successful parse, contains the parsed unqualified-id. 2624 /// 2625 /// \returns true if parsing fails, false otherwise. 2626 bool Parser::ParseUnqualifiedIdOperator(CXXScopeSpec &SS, bool EnteringContext, 2627 ParsedType ObjectType, 2628 UnqualifiedId &Result) { 2629 assert(Tok.is(tok::kw_operator) && "Expected 'operator' keyword"); 2630 2631 // Consume the 'operator' keyword. 2632 SourceLocation KeywordLoc = ConsumeToken(); 2633 2634 // Determine what kind of operator name we have. 2635 unsigned SymbolIdx = 0; 2636 SourceLocation SymbolLocations[3]; 2637 OverloadedOperatorKind Op = OO_None; 2638 switch (Tok.getKind()) { 2639 case tok::kw_new: 2640 case tok::kw_delete: { 2641 bool isNew = Tok.getKind() == tok::kw_new; 2642 // Consume the 'new' or 'delete'. 2643 SymbolLocations[SymbolIdx++] = ConsumeToken(); 2644 // Check for array new/delete. 2645 if (Tok.is(tok::l_square) && 2646 (!getLangOpts().CPlusPlus11 || NextToken().isNot(tok::l_square))) { 2647 // Consume the '[' and ']'. 2648 BalancedDelimiterTracker T(*this, tok::l_square); 2649 T.consumeOpen(); 2650 T.consumeClose(); 2651 if (T.getCloseLocation().isInvalid()) 2652 return true; 2653 2654 SymbolLocations[SymbolIdx++] = T.getOpenLocation(); 2655 SymbolLocations[SymbolIdx++] = T.getCloseLocation(); 2656 Op = isNew? OO_Array_New : OO_Array_Delete; 2657 } else { 2658 Op = isNew? OO_New : OO_Delete; 2659 } 2660 break; 2661 } 2662 2663 #define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \ 2664 case tok::Token: \ 2665 SymbolLocations[SymbolIdx++] = ConsumeToken(); \ 2666 Op = OO_##Name; \ 2667 break; 2668 #define OVERLOADED_OPERATOR_MULTI(Name,Spelling,Unary,Binary,MemberOnly) 2669 #include "clang/Basic/OperatorKinds.def" 2670 2671 case tok::l_paren: { 2672 // Consume the '(' and ')'. 2673 BalancedDelimiterTracker T(*this, tok::l_paren); 2674 T.consumeOpen(); 2675 T.consumeClose(); 2676 if (T.getCloseLocation().isInvalid()) 2677 return true; 2678 2679 SymbolLocations[SymbolIdx++] = T.getOpenLocation(); 2680 SymbolLocations[SymbolIdx++] = T.getCloseLocation(); 2681 Op = OO_Call; 2682 break; 2683 } 2684 2685 case tok::l_square: { 2686 // Consume the '[' and ']'. 2687 BalancedDelimiterTracker T(*this, tok::l_square); 2688 T.consumeOpen(); 2689 T.consumeClose(); 2690 if (T.getCloseLocation().isInvalid()) 2691 return true; 2692 2693 SymbolLocations[SymbolIdx++] = T.getOpenLocation(); 2694 SymbolLocations[SymbolIdx++] = T.getCloseLocation(); 2695 Op = OO_Subscript; 2696 break; 2697 } 2698 2699 case tok::code_completion: { 2700 // Don't try to parse any further. 2701 cutOffParsing(); 2702 // Code completion for the operator name. 2703 Actions.CodeCompleteOperatorName(getCurScope()); 2704 return true; 2705 } 2706 2707 default: 2708 break; 2709 } 2710 2711 if (Op != OO_None) { 2712 // We have parsed an operator-function-id. 2713 Result.setOperatorFunctionId(KeywordLoc, Op, SymbolLocations); 2714 return false; 2715 } 2716 2717 // Parse a literal-operator-id. 2718 // 2719 // literal-operator-id: C++11 [over.literal] 2720 // operator string-literal identifier 2721 // operator user-defined-string-literal 2722 2723 if (getLangOpts().CPlusPlus11 && isTokenStringLiteral()) { 2724 Diag(Tok.getLocation(), diag::warn_cxx98_compat_literal_operator); 2725 2726 SourceLocation DiagLoc; 2727 unsigned DiagId = 0; 2728 2729 // We're past translation phase 6, so perform string literal concatenation 2730 // before checking for "". 2731 SmallVector<Token, 4> Toks; 2732 SmallVector<SourceLocation, 4> TokLocs; 2733 while (isTokenStringLiteral()) { 2734 if (!Tok.is(tok::string_literal) && !DiagId) { 2735 // C++11 [over.literal]p1: 2736 // The string-literal or user-defined-string-literal in a 2737 // literal-operator-id shall have no encoding-prefix [...]. 2738 DiagLoc = Tok.getLocation(); 2739 DiagId = diag::err_literal_operator_string_prefix; 2740 } 2741 Toks.push_back(Tok); 2742 TokLocs.push_back(ConsumeStringToken()); 2743 } 2744 2745 StringLiteralParser Literal(Toks, PP); 2746 if (Literal.hadError) 2747 return true; 2748 2749 // Grab the literal operator's suffix, which will be either the next token 2750 // or a ud-suffix from the string literal. 2751 bool IsUDSuffix = !Literal.getUDSuffix().empty(); 2752 IdentifierInfo *II = nullptr; 2753 SourceLocation SuffixLoc; 2754 if (IsUDSuffix) { 2755 II = &PP.getIdentifierTable().get(Literal.getUDSuffix()); 2756 SuffixLoc = 2757 Lexer::AdvanceToTokenCharacter(TokLocs[Literal.getUDSuffixToken()], 2758 Literal.getUDSuffixOffset(), 2759 PP.getSourceManager(), getLangOpts()); 2760 } else if (Tok.is(tok::identifier)) { 2761 II = Tok.getIdentifierInfo(); 2762 SuffixLoc = ConsumeToken(); 2763 TokLocs.push_back(SuffixLoc); 2764 } else { 2765 Diag(Tok.getLocation(), diag::err_expected) << tok::identifier; 2766 return true; 2767 } 2768 2769 // The string literal must be empty. 2770 if (!Literal.GetString().empty() || Literal.Pascal) { 2771 // C++11 [over.literal]p1: 2772 // The string-literal or user-defined-string-literal in a 2773 // literal-operator-id shall [...] contain no characters 2774 // other than the implicit terminating '\0'. 2775 DiagLoc = TokLocs.front(); 2776 DiagId = diag::err_literal_operator_string_not_empty; 2777 } 2778 2779 if (DiagId) { 2780 // This isn't a valid literal-operator-id, but we think we know 2781 // what the user meant. Tell them what they should have written. 2782 SmallString<32> Str; 2783 Str += "\"\""; 2784 Str += II->getName(); 2785 Diag(DiagLoc, DiagId) << FixItHint::CreateReplacement( 2786 SourceRange(TokLocs.front(), TokLocs.back()), Str); 2787 } 2788 2789 Result.setLiteralOperatorId(II, KeywordLoc, SuffixLoc); 2790 2791 return Actions.checkLiteralOperatorId(SS, Result, IsUDSuffix); 2792 } 2793 2794 // Parse a conversion-function-id. 2795 // 2796 // conversion-function-id: [C++ 12.3.2] 2797 // operator conversion-type-id 2798 // 2799 // conversion-type-id: 2800 // type-specifier-seq conversion-declarator[opt] 2801 // 2802 // conversion-declarator: 2803 // ptr-operator conversion-declarator[opt] 2804 2805 // Parse the type-specifier-seq. 2806 DeclSpec DS(AttrFactory); 2807 if (ParseCXXTypeSpecifierSeq( 2808 DS, DeclaratorContext::ConversionId)) // FIXME: ObjectType? 2809 return true; 2810 2811 // Parse the conversion-declarator, which is merely a sequence of 2812 // ptr-operators. 2813 Declarator D(DS, ParsedAttributesView::none(), 2814 DeclaratorContext::ConversionId); 2815 ParseDeclaratorInternal(D, /*DirectDeclParser=*/nullptr); 2816 2817 // Finish up the type. 2818 TypeResult Ty = Actions.ActOnTypeName(D); 2819 if (Ty.isInvalid()) 2820 return true; 2821 2822 // Note that this is a conversion-function-id. 2823 Result.setConversionFunctionId(KeywordLoc, Ty.get(), 2824 D.getSourceRange().getEnd()); 2825 return false; 2826 } 2827 2828 /// Parse a C++ unqualified-id (or a C identifier), which describes the 2829 /// name of an entity. 2830 /// 2831 /// \code 2832 /// unqualified-id: [C++ expr.prim.general] 2833 /// identifier 2834 /// operator-function-id 2835 /// conversion-function-id 2836 /// [C++0x] literal-operator-id [TODO] 2837 /// ~ class-name 2838 /// template-id 2839 /// 2840 /// \endcode 2841 /// 2842 /// \param SS The nested-name-specifier that preceded this unqualified-id. If 2843 /// non-empty, then we are parsing the unqualified-id of a qualified-id. 2844 /// 2845 /// \param ObjectType if this unqualified-id occurs within a member access 2846 /// expression, the type of the base object whose member is being accessed. 2847 /// 2848 /// \param ObjectHadErrors if this unqualified-id occurs within a member access 2849 /// expression, indicates whether the original subexpressions had any errors. 2850 /// When true, diagnostics for missing 'template' keyword will be supressed. 2851 /// 2852 /// \param EnteringContext whether we are entering the scope of the 2853 /// nested-name-specifier. 2854 /// 2855 /// \param AllowDestructorName whether we allow parsing of a destructor name. 2856 /// 2857 /// \param AllowConstructorName whether we allow parsing a constructor name. 2858 /// 2859 /// \param AllowDeductionGuide whether we allow parsing a deduction guide name. 2860 /// 2861 /// \param Result on a successful parse, contains the parsed unqualified-id. 2862 /// 2863 /// \returns true if parsing fails, false otherwise. 2864 bool Parser::ParseUnqualifiedId(CXXScopeSpec &SS, ParsedType ObjectType, 2865 bool ObjectHadErrors, bool EnteringContext, 2866 bool AllowDestructorName, 2867 bool AllowConstructorName, 2868 bool AllowDeductionGuide, 2869 SourceLocation *TemplateKWLoc, 2870 UnqualifiedId &Result) { 2871 if (TemplateKWLoc) 2872 *TemplateKWLoc = SourceLocation(); 2873 2874 // Handle 'A::template B'. This is for template-ids which have not 2875 // already been annotated by ParseOptionalCXXScopeSpecifier(). 2876 bool TemplateSpecified = false; 2877 if (Tok.is(tok::kw_template)) { 2878 if (TemplateKWLoc && (ObjectType || SS.isSet())) { 2879 TemplateSpecified = true; 2880 *TemplateKWLoc = ConsumeToken(); 2881 } else { 2882 SourceLocation TemplateLoc = ConsumeToken(); 2883 Diag(TemplateLoc, diag::err_unexpected_template_in_unqualified_id) 2884 << FixItHint::CreateRemoval(TemplateLoc); 2885 } 2886 } 2887 2888 // unqualified-id: 2889 // identifier 2890 // template-id (when it hasn't already been annotated) 2891 if (Tok.is(tok::identifier)) { 2892 ParseIdentifier: 2893 // Consume the identifier. 2894 IdentifierInfo *Id = Tok.getIdentifierInfo(); 2895 SourceLocation IdLoc = ConsumeToken(); 2896 2897 if (!getLangOpts().CPlusPlus) { 2898 // If we're not in C++, only identifiers matter. Record the 2899 // identifier and return. 2900 Result.setIdentifier(Id, IdLoc); 2901 return false; 2902 } 2903 2904 ParsedTemplateTy TemplateName; 2905 if (AllowConstructorName && 2906 Actions.isCurrentClassName(*Id, getCurScope(), &SS)) { 2907 // We have parsed a constructor name. 2908 ParsedType Ty = Actions.getConstructorName(*Id, IdLoc, getCurScope(), SS, 2909 EnteringContext); 2910 if (!Ty) 2911 return true; 2912 Result.setConstructorName(Ty, IdLoc, IdLoc); 2913 } else if (getLangOpts().CPlusPlus17 && AllowDeductionGuide && 2914 SS.isEmpty() && 2915 Actions.isDeductionGuideName(getCurScope(), *Id, IdLoc, SS, 2916 &TemplateName)) { 2917 // We have parsed a template-name naming a deduction guide. 2918 Result.setDeductionGuideName(TemplateName, IdLoc); 2919 } else { 2920 // We have parsed an identifier. 2921 Result.setIdentifier(Id, IdLoc); 2922 } 2923 2924 // If the next token is a '<', we may have a template. 2925 TemplateTy Template; 2926 if (Tok.is(tok::less)) 2927 return ParseUnqualifiedIdTemplateId( 2928 SS, ObjectType, ObjectHadErrors, 2929 TemplateKWLoc ? *TemplateKWLoc : SourceLocation(), Id, IdLoc, 2930 EnteringContext, Result, TemplateSpecified); 2931 else if (TemplateSpecified && 2932 Actions.ActOnTemplateName( 2933 getCurScope(), SS, *TemplateKWLoc, Result, ObjectType, 2934 EnteringContext, Template, 2935 /*AllowInjectedClassName*/ true) == TNK_Non_template) 2936 return true; 2937 2938 return false; 2939 } 2940 2941 // unqualified-id: 2942 // template-id (already parsed and annotated) 2943 if (Tok.is(tok::annot_template_id)) { 2944 TemplateIdAnnotation *TemplateId = takeTemplateIdAnnotation(Tok); 2945 2946 // FIXME: Consider passing invalid template-ids on to callers; they may 2947 // be able to recover better than we can. 2948 if (TemplateId->isInvalid()) { 2949 ConsumeAnnotationToken(); 2950 return true; 2951 } 2952 2953 // If the template-name names the current class, then this is a constructor 2954 if (AllowConstructorName && TemplateId->Name && 2955 Actions.isCurrentClassName(*TemplateId->Name, getCurScope(), &SS)) { 2956 if (SS.isSet()) { 2957 // C++ [class.qual]p2 specifies that a qualified template-name 2958 // is taken as the constructor name where a constructor can be 2959 // declared. Thus, the template arguments are extraneous, so 2960 // complain about them and remove them entirely. 2961 Diag(TemplateId->TemplateNameLoc, 2962 diag::err_out_of_line_constructor_template_id) 2963 << TemplateId->Name 2964 << FixItHint::CreateRemoval( 2965 SourceRange(TemplateId->LAngleLoc, TemplateId->RAngleLoc)); 2966 ParsedType Ty = Actions.getConstructorName( 2967 *TemplateId->Name, TemplateId->TemplateNameLoc, getCurScope(), SS, 2968 EnteringContext); 2969 if (!Ty) 2970 return true; 2971 Result.setConstructorName(Ty, TemplateId->TemplateNameLoc, 2972 TemplateId->RAngleLoc); 2973 ConsumeAnnotationToken(); 2974 return false; 2975 } 2976 2977 Result.setConstructorTemplateId(TemplateId); 2978 ConsumeAnnotationToken(); 2979 return false; 2980 } 2981 2982 // We have already parsed a template-id; consume the annotation token as 2983 // our unqualified-id. 2984 Result.setTemplateId(TemplateId); 2985 SourceLocation TemplateLoc = TemplateId->TemplateKWLoc; 2986 if (TemplateLoc.isValid()) { 2987 if (TemplateKWLoc && (ObjectType || SS.isSet())) 2988 *TemplateKWLoc = TemplateLoc; 2989 else 2990 Diag(TemplateLoc, diag::err_unexpected_template_in_unqualified_id) 2991 << FixItHint::CreateRemoval(TemplateLoc); 2992 } 2993 ConsumeAnnotationToken(); 2994 return false; 2995 } 2996 2997 // unqualified-id: 2998 // operator-function-id 2999 // conversion-function-id 3000 if (Tok.is(tok::kw_operator)) { 3001 if (ParseUnqualifiedIdOperator(SS, EnteringContext, ObjectType, Result)) 3002 return true; 3003 3004 // If we have an operator-function-id or a literal-operator-id and the next 3005 // token is a '<', we may have a 3006 // 3007 // template-id: 3008 // operator-function-id < template-argument-list[opt] > 3009 TemplateTy Template; 3010 if ((Result.getKind() == UnqualifiedIdKind::IK_OperatorFunctionId || 3011 Result.getKind() == UnqualifiedIdKind::IK_LiteralOperatorId) && 3012 Tok.is(tok::less)) 3013 return ParseUnqualifiedIdTemplateId( 3014 SS, ObjectType, ObjectHadErrors, 3015 TemplateKWLoc ? *TemplateKWLoc : SourceLocation(), nullptr, 3016 SourceLocation(), EnteringContext, Result, TemplateSpecified); 3017 else if (TemplateSpecified && 3018 Actions.ActOnTemplateName( 3019 getCurScope(), SS, *TemplateKWLoc, Result, ObjectType, 3020 EnteringContext, Template, 3021 /*AllowInjectedClassName*/ true) == TNK_Non_template) 3022 return true; 3023 3024 return false; 3025 } 3026 3027 if (getLangOpts().CPlusPlus && 3028 (AllowDestructorName || SS.isSet()) && Tok.is(tok::tilde)) { 3029 // C++ [expr.unary.op]p10: 3030 // There is an ambiguity in the unary-expression ~X(), where X is a 3031 // class-name. The ambiguity is resolved in favor of treating ~ as a 3032 // unary complement rather than treating ~X as referring to a destructor. 3033 3034 // Parse the '~'. 3035 SourceLocation TildeLoc = ConsumeToken(); 3036 3037 if (TemplateSpecified) { 3038 // C++ [temp.names]p3: 3039 // A name prefixed by the keyword template shall be a template-id [...] 3040 // 3041 // A template-id cannot begin with a '~' token. This would never work 3042 // anyway: x.~A<int>() would specify that the destructor is a template, 3043 // not that 'A' is a template. 3044 // 3045 // FIXME: Suggest replacing the attempted destructor name with a correct 3046 // destructor name and recover. (This is not trivial if this would become 3047 // a pseudo-destructor name). 3048 Diag(*TemplateKWLoc, diag::err_unexpected_template_in_destructor_name) 3049 << Tok.getLocation(); 3050 return true; 3051 } 3052 3053 if (SS.isEmpty() && Tok.is(tok::kw_decltype)) { 3054 DeclSpec DS(AttrFactory); 3055 SourceLocation EndLoc = ParseDecltypeSpecifier(DS); 3056 if (ParsedType Type = 3057 Actions.getDestructorTypeForDecltype(DS, ObjectType)) { 3058 Result.setDestructorName(TildeLoc, Type, EndLoc); 3059 return false; 3060 } 3061 return true; 3062 } 3063 3064 // Parse the class-name. 3065 if (Tok.isNot(tok::identifier)) { 3066 Diag(Tok, diag::err_destructor_tilde_identifier); 3067 return true; 3068 } 3069 3070 // If the user wrote ~T::T, correct it to T::~T. 3071 DeclaratorScopeObj DeclScopeObj(*this, SS); 3072 if (NextToken().is(tok::coloncolon)) { 3073 // Don't let ParseOptionalCXXScopeSpecifier() "correct" 3074 // `int A; struct { ~A::A(); };` to `int A; struct { ~A:A(); };`, 3075 // it will confuse this recovery logic. 3076 ColonProtectionRAIIObject ColonRAII(*this, false); 3077 3078 if (SS.isSet()) { 3079 AnnotateScopeToken(SS, /*NewAnnotation*/true); 3080 SS.clear(); 3081 } 3082 if (ParseOptionalCXXScopeSpecifier(SS, ObjectType, ObjectHadErrors, 3083 EnteringContext)) 3084 return true; 3085 if (SS.isNotEmpty()) 3086 ObjectType = nullptr; 3087 if (Tok.isNot(tok::identifier) || NextToken().is(tok::coloncolon) || 3088 !SS.isSet()) { 3089 Diag(TildeLoc, diag::err_destructor_tilde_scope); 3090 return true; 3091 } 3092 3093 // Recover as if the tilde had been written before the identifier. 3094 Diag(TildeLoc, diag::err_destructor_tilde_scope) 3095 << FixItHint::CreateRemoval(TildeLoc) 3096 << FixItHint::CreateInsertion(Tok.getLocation(), "~"); 3097 3098 // Temporarily enter the scope for the rest of this function. 3099 if (Actions.ShouldEnterDeclaratorScope(getCurScope(), SS)) 3100 DeclScopeObj.EnterDeclaratorScope(); 3101 } 3102 3103 // Parse the class-name (or template-name in a simple-template-id). 3104 IdentifierInfo *ClassName = Tok.getIdentifierInfo(); 3105 SourceLocation ClassNameLoc = ConsumeToken(); 3106 3107 if (Tok.is(tok::less)) { 3108 Result.setDestructorName(TildeLoc, nullptr, ClassNameLoc); 3109 return ParseUnqualifiedIdTemplateId( 3110 SS, ObjectType, ObjectHadErrors, 3111 TemplateKWLoc ? *TemplateKWLoc : SourceLocation(), ClassName, 3112 ClassNameLoc, EnteringContext, Result, TemplateSpecified); 3113 } 3114 3115 // Note that this is a destructor name. 3116 ParsedType Ty = 3117 Actions.getDestructorName(*ClassName, ClassNameLoc, getCurScope(), SS, 3118 ObjectType, EnteringContext); 3119 if (!Ty) 3120 return true; 3121 3122 Result.setDestructorName(TildeLoc, Ty, ClassNameLoc); 3123 return false; 3124 } 3125 3126 switch (Tok.getKind()) { 3127 #define TRANSFORM_TYPE_TRAIT_DEF(_, Trait) case tok::kw___##Trait: 3128 #include "clang/Basic/TransformTypeTraits.def" 3129 if (!NextToken().is(tok::l_paren)) { 3130 Tok.setKind(tok::identifier); 3131 Diag(Tok, diag::ext_keyword_as_ident) 3132 << Tok.getIdentifierInfo()->getName() << 0; 3133 goto ParseIdentifier; 3134 } 3135 [[fallthrough]]; 3136 default: 3137 Diag(Tok, diag::err_expected_unqualified_id) << getLangOpts().CPlusPlus; 3138 return true; 3139 } 3140 } 3141 3142 /// ParseCXXNewExpression - Parse a C++ new-expression. New is used to allocate 3143 /// memory in a typesafe manner and call constructors. 3144 /// 3145 /// This method is called to parse the new expression after the optional :: has 3146 /// been already parsed. If the :: was present, "UseGlobal" is true and "Start" 3147 /// is its location. Otherwise, "Start" is the location of the 'new' token. 3148 /// 3149 /// new-expression: 3150 /// '::'[opt] 'new' new-placement[opt] new-type-id 3151 /// new-initializer[opt] 3152 /// '::'[opt] 'new' new-placement[opt] '(' type-id ')' 3153 /// new-initializer[opt] 3154 /// 3155 /// new-placement: 3156 /// '(' expression-list ')' 3157 /// 3158 /// new-type-id: 3159 /// type-specifier-seq new-declarator[opt] 3160 /// [GNU] attributes type-specifier-seq new-declarator[opt] 3161 /// 3162 /// new-declarator: 3163 /// ptr-operator new-declarator[opt] 3164 /// direct-new-declarator 3165 /// 3166 /// new-initializer: 3167 /// '(' expression-list[opt] ')' 3168 /// [C++0x] braced-init-list 3169 /// 3170 ExprResult 3171 Parser::ParseCXXNewExpression(bool UseGlobal, SourceLocation Start) { 3172 assert(Tok.is(tok::kw_new) && "expected 'new' token"); 3173 ConsumeToken(); // Consume 'new' 3174 3175 // A '(' now can be a new-placement or the '(' wrapping the type-id in the 3176 // second form of new-expression. It can't be a new-type-id. 3177 3178 ExprVector PlacementArgs; 3179 SourceLocation PlacementLParen, PlacementRParen; 3180 3181 SourceRange TypeIdParens; 3182 DeclSpec DS(AttrFactory); 3183 Declarator DeclaratorInfo(DS, ParsedAttributesView::none(), 3184 DeclaratorContext::CXXNew); 3185 if (Tok.is(tok::l_paren)) { 3186 // If it turns out to be a placement, we change the type location. 3187 BalancedDelimiterTracker T(*this, tok::l_paren); 3188 T.consumeOpen(); 3189 PlacementLParen = T.getOpenLocation(); 3190 if (ParseExpressionListOrTypeId(PlacementArgs, DeclaratorInfo)) { 3191 SkipUntil(tok::semi, StopAtSemi | StopBeforeMatch); 3192 return ExprError(); 3193 } 3194 3195 T.consumeClose(); 3196 PlacementRParen = T.getCloseLocation(); 3197 if (PlacementRParen.isInvalid()) { 3198 SkipUntil(tok::semi, StopAtSemi | StopBeforeMatch); 3199 return ExprError(); 3200 } 3201 3202 if (PlacementArgs.empty()) { 3203 // Reset the placement locations. There was no placement. 3204 TypeIdParens = T.getRange(); 3205 PlacementLParen = PlacementRParen = SourceLocation(); 3206 } else { 3207 // We still need the type. 3208 if (Tok.is(tok::l_paren)) { 3209 BalancedDelimiterTracker T(*this, tok::l_paren); 3210 T.consumeOpen(); 3211 MaybeParseGNUAttributes(DeclaratorInfo); 3212 ParseSpecifierQualifierList(DS); 3213 DeclaratorInfo.SetSourceRange(DS.getSourceRange()); 3214 ParseDeclarator(DeclaratorInfo); 3215 T.consumeClose(); 3216 TypeIdParens = T.getRange(); 3217 } else { 3218 MaybeParseGNUAttributes(DeclaratorInfo); 3219 if (ParseCXXTypeSpecifierSeq(DS)) 3220 DeclaratorInfo.setInvalidType(true); 3221 else { 3222 DeclaratorInfo.SetSourceRange(DS.getSourceRange()); 3223 ParseDeclaratorInternal(DeclaratorInfo, 3224 &Parser::ParseDirectNewDeclarator); 3225 } 3226 } 3227 } 3228 } else { 3229 // A new-type-id is a simplified type-id, where essentially the 3230 // direct-declarator is replaced by a direct-new-declarator. 3231 MaybeParseGNUAttributes(DeclaratorInfo); 3232 if (ParseCXXTypeSpecifierSeq(DS, DeclaratorContext::CXXNew)) 3233 DeclaratorInfo.setInvalidType(true); 3234 else { 3235 DeclaratorInfo.SetSourceRange(DS.getSourceRange()); 3236 ParseDeclaratorInternal(DeclaratorInfo, 3237 &Parser::ParseDirectNewDeclarator); 3238 } 3239 } 3240 if (DeclaratorInfo.isInvalidType()) { 3241 SkipUntil(tok::semi, StopAtSemi | StopBeforeMatch); 3242 return ExprError(); 3243 } 3244 3245 ExprResult Initializer; 3246 3247 if (Tok.is(tok::l_paren)) { 3248 SourceLocation ConstructorLParen, ConstructorRParen; 3249 ExprVector ConstructorArgs; 3250 BalancedDelimiterTracker T(*this, tok::l_paren); 3251 T.consumeOpen(); 3252 ConstructorLParen = T.getOpenLocation(); 3253 if (Tok.isNot(tok::r_paren)) { 3254 auto RunSignatureHelp = [&]() { 3255 ParsedType TypeRep = Actions.ActOnTypeName(DeclaratorInfo).get(); 3256 QualType PreferredType; 3257 // ActOnTypeName might adjust DeclaratorInfo and return a null type even 3258 // the passing DeclaratorInfo is valid, e.g. running SignatureHelp on 3259 // `new decltype(invalid) (^)`. 3260 if (TypeRep) 3261 PreferredType = Actions.ProduceConstructorSignatureHelp( 3262 TypeRep.get()->getCanonicalTypeInternal(), 3263 DeclaratorInfo.getEndLoc(), ConstructorArgs, ConstructorLParen, 3264 /*Braced=*/false); 3265 CalledSignatureHelp = true; 3266 return PreferredType; 3267 }; 3268 if (ParseExpressionList(ConstructorArgs, [&] { 3269 PreferredType.enterFunctionArgument(Tok.getLocation(), 3270 RunSignatureHelp); 3271 })) { 3272 if (PP.isCodeCompletionReached() && !CalledSignatureHelp) 3273 RunSignatureHelp(); 3274 SkipUntil(tok::semi, StopAtSemi | StopBeforeMatch); 3275 return ExprError(); 3276 } 3277 } 3278 T.consumeClose(); 3279 ConstructorRParen = T.getCloseLocation(); 3280 if (ConstructorRParen.isInvalid()) { 3281 SkipUntil(tok::semi, StopAtSemi | StopBeforeMatch); 3282 return ExprError(); 3283 } 3284 Initializer = Actions.ActOnParenListExpr(ConstructorLParen, 3285 ConstructorRParen, 3286 ConstructorArgs); 3287 } else if (Tok.is(tok::l_brace) && getLangOpts().CPlusPlus11) { 3288 Diag(Tok.getLocation(), 3289 diag::warn_cxx98_compat_generalized_initializer_lists); 3290 Initializer = ParseBraceInitializer(); 3291 } 3292 if (Initializer.isInvalid()) 3293 return Initializer; 3294 3295 return Actions.ActOnCXXNew(Start, UseGlobal, PlacementLParen, 3296 PlacementArgs, PlacementRParen, 3297 TypeIdParens, DeclaratorInfo, Initializer.get()); 3298 } 3299 3300 /// ParseDirectNewDeclarator - Parses a direct-new-declarator. Intended to be 3301 /// passed to ParseDeclaratorInternal. 3302 /// 3303 /// direct-new-declarator: 3304 /// '[' expression[opt] ']' 3305 /// direct-new-declarator '[' constant-expression ']' 3306 /// 3307 void Parser::ParseDirectNewDeclarator(Declarator &D) { 3308 // Parse the array dimensions. 3309 bool First = true; 3310 while (Tok.is(tok::l_square)) { 3311 // An array-size expression can't start with a lambda. 3312 if (CheckProhibitedCXX11Attribute()) 3313 continue; 3314 3315 BalancedDelimiterTracker T(*this, tok::l_square); 3316 T.consumeOpen(); 3317 3318 ExprResult Size = 3319 First ? (Tok.is(tok::r_square) ? ExprResult() : ParseExpression()) 3320 : ParseConstantExpression(); 3321 if (Size.isInvalid()) { 3322 // Recover 3323 SkipUntil(tok::r_square, StopAtSemi); 3324 return; 3325 } 3326 First = false; 3327 3328 T.consumeClose(); 3329 3330 // Attributes here appertain to the array type. C++11 [expr.new]p5. 3331 ParsedAttributes Attrs(AttrFactory); 3332 MaybeParseCXX11Attributes(Attrs); 3333 3334 D.AddTypeInfo(DeclaratorChunk::getArray(0, 3335 /*isStatic=*/false, /*isStar=*/false, 3336 Size.get(), T.getOpenLocation(), 3337 T.getCloseLocation()), 3338 std::move(Attrs), T.getCloseLocation()); 3339 3340 if (T.getCloseLocation().isInvalid()) 3341 return; 3342 } 3343 } 3344 3345 /// ParseExpressionListOrTypeId - Parse either an expression-list or a type-id. 3346 /// This ambiguity appears in the syntax of the C++ new operator. 3347 /// 3348 /// new-expression: 3349 /// '::'[opt] 'new' new-placement[opt] '(' type-id ')' 3350 /// new-initializer[opt] 3351 /// 3352 /// new-placement: 3353 /// '(' expression-list ')' 3354 /// 3355 bool Parser::ParseExpressionListOrTypeId( 3356 SmallVectorImpl<Expr*> &PlacementArgs, 3357 Declarator &D) { 3358 // The '(' was already consumed. 3359 if (isTypeIdInParens()) { 3360 ParseSpecifierQualifierList(D.getMutableDeclSpec()); 3361 D.SetSourceRange(D.getDeclSpec().getSourceRange()); 3362 ParseDeclarator(D); 3363 return D.isInvalidType(); 3364 } 3365 3366 // It's not a type, it has to be an expression list. 3367 return ParseExpressionList(PlacementArgs); 3368 } 3369 3370 /// ParseCXXDeleteExpression - Parse a C++ delete-expression. Delete is used 3371 /// to free memory allocated by new. 3372 /// 3373 /// This method is called to parse the 'delete' expression after the optional 3374 /// '::' has been already parsed. If the '::' was present, "UseGlobal" is true 3375 /// and "Start" is its location. Otherwise, "Start" is the location of the 3376 /// 'delete' token. 3377 /// 3378 /// delete-expression: 3379 /// '::'[opt] 'delete' cast-expression 3380 /// '::'[opt] 'delete' '[' ']' cast-expression 3381 ExprResult 3382 Parser::ParseCXXDeleteExpression(bool UseGlobal, SourceLocation Start) { 3383 assert(Tok.is(tok::kw_delete) && "Expected 'delete' keyword"); 3384 ConsumeToken(); // Consume 'delete' 3385 3386 // Array delete? 3387 bool ArrayDelete = false; 3388 if (Tok.is(tok::l_square) && NextToken().is(tok::r_square)) { 3389 // C++11 [expr.delete]p1: 3390 // Whenever the delete keyword is followed by empty square brackets, it 3391 // shall be interpreted as [array delete]. 3392 // [Footnote: A lambda expression with a lambda-introducer that consists 3393 // of empty square brackets can follow the delete keyword if 3394 // the lambda expression is enclosed in parentheses.] 3395 3396 const Token Next = GetLookAheadToken(2); 3397 3398 // Basic lookahead to check if we have a lambda expression. 3399 if (Next.isOneOf(tok::l_brace, tok::less) || 3400 (Next.is(tok::l_paren) && 3401 (GetLookAheadToken(3).is(tok::r_paren) || 3402 (GetLookAheadToken(3).is(tok::identifier) && 3403 GetLookAheadToken(4).is(tok::identifier))))) { 3404 TentativeParsingAction TPA(*this); 3405 SourceLocation LSquareLoc = Tok.getLocation(); 3406 SourceLocation RSquareLoc = NextToken().getLocation(); 3407 3408 // SkipUntil can't skip pairs of </*...*/>; don't emit a FixIt in this 3409 // case. 3410 SkipUntil({tok::l_brace, tok::less}, StopBeforeMatch); 3411 SourceLocation RBraceLoc; 3412 bool EmitFixIt = false; 3413 if (Tok.is(tok::l_brace)) { 3414 ConsumeBrace(); 3415 SkipUntil(tok::r_brace, StopBeforeMatch); 3416 RBraceLoc = Tok.getLocation(); 3417 EmitFixIt = true; 3418 } 3419 3420 TPA.Revert(); 3421 3422 if (EmitFixIt) 3423 Diag(Start, diag::err_lambda_after_delete) 3424 << SourceRange(Start, RSquareLoc) 3425 << FixItHint::CreateInsertion(LSquareLoc, "(") 3426 << FixItHint::CreateInsertion( 3427 Lexer::getLocForEndOfToken( 3428 RBraceLoc, 0, Actions.getSourceManager(), getLangOpts()), 3429 ")"); 3430 else 3431 Diag(Start, diag::err_lambda_after_delete) 3432 << SourceRange(Start, RSquareLoc); 3433 3434 // Warn that the non-capturing lambda isn't surrounded by parentheses 3435 // to disambiguate it from 'delete[]'. 3436 ExprResult Lambda = ParseLambdaExpression(); 3437 if (Lambda.isInvalid()) 3438 return ExprError(); 3439 3440 // Evaluate any postfix expressions used on the lambda. 3441 Lambda = ParsePostfixExpressionSuffix(Lambda); 3442 if (Lambda.isInvalid()) 3443 return ExprError(); 3444 return Actions.ActOnCXXDelete(Start, UseGlobal, /*ArrayForm=*/false, 3445 Lambda.get()); 3446 } 3447 3448 ArrayDelete = true; 3449 BalancedDelimiterTracker T(*this, tok::l_square); 3450 3451 T.consumeOpen(); 3452 T.consumeClose(); 3453 if (T.getCloseLocation().isInvalid()) 3454 return ExprError(); 3455 } 3456 3457 ExprResult Operand(ParseCastExpression(AnyCastExpr)); 3458 if (Operand.isInvalid()) 3459 return Operand; 3460 3461 return Actions.ActOnCXXDelete(Start, UseGlobal, ArrayDelete, Operand.get()); 3462 } 3463 3464 /// ParseRequiresExpression - Parse a C++2a requires-expression. 3465 /// C++2a [expr.prim.req]p1 3466 /// A requires-expression provides a concise way to express requirements on 3467 /// template arguments. A requirement is one that can be checked by name 3468 /// lookup (6.4) or by checking properties of types and expressions. 3469 /// 3470 /// requires-expression: 3471 /// 'requires' requirement-parameter-list[opt] requirement-body 3472 /// 3473 /// requirement-parameter-list: 3474 /// '(' parameter-declaration-clause[opt] ')' 3475 /// 3476 /// requirement-body: 3477 /// '{' requirement-seq '}' 3478 /// 3479 /// requirement-seq: 3480 /// requirement 3481 /// requirement-seq requirement 3482 /// 3483 /// requirement: 3484 /// simple-requirement 3485 /// type-requirement 3486 /// compound-requirement 3487 /// nested-requirement 3488 ExprResult Parser::ParseRequiresExpression() { 3489 assert(Tok.is(tok::kw_requires) && "Expected 'requires' keyword"); 3490 SourceLocation RequiresKWLoc = ConsumeToken(); // Consume 'requires' 3491 3492 llvm::SmallVector<ParmVarDecl *, 2> LocalParameterDecls; 3493 BalancedDelimiterTracker Parens(*this, tok::l_paren); 3494 if (Tok.is(tok::l_paren)) { 3495 // requirement parameter list is present. 3496 ParseScope LocalParametersScope(this, Scope::FunctionPrototypeScope | 3497 Scope::DeclScope); 3498 Parens.consumeOpen(); 3499 if (!Tok.is(tok::r_paren)) { 3500 ParsedAttributes FirstArgAttrs(getAttrFactory()); 3501 SourceLocation EllipsisLoc; 3502 llvm::SmallVector<DeclaratorChunk::ParamInfo, 2> LocalParameters; 3503 ParseParameterDeclarationClause(DeclaratorContext::RequiresExpr, 3504 FirstArgAttrs, LocalParameters, 3505 EllipsisLoc); 3506 if (EllipsisLoc.isValid()) 3507 Diag(EllipsisLoc, diag::err_requires_expr_parameter_list_ellipsis); 3508 for (auto &ParamInfo : LocalParameters) 3509 LocalParameterDecls.push_back(cast<ParmVarDecl>(ParamInfo.Param)); 3510 } 3511 Parens.consumeClose(); 3512 } 3513 3514 BalancedDelimiterTracker Braces(*this, tok::l_brace); 3515 if (Braces.expectAndConsume()) 3516 return ExprError(); 3517 3518 // Start of requirement list 3519 llvm::SmallVector<concepts::Requirement *, 2> Requirements; 3520 3521 // C++2a [expr.prim.req]p2 3522 // Expressions appearing within a requirement-body are unevaluated operands. 3523 EnterExpressionEvaluationContext Ctx( 3524 Actions, Sema::ExpressionEvaluationContext::Unevaluated); 3525 3526 ParseScope BodyScope(this, Scope::DeclScope); 3527 // Create a separate diagnostic pool for RequiresExprBodyDecl. 3528 // Dependent diagnostics are attached to this Decl and non-depenedent 3529 // diagnostics are surfaced after this parse. 3530 ParsingDeclRAIIObject ParsingBodyDecl(*this, ParsingDeclRAIIObject::NoParent); 3531 RequiresExprBodyDecl *Body = Actions.ActOnStartRequiresExpr( 3532 RequiresKWLoc, LocalParameterDecls, getCurScope()); 3533 3534 if (Tok.is(tok::r_brace)) { 3535 // Grammar does not allow an empty body. 3536 // requirement-body: 3537 // { requirement-seq } 3538 // requirement-seq: 3539 // requirement 3540 // requirement-seq requirement 3541 Diag(Tok, diag::err_empty_requires_expr); 3542 // Continue anyway and produce a requires expr with no requirements. 3543 } else { 3544 while (!Tok.is(tok::r_brace)) { 3545 switch (Tok.getKind()) { 3546 case tok::l_brace: { 3547 // Compound requirement 3548 // C++ [expr.prim.req.compound] 3549 // compound-requirement: 3550 // '{' expression '}' 'noexcept'[opt] 3551 // return-type-requirement[opt] ';' 3552 // return-type-requirement: 3553 // trailing-return-type 3554 // '->' cv-qualifier-seq[opt] constrained-parameter 3555 // cv-qualifier-seq[opt] abstract-declarator[opt] 3556 BalancedDelimiterTracker ExprBraces(*this, tok::l_brace); 3557 ExprBraces.consumeOpen(); 3558 ExprResult Expression = 3559 Actions.CorrectDelayedTyposInExpr(ParseExpression()); 3560 if (!Expression.isUsable()) { 3561 ExprBraces.skipToEnd(); 3562 SkipUntil(tok::semi, tok::r_brace, SkipUntilFlags::StopBeforeMatch); 3563 break; 3564 } 3565 if (ExprBraces.consumeClose()) 3566 ExprBraces.skipToEnd(); 3567 3568 concepts::Requirement *Req = nullptr; 3569 SourceLocation NoexceptLoc; 3570 TryConsumeToken(tok::kw_noexcept, NoexceptLoc); 3571 if (Tok.is(tok::semi)) { 3572 Req = Actions.ActOnCompoundRequirement(Expression.get(), NoexceptLoc); 3573 if (Req) 3574 Requirements.push_back(Req); 3575 break; 3576 } 3577 if (!TryConsumeToken(tok::arrow)) 3578 // User probably forgot the arrow, remind them and try to continue. 3579 Diag(Tok, diag::err_requires_expr_missing_arrow) 3580 << FixItHint::CreateInsertion(Tok.getLocation(), "->"); 3581 // Try to parse a 'type-constraint' 3582 if (TryAnnotateTypeConstraint()) { 3583 SkipUntil(tok::semi, tok::r_brace, SkipUntilFlags::StopBeforeMatch); 3584 break; 3585 } 3586 if (!isTypeConstraintAnnotation()) { 3587 Diag(Tok, diag::err_requires_expr_expected_type_constraint); 3588 SkipUntil(tok::semi, tok::r_brace, SkipUntilFlags::StopBeforeMatch); 3589 break; 3590 } 3591 CXXScopeSpec SS; 3592 if (Tok.is(tok::annot_cxxscope)) { 3593 Actions.RestoreNestedNameSpecifierAnnotation(Tok.getAnnotationValue(), 3594 Tok.getAnnotationRange(), 3595 SS); 3596 ConsumeAnnotationToken(); 3597 } 3598 3599 Req = Actions.ActOnCompoundRequirement( 3600 Expression.get(), NoexceptLoc, SS, takeTemplateIdAnnotation(Tok), 3601 TemplateParameterDepth); 3602 ConsumeAnnotationToken(); 3603 if (Req) 3604 Requirements.push_back(Req); 3605 break; 3606 } 3607 default: { 3608 bool PossibleRequiresExprInSimpleRequirement = false; 3609 if (Tok.is(tok::kw_requires)) { 3610 auto IsNestedRequirement = [&] { 3611 RevertingTentativeParsingAction TPA(*this); 3612 ConsumeToken(); // 'requires' 3613 if (Tok.is(tok::l_brace)) 3614 // This is a requires expression 3615 // requires (T t) { 3616 // requires { t++; }; 3617 // ... ^ 3618 // } 3619 return false; 3620 if (Tok.is(tok::l_paren)) { 3621 // This might be the parameter list of a requires expression 3622 ConsumeParen(); 3623 auto Res = TryParseParameterDeclarationClause(); 3624 if (Res != TPResult::False) { 3625 // Skip to the closing parenthesis 3626 unsigned Depth = 1; 3627 while (Depth != 0) { 3628 bool FoundParen = SkipUntil(tok::l_paren, tok::r_paren, 3629 SkipUntilFlags::StopBeforeMatch); 3630 if (!FoundParen) 3631 break; 3632 if (Tok.is(tok::l_paren)) 3633 Depth++; 3634 else if (Tok.is(tok::r_paren)) 3635 Depth--; 3636 ConsumeAnyToken(); 3637 } 3638 // requires (T t) { 3639 // requires () ? 3640 // ... ^ 3641 // - OR - 3642 // requires (int x) ? 3643 // ... ^ 3644 // } 3645 if (Tok.is(tok::l_brace)) 3646 // requires (...) { 3647 // ^ - a requires expression as a 3648 // simple-requirement. 3649 return false; 3650 } 3651 } 3652 return true; 3653 }; 3654 if (IsNestedRequirement()) { 3655 ConsumeToken(); 3656 // Nested requirement 3657 // C++ [expr.prim.req.nested] 3658 // nested-requirement: 3659 // 'requires' constraint-expression ';' 3660 ExprResult ConstraintExpr = 3661 Actions.CorrectDelayedTyposInExpr(ParseConstraintExpression()); 3662 if (ConstraintExpr.isInvalid() || !ConstraintExpr.isUsable()) { 3663 SkipUntil(tok::semi, tok::r_brace, 3664 SkipUntilFlags::StopBeforeMatch); 3665 break; 3666 } 3667 if (auto *Req = 3668 Actions.ActOnNestedRequirement(ConstraintExpr.get())) 3669 Requirements.push_back(Req); 3670 else { 3671 SkipUntil(tok::semi, tok::r_brace, 3672 SkipUntilFlags::StopBeforeMatch); 3673 break; 3674 } 3675 break; 3676 } else 3677 PossibleRequiresExprInSimpleRequirement = true; 3678 } else if (Tok.is(tok::kw_typename)) { 3679 // This might be 'typename T::value_type;' (a type requirement) or 3680 // 'typename T::value_type{};' (a simple requirement). 3681 TentativeParsingAction TPA(*this); 3682 3683 // We need to consume the typename to allow 'requires { typename a; }' 3684 SourceLocation TypenameKWLoc = ConsumeToken(); 3685 if (TryAnnotateOptionalCXXScopeToken()) { 3686 TPA.Commit(); 3687 SkipUntil(tok::semi, tok::r_brace, SkipUntilFlags::StopBeforeMatch); 3688 break; 3689 } 3690 CXXScopeSpec SS; 3691 if (Tok.is(tok::annot_cxxscope)) { 3692 Actions.RestoreNestedNameSpecifierAnnotation( 3693 Tok.getAnnotationValue(), Tok.getAnnotationRange(), SS); 3694 ConsumeAnnotationToken(); 3695 } 3696 3697 if (Tok.isOneOf(tok::identifier, tok::annot_template_id) && 3698 !NextToken().isOneOf(tok::l_brace, tok::l_paren)) { 3699 TPA.Commit(); 3700 SourceLocation NameLoc = Tok.getLocation(); 3701 IdentifierInfo *II = nullptr; 3702 TemplateIdAnnotation *TemplateId = nullptr; 3703 if (Tok.is(tok::identifier)) { 3704 II = Tok.getIdentifierInfo(); 3705 ConsumeToken(); 3706 } else { 3707 TemplateId = takeTemplateIdAnnotation(Tok); 3708 ConsumeAnnotationToken(); 3709 if (TemplateId->isInvalid()) 3710 break; 3711 } 3712 3713 if (auto *Req = Actions.ActOnTypeRequirement(TypenameKWLoc, SS, 3714 NameLoc, II, 3715 TemplateId)) { 3716 Requirements.push_back(Req); 3717 } 3718 break; 3719 } 3720 TPA.Revert(); 3721 } 3722 // Simple requirement 3723 // C++ [expr.prim.req.simple] 3724 // simple-requirement: 3725 // expression ';' 3726 SourceLocation StartLoc = Tok.getLocation(); 3727 ExprResult Expression = 3728 Actions.CorrectDelayedTyposInExpr(ParseExpression()); 3729 if (!Expression.isUsable()) { 3730 SkipUntil(tok::semi, tok::r_brace, SkipUntilFlags::StopBeforeMatch); 3731 break; 3732 } 3733 if (!Expression.isInvalid() && PossibleRequiresExprInSimpleRequirement) 3734 Diag(StartLoc, diag::err_requires_expr_in_simple_requirement) 3735 << FixItHint::CreateInsertion(StartLoc, "requires"); 3736 if (auto *Req = Actions.ActOnSimpleRequirement(Expression.get())) 3737 Requirements.push_back(Req); 3738 else { 3739 SkipUntil(tok::semi, tok::r_brace, SkipUntilFlags::StopBeforeMatch); 3740 break; 3741 } 3742 // User may have tried to put some compound requirement stuff here 3743 if (Tok.is(tok::kw_noexcept)) { 3744 Diag(Tok, diag::err_requires_expr_simple_requirement_noexcept) 3745 << FixItHint::CreateInsertion(StartLoc, "{") 3746 << FixItHint::CreateInsertion(Tok.getLocation(), "}"); 3747 SkipUntil(tok::semi, tok::r_brace, SkipUntilFlags::StopBeforeMatch); 3748 break; 3749 } 3750 break; 3751 } 3752 } 3753 if (ExpectAndConsumeSemi(diag::err_expected_semi_requirement)) { 3754 SkipUntil(tok::semi, tok::r_brace, SkipUntilFlags::StopBeforeMatch); 3755 TryConsumeToken(tok::semi); 3756 break; 3757 } 3758 } 3759 if (Requirements.empty()) { 3760 // Don't emit an empty requires expr here to avoid confusing the user with 3761 // other diagnostics quoting an empty requires expression they never 3762 // wrote. 3763 Braces.consumeClose(); 3764 Actions.ActOnFinishRequiresExpr(); 3765 return ExprError(); 3766 } 3767 } 3768 Braces.consumeClose(); 3769 Actions.ActOnFinishRequiresExpr(); 3770 ParsingBodyDecl.complete(Body); 3771 return Actions.ActOnRequiresExpr( 3772 RequiresKWLoc, Body, Parens.getOpenLocation(), LocalParameterDecls, 3773 Parens.getCloseLocation(), 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(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