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