1 //===--- ParseDeclCXX.cpp - C++ Declaration Parsing -------------*- C++ -*-===// 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 C++ Declaration portions of the Parser interfaces. 10 // 11 //===----------------------------------------------------------------------===// 12 13 #include "clang/AST/ASTContext.h" 14 #include "clang/AST/DeclTemplate.h" 15 #include "clang/AST/PrettyDeclStackTrace.h" 16 #include "clang/Basic/AttributeCommonInfo.h" 17 #include "clang/Basic/Attributes.h" 18 #include "clang/Basic/CharInfo.h" 19 #include "clang/Basic/OperatorKinds.h" 20 #include "clang/Basic/TargetInfo.h" 21 #include "clang/Basic/TokenKinds.h" 22 #include "clang/Lex/LiteralSupport.h" 23 #include "clang/Parse/ParseDiagnostic.h" 24 #include "clang/Parse/Parser.h" 25 #include "clang/Parse/RAIIObjectsForParser.h" 26 #include "clang/Sema/DeclSpec.h" 27 #include "clang/Sema/EnterExpressionEvaluationContext.h" 28 #include "clang/Sema/ParsedTemplate.h" 29 #include "clang/Sema/Scope.h" 30 #include "clang/Sema/SemaCodeCompletion.h" 31 #include "llvm/ADT/SmallString.h" 32 #include "llvm/Support/TimeProfiler.h" 33 #include <optional> 34 35 using namespace clang; 36 37 /// ParseNamespace - We know that the current token is a namespace keyword. This 38 /// may either be a top level namespace or a block-level namespace alias. If 39 /// there was an inline keyword, it has already been parsed. 40 /// 41 /// namespace-definition: [C++: namespace.def] 42 /// named-namespace-definition 43 /// unnamed-namespace-definition 44 /// nested-namespace-definition 45 /// 46 /// named-namespace-definition: 47 /// 'inline'[opt] 'namespace' attributes[opt] identifier '{' 48 /// namespace-body '}' 49 /// 50 /// unnamed-namespace-definition: 51 /// 'inline'[opt] 'namespace' attributes[opt] '{' namespace-body '}' 52 /// 53 /// nested-namespace-definition: 54 /// 'namespace' enclosing-namespace-specifier '::' 'inline'[opt] 55 /// identifier '{' namespace-body '}' 56 /// 57 /// enclosing-namespace-specifier: 58 /// identifier 59 /// enclosing-namespace-specifier '::' 'inline'[opt] identifier 60 /// 61 /// namespace-alias-definition: [C++ 7.3.2: namespace.alias] 62 /// 'namespace' identifier '=' qualified-namespace-specifier ';' 63 /// 64 Parser::DeclGroupPtrTy Parser::ParseNamespace(DeclaratorContext Context, 65 SourceLocation &DeclEnd, 66 SourceLocation InlineLoc) { 67 assert(Tok.is(tok::kw_namespace) && "Not a namespace!"); 68 SourceLocation NamespaceLoc = ConsumeToken(); // eat the 'namespace'. 69 ObjCDeclContextSwitch ObjCDC(*this); 70 71 if (Tok.is(tok::code_completion)) { 72 cutOffParsing(); 73 Actions.CodeCompletion().CodeCompleteNamespaceDecl(getCurScope()); 74 return nullptr; 75 } 76 77 SourceLocation IdentLoc; 78 IdentifierInfo *Ident = nullptr; 79 InnerNamespaceInfoList ExtraNSs; 80 SourceLocation FirstNestedInlineLoc; 81 82 ParsedAttributes attrs(AttrFactory); 83 84 auto ReadAttributes = [&] { 85 bool MoreToParse; 86 do { 87 MoreToParse = false; 88 if (Tok.is(tok::kw___attribute)) { 89 ParseGNUAttributes(attrs); 90 MoreToParse = true; 91 } 92 if (getLangOpts().CPlusPlus11 && isCXX11AttributeSpecifier()) { 93 Diag(Tok.getLocation(), getLangOpts().CPlusPlus17 94 ? diag::warn_cxx14_compat_ns_enum_attribute 95 : diag::ext_ns_enum_attribute) 96 << 0 /*namespace*/; 97 ParseCXX11Attributes(attrs); 98 MoreToParse = true; 99 } 100 } while (MoreToParse); 101 }; 102 103 ReadAttributes(); 104 105 if (Tok.is(tok::identifier)) { 106 Ident = Tok.getIdentifierInfo(); 107 IdentLoc = ConsumeToken(); // eat the identifier. 108 while (Tok.is(tok::coloncolon) && 109 (NextToken().is(tok::identifier) || 110 (NextToken().is(tok::kw_inline) && 111 GetLookAheadToken(2).is(tok::identifier)))) { 112 113 InnerNamespaceInfo Info; 114 Info.NamespaceLoc = ConsumeToken(); 115 116 if (Tok.is(tok::kw_inline)) { 117 Info.InlineLoc = ConsumeToken(); 118 if (FirstNestedInlineLoc.isInvalid()) 119 FirstNestedInlineLoc = Info.InlineLoc; 120 } 121 122 Info.Ident = Tok.getIdentifierInfo(); 123 Info.IdentLoc = ConsumeToken(); 124 125 ExtraNSs.push_back(Info); 126 } 127 } 128 129 ReadAttributes(); 130 131 SourceLocation attrLoc = attrs.Range.getBegin(); 132 133 // A nested namespace definition cannot have attributes. 134 if (!ExtraNSs.empty() && attrLoc.isValid()) 135 Diag(attrLoc, diag::err_unexpected_nested_namespace_attribute); 136 137 if (Tok.is(tok::equal)) { 138 if (!Ident) { 139 Diag(Tok, diag::err_expected) << tok::identifier; 140 // Skip to end of the definition and eat the ';'. 141 SkipUntil(tok::semi); 142 return nullptr; 143 } 144 if (!ExtraNSs.empty()) { 145 Diag(ExtraNSs.front().NamespaceLoc, 146 diag::err_unexpected_qualified_namespace_alias) 147 << SourceRange(ExtraNSs.front().NamespaceLoc, 148 ExtraNSs.back().IdentLoc); 149 SkipUntil(tok::semi); 150 return nullptr; 151 } 152 if (attrLoc.isValid()) 153 Diag(attrLoc, diag::err_unexpected_namespace_attributes_alias); 154 if (InlineLoc.isValid()) 155 Diag(InlineLoc, diag::err_inline_namespace_alias) 156 << FixItHint::CreateRemoval(InlineLoc); 157 Decl *NSAlias = ParseNamespaceAlias(NamespaceLoc, IdentLoc, Ident, DeclEnd); 158 return Actions.ConvertDeclToDeclGroup(NSAlias); 159 } 160 161 BalancedDelimiterTracker T(*this, tok::l_brace); 162 if (T.consumeOpen()) { 163 if (Ident) 164 Diag(Tok, diag::err_expected) << tok::l_brace; 165 else 166 Diag(Tok, diag::err_expected_either) << tok::identifier << tok::l_brace; 167 return nullptr; 168 } 169 170 if (getCurScope()->isClassScope() || getCurScope()->isTemplateParamScope() || 171 getCurScope()->isInObjcMethodScope() || getCurScope()->getBlockParent() || 172 getCurScope()->getFnParent()) { 173 Diag(T.getOpenLocation(), diag::err_namespace_nonnamespace_scope); 174 SkipUntil(tok::r_brace); 175 return nullptr; 176 } 177 178 if (ExtraNSs.empty()) { 179 // Normal namespace definition, not a nested-namespace-definition. 180 } else if (InlineLoc.isValid()) { 181 Diag(InlineLoc, diag::err_inline_nested_namespace_definition); 182 } else if (getLangOpts().CPlusPlus20) { 183 Diag(ExtraNSs[0].NamespaceLoc, 184 diag::warn_cxx14_compat_nested_namespace_definition); 185 if (FirstNestedInlineLoc.isValid()) 186 Diag(FirstNestedInlineLoc, 187 diag::warn_cxx17_compat_inline_nested_namespace_definition); 188 } else if (getLangOpts().CPlusPlus17) { 189 Diag(ExtraNSs[0].NamespaceLoc, 190 diag::warn_cxx14_compat_nested_namespace_definition); 191 if (FirstNestedInlineLoc.isValid()) 192 Diag(FirstNestedInlineLoc, diag::ext_inline_nested_namespace_definition); 193 } else { 194 TentativeParsingAction TPA(*this); 195 SkipUntil(tok::r_brace, StopBeforeMatch); 196 Token rBraceToken = Tok; 197 TPA.Revert(); 198 199 if (!rBraceToken.is(tok::r_brace)) { 200 Diag(ExtraNSs[0].NamespaceLoc, diag::ext_nested_namespace_definition) 201 << SourceRange(ExtraNSs.front().NamespaceLoc, 202 ExtraNSs.back().IdentLoc); 203 } else { 204 std::string NamespaceFix; 205 for (const auto &ExtraNS : ExtraNSs) { 206 NamespaceFix += " { "; 207 if (ExtraNS.InlineLoc.isValid()) 208 NamespaceFix += "inline "; 209 NamespaceFix += "namespace "; 210 NamespaceFix += ExtraNS.Ident->getName(); 211 } 212 213 std::string RBraces; 214 for (unsigned i = 0, e = ExtraNSs.size(); i != e; ++i) 215 RBraces += "} "; 216 217 Diag(ExtraNSs[0].NamespaceLoc, diag::ext_nested_namespace_definition) 218 << FixItHint::CreateReplacement( 219 SourceRange(ExtraNSs.front().NamespaceLoc, 220 ExtraNSs.back().IdentLoc), 221 NamespaceFix) 222 << FixItHint::CreateInsertion(rBraceToken.getLocation(), RBraces); 223 } 224 225 // Warn about nested inline namespaces. 226 if (FirstNestedInlineLoc.isValid()) 227 Diag(FirstNestedInlineLoc, diag::ext_inline_nested_namespace_definition); 228 } 229 230 // If we're still good, complain about inline namespaces in non-C++0x now. 231 if (InlineLoc.isValid()) 232 Diag(InlineLoc, getLangOpts().CPlusPlus11 233 ? diag::warn_cxx98_compat_inline_namespace 234 : diag::ext_inline_namespace); 235 236 // Enter a scope for the namespace. 237 ParseScope NamespaceScope(this, Scope::DeclScope); 238 239 UsingDirectiveDecl *ImplicitUsingDirectiveDecl = nullptr; 240 Decl *NamespcDecl = Actions.ActOnStartNamespaceDef( 241 getCurScope(), InlineLoc, NamespaceLoc, IdentLoc, Ident, 242 T.getOpenLocation(), attrs, ImplicitUsingDirectiveDecl, false); 243 244 PrettyDeclStackTraceEntry CrashInfo(Actions.Context, NamespcDecl, 245 NamespaceLoc, "parsing namespace"); 246 247 // Parse the contents of the namespace. This includes parsing recovery on 248 // any improperly nested namespaces. 249 ParseInnerNamespace(ExtraNSs, 0, InlineLoc, attrs, T); 250 251 // Leave the namespace scope. 252 NamespaceScope.Exit(); 253 254 DeclEnd = T.getCloseLocation(); 255 Actions.ActOnFinishNamespaceDef(NamespcDecl, DeclEnd); 256 257 return Actions.ConvertDeclToDeclGroup(NamespcDecl, 258 ImplicitUsingDirectiveDecl); 259 } 260 261 /// ParseInnerNamespace - Parse the contents of a namespace. 262 void Parser::ParseInnerNamespace(const InnerNamespaceInfoList &InnerNSs, 263 unsigned int index, SourceLocation &InlineLoc, 264 ParsedAttributes &attrs, 265 BalancedDelimiterTracker &Tracker) { 266 if (index == InnerNSs.size()) { 267 while (!tryParseMisplacedModuleImport() && Tok.isNot(tok::r_brace) && 268 Tok.isNot(tok::eof)) { 269 ParsedAttributes DeclAttrs(AttrFactory); 270 MaybeParseCXX11Attributes(DeclAttrs); 271 ParsedAttributes EmptyDeclSpecAttrs(AttrFactory); 272 ParseExternalDeclaration(DeclAttrs, EmptyDeclSpecAttrs); 273 } 274 275 // The caller is what called check -- we are simply calling 276 // the close for it. 277 Tracker.consumeClose(); 278 279 return; 280 } 281 282 // Handle a nested namespace definition. 283 // FIXME: Preserve the source information through to the AST rather than 284 // desugaring it here. 285 ParseScope NamespaceScope(this, Scope::DeclScope); 286 UsingDirectiveDecl *ImplicitUsingDirectiveDecl = nullptr; 287 Decl *NamespcDecl = Actions.ActOnStartNamespaceDef( 288 getCurScope(), InnerNSs[index].InlineLoc, InnerNSs[index].NamespaceLoc, 289 InnerNSs[index].IdentLoc, InnerNSs[index].Ident, 290 Tracker.getOpenLocation(), attrs, ImplicitUsingDirectiveDecl, true); 291 assert(!ImplicitUsingDirectiveDecl && 292 "nested namespace definition cannot define anonymous namespace"); 293 294 ParseInnerNamespace(InnerNSs, ++index, InlineLoc, attrs, Tracker); 295 296 NamespaceScope.Exit(); 297 Actions.ActOnFinishNamespaceDef(NamespcDecl, Tracker.getCloseLocation()); 298 } 299 300 /// ParseNamespaceAlias - Parse the part after the '=' in a namespace 301 /// alias definition. 302 /// 303 Decl *Parser::ParseNamespaceAlias(SourceLocation NamespaceLoc, 304 SourceLocation AliasLoc, 305 IdentifierInfo *Alias, 306 SourceLocation &DeclEnd) { 307 assert(Tok.is(tok::equal) && "Not equal token"); 308 309 ConsumeToken(); // eat the '='. 310 311 if (Tok.is(tok::code_completion)) { 312 cutOffParsing(); 313 Actions.CodeCompletion().CodeCompleteNamespaceAliasDecl(getCurScope()); 314 return nullptr; 315 } 316 317 CXXScopeSpec SS; 318 // Parse (optional) nested-name-specifier. 319 ParseOptionalCXXScopeSpecifier(SS, /*ObjectType=*/nullptr, 320 /*ObjectHasErrors=*/false, 321 /*EnteringContext=*/false, 322 /*MayBePseudoDestructor=*/nullptr, 323 /*IsTypename=*/false, 324 /*LastII=*/nullptr, 325 /*OnlyNamespace=*/true); 326 327 if (Tok.isNot(tok::identifier)) { 328 Diag(Tok, diag::err_expected_namespace_name); 329 // Skip to end of the definition and eat the ';'. 330 SkipUntil(tok::semi); 331 return nullptr; 332 } 333 334 if (SS.isInvalid()) { 335 // Diagnostics have been emitted in ParseOptionalCXXScopeSpecifier. 336 // Skip to end of the definition and eat the ';'. 337 SkipUntil(tok::semi); 338 return nullptr; 339 } 340 341 // Parse identifier. 342 IdentifierInfo *Ident = Tok.getIdentifierInfo(); 343 SourceLocation IdentLoc = ConsumeToken(); 344 345 // Eat the ';'. 346 DeclEnd = Tok.getLocation(); 347 if (ExpectAndConsume(tok::semi, diag::err_expected_semi_after_namespace_name)) 348 SkipUntil(tok::semi); 349 350 return Actions.ActOnNamespaceAliasDef(getCurScope(), NamespaceLoc, AliasLoc, 351 Alias, SS, IdentLoc, Ident); 352 } 353 354 /// ParseLinkage - We know that the current token is a string_literal 355 /// and just before that, that extern was seen. 356 /// 357 /// linkage-specification: [C++ 7.5p2: dcl.link] 358 /// 'extern' string-literal '{' declaration-seq[opt] '}' 359 /// 'extern' string-literal declaration 360 /// 361 Decl *Parser::ParseLinkage(ParsingDeclSpec &DS, DeclaratorContext Context) { 362 assert(isTokenStringLiteral() && "Not a string literal!"); 363 ExprResult Lang = ParseUnevaluatedStringLiteralExpression(); 364 365 ParseScope LinkageScope(this, Scope::DeclScope); 366 Decl *LinkageSpec = 367 Lang.isInvalid() 368 ? nullptr 369 : Actions.ActOnStartLinkageSpecification( 370 getCurScope(), DS.getSourceRange().getBegin(), Lang.get(), 371 Tok.is(tok::l_brace) ? Tok.getLocation() : SourceLocation()); 372 373 ParsedAttributes DeclAttrs(AttrFactory); 374 ParsedAttributes DeclSpecAttrs(AttrFactory); 375 376 while (MaybeParseCXX11Attributes(DeclAttrs) || 377 MaybeParseGNUAttributes(DeclSpecAttrs)) 378 ; 379 380 if (Tok.isNot(tok::l_brace)) { 381 // Reset the source range in DS, as the leading "extern" 382 // does not really belong to the inner declaration ... 383 DS.SetRangeStart(SourceLocation()); 384 DS.SetRangeEnd(SourceLocation()); 385 // ... but anyway remember that such an "extern" was seen. 386 DS.setExternInLinkageSpec(true); 387 ParseExternalDeclaration(DeclAttrs, DeclSpecAttrs, &DS); 388 return LinkageSpec ? Actions.ActOnFinishLinkageSpecification( 389 getCurScope(), LinkageSpec, SourceLocation()) 390 : nullptr; 391 } 392 393 DS.abort(); 394 395 ProhibitAttributes(DeclAttrs); 396 397 BalancedDelimiterTracker T(*this, tok::l_brace); 398 T.consumeOpen(); 399 400 unsigned NestedModules = 0; 401 while (true) { 402 switch (Tok.getKind()) { 403 case tok::annot_module_begin: 404 ++NestedModules; 405 ParseTopLevelDecl(); 406 continue; 407 408 case tok::annot_module_end: 409 if (!NestedModules) 410 break; 411 --NestedModules; 412 ParseTopLevelDecl(); 413 continue; 414 415 case tok::annot_module_include: 416 ParseTopLevelDecl(); 417 continue; 418 419 case tok::eof: 420 break; 421 422 case tok::r_brace: 423 if (!NestedModules) 424 break; 425 [[fallthrough]]; 426 default: 427 ParsedAttributes DeclAttrs(AttrFactory); 428 MaybeParseCXX11Attributes(DeclAttrs); 429 ParseExternalDeclaration(DeclAttrs, DeclSpecAttrs); 430 continue; 431 } 432 433 break; 434 } 435 436 T.consumeClose(); 437 return LinkageSpec ? Actions.ActOnFinishLinkageSpecification( 438 getCurScope(), LinkageSpec, T.getCloseLocation()) 439 : nullptr; 440 } 441 442 /// Parse a standard C++ Modules export-declaration. 443 /// 444 /// export-declaration: 445 /// 'export' declaration 446 /// 'export' '{' declaration-seq[opt] '}' 447 /// 448 /// HLSL: Parse export function declaration. 449 /// 450 /// export-function-declaration: 451 /// 'export' function-declaration 452 /// 453 /// export-declaration-group: 454 /// 'export' '{' function-declaration-seq[opt] '}' 455 /// 456 Decl *Parser::ParseExportDeclaration() { 457 assert(Tok.is(tok::kw_export)); 458 SourceLocation ExportLoc = ConsumeToken(); 459 460 ParseScope ExportScope(this, Scope::DeclScope); 461 Decl *ExportDecl = Actions.ActOnStartExportDecl( 462 getCurScope(), ExportLoc, 463 Tok.is(tok::l_brace) ? Tok.getLocation() : SourceLocation()); 464 465 if (Tok.isNot(tok::l_brace)) { 466 // FIXME: Factor out a ParseExternalDeclarationWithAttrs. 467 ParsedAttributes DeclAttrs(AttrFactory); 468 MaybeParseCXX11Attributes(DeclAttrs); 469 ParsedAttributes EmptyDeclSpecAttrs(AttrFactory); 470 ParseExternalDeclaration(DeclAttrs, EmptyDeclSpecAttrs); 471 return Actions.ActOnFinishExportDecl(getCurScope(), ExportDecl, 472 SourceLocation()); 473 } 474 475 BalancedDelimiterTracker T(*this, tok::l_brace); 476 T.consumeOpen(); 477 478 while (!tryParseMisplacedModuleImport() && Tok.isNot(tok::r_brace) && 479 Tok.isNot(tok::eof)) { 480 ParsedAttributes DeclAttrs(AttrFactory); 481 MaybeParseCXX11Attributes(DeclAttrs); 482 ParsedAttributes EmptyDeclSpecAttrs(AttrFactory); 483 ParseExternalDeclaration(DeclAttrs, EmptyDeclSpecAttrs); 484 } 485 486 T.consumeClose(); 487 return Actions.ActOnFinishExportDecl(getCurScope(), ExportDecl, 488 T.getCloseLocation()); 489 } 490 491 /// ParseUsingDirectiveOrDeclaration - Parse C++ using using-declaration or 492 /// using-directive. Assumes that current token is 'using'. 493 Parser::DeclGroupPtrTy Parser::ParseUsingDirectiveOrDeclaration( 494 DeclaratorContext Context, const ParsedTemplateInfo &TemplateInfo, 495 SourceLocation &DeclEnd, ParsedAttributes &Attrs) { 496 assert(Tok.is(tok::kw_using) && "Not using token"); 497 ObjCDeclContextSwitch ObjCDC(*this); 498 499 // Eat 'using'. 500 SourceLocation UsingLoc = ConsumeToken(); 501 502 if (Tok.is(tok::code_completion)) { 503 cutOffParsing(); 504 Actions.CodeCompletion().CodeCompleteUsing(getCurScope()); 505 return nullptr; 506 } 507 508 // Consume unexpected 'template' keywords. 509 while (Tok.is(tok::kw_template)) { 510 SourceLocation TemplateLoc = ConsumeToken(); 511 Diag(TemplateLoc, diag::err_unexpected_template_after_using) 512 << FixItHint::CreateRemoval(TemplateLoc); 513 } 514 515 // 'using namespace' means this is a using-directive. 516 if (Tok.is(tok::kw_namespace)) { 517 // Template parameters are always an error here. 518 if (TemplateInfo.Kind) { 519 SourceRange R = TemplateInfo.getSourceRange(); 520 Diag(UsingLoc, diag::err_templated_using_directive_declaration) 521 << 0 /* directive */ << R << FixItHint::CreateRemoval(R); 522 } 523 524 Decl *UsingDir = ParseUsingDirective(Context, UsingLoc, DeclEnd, Attrs); 525 return Actions.ConvertDeclToDeclGroup(UsingDir); 526 } 527 528 // Otherwise, it must be a using-declaration or an alias-declaration. 529 return ParseUsingDeclaration(Context, TemplateInfo, UsingLoc, DeclEnd, Attrs, 530 AS_none); 531 } 532 533 /// ParseUsingDirective - Parse C++ using-directive, assumes 534 /// that current token is 'namespace' and 'using' was already parsed. 535 /// 536 /// using-directive: [C++ 7.3.p4: namespace.udir] 537 /// 'using' 'namespace' ::[opt] nested-name-specifier[opt] 538 /// namespace-name ; 539 /// [GNU] using-directive: 540 /// 'using' 'namespace' ::[opt] nested-name-specifier[opt] 541 /// namespace-name attributes[opt] ; 542 /// 543 Decl *Parser::ParseUsingDirective(DeclaratorContext Context, 544 SourceLocation UsingLoc, 545 SourceLocation &DeclEnd, 546 ParsedAttributes &attrs) { 547 assert(Tok.is(tok::kw_namespace) && "Not 'namespace' token"); 548 549 // Eat 'namespace'. 550 SourceLocation NamespcLoc = ConsumeToken(); 551 552 if (Tok.is(tok::code_completion)) { 553 cutOffParsing(); 554 Actions.CodeCompletion().CodeCompleteUsingDirective(getCurScope()); 555 return nullptr; 556 } 557 558 CXXScopeSpec SS; 559 // Parse (optional) nested-name-specifier. 560 ParseOptionalCXXScopeSpecifier(SS, /*ObjectType=*/nullptr, 561 /*ObjectHasErrors=*/false, 562 /*EnteringContext=*/false, 563 /*MayBePseudoDestructor=*/nullptr, 564 /*IsTypename=*/false, 565 /*LastII=*/nullptr, 566 /*OnlyNamespace=*/true); 567 568 IdentifierInfo *NamespcName = nullptr; 569 SourceLocation IdentLoc = SourceLocation(); 570 571 // Parse namespace-name. 572 if (Tok.isNot(tok::identifier)) { 573 Diag(Tok, diag::err_expected_namespace_name); 574 // If there was invalid namespace name, skip to end of decl, and eat ';'. 575 SkipUntil(tok::semi); 576 // FIXME: Are there cases, when we would like to call ActOnUsingDirective? 577 return nullptr; 578 } 579 580 if (SS.isInvalid()) { 581 // Diagnostics have been emitted in ParseOptionalCXXScopeSpecifier. 582 // Skip to end of the definition and eat the ';'. 583 SkipUntil(tok::semi); 584 return nullptr; 585 } 586 587 // Parse identifier. 588 NamespcName = Tok.getIdentifierInfo(); 589 IdentLoc = ConsumeToken(); 590 591 // Parse (optional) attributes (most likely GNU strong-using extension). 592 bool GNUAttr = false; 593 if (Tok.is(tok::kw___attribute)) { 594 GNUAttr = true; 595 ParseGNUAttributes(attrs); 596 } 597 598 // Eat ';'. 599 DeclEnd = Tok.getLocation(); 600 if (ExpectAndConsume(tok::semi, 601 GNUAttr ? diag::err_expected_semi_after_attribute_list 602 : diag::err_expected_semi_after_namespace_name)) 603 SkipUntil(tok::semi); 604 605 return Actions.ActOnUsingDirective(getCurScope(), UsingLoc, NamespcLoc, SS, 606 IdentLoc, NamespcName, attrs); 607 } 608 609 /// Parse a using-declarator (or the identifier in a C++11 alias-declaration). 610 /// 611 /// using-declarator: 612 /// 'typename'[opt] nested-name-specifier unqualified-id 613 /// 614 bool Parser::ParseUsingDeclarator(DeclaratorContext Context, 615 UsingDeclarator &D) { 616 D.clear(); 617 618 // Ignore optional 'typename'. 619 // FIXME: This is wrong; we should parse this as a typename-specifier. 620 TryConsumeToken(tok::kw_typename, D.TypenameLoc); 621 622 if (Tok.is(tok::kw___super)) { 623 Diag(Tok.getLocation(), diag::err_super_in_using_declaration); 624 return true; 625 } 626 627 // Parse nested-name-specifier. 628 const IdentifierInfo *LastII = nullptr; 629 if (ParseOptionalCXXScopeSpecifier(D.SS, /*ObjectType=*/nullptr, 630 /*ObjectHasErrors=*/false, 631 /*EnteringContext=*/false, 632 /*MayBePseudoDtor=*/nullptr, 633 /*IsTypename=*/false, 634 /*LastII=*/&LastII, 635 /*OnlyNamespace=*/false, 636 /*InUsingDeclaration=*/true)) 637 638 return true; 639 if (D.SS.isInvalid()) 640 return true; 641 642 // Parse the unqualified-id. We allow parsing of both constructor and 643 // destructor names and allow the action module to diagnose any semantic 644 // errors. 645 // 646 // C++11 [class.qual]p2: 647 // [...] in a using-declaration that is a member-declaration, if the name 648 // specified after the nested-name-specifier is the same as the identifier 649 // or the simple-template-id's template-name in the last component of the 650 // nested-name-specifier, the name is [...] considered to name the 651 // constructor. 652 if (getLangOpts().CPlusPlus11 && Context == DeclaratorContext::Member && 653 Tok.is(tok::identifier) && 654 (NextToken().is(tok::semi) || NextToken().is(tok::comma) || 655 NextToken().is(tok::ellipsis) || NextToken().is(tok::l_square) || 656 NextToken().isRegularKeywordAttribute() || 657 NextToken().is(tok::kw___attribute)) && 658 D.SS.isNotEmpty() && LastII == Tok.getIdentifierInfo() && 659 !D.SS.getScopeRep()->getAsNamespace() && 660 !D.SS.getScopeRep()->getAsNamespaceAlias()) { 661 SourceLocation IdLoc = ConsumeToken(); 662 ParsedType Type = 663 Actions.getInheritingConstructorName(D.SS, IdLoc, *LastII); 664 D.Name.setConstructorName(Type, IdLoc, IdLoc); 665 } else { 666 if (ParseUnqualifiedId( 667 D.SS, /*ObjectType=*/nullptr, 668 /*ObjectHadErrors=*/false, /*EnteringContext=*/false, 669 /*AllowDestructorName=*/true, 670 /*AllowConstructorName=*/ 671 !(Tok.is(tok::identifier) && NextToken().is(tok::equal)), 672 /*AllowDeductionGuide=*/false, nullptr, D.Name)) 673 return true; 674 } 675 676 if (TryConsumeToken(tok::ellipsis, D.EllipsisLoc)) 677 Diag(Tok.getLocation(), getLangOpts().CPlusPlus17 678 ? diag::warn_cxx17_compat_using_declaration_pack 679 : diag::ext_using_declaration_pack); 680 681 return false; 682 } 683 684 /// ParseUsingDeclaration - Parse C++ using-declaration or alias-declaration. 685 /// Assumes that 'using' was already seen. 686 /// 687 /// using-declaration: [C++ 7.3.p3: namespace.udecl] 688 /// 'using' using-declarator-list[opt] ; 689 /// 690 /// using-declarator-list: [C++1z] 691 /// using-declarator '...'[opt] 692 /// using-declarator-list ',' using-declarator '...'[opt] 693 /// 694 /// using-declarator-list: [C++98-14] 695 /// using-declarator 696 /// 697 /// alias-declaration: C++11 [dcl.dcl]p1 698 /// 'using' identifier attribute-specifier-seq[opt] = type-id ; 699 /// 700 /// using-enum-declaration: [C++20, dcl.enum] 701 /// 'using' elaborated-enum-specifier ; 702 /// The terminal name of the elaborated-enum-specifier undergoes 703 /// type-only lookup 704 /// 705 /// elaborated-enum-specifier: 706 /// 'enum' nested-name-specifier[opt] identifier 707 Parser::DeclGroupPtrTy Parser::ParseUsingDeclaration( 708 DeclaratorContext Context, const ParsedTemplateInfo &TemplateInfo, 709 SourceLocation UsingLoc, SourceLocation &DeclEnd, 710 ParsedAttributes &PrefixAttrs, AccessSpecifier AS) { 711 SourceLocation UELoc; 712 bool InInitStatement = Context == DeclaratorContext::SelectionInit || 713 Context == DeclaratorContext::ForInit; 714 715 if (TryConsumeToken(tok::kw_enum, UELoc) && !InInitStatement) { 716 // C++20 using-enum 717 Diag(UELoc, getLangOpts().CPlusPlus20 718 ? diag::warn_cxx17_compat_using_enum_declaration 719 : diag::ext_using_enum_declaration); 720 721 DiagnoseCXX11AttributeExtension(PrefixAttrs); 722 723 if (TemplateInfo.Kind) { 724 SourceRange R = TemplateInfo.getSourceRange(); 725 Diag(UsingLoc, diag::err_templated_using_directive_declaration) 726 << 1 /* declaration */ << R << FixItHint::CreateRemoval(R); 727 SkipUntil(tok::semi); 728 return nullptr; 729 } 730 CXXScopeSpec SS; 731 if (ParseOptionalCXXScopeSpecifier(SS, /*ParsedType=*/nullptr, 732 /*ObectHasErrors=*/false, 733 /*EnteringConttext=*/false, 734 /*MayBePseudoDestructor=*/nullptr, 735 /*IsTypename=*/true, 736 /*IdentifierInfo=*/nullptr, 737 /*OnlyNamespace=*/false, 738 /*InUsingDeclaration=*/true)) { 739 SkipUntil(tok::semi); 740 return nullptr; 741 } 742 743 if (Tok.is(tok::code_completion)) { 744 cutOffParsing(); 745 Actions.CodeCompletion().CodeCompleteUsing(getCurScope()); 746 return nullptr; 747 } 748 749 Decl *UED = nullptr; 750 751 // FIXME: identifier and annot_template_id handling is very similar to 752 // ParseBaseTypeSpecifier. It should be factored out into a function. 753 if (Tok.is(tok::identifier)) { 754 IdentifierInfo *IdentInfo = Tok.getIdentifierInfo(); 755 SourceLocation IdentLoc = ConsumeToken(); 756 757 ParsedType Type = Actions.getTypeName( 758 *IdentInfo, IdentLoc, getCurScope(), &SS, /*isClassName=*/true, 759 /*HasTrailingDot=*/false, 760 /*ObjectType=*/nullptr, /*IsCtorOrDtorName=*/false, 761 /*WantNontrivialTypeSourceInfo=*/true); 762 763 UED = Actions.ActOnUsingEnumDeclaration( 764 getCurScope(), AS, UsingLoc, UELoc, IdentLoc, *IdentInfo, Type, &SS); 765 } else if (Tok.is(tok::annot_template_id)) { 766 TemplateIdAnnotation *TemplateId = takeTemplateIdAnnotation(Tok); 767 768 if (TemplateId->mightBeType()) { 769 AnnotateTemplateIdTokenAsType(SS, ImplicitTypenameContext::No, 770 /*IsClassName=*/true); 771 772 assert(Tok.is(tok::annot_typename) && "template-id -> type failed"); 773 TypeResult Type = getTypeAnnotation(Tok); 774 SourceRange Loc = Tok.getAnnotationRange(); 775 ConsumeAnnotationToken(); 776 777 UED = Actions.ActOnUsingEnumDeclaration(getCurScope(), AS, UsingLoc, 778 UELoc, Loc, *TemplateId->Name, 779 Type.get(), &SS); 780 } else { 781 Diag(Tok.getLocation(), diag::err_using_enum_not_enum) 782 << TemplateId->Name->getName() 783 << SourceRange(TemplateId->TemplateNameLoc, TemplateId->RAngleLoc); 784 } 785 } else { 786 Diag(Tok.getLocation(), diag::err_using_enum_expect_identifier) 787 << Tok.is(tok::kw_enum); 788 SkipUntil(tok::semi); 789 return nullptr; 790 } 791 792 if (!UED) { 793 SkipUntil(tok::semi); 794 return nullptr; 795 } 796 797 DeclEnd = Tok.getLocation(); 798 if (ExpectAndConsume(tok::semi, diag::err_expected_after, 799 "using-enum declaration")) 800 SkipUntil(tok::semi); 801 802 return Actions.ConvertDeclToDeclGroup(UED); 803 } 804 805 // Check for misplaced attributes before the identifier in an 806 // alias-declaration. 807 ParsedAttributes MisplacedAttrs(AttrFactory); 808 MaybeParseCXX11Attributes(MisplacedAttrs); 809 810 if (InInitStatement && Tok.isNot(tok::identifier)) 811 return nullptr; 812 813 UsingDeclarator D; 814 bool InvalidDeclarator = ParseUsingDeclarator(Context, D); 815 816 ParsedAttributes Attrs(AttrFactory); 817 MaybeParseAttributes(PAKM_GNU | PAKM_CXX11, Attrs); 818 819 // If we had any misplaced attributes from earlier, this is where they 820 // should have been written. 821 if (MisplacedAttrs.Range.isValid()) { 822 auto *FirstAttr = 823 MisplacedAttrs.empty() ? nullptr : &MisplacedAttrs.front(); 824 auto &Range = MisplacedAttrs.Range; 825 (FirstAttr && FirstAttr->isRegularKeywordAttribute() 826 ? Diag(Range.getBegin(), diag::err_keyword_not_allowed) << FirstAttr 827 : Diag(Range.getBegin(), diag::err_attributes_not_allowed)) 828 << FixItHint::CreateInsertionFromRange( 829 Tok.getLocation(), CharSourceRange::getTokenRange(Range)) 830 << FixItHint::CreateRemoval(Range); 831 Attrs.takeAllFrom(MisplacedAttrs); 832 } 833 834 // Maybe this is an alias-declaration. 835 if (Tok.is(tok::equal) || InInitStatement) { 836 if (InvalidDeclarator) { 837 SkipUntil(tok::semi); 838 return nullptr; 839 } 840 841 ProhibitAttributes(PrefixAttrs); 842 843 Decl *DeclFromDeclSpec = nullptr; 844 Scope *CurScope = getCurScope(); 845 if (CurScope) 846 CurScope->setFlags(Scope::ScopeFlags::TypeAliasScope | 847 CurScope->getFlags()); 848 849 Decl *AD = ParseAliasDeclarationAfterDeclarator( 850 TemplateInfo, UsingLoc, D, DeclEnd, AS, Attrs, &DeclFromDeclSpec); 851 return Actions.ConvertDeclToDeclGroup(AD, DeclFromDeclSpec); 852 } 853 854 DiagnoseCXX11AttributeExtension(PrefixAttrs); 855 856 // Diagnose an attempt to declare a templated using-declaration. 857 // In C++11, alias-declarations can be templates: 858 // template <...> using id = type; 859 if (TemplateInfo.Kind) { 860 SourceRange R = TemplateInfo.getSourceRange(); 861 Diag(UsingLoc, diag::err_templated_using_directive_declaration) 862 << 1 /* declaration */ << R << FixItHint::CreateRemoval(R); 863 864 // Unfortunately, we have to bail out instead of recovering by 865 // ignoring the parameters, just in case the nested name specifier 866 // depends on the parameters. 867 return nullptr; 868 } 869 870 SmallVector<Decl *, 8> DeclsInGroup; 871 while (true) { 872 // Parse (optional) attributes. 873 MaybeParseAttributes(PAKM_GNU | PAKM_CXX11, Attrs); 874 DiagnoseCXX11AttributeExtension(Attrs); 875 Attrs.addAll(PrefixAttrs.begin(), PrefixAttrs.end()); 876 877 if (InvalidDeclarator) 878 SkipUntil(tok::comma, tok::semi, StopBeforeMatch); 879 else { 880 // "typename" keyword is allowed for identifiers only, 881 // because it may be a type definition. 882 if (D.TypenameLoc.isValid() && 883 D.Name.getKind() != UnqualifiedIdKind::IK_Identifier) { 884 Diag(D.Name.getSourceRange().getBegin(), 885 diag::err_typename_identifiers_only) 886 << FixItHint::CreateRemoval(SourceRange(D.TypenameLoc)); 887 // Proceed parsing, but discard the typename keyword. 888 D.TypenameLoc = SourceLocation(); 889 } 890 891 Decl *UD = Actions.ActOnUsingDeclaration(getCurScope(), AS, UsingLoc, 892 D.TypenameLoc, D.SS, D.Name, 893 D.EllipsisLoc, Attrs); 894 if (UD) 895 DeclsInGroup.push_back(UD); 896 } 897 898 if (!TryConsumeToken(tok::comma)) 899 break; 900 901 // Parse another using-declarator. 902 Attrs.clear(); 903 InvalidDeclarator = ParseUsingDeclarator(Context, D); 904 } 905 906 if (DeclsInGroup.size() > 1) 907 Diag(Tok.getLocation(), 908 getLangOpts().CPlusPlus17 909 ? diag::warn_cxx17_compat_multi_using_declaration 910 : diag::ext_multi_using_declaration); 911 912 // Eat ';'. 913 DeclEnd = Tok.getLocation(); 914 if (ExpectAndConsume(tok::semi, diag::err_expected_after, 915 !Attrs.empty() ? "attributes list" 916 : UELoc.isValid() ? "using-enum declaration" 917 : "using declaration")) 918 SkipUntil(tok::semi); 919 920 return Actions.BuildDeclaratorGroup(DeclsInGroup); 921 } 922 923 Decl *Parser::ParseAliasDeclarationAfterDeclarator( 924 const ParsedTemplateInfo &TemplateInfo, SourceLocation UsingLoc, 925 UsingDeclarator &D, SourceLocation &DeclEnd, AccessSpecifier AS, 926 ParsedAttributes &Attrs, Decl **OwnedType) { 927 if (ExpectAndConsume(tok::equal)) { 928 SkipUntil(tok::semi); 929 return nullptr; 930 } 931 932 Diag(Tok.getLocation(), getLangOpts().CPlusPlus11 933 ? diag::warn_cxx98_compat_alias_declaration 934 : diag::ext_alias_declaration); 935 936 // Type alias templates cannot be specialized. 937 int SpecKind = -1; 938 if (TemplateInfo.Kind == ParsedTemplateInfo::Template && 939 D.Name.getKind() == UnqualifiedIdKind::IK_TemplateId) 940 SpecKind = 0; 941 if (TemplateInfo.Kind == ParsedTemplateInfo::ExplicitSpecialization) 942 SpecKind = 1; 943 if (TemplateInfo.Kind == ParsedTemplateInfo::ExplicitInstantiation) 944 SpecKind = 2; 945 if (SpecKind != -1) { 946 SourceRange Range; 947 if (SpecKind == 0) 948 Range = SourceRange(D.Name.TemplateId->LAngleLoc, 949 D.Name.TemplateId->RAngleLoc); 950 else 951 Range = TemplateInfo.getSourceRange(); 952 Diag(Range.getBegin(), diag::err_alias_declaration_specialization) 953 << SpecKind << Range; 954 SkipUntil(tok::semi); 955 return nullptr; 956 } 957 958 // Name must be an identifier. 959 if (D.Name.getKind() != UnqualifiedIdKind::IK_Identifier) { 960 Diag(D.Name.StartLocation, diag::err_alias_declaration_not_identifier); 961 // No removal fixit: can't recover from this. 962 SkipUntil(tok::semi); 963 return nullptr; 964 } else if (D.TypenameLoc.isValid()) 965 Diag(D.TypenameLoc, diag::err_alias_declaration_not_identifier) 966 << FixItHint::CreateRemoval( 967 SourceRange(D.TypenameLoc, D.SS.isNotEmpty() ? D.SS.getEndLoc() 968 : D.TypenameLoc)); 969 else if (D.SS.isNotEmpty()) 970 Diag(D.SS.getBeginLoc(), diag::err_alias_declaration_not_identifier) 971 << FixItHint::CreateRemoval(D.SS.getRange()); 972 if (D.EllipsisLoc.isValid()) 973 Diag(D.EllipsisLoc, diag::err_alias_declaration_pack_expansion) 974 << FixItHint::CreateRemoval(SourceRange(D.EllipsisLoc)); 975 976 Decl *DeclFromDeclSpec = nullptr; 977 TypeResult TypeAlias = 978 ParseTypeName(nullptr, 979 TemplateInfo.Kind ? DeclaratorContext::AliasTemplate 980 : DeclaratorContext::AliasDecl, 981 AS, &DeclFromDeclSpec, &Attrs); 982 if (OwnedType) 983 *OwnedType = DeclFromDeclSpec; 984 985 // Eat ';'. 986 DeclEnd = Tok.getLocation(); 987 if (ExpectAndConsume(tok::semi, diag::err_expected_after, 988 !Attrs.empty() ? "attributes list" 989 : "alias declaration")) 990 SkipUntil(tok::semi); 991 992 TemplateParameterLists *TemplateParams = TemplateInfo.TemplateParams; 993 MultiTemplateParamsArg TemplateParamsArg( 994 TemplateParams ? TemplateParams->data() : nullptr, 995 TemplateParams ? TemplateParams->size() : 0); 996 return Actions.ActOnAliasDeclaration(getCurScope(), AS, TemplateParamsArg, 997 UsingLoc, D.Name, Attrs, TypeAlias, 998 DeclFromDeclSpec); 999 } 1000 1001 static FixItHint getStaticAssertNoMessageFixIt(const Expr *AssertExpr, 1002 SourceLocation EndExprLoc) { 1003 if (const auto *BO = dyn_cast_or_null<BinaryOperator>(AssertExpr)) { 1004 if (BO->getOpcode() == BO_LAnd && 1005 isa<StringLiteral>(BO->getRHS()->IgnoreImpCasts())) 1006 return FixItHint::CreateReplacement(BO->getOperatorLoc(), ","); 1007 } 1008 return FixItHint::CreateInsertion(EndExprLoc, ", \"\""); 1009 } 1010 1011 /// ParseStaticAssertDeclaration - Parse C++0x or C11 static_assert-declaration. 1012 /// 1013 /// [C++0x] static_assert-declaration: 1014 /// static_assert ( constant-expression , string-literal ) ; 1015 /// 1016 /// [C11] static_assert-declaration: 1017 /// _Static_assert ( constant-expression , string-literal ) ; 1018 /// 1019 Decl *Parser::ParseStaticAssertDeclaration(SourceLocation &DeclEnd) { 1020 assert(Tok.isOneOf(tok::kw_static_assert, tok::kw__Static_assert) && 1021 "Not a static_assert declaration"); 1022 1023 // Save the token name used for static assertion. 1024 const char *TokName = Tok.getName(); 1025 1026 if (Tok.is(tok::kw__Static_assert)) 1027 diagnoseUseOfC11Keyword(Tok); 1028 else if (Tok.is(tok::kw_static_assert)) { 1029 if (!getLangOpts().CPlusPlus) { 1030 if (getLangOpts().C23) 1031 Diag(Tok, diag::warn_c23_compat_keyword) << Tok.getName(); 1032 else 1033 Diag(Tok, diag::ext_ms_static_assert) << FixItHint::CreateReplacement( 1034 Tok.getLocation(), "_Static_assert"); 1035 } else 1036 Diag(Tok, diag::warn_cxx98_compat_static_assert); 1037 } 1038 1039 SourceLocation StaticAssertLoc = ConsumeToken(); 1040 1041 BalancedDelimiterTracker T(*this, tok::l_paren); 1042 if (T.consumeOpen()) { 1043 Diag(Tok, diag::err_expected) << tok::l_paren; 1044 SkipMalformedDecl(); 1045 return nullptr; 1046 } 1047 1048 EnterExpressionEvaluationContext ConstantEvaluated( 1049 Actions, Sema::ExpressionEvaluationContext::ConstantEvaluated); 1050 ExprResult AssertExpr(ParseConstantExpressionInExprEvalContext()); 1051 if (AssertExpr.isInvalid()) { 1052 SkipMalformedDecl(); 1053 return nullptr; 1054 } 1055 1056 ExprResult AssertMessage; 1057 if (Tok.is(tok::r_paren)) { 1058 unsigned DiagVal; 1059 if (getLangOpts().CPlusPlus17) 1060 DiagVal = diag::warn_cxx14_compat_static_assert_no_message; 1061 else if (getLangOpts().CPlusPlus) 1062 DiagVal = diag::ext_cxx_static_assert_no_message; 1063 else if (getLangOpts().C23) 1064 DiagVal = diag::warn_c17_compat_static_assert_no_message; 1065 else 1066 DiagVal = diag::ext_c_static_assert_no_message; 1067 Diag(Tok, DiagVal) << getStaticAssertNoMessageFixIt(AssertExpr.get(), 1068 Tok.getLocation()); 1069 } else { 1070 if (ExpectAndConsume(tok::comma)) { 1071 SkipUntil(tok::semi); 1072 return nullptr; 1073 } 1074 1075 bool ParseAsExpression = false; 1076 if (getLangOpts().CPlusPlus26) { 1077 for (unsigned I = 0;; ++I) { 1078 const Token &T = GetLookAheadToken(I); 1079 if (T.is(tok::r_paren)) 1080 break; 1081 if (!tokenIsLikeStringLiteral(T, getLangOpts()) || T.hasUDSuffix()) { 1082 ParseAsExpression = true; 1083 break; 1084 } 1085 } 1086 } 1087 1088 if (ParseAsExpression) 1089 AssertMessage = ParseConstantExpressionInExprEvalContext(); 1090 else if (tokenIsLikeStringLiteral(Tok, getLangOpts())) 1091 AssertMessage = ParseUnevaluatedStringLiteralExpression(); 1092 else { 1093 Diag(Tok, diag::err_expected_string_literal) 1094 << /*Source='static_assert'*/ 1; 1095 SkipMalformedDecl(); 1096 return nullptr; 1097 } 1098 1099 if (AssertMessage.isInvalid()) { 1100 SkipMalformedDecl(); 1101 return nullptr; 1102 } 1103 } 1104 1105 T.consumeClose(); 1106 1107 DeclEnd = Tok.getLocation(); 1108 ExpectAndConsumeSemi(diag::err_expected_semi_after_static_assert, TokName); 1109 1110 return Actions.ActOnStaticAssertDeclaration(StaticAssertLoc, AssertExpr.get(), 1111 AssertMessage.get(), 1112 T.getCloseLocation()); 1113 } 1114 1115 /// ParseDecltypeSpecifier - Parse a C++11 decltype specifier. 1116 /// 1117 /// 'decltype' ( expression ) 1118 /// 'decltype' ( 'auto' ) [C++1y] 1119 /// 1120 SourceLocation Parser::ParseDecltypeSpecifier(DeclSpec &DS) { 1121 assert(Tok.isOneOf(tok::kw_decltype, tok::annot_decltype) && 1122 "Not a decltype specifier"); 1123 1124 ExprResult Result; 1125 SourceLocation StartLoc = Tok.getLocation(); 1126 SourceLocation EndLoc; 1127 1128 if (Tok.is(tok::annot_decltype)) { 1129 Result = getExprAnnotation(Tok); 1130 EndLoc = Tok.getAnnotationEndLoc(); 1131 // Unfortunately, we don't know the LParen source location as the annotated 1132 // token doesn't have it. 1133 DS.setTypeArgumentRange(SourceRange(SourceLocation(), EndLoc)); 1134 ConsumeAnnotationToken(); 1135 if (Result.isInvalid()) { 1136 DS.SetTypeSpecError(); 1137 return EndLoc; 1138 } 1139 } else { 1140 if (Tok.getIdentifierInfo()->isStr("decltype")) 1141 Diag(Tok, diag::warn_cxx98_compat_decltype); 1142 1143 ConsumeToken(); 1144 1145 BalancedDelimiterTracker T(*this, tok::l_paren); 1146 if (T.expectAndConsume(diag::err_expected_lparen_after, "decltype", 1147 tok::r_paren)) { 1148 DS.SetTypeSpecError(); 1149 return T.getOpenLocation() == Tok.getLocation() ? StartLoc 1150 : T.getOpenLocation(); 1151 } 1152 1153 // Check for C++1y 'decltype(auto)'. 1154 if (Tok.is(tok::kw_auto) && NextToken().is(tok::r_paren)) { 1155 // the typename-specifier in a function-style cast expression may 1156 // be 'auto' since C++23. 1157 Diag(Tok.getLocation(), 1158 getLangOpts().CPlusPlus14 1159 ? diag::warn_cxx11_compat_decltype_auto_type_specifier 1160 : diag::ext_decltype_auto_type_specifier); 1161 ConsumeToken(); 1162 } else { 1163 // Parse the expression 1164 1165 // C++11 [dcl.type.simple]p4: 1166 // The operand of the decltype specifier is an unevaluated operand. 1167 EnterExpressionEvaluationContext Unevaluated( 1168 Actions, Sema::ExpressionEvaluationContext::Unevaluated, nullptr, 1169 Sema::ExpressionEvaluationContextRecord::EK_Decltype); 1170 Result = Actions.CorrectDelayedTyposInExpr( 1171 ParseExpression(), /*InitDecl=*/nullptr, 1172 /*RecoverUncorrectedTypos=*/false, 1173 [](Expr *E) { return E->hasPlaceholderType() ? ExprError() : E; }); 1174 if (Result.isInvalid()) { 1175 DS.SetTypeSpecError(); 1176 if (SkipUntil(tok::r_paren, StopAtSemi | StopBeforeMatch)) { 1177 EndLoc = ConsumeParen(); 1178 } else { 1179 if (PP.isBacktrackEnabled() && Tok.is(tok::semi)) { 1180 // Backtrack to get the location of the last token before the semi. 1181 PP.RevertCachedTokens(2); 1182 ConsumeToken(); // the semi. 1183 EndLoc = ConsumeAnyToken(); 1184 assert(Tok.is(tok::semi)); 1185 } else { 1186 EndLoc = Tok.getLocation(); 1187 } 1188 } 1189 return EndLoc; 1190 } 1191 1192 Result = Actions.ActOnDecltypeExpression(Result.get()); 1193 } 1194 1195 // Match the ')' 1196 T.consumeClose(); 1197 DS.setTypeArgumentRange(T.getRange()); 1198 if (T.getCloseLocation().isInvalid()) { 1199 DS.SetTypeSpecError(); 1200 // FIXME: this should return the location of the last token 1201 // that was consumed (by "consumeClose()") 1202 return T.getCloseLocation(); 1203 } 1204 1205 if (Result.isInvalid()) { 1206 DS.SetTypeSpecError(); 1207 return T.getCloseLocation(); 1208 } 1209 1210 EndLoc = T.getCloseLocation(); 1211 } 1212 assert(!Result.isInvalid()); 1213 1214 const char *PrevSpec = nullptr; 1215 unsigned DiagID; 1216 const PrintingPolicy &Policy = Actions.getASTContext().getPrintingPolicy(); 1217 // Check for duplicate type specifiers (e.g. "int decltype(a)"). 1218 if (Result.get() ? DS.SetTypeSpecType(DeclSpec::TST_decltype, StartLoc, 1219 PrevSpec, DiagID, Result.get(), Policy) 1220 : DS.SetTypeSpecType(DeclSpec::TST_decltype_auto, StartLoc, 1221 PrevSpec, DiagID, Policy)) { 1222 Diag(StartLoc, DiagID) << PrevSpec; 1223 DS.SetTypeSpecError(); 1224 } 1225 return EndLoc; 1226 } 1227 1228 void Parser::AnnotateExistingDecltypeSpecifier(const DeclSpec &DS, 1229 SourceLocation StartLoc, 1230 SourceLocation EndLoc) { 1231 // make sure we have a token we can turn into an annotation token 1232 if (PP.isBacktrackEnabled()) { 1233 PP.RevertCachedTokens(1); 1234 if (DS.getTypeSpecType() == TST_error) { 1235 // We encountered an error in parsing 'decltype(...)' so lets annotate all 1236 // the tokens in the backtracking cache - that we likely had to skip over 1237 // to get to a token that allows us to resume parsing, such as a 1238 // semi-colon. 1239 EndLoc = PP.getLastCachedTokenLocation(); 1240 } 1241 } else 1242 PP.EnterToken(Tok, /*IsReinject*/ true); 1243 1244 Tok.setKind(tok::annot_decltype); 1245 setExprAnnotation(Tok, 1246 DS.getTypeSpecType() == TST_decltype ? DS.getRepAsExpr() 1247 : DS.getTypeSpecType() == TST_decltype_auto ? ExprResult() 1248 : ExprError()); 1249 Tok.setAnnotationEndLoc(EndLoc); 1250 Tok.setLocation(StartLoc); 1251 PP.AnnotateCachedTokens(Tok); 1252 } 1253 1254 SourceLocation Parser::ParsePackIndexingType(DeclSpec &DS) { 1255 assert(Tok.isOneOf(tok::annot_pack_indexing_type, tok::identifier) && 1256 "Expected an identifier"); 1257 1258 TypeResult Type; 1259 SourceLocation StartLoc; 1260 SourceLocation EllipsisLoc; 1261 const char *PrevSpec; 1262 unsigned DiagID; 1263 const PrintingPolicy &Policy = Actions.getASTContext().getPrintingPolicy(); 1264 1265 if (Tok.is(tok::annot_pack_indexing_type)) { 1266 StartLoc = Tok.getLocation(); 1267 SourceLocation EndLoc; 1268 Type = getTypeAnnotation(Tok); 1269 EndLoc = Tok.getAnnotationEndLoc(); 1270 // Unfortunately, we don't know the LParen source location as the annotated 1271 // token doesn't have it. 1272 DS.setTypeArgumentRange(SourceRange(SourceLocation(), EndLoc)); 1273 ConsumeAnnotationToken(); 1274 if (Type.isInvalid()) { 1275 DS.SetTypeSpecError(); 1276 return EndLoc; 1277 } 1278 DS.SetTypeSpecType(DeclSpec::TST_typename_pack_indexing, StartLoc, PrevSpec, 1279 DiagID, Type, Policy); 1280 return EndLoc; 1281 } 1282 if (!NextToken().is(tok::ellipsis) || 1283 !GetLookAheadToken(2).is(tok::l_square)) { 1284 DS.SetTypeSpecError(); 1285 return Tok.getEndLoc(); 1286 } 1287 1288 ParsedType Ty = Actions.getTypeName(*Tok.getIdentifierInfo(), 1289 Tok.getLocation(), getCurScope()); 1290 if (!Ty) { 1291 DS.SetTypeSpecError(); 1292 return Tok.getEndLoc(); 1293 } 1294 Type = Ty; 1295 1296 StartLoc = ConsumeToken(); 1297 EllipsisLoc = ConsumeToken(); 1298 BalancedDelimiterTracker T(*this, tok::l_square); 1299 T.consumeOpen(); 1300 ExprResult IndexExpr = ParseConstantExpression(); 1301 T.consumeClose(); 1302 1303 DS.SetRangeStart(StartLoc); 1304 DS.SetRangeEnd(T.getCloseLocation()); 1305 1306 if (!IndexExpr.isUsable()) { 1307 ASTContext &C = Actions.getASTContext(); 1308 IndexExpr = IntegerLiteral::Create(C, C.MakeIntValue(0, C.getSizeType()), 1309 C.getSizeType(), SourceLocation()); 1310 } 1311 1312 DS.SetTypeSpecType(DeclSpec::TST_typename, StartLoc, PrevSpec, DiagID, Type, 1313 Policy); 1314 DS.SetPackIndexingExpr(EllipsisLoc, IndexExpr.get()); 1315 return T.getCloseLocation(); 1316 } 1317 1318 void Parser::AnnotateExistingIndexedTypeNamePack(ParsedType T, 1319 SourceLocation StartLoc, 1320 SourceLocation EndLoc) { 1321 // make sure we have a token we can turn into an annotation token 1322 if (PP.isBacktrackEnabled()) { 1323 PP.RevertCachedTokens(1); 1324 if (!T) { 1325 // We encountered an error in parsing 'decltype(...)' so lets annotate all 1326 // the tokens in the backtracking cache - that we likely had to skip over 1327 // to get to a token that allows us to resume parsing, such as a 1328 // semi-colon. 1329 EndLoc = PP.getLastCachedTokenLocation(); 1330 } 1331 } else 1332 PP.EnterToken(Tok, /*IsReinject*/ true); 1333 1334 Tok.setKind(tok::annot_pack_indexing_type); 1335 setTypeAnnotation(Tok, T); 1336 Tok.setAnnotationEndLoc(EndLoc); 1337 Tok.setLocation(StartLoc); 1338 PP.AnnotateCachedTokens(Tok); 1339 } 1340 1341 DeclSpec::TST Parser::TypeTransformTokToDeclSpec() { 1342 switch (Tok.getKind()) { 1343 #define TRANSFORM_TYPE_TRAIT_DEF(_, Trait) \ 1344 case tok::kw___##Trait: \ 1345 return DeclSpec::TST_##Trait; 1346 #include "clang/Basic/TransformTypeTraits.def" 1347 default: 1348 llvm_unreachable("passed in an unhandled type transformation built-in"); 1349 } 1350 } 1351 1352 bool Parser::MaybeParseTypeTransformTypeSpecifier(DeclSpec &DS) { 1353 if (!NextToken().is(tok::l_paren)) { 1354 Tok.setKind(tok::identifier); 1355 return false; 1356 } 1357 DeclSpec::TST TypeTransformTST = TypeTransformTokToDeclSpec(); 1358 SourceLocation StartLoc = ConsumeToken(); 1359 1360 BalancedDelimiterTracker T(*this, tok::l_paren); 1361 if (T.expectAndConsume(diag::err_expected_lparen_after, Tok.getName(), 1362 tok::r_paren)) 1363 return true; 1364 1365 TypeResult Result = ParseTypeName(); 1366 if (Result.isInvalid()) { 1367 SkipUntil(tok::r_paren, StopAtSemi); 1368 return true; 1369 } 1370 1371 T.consumeClose(); 1372 if (T.getCloseLocation().isInvalid()) 1373 return true; 1374 1375 const char *PrevSpec = nullptr; 1376 unsigned DiagID; 1377 if (DS.SetTypeSpecType(TypeTransformTST, StartLoc, PrevSpec, DiagID, 1378 Result.get(), 1379 Actions.getASTContext().getPrintingPolicy())) 1380 Diag(StartLoc, DiagID) << PrevSpec; 1381 DS.setTypeArgumentRange(T.getRange()); 1382 return true; 1383 } 1384 1385 /// ParseBaseTypeSpecifier - Parse a C++ base-type-specifier which is either a 1386 /// class name or decltype-specifier. Note that we only check that the result 1387 /// names a type; semantic analysis will need to verify that the type names a 1388 /// class. The result is either a type or null, depending on whether a type 1389 /// name was found. 1390 /// 1391 /// base-type-specifier: [C++11 class.derived] 1392 /// class-or-decltype 1393 /// class-or-decltype: [C++11 class.derived] 1394 /// nested-name-specifier[opt] class-name 1395 /// decltype-specifier 1396 /// class-name: [C++ class.name] 1397 /// identifier 1398 /// simple-template-id 1399 /// 1400 /// In C++98, instead of base-type-specifier, we have: 1401 /// 1402 /// ::[opt] nested-name-specifier[opt] class-name 1403 TypeResult Parser::ParseBaseTypeSpecifier(SourceLocation &BaseLoc, 1404 SourceLocation &EndLocation) { 1405 // Ignore attempts to use typename 1406 if (Tok.is(tok::kw_typename)) { 1407 Diag(Tok, diag::err_expected_class_name_not_template) 1408 << FixItHint::CreateRemoval(Tok.getLocation()); 1409 ConsumeToken(); 1410 } 1411 1412 // Parse optional nested-name-specifier 1413 CXXScopeSpec SS; 1414 if (ParseOptionalCXXScopeSpecifier(SS, /*ObjectType=*/nullptr, 1415 /*ObjectHasErrors=*/false, 1416 /*EnteringContext=*/false)) 1417 return true; 1418 1419 BaseLoc = Tok.getLocation(); 1420 1421 // Parse decltype-specifier 1422 // tok == kw_decltype is just error recovery, it can only happen when SS 1423 // isn't empty 1424 if (Tok.isOneOf(tok::kw_decltype, tok::annot_decltype)) { 1425 if (SS.isNotEmpty()) 1426 Diag(SS.getBeginLoc(), diag::err_unexpected_scope_on_base_decltype) 1427 << FixItHint::CreateRemoval(SS.getRange()); 1428 // Fake up a Declarator to use with ActOnTypeName. 1429 DeclSpec DS(AttrFactory); 1430 1431 EndLocation = ParseDecltypeSpecifier(DS); 1432 1433 Declarator DeclaratorInfo(DS, ParsedAttributesView::none(), 1434 DeclaratorContext::TypeName); 1435 return Actions.ActOnTypeName(DeclaratorInfo); 1436 } 1437 1438 if (Tok.is(tok::annot_pack_indexing_type)) { 1439 DeclSpec DS(AttrFactory); 1440 ParsePackIndexingType(DS); 1441 Declarator DeclaratorInfo(DS, ParsedAttributesView::none(), 1442 DeclaratorContext::TypeName); 1443 return Actions.ActOnTypeName(DeclaratorInfo); 1444 } 1445 1446 // Check whether we have a template-id that names a type. 1447 // FIXME: identifier and annot_template_id handling in ParseUsingDeclaration 1448 // work very similarly. It should be refactored into a separate function. 1449 if (Tok.is(tok::annot_template_id)) { 1450 TemplateIdAnnotation *TemplateId = takeTemplateIdAnnotation(Tok); 1451 if (TemplateId->mightBeType()) { 1452 AnnotateTemplateIdTokenAsType(SS, ImplicitTypenameContext::No, 1453 /*IsClassName=*/true); 1454 1455 assert(Tok.is(tok::annot_typename) && "template-id -> type failed"); 1456 TypeResult Type = getTypeAnnotation(Tok); 1457 EndLocation = Tok.getAnnotationEndLoc(); 1458 ConsumeAnnotationToken(); 1459 return Type; 1460 } 1461 1462 // Fall through to produce an error below. 1463 } 1464 1465 if (Tok.isNot(tok::identifier)) { 1466 Diag(Tok, diag::err_expected_class_name); 1467 return true; 1468 } 1469 1470 IdentifierInfo *Id = Tok.getIdentifierInfo(); 1471 SourceLocation IdLoc = ConsumeToken(); 1472 1473 if (Tok.is(tok::less)) { 1474 // It looks the user intended to write a template-id here, but the 1475 // template-name was wrong. Try to fix that. 1476 // FIXME: Invoke ParseOptionalCXXScopeSpecifier in a "'template' is neither 1477 // required nor permitted" mode, and do this there. 1478 TemplateNameKind TNK = TNK_Non_template; 1479 TemplateTy Template; 1480 if (!Actions.DiagnoseUnknownTemplateName(*Id, IdLoc, getCurScope(), &SS, 1481 Template, TNK)) { 1482 Diag(IdLoc, diag::err_unknown_template_name) << Id; 1483 } 1484 1485 // Form the template name 1486 UnqualifiedId TemplateName; 1487 TemplateName.setIdentifier(Id, IdLoc); 1488 1489 // Parse the full template-id, then turn it into a type. 1490 if (AnnotateTemplateIdToken(Template, TNK, SS, SourceLocation(), 1491 TemplateName)) 1492 return true; 1493 if (Tok.is(tok::annot_template_id) && 1494 takeTemplateIdAnnotation(Tok)->mightBeType()) 1495 AnnotateTemplateIdTokenAsType(SS, ImplicitTypenameContext::No, 1496 /*IsClassName=*/true); 1497 1498 // If we didn't end up with a typename token, there's nothing more we 1499 // can do. 1500 if (Tok.isNot(tok::annot_typename)) 1501 return true; 1502 1503 // Retrieve the type from the annotation token, consume that token, and 1504 // return. 1505 EndLocation = Tok.getAnnotationEndLoc(); 1506 TypeResult Type = getTypeAnnotation(Tok); 1507 ConsumeAnnotationToken(); 1508 return Type; 1509 } 1510 1511 // We have an identifier; check whether it is actually a type. 1512 IdentifierInfo *CorrectedII = nullptr; 1513 ParsedType Type = Actions.getTypeName( 1514 *Id, IdLoc, getCurScope(), &SS, /*isClassName=*/true, false, nullptr, 1515 /*IsCtorOrDtorName=*/false, 1516 /*WantNontrivialTypeSourceInfo=*/true, 1517 /*IsClassTemplateDeductionContext=*/false, ImplicitTypenameContext::No, 1518 &CorrectedII); 1519 if (!Type) { 1520 Diag(IdLoc, diag::err_expected_class_name); 1521 return true; 1522 } 1523 1524 // Consume the identifier. 1525 EndLocation = IdLoc; 1526 1527 // Fake up a Declarator to use with ActOnTypeName. 1528 DeclSpec DS(AttrFactory); 1529 DS.SetRangeStart(IdLoc); 1530 DS.SetRangeEnd(EndLocation); 1531 DS.getTypeSpecScope() = SS; 1532 1533 const char *PrevSpec = nullptr; 1534 unsigned DiagID; 1535 DS.SetTypeSpecType(TST_typename, IdLoc, PrevSpec, DiagID, Type, 1536 Actions.getASTContext().getPrintingPolicy()); 1537 1538 Declarator DeclaratorInfo(DS, ParsedAttributesView::none(), 1539 DeclaratorContext::TypeName); 1540 return Actions.ActOnTypeName(DeclaratorInfo); 1541 } 1542 1543 void Parser::ParseMicrosoftInheritanceClassAttributes(ParsedAttributes &attrs) { 1544 while (Tok.isOneOf(tok::kw___single_inheritance, 1545 tok::kw___multiple_inheritance, 1546 tok::kw___virtual_inheritance)) { 1547 IdentifierInfo *AttrName = Tok.getIdentifierInfo(); 1548 auto Kind = Tok.getKind(); 1549 SourceLocation AttrNameLoc = ConsumeToken(); 1550 attrs.addNew(AttrName, AttrNameLoc, nullptr, AttrNameLoc, nullptr, 0, Kind); 1551 } 1552 } 1553 1554 void Parser::ParseNullabilityClassAttributes(ParsedAttributes &attrs) { 1555 while (Tok.is(tok::kw__Nullable)) { 1556 IdentifierInfo *AttrName = Tok.getIdentifierInfo(); 1557 auto Kind = Tok.getKind(); 1558 SourceLocation AttrNameLoc = ConsumeToken(); 1559 attrs.addNew(AttrName, AttrNameLoc, nullptr, AttrNameLoc, nullptr, 0, Kind); 1560 } 1561 } 1562 1563 /// Determine whether the following tokens are valid after a type-specifier 1564 /// which could be a standalone declaration. This will conservatively return 1565 /// true if there's any doubt, and is appropriate for insert-';' fixits. 1566 bool Parser::isValidAfterTypeSpecifier(bool CouldBeBitfield) { 1567 // This switch enumerates the valid "follow" set for type-specifiers. 1568 switch (Tok.getKind()) { 1569 default: 1570 if (Tok.isRegularKeywordAttribute()) 1571 return true; 1572 break; 1573 case tok::semi: // struct foo {...} ; 1574 case tok::star: // struct foo {...} * P; 1575 case tok::amp: // struct foo {...} & R = ... 1576 case tok::ampamp: // struct foo {...} && R = ... 1577 case tok::identifier: // struct foo {...} V ; 1578 case tok::r_paren: //(struct foo {...} ) {4} 1579 case tok::coloncolon: // struct foo {...} :: a::b; 1580 case tok::annot_cxxscope: // struct foo {...} a:: b; 1581 case tok::annot_typename: // struct foo {...} a ::b; 1582 case tok::annot_template_id: // struct foo {...} a<int> ::b; 1583 case tok::kw_decltype: // struct foo {...} decltype (a)::b; 1584 case tok::l_paren: // struct foo {...} ( x); 1585 case tok::comma: // __builtin_offsetof(struct foo{...} , 1586 case tok::kw_operator: // struct foo operator ++() {...} 1587 case tok::kw___declspec: // struct foo {...} __declspec(...) 1588 case tok::l_square: // void f(struct f [ 3]) 1589 case tok::ellipsis: // void f(struct f ... [Ns]) 1590 // FIXME: we should emit semantic diagnostic when declaration 1591 // attribute is in type attribute position. 1592 case tok::kw___attribute: // struct foo __attribute__((used)) x; 1593 case tok::annot_pragma_pack: // struct foo {...} _Pragma(pack(pop)); 1594 // struct foo {...} _Pragma(section(...)); 1595 case tok::annot_pragma_ms_pragma: 1596 // struct foo {...} _Pragma(vtordisp(pop)); 1597 case tok::annot_pragma_ms_vtordisp: 1598 // struct foo {...} _Pragma(pointers_to_members(...)); 1599 case tok::annot_pragma_ms_pointers_to_members: 1600 return true; 1601 case tok::colon: 1602 return CouldBeBitfield || // enum E { ... } : 2; 1603 ColonIsSacred; // _Generic(..., enum E : 2); 1604 // Microsoft compatibility 1605 case tok::kw___cdecl: // struct foo {...} __cdecl x; 1606 case tok::kw___fastcall: // struct foo {...} __fastcall x; 1607 case tok::kw___stdcall: // struct foo {...} __stdcall x; 1608 case tok::kw___thiscall: // struct foo {...} __thiscall x; 1609 case tok::kw___vectorcall: // struct foo {...} __vectorcall x; 1610 // We will diagnose these calling-convention specifiers on non-function 1611 // declarations later, so claim they are valid after a type specifier. 1612 return getLangOpts().MicrosoftExt; 1613 // Type qualifiers 1614 case tok::kw_const: // struct foo {...} const x; 1615 case tok::kw_volatile: // struct foo {...} volatile x; 1616 case tok::kw_restrict: // struct foo {...} restrict x; 1617 case tok::kw__Atomic: // struct foo {...} _Atomic x; 1618 case tok::kw___unaligned: // struct foo {...} __unaligned *x; 1619 // Function specifiers 1620 // Note, no 'explicit'. An explicit function must be either a conversion 1621 // operator or a constructor. Either way, it can't have a return type. 1622 case tok::kw_inline: // struct foo inline f(); 1623 case tok::kw_virtual: // struct foo virtual f(); 1624 case tok::kw_friend: // struct foo friend f(); 1625 // Storage-class specifiers 1626 case tok::kw_static: // struct foo {...} static x; 1627 case tok::kw_extern: // struct foo {...} extern x; 1628 case tok::kw_typedef: // struct foo {...} typedef x; 1629 case tok::kw_register: // struct foo {...} register x; 1630 case tok::kw_auto: // struct foo {...} auto x; 1631 case tok::kw_mutable: // struct foo {...} mutable x; 1632 case tok::kw_thread_local: // struct foo {...} thread_local x; 1633 case tok::kw_constexpr: // struct foo {...} constexpr x; 1634 case tok::kw_consteval: // struct foo {...} consteval x; 1635 case tok::kw_constinit: // struct foo {...} constinit x; 1636 // As shown above, type qualifiers and storage class specifiers absolutely 1637 // can occur after class specifiers according to the grammar. However, 1638 // almost no one actually writes code like this. If we see one of these, 1639 // it is much more likely that someone missed a semi colon and the 1640 // type/storage class specifier we're seeing is part of the *next* 1641 // intended declaration, as in: 1642 // 1643 // struct foo { ... } 1644 // typedef int X; 1645 // 1646 // We'd really like to emit a missing semicolon error instead of emitting 1647 // an error on the 'int' saying that you can't have two type specifiers in 1648 // the same declaration of X. Because of this, we look ahead past this 1649 // token to see if it's a type specifier. If so, we know the code is 1650 // otherwise invalid, so we can produce the expected semi error. 1651 if (!isKnownToBeTypeSpecifier(NextToken())) 1652 return true; 1653 break; 1654 case tok::r_brace: // struct bar { struct foo {...} } 1655 // Missing ';' at end of struct is accepted as an extension in C mode. 1656 if (!getLangOpts().CPlusPlus) 1657 return true; 1658 break; 1659 case tok::greater: 1660 // template<class T = class X> 1661 return getLangOpts().CPlusPlus; 1662 } 1663 return false; 1664 } 1665 1666 /// ParseClassSpecifier - Parse a C++ class-specifier [C++ class] or 1667 /// elaborated-type-specifier [C++ dcl.type.elab]; we can't tell which 1668 /// until we reach the start of a definition or see a token that 1669 /// cannot start a definition. 1670 /// 1671 /// class-specifier: [C++ class] 1672 /// class-head '{' member-specification[opt] '}' 1673 /// class-head '{' member-specification[opt] '}' attributes[opt] 1674 /// class-head: 1675 /// class-key identifier[opt] base-clause[opt] 1676 /// class-key nested-name-specifier identifier base-clause[opt] 1677 /// class-key nested-name-specifier[opt] simple-template-id 1678 /// base-clause[opt] 1679 /// [GNU] class-key attributes[opt] identifier[opt] base-clause[opt] 1680 /// [GNU] class-key attributes[opt] nested-name-specifier 1681 /// identifier base-clause[opt] 1682 /// [GNU] class-key attributes[opt] nested-name-specifier[opt] 1683 /// simple-template-id base-clause[opt] 1684 /// class-key: 1685 /// 'class' 1686 /// 'struct' 1687 /// 'union' 1688 /// 1689 /// elaborated-type-specifier: [C++ dcl.type.elab] 1690 /// class-key ::[opt] nested-name-specifier[opt] identifier 1691 /// class-key ::[opt] nested-name-specifier[opt] 'template'[opt] 1692 /// simple-template-id 1693 /// 1694 /// Note that the C++ class-specifier and elaborated-type-specifier, 1695 /// together, subsume the C99 struct-or-union-specifier: 1696 /// 1697 /// struct-or-union-specifier: [C99 6.7.2.1] 1698 /// struct-or-union identifier[opt] '{' struct-contents '}' 1699 /// struct-or-union identifier 1700 /// [GNU] struct-or-union attributes[opt] identifier[opt] '{' struct-contents 1701 /// '}' attributes[opt] 1702 /// [GNU] struct-or-union attributes[opt] identifier 1703 /// struct-or-union: 1704 /// 'struct' 1705 /// 'union' 1706 void Parser::ParseClassSpecifier(tok::TokenKind TagTokKind, 1707 SourceLocation StartLoc, DeclSpec &DS, 1708 ParsedTemplateInfo &TemplateInfo, 1709 AccessSpecifier AS, bool EnteringContext, 1710 DeclSpecContext DSC, 1711 ParsedAttributes &Attributes) { 1712 DeclSpec::TST TagType; 1713 if (TagTokKind == tok::kw_struct) 1714 TagType = DeclSpec::TST_struct; 1715 else if (TagTokKind == tok::kw___interface) 1716 TagType = DeclSpec::TST_interface; 1717 else if (TagTokKind == tok::kw_class) 1718 TagType = DeclSpec::TST_class; 1719 else { 1720 assert(TagTokKind == tok::kw_union && "Not a class specifier"); 1721 TagType = DeclSpec::TST_union; 1722 } 1723 1724 if (Tok.is(tok::code_completion)) { 1725 // Code completion for a struct, class, or union name. 1726 cutOffParsing(); 1727 Actions.CodeCompletion().CodeCompleteTag(getCurScope(), TagType); 1728 return; 1729 } 1730 1731 // C++20 [temp.class.spec] 13.7.5/10 1732 // The usual access checking rules do not apply to non-dependent names 1733 // used to specify template arguments of the simple-template-id of the 1734 // partial specialization. 1735 // C++20 [temp.spec] 13.9/6: 1736 // The usual access checking rules do not apply to names in a declaration 1737 // of an explicit instantiation or explicit specialization... 1738 const bool shouldDelayDiagsInTag = 1739 (TemplateInfo.Kind != ParsedTemplateInfo::NonTemplate); 1740 SuppressAccessChecks diagsFromTag(*this, shouldDelayDiagsInTag); 1741 1742 ParsedAttributes attrs(AttrFactory); 1743 // If attributes exist after tag, parse them. 1744 for (;;) { 1745 MaybeParseAttributes(PAKM_CXX11 | PAKM_Declspec | PAKM_GNU, attrs); 1746 // Parse inheritance specifiers. 1747 if (Tok.isOneOf(tok::kw___single_inheritance, 1748 tok::kw___multiple_inheritance, 1749 tok::kw___virtual_inheritance)) { 1750 ParseMicrosoftInheritanceClassAttributes(attrs); 1751 continue; 1752 } 1753 if (Tok.is(tok::kw__Nullable)) { 1754 ParseNullabilityClassAttributes(attrs); 1755 continue; 1756 } 1757 break; 1758 } 1759 1760 // Source location used by FIXIT to insert misplaced 1761 // C++11 attributes 1762 SourceLocation AttrFixitLoc = Tok.getLocation(); 1763 1764 if (TagType == DeclSpec::TST_struct && Tok.isNot(tok::identifier) && 1765 !Tok.isAnnotation() && Tok.getIdentifierInfo() && 1766 Tok.isOneOf( 1767 #define TRANSFORM_TYPE_TRAIT_DEF(_, Trait) tok::kw___##Trait, 1768 #include "clang/Basic/TransformTypeTraits.def" 1769 tok::kw___is_abstract, 1770 tok::kw___is_aggregate, 1771 tok::kw___is_arithmetic, 1772 tok::kw___is_array, 1773 tok::kw___is_assignable, 1774 tok::kw___is_base_of, 1775 tok::kw___is_bounded_array, 1776 tok::kw___is_class, 1777 tok::kw___is_complete_type, 1778 tok::kw___is_compound, 1779 tok::kw___is_const, 1780 tok::kw___is_constructible, 1781 tok::kw___is_convertible, 1782 tok::kw___is_convertible_to, 1783 tok::kw___is_destructible, 1784 tok::kw___is_empty, 1785 tok::kw___is_enum, 1786 tok::kw___is_floating_point, 1787 tok::kw___is_final, 1788 tok::kw___is_function, 1789 tok::kw___is_fundamental, 1790 tok::kw___is_integral, 1791 tok::kw___is_interface_class, 1792 tok::kw___is_literal, 1793 tok::kw___is_lvalue_expr, 1794 tok::kw___is_lvalue_reference, 1795 tok::kw___is_member_function_pointer, 1796 tok::kw___is_member_object_pointer, 1797 tok::kw___is_member_pointer, 1798 tok::kw___is_nothrow_assignable, 1799 tok::kw___is_nothrow_constructible, 1800 tok::kw___is_nothrow_convertible, 1801 tok::kw___is_nothrow_destructible, 1802 tok::kw___is_nullptr, 1803 tok::kw___is_object, 1804 tok::kw___is_pod, 1805 tok::kw___is_pointer, 1806 tok::kw___is_polymorphic, 1807 tok::kw___is_reference, 1808 tok::kw___is_referenceable, 1809 tok::kw___is_rvalue_expr, 1810 tok::kw___is_rvalue_reference, 1811 tok::kw___is_same, 1812 tok::kw___is_scalar, 1813 tok::kw___is_scoped_enum, 1814 tok::kw___is_sealed, 1815 tok::kw___is_signed, 1816 tok::kw___is_standard_layout, 1817 tok::kw___is_trivial, 1818 tok::kw___is_trivially_equality_comparable, 1819 tok::kw___is_trivially_assignable, 1820 tok::kw___is_trivially_constructible, 1821 tok::kw___is_trivially_copyable, 1822 tok::kw___is_unbounded_array, 1823 tok::kw___is_union, 1824 tok::kw___is_unsigned, 1825 tok::kw___is_void, 1826 tok::kw___is_volatile 1827 )) 1828 // GNU libstdc++ 4.2 and libc++ use certain intrinsic names as the 1829 // name of struct templates, but some are keywords in GCC >= 4.3 1830 // and Clang. Therefore, when we see the token sequence "struct 1831 // X", make X into a normal identifier rather than a keyword, to 1832 // allow libstdc++ 4.2 and libc++ to work properly. 1833 TryKeywordIdentFallback(true); 1834 1835 struct PreserveAtomicIdentifierInfoRAII { 1836 PreserveAtomicIdentifierInfoRAII(Token &Tok, bool Enabled) 1837 : AtomicII(nullptr) { 1838 if (!Enabled) 1839 return; 1840 assert(Tok.is(tok::kw__Atomic)); 1841 AtomicII = Tok.getIdentifierInfo(); 1842 AtomicII->revertTokenIDToIdentifier(); 1843 Tok.setKind(tok::identifier); 1844 } 1845 ~PreserveAtomicIdentifierInfoRAII() { 1846 if (!AtomicII) 1847 return; 1848 AtomicII->revertIdentifierToTokenID(tok::kw__Atomic); 1849 } 1850 IdentifierInfo *AtomicII; 1851 }; 1852 1853 // HACK: MSVC doesn't consider _Atomic to be a keyword and its STL 1854 // implementation for VS2013 uses _Atomic as an identifier for one of the 1855 // classes in <atomic>. When we are parsing 'struct _Atomic', don't consider 1856 // '_Atomic' to be a keyword. We are careful to undo this so that clang can 1857 // use '_Atomic' in its own header files. 1858 bool ShouldChangeAtomicToIdentifier = getLangOpts().MSVCCompat && 1859 Tok.is(tok::kw__Atomic) && 1860 TagType == DeclSpec::TST_struct; 1861 PreserveAtomicIdentifierInfoRAII AtomicTokenGuard( 1862 Tok, ShouldChangeAtomicToIdentifier); 1863 1864 // Parse the (optional) nested-name-specifier. 1865 CXXScopeSpec &SS = DS.getTypeSpecScope(); 1866 if (getLangOpts().CPlusPlus) { 1867 // "FOO : BAR" is not a potential typo for "FOO::BAR". In this context it 1868 // is a base-specifier-list. 1869 ColonProtectionRAIIObject X(*this); 1870 1871 CXXScopeSpec Spec; 1872 if (TemplateInfo.TemplateParams) 1873 Spec.setTemplateParamLists(*TemplateInfo.TemplateParams); 1874 1875 bool HasValidSpec = true; 1876 if (ParseOptionalCXXScopeSpecifier(Spec, /*ObjectType=*/nullptr, 1877 /*ObjectHasErrors=*/false, 1878 EnteringContext)) { 1879 DS.SetTypeSpecError(); 1880 HasValidSpec = false; 1881 } 1882 if (Spec.isSet()) 1883 if (Tok.isNot(tok::identifier) && Tok.isNot(tok::annot_template_id)) { 1884 Diag(Tok, diag::err_expected) << tok::identifier; 1885 HasValidSpec = false; 1886 } 1887 if (HasValidSpec) 1888 SS = Spec; 1889 } 1890 1891 TemplateParameterLists *TemplateParams = TemplateInfo.TemplateParams; 1892 1893 auto RecoverFromUndeclaredTemplateName = [&](IdentifierInfo *Name, 1894 SourceLocation NameLoc, 1895 SourceRange TemplateArgRange, 1896 bool KnownUndeclared) { 1897 Diag(NameLoc, diag::err_explicit_spec_non_template) 1898 << (TemplateInfo.Kind == ParsedTemplateInfo::ExplicitInstantiation) 1899 << TagTokKind << Name << TemplateArgRange << KnownUndeclared; 1900 1901 // Strip off the last template parameter list if it was empty, since 1902 // we've removed its template argument list. 1903 if (TemplateParams && TemplateInfo.LastParameterListWasEmpty) { 1904 if (TemplateParams->size() > 1) { 1905 TemplateParams->pop_back(); 1906 } else { 1907 TemplateParams = nullptr; 1908 TemplateInfo.Kind = ParsedTemplateInfo::NonTemplate; 1909 } 1910 } else if (TemplateInfo.Kind == ParsedTemplateInfo::ExplicitInstantiation) { 1911 // Pretend this is just a forward declaration. 1912 TemplateParams = nullptr; 1913 TemplateInfo.Kind = ParsedTemplateInfo::NonTemplate; 1914 TemplateInfo.TemplateLoc = SourceLocation(); 1915 TemplateInfo.ExternLoc = SourceLocation(); 1916 } 1917 }; 1918 1919 // Parse the (optional) class name or simple-template-id. 1920 IdentifierInfo *Name = nullptr; 1921 SourceLocation NameLoc; 1922 TemplateIdAnnotation *TemplateId = nullptr; 1923 if (Tok.is(tok::identifier)) { 1924 Name = Tok.getIdentifierInfo(); 1925 NameLoc = ConsumeToken(); 1926 DS.SetRangeEnd(NameLoc); 1927 1928 if (Tok.is(tok::less) && getLangOpts().CPlusPlus) { 1929 // The name was supposed to refer to a template, but didn't. 1930 // Eat the template argument list and try to continue parsing this as 1931 // a class (or template thereof). 1932 TemplateArgList TemplateArgs; 1933 SourceLocation LAngleLoc, RAngleLoc; 1934 if (ParseTemplateIdAfterTemplateName(true, LAngleLoc, TemplateArgs, 1935 RAngleLoc)) { 1936 // We couldn't parse the template argument list at all, so don't 1937 // try to give any location information for the list. 1938 LAngleLoc = RAngleLoc = SourceLocation(); 1939 } 1940 RecoverFromUndeclaredTemplateName( 1941 Name, NameLoc, SourceRange(LAngleLoc, RAngleLoc), false); 1942 } 1943 } else if (Tok.is(tok::annot_template_id)) { 1944 TemplateId = takeTemplateIdAnnotation(Tok); 1945 NameLoc = ConsumeAnnotationToken(); 1946 1947 if (TemplateId->Kind == TNK_Undeclared_template) { 1948 // Try to resolve the template name to a type template. May update Kind. 1949 Actions.ActOnUndeclaredTypeTemplateName( 1950 getCurScope(), TemplateId->Template, TemplateId->Kind, NameLoc, Name); 1951 if (TemplateId->Kind == TNK_Undeclared_template) { 1952 RecoverFromUndeclaredTemplateName( 1953 Name, NameLoc, 1954 SourceRange(TemplateId->LAngleLoc, TemplateId->RAngleLoc), true); 1955 TemplateId = nullptr; 1956 } 1957 } 1958 1959 if (TemplateId && !TemplateId->mightBeType()) { 1960 // The template-name in the simple-template-id refers to 1961 // something other than a type template. Give an appropriate 1962 // error message and skip to the ';'. 1963 SourceRange Range(NameLoc); 1964 if (SS.isNotEmpty()) 1965 Range.setBegin(SS.getBeginLoc()); 1966 1967 // FIXME: Name may be null here. 1968 Diag(TemplateId->LAngleLoc, diag::err_template_spec_syntax_non_template) 1969 << TemplateId->Name << static_cast<int>(TemplateId->Kind) << Range; 1970 1971 DS.SetTypeSpecError(); 1972 SkipUntil(tok::semi, StopBeforeMatch); 1973 return; 1974 } 1975 } 1976 1977 // There are four options here. 1978 // - If we are in a trailing return type, this is always just a reference, 1979 // and we must not try to parse a definition. For instance, 1980 // [] () -> struct S { }; 1981 // does not define a type. 1982 // - If we have 'struct foo {...', 'struct foo :...', 1983 // 'struct foo final :' or 'struct foo final {', then this is a definition. 1984 // - If we have 'struct foo;', then this is either a forward declaration 1985 // or a friend declaration, which have to be treated differently. 1986 // - Otherwise we have something like 'struct foo xyz', a reference. 1987 // 1988 // We also detect these erroneous cases to provide better diagnostic for 1989 // C++11 attributes parsing. 1990 // - attributes follow class name: 1991 // struct foo [[]] {}; 1992 // - attributes appear before or after 'final': 1993 // struct foo [[]] final [[]] {}; 1994 // 1995 // However, in type-specifier-seq's, things look like declarations but are 1996 // just references, e.g. 1997 // new struct s; 1998 // or 1999 // &T::operator struct s; 2000 // For these, DSC is DeclSpecContext::DSC_type_specifier or 2001 // DeclSpecContext::DSC_alias_declaration. 2002 2003 // If there are attributes after class name, parse them. 2004 MaybeParseCXX11Attributes(Attributes); 2005 2006 const PrintingPolicy &Policy = Actions.getASTContext().getPrintingPolicy(); 2007 TagUseKind TUK; 2008 if (isDefiningTypeSpecifierContext(DSC, getLangOpts().CPlusPlus) == 2009 AllowDefiningTypeSpec::No || 2010 (getLangOpts().OpenMP && OpenMPDirectiveParsing)) 2011 TUK = TagUseKind::Reference; 2012 else if (Tok.is(tok::l_brace) || 2013 (DSC != DeclSpecContext::DSC_association && 2014 getLangOpts().CPlusPlus && Tok.is(tok::colon)) || 2015 (isClassCompatibleKeyword() && 2016 (NextToken().is(tok::l_brace) || NextToken().is(tok::colon)))) { 2017 if (DS.isFriendSpecified()) { 2018 // C++ [class.friend]p2: 2019 // A class shall not be defined in a friend declaration. 2020 Diag(Tok.getLocation(), diag::err_friend_decl_defines_type) 2021 << SourceRange(DS.getFriendSpecLoc()); 2022 2023 // Skip everything up to the semicolon, so that this looks like a proper 2024 // friend class (or template thereof) declaration. 2025 SkipUntil(tok::semi, StopBeforeMatch); 2026 TUK = TagUseKind::Friend; 2027 } else { 2028 // Okay, this is a class definition. 2029 TUK = TagUseKind::Definition; 2030 } 2031 } else if (isClassCompatibleKeyword() && 2032 (NextToken().is(tok::l_square) || 2033 NextToken().is(tok::kw_alignas) || 2034 NextToken().isRegularKeywordAttribute() || 2035 isCXX11VirtSpecifier(NextToken()) != VirtSpecifiers::VS_None)) { 2036 // We can't tell if this is a definition or reference 2037 // until we skipped the 'final' and C++11 attribute specifiers. 2038 TentativeParsingAction PA(*this); 2039 2040 // Skip the 'final', abstract'... keywords. 2041 while (isClassCompatibleKeyword()) { 2042 ConsumeToken(); 2043 } 2044 2045 // Skip C++11 attribute specifiers. 2046 while (true) { 2047 if (Tok.is(tok::l_square) && NextToken().is(tok::l_square)) { 2048 ConsumeBracket(); 2049 if (!SkipUntil(tok::r_square, StopAtSemi)) 2050 break; 2051 } else if (Tok.is(tok::kw_alignas) && NextToken().is(tok::l_paren)) { 2052 ConsumeToken(); 2053 ConsumeParen(); 2054 if (!SkipUntil(tok::r_paren, StopAtSemi)) 2055 break; 2056 } else if (Tok.isRegularKeywordAttribute()) { 2057 bool TakesArgs = doesKeywordAttributeTakeArgs(Tok.getKind()); 2058 ConsumeToken(); 2059 if (TakesArgs) { 2060 BalancedDelimiterTracker T(*this, tok::l_paren); 2061 if (!T.consumeOpen()) 2062 T.skipToEnd(); 2063 } 2064 } else { 2065 break; 2066 } 2067 } 2068 2069 if (Tok.isOneOf(tok::l_brace, tok::colon)) 2070 TUK = TagUseKind::Definition; 2071 else 2072 TUK = TagUseKind::Reference; 2073 2074 PA.Revert(); 2075 } else if (!isTypeSpecifier(DSC) && 2076 (Tok.is(tok::semi) || 2077 (Tok.isAtStartOfLine() && !isValidAfterTypeSpecifier(false)))) { 2078 TUK = DS.isFriendSpecified() ? TagUseKind::Friend : TagUseKind::Declaration; 2079 if (Tok.isNot(tok::semi)) { 2080 const PrintingPolicy &PPol = Actions.getASTContext().getPrintingPolicy(); 2081 // A semicolon was missing after this declaration. Diagnose and recover. 2082 ExpectAndConsume(tok::semi, diag::err_expected_after, 2083 DeclSpec::getSpecifierName(TagType, PPol)); 2084 PP.EnterToken(Tok, /*IsReinject*/ true); 2085 Tok.setKind(tok::semi); 2086 } 2087 } else 2088 TUK = TagUseKind::Reference; 2089 2090 // Forbid misplaced attributes. In cases of a reference, we pass attributes 2091 // to caller to handle. 2092 if (TUK != TagUseKind::Reference) { 2093 // If this is not a reference, then the only possible 2094 // valid place for C++11 attributes to appear here 2095 // is between class-key and class-name. If there are 2096 // any attributes after class-name, we try a fixit to move 2097 // them to the right place. 2098 SourceRange AttrRange = Attributes.Range; 2099 if (AttrRange.isValid()) { 2100 auto *FirstAttr = Attributes.empty() ? nullptr : &Attributes.front(); 2101 auto Loc = AttrRange.getBegin(); 2102 (FirstAttr && FirstAttr->isRegularKeywordAttribute() 2103 ? Diag(Loc, diag::err_keyword_not_allowed) << FirstAttr 2104 : Diag(Loc, diag::err_attributes_not_allowed)) 2105 << AttrRange 2106 << FixItHint::CreateInsertionFromRange( 2107 AttrFixitLoc, CharSourceRange(AttrRange, true)) 2108 << FixItHint::CreateRemoval(AttrRange); 2109 2110 // Recover by adding misplaced attributes to the attribute list 2111 // of the class so they can be applied on the class later. 2112 attrs.takeAllFrom(Attributes); 2113 } 2114 } 2115 2116 if (!Name && !TemplateId && 2117 (DS.getTypeSpecType() == DeclSpec::TST_error || 2118 TUK != TagUseKind::Definition)) { 2119 if (DS.getTypeSpecType() != DeclSpec::TST_error) { 2120 // We have a declaration or reference to an anonymous class. 2121 Diag(StartLoc, diag::err_anon_type_definition) 2122 << DeclSpec::getSpecifierName(TagType, Policy); 2123 } 2124 2125 // If we are parsing a definition and stop at a base-clause, continue on 2126 // until the semicolon. Continuing from the comma will just trick us into 2127 // thinking we are seeing a variable declaration. 2128 if (TUK == TagUseKind::Definition && Tok.is(tok::colon)) 2129 SkipUntil(tok::semi, StopBeforeMatch); 2130 else 2131 SkipUntil(tok::comma, StopAtSemi); 2132 return; 2133 } 2134 2135 // Create the tag portion of the class or class template. 2136 DeclResult TagOrTempResult = true; // invalid 2137 TypeResult TypeResult = true; // invalid 2138 2139 bool Owned = false; 2140 SkipBodyInfo SkipBody; 2141 if (TemplateId) { 2142 // Explicit specialization, class template partial specialization, 2143 // or explicit instantiation. 2144 ASTTemplateArgsPtr TemplateArgsPtr(TemplateId->getTemplateArgs(), 2145 TemplateId->NumArgs); 2146 if (TemplateId->isInvalid()) { 2147 // Can't build the declaration. 2148 } else if (TemplateInfo.Kind == ParsedTemplateInfo::ExplicitInstantiation && 2149 TUK == TagUseKind::Declaration) { 2150 // This is an explicit instantiation of a class template. 2151 ProhibitCXX11Attributes(attrs, diag::err_attributes_not_allowed, 2152 diag::err_keyword_not_allowed, 2153 /*DiagnoseEmptyAttrs=*/true); 2154 2155 TagOrTempResult = Actions.ActOnExplicitInstantiation( 2156 getCurScope(), TemplateInfo.ExternLoc, TemplateInfo.TemplateLoc, 2157 TagType, StartLoc, SS, TemplateId->Template, 2158 TemplateId->TemplateNameLoc, TemplateId->LAngleLoc, TemplateArgsPtr, 2159 TemplateId->RAngleLoc, attrs); 2160 2161 // Friend template-ids are treated as references unless 2162 // they have template headers, in which case they're ill-formed 2163 // (FIXME: "template <class T> friend class A<T>::B<int>;"). 2164 // We diagnose this error in ActOnClassTemplateSpecialization. 2165 } else if (TUK == TagUseKind::Reference || 2166 (TUK == TagUseKind::Friend && 2167 TemplateInfo.Kind == ParsedTemplateInfo::NonTemplate)) { 2168 ProhibitCXX11Attributes(attrs, diag::err_attributes_not_allowed, 2169 diag::err_keyword_not_allowed, 2170 /*DiagnoseEmptyAttrs=*/true); 2171 TypeResult = Actions.ActOnTagTemplateIdType( 2172 TUK, TagType, StartLoc, SS, TemplateId->TemplateKWLoc, 2173 TemplateId->Template, TemplateId->TemplateNameLoc, 2174 TemplateId->LAngleLoc, TemplateArgsPtr, TemplateId->RAngleLoc); 2175 } else { 2176 // This is an explicit specialization or a class template 2177 // partial specialization. 2178 TemplateParameterLists FakedParamLists; 2179 if (TemplateInfo.Kind == ParsedTemplateInfo::ExplicitInstantiation) { 2180 // This looks like an explicit instantiation, because we have 2181 // something like 2182 // 2183 // template class Foo<X> 2184 // 2185 // but it actually has a definition. Most likely, this was 2186 // meant to be an explicit specialization, but the user forgot 2187 // the '<>' after 'template'. 2188 // It this is friend declaration however, since it cannot have a 2189 // template header, it is most likely that the user meant to 2190 // remove the 'template' keyword. 2191 assert((TUK == TagUseKind::Definition || TUK == TagUseKind::Friend) && 2192 "Expected a definition here"); 2193 2194 if (TUK == TagUseKind::Friend) { 2195 Diag(DS.getFriendSpecLoc(), diag::err_friend_explicit_instantiation); 2196 TemplateParams = nullptr; 2197 } else { 2198 SourceLocation LAngleLoc = 2199 PP.getLocForEndOfToken(TemplateInfo.TemplateLoc); 2200 Diag(TemplateId->TemplateNameLoc, 2201 diag::err_explicit_instantiation_with_definition) 2202 << SourceRange(TemplateInfo.TemplateLoc) 2203 << FixItHint::CreateInsertion(LAngleLoc, "<>"); 2204 2205 // Create a fake template parameter list that contains only 2206 // "template<>", so that we treat this construct as a class 2207 // template specialization. 2208 FakedParamLists.push_back(Actions.ActOnTemplateParameterList( 2209 0, SourceLocation(), TemplateInfo.TemplateLoc, LAngleLoc, 2210 std::nullopt, LAngleLoc, nullptr)); 2211 TemplateParams = &FakedParamLists; 2212 } 2213 } 2214 2215 // Build the class template specialization. 2216 TagOrTempResult = Actions.ActOnClassTemplateSpecialization( 2217 getCurScope(), TagType, TUK, StartLoc, DS.getModulePrivateSpecLoc(), 2218 SS, *TemplateId, attrs, 2219 MultiTemplateParamsArg(TemplateParams ? &(*TemplateParams)[0] 2220 : nullptr, 2221 TemplateParams ? TemplateParams->size() : 0), 2222 &SkipBody); 2223 } 2224 } else if (TemplateInfo.Kind == ParsedTemplateInfo::ExplicitInstantiation && 2225 TUK == TagUseKind::Declaration) { 2226 // Explicit instantiation of a member of a class template 2227 // specialization, e.g., 2228 // 2229 // template struct Outer<int>::Inner; 2230 // 2231 ProhibitAttributes(attrs); 2232 2233 TagOrTempResult = Actions.ActOnExplicitInstantiation( 2234 getCurScope(), TemplateInfo.ExternLoc, TemplateInfo.TemplateLoc, 2235 TagType, StartLoc, SS, Name, NameLoc, attrs); 2236 } else if (TUK == TagUseKind::Friend && 2237 TemplateInfo.Kind != ParsedTemplateInfo::NonTemplate) { 2238 ProhibitCXX11Attributes(attrs, diag::err_attributes_not_allowed, 2239 diag::err_keyword_not_allowed, 2240 /*DiagnoseEmptyAttrs=*/true); 2241 2242 TagOrTempResult = Actions.ActOnTemplatedFriendTag( 2243 getCurScope(), DS.getFriendSpecLoc(), TagType, StartLoc, SS, Name, 2244 NameLoc, attrs, 2245 MultiTemplateParamsArg(TemplateParams ? &(*TemplateParams)[0] : nullptr, 2246 TemplateParams ? TemplateParams->size() : 0)); 2247 } else { 2248 if (TUK != TagUseKind::Declaration && TUK != TagUseKind::Definition) 2249 ProhibitCXX11Attributes(attrs, diag::err_attributes_not_allowed, 2250 diag::err_keyword_not_allowed, 2251 /* DiagnoseEmptyAttrs=*/true); 2252 2253 if (TUK == TagUseKind::Definition && 2254 TemplateInfo.Kind == ParsedTemplateInfo::ExplicitInstantiation) { 2255 // If the declarator-id is not a template-id, issue a diagnostic and 2256 // recover by ignoring the 'template' keyword. 2257 Diag(Tok, diag::err_template_defn_explicit_instantiation) 2258 << 1 << FixItHint::CreateRemoval(TemplateInfo.TemplateLoc); 2259 TemplateParams = nullptr; 2260 } 2261 2262 bool IsDependent = false; 2263 2264 // Don't pass down template parameter lists if this is just a tag 2265 // reference. For example, we don't need the template parameters here: 2266 // template <class T> class A *makeA(T t); 2267 MultiTemplateParamsArg TParams; 2268 if (TUK != TagUseKind::Reference && TemplateParams) 2269 TParams = 2270 MultiTemplateParamsArg(&(*TemplateParams)[0], TemplateParams->size()); 2271 2272 stripTypeAttributesOffDeclSpec(attrs, DS, TUK); 2273 2274 // Declaration or definition of a class type 2275 TagOrTempResult = Actions.ActOnTag( 2276 getCurScope(), TagType, TUK, StartLoc, SS, Name, NameLoc, attrs, AS, 2277 DS.getModulePrivateSpecLoc(), TParams, Owned, IsDependent, 2278 SourceLocation(), false, clang::TypeResult(), 2279 DSC == DeclSpecContext::DSC_type_specifier, 2280 DSC == DeclSpecContext::DSC_template_param || 2281 DSC == DeclSpecContext::DSC_template_type_arg, 2282 OffsetOfState, &SkipBody); 2283 2284 // If ActOnTag said the type was dependent, try again with the 2285 // less common call. 2286 if (IsDependent) { 2287 assert(TUK == TagUseKind::Reference || TUK == TagUseKind::Friend); 2288 TypeResult = Actions.ActOnDependentTag(getCurScope(), TagType, TUK, SS, 2289 Name, StartLoc, NameLoc); 2290 } 2291 } 2292 2293 // If this is an elaborated type specifier in function template, 2294 // and we delayed diagnostics before, 2295 // just merge them into the current pool. 2296 if (shouldDelayDiagsInTag) { 2297 diagsFromTag.done(); 2298 if (TUK == TagUseKind::Reference && 2299 TemplateInfo.Kind == ParsedTemplateInfo::Template) 2300 diagsFromTag.redelay(); 2301 } 2302 2303 // If there is a body, parse it and inform the actions module. 2304 if (TUK == TagUseKind::Definition) { 2305 assert(Tok.is(tok::l_brace) || 2306 (getLangOpts().CPlusPlus && Tok.is(tok::colon)) || 2307 isClassCompatibleKeyword()); 2308 if (SkipBody.ShouldSkip) 2309 SkipCXXMemberSpecification(StartLoc, AttrFixitLoc, TagType, 2310 TagOrTempResult.get()); 2311 else if (getLangOpts().CPlusPlus) 2312 ParseCXXMemberSpecification(StartLoc, AttrFixitLoc, attrs, TagType, 2313 TagOrTempResult.get()); 2314 else { 2315 Decl *D = 2316 SkipBody.CheckSameAsPrevious ? SkipBody.New : TagOrTempResult.get(); 2317 // Parse the definition body. 2318 ParseStructUnionBody(StartLoc, TagType, cast<RecordDecl>(D)); 2319 if (SkipBody.CheckSameAsPrevious && 2320 !Actions.ActOnDuplicateDefinition(TagOrTempResult.get(), SkipBody)) { 2321 DS.SetTypeSpecError(); 2322 return; 2323 } 2324 } 2325 } 2326 2327 if (!TagOrTempResult.isInvalid()) 2328 // Delayed processing of attributes. 2329 Actions.ProcessDeclAttributeDelayed(TagOrTempResult.get(), attrs); 2330 2331 const char *PrevSpec = nullptr; 2332 unsigned DiagID; 2333 bool Result; 2334 if (!TypeResult.isInvalid()) { 2335 Result = DS.SetTypeSpecType(DeclSpec::TST_typename, StartLoc, 2336 NameLoc.isValid() ? NameLoc : StartLoc, 2337 PrevSpec, DiagID, TypeResult.get(), Policy); 2338 } else if (!TagOrTempResult.isInvalid()) { 2339 Result = DS.SetTypeSpecType( 2340 TagType, StartLoc, NameLoc.isValid() ? NameLoc : StartLoc, PrevSpec, 2341 DiagID, TagOrTempResult.get(), Owned, Policy); 2342 } else { 2343 DS.SetTypeSpecError(); 2344 return; 2345 } 2346 2347 if (Result) 2348 Diag(StartLoc, DiagID) << PrevSpec; 2349 2350 // At this point, we've successfully parsed a class-specifier in 'definition' 2351 // form (e.g. "struct foo { int x; }". While we could just return here, we're 2352 // going to look at what comes after it to improve error recovery. If an 2353 // impossible token occurs next, we assume that the programmer forgot a ; at 2354 // the end of the declaration and recover that way. 2355 // 2356 // Also enforce C++ [temp]p3: 2357 // In a template-declaration which defines a class, no declarator 2358 // is permitted. 2359 // 2360 // After a type-specifier, we don't expect a semicolon. This only happens in 2361 // C, since definitions are not permitted in this context in C++. 2362 if (TUK == TagUseKind::Definition && 2363 (getLangOpts().CPlusPlus || !isTypeSpecifier(DSC)) && 2364 (TemplateInfo.Kind || !isValidAfterTypeSpecifier(false))) { 2365 if (Tok.isNot(tok::semi)) { 2366 const PrintingPolicy &PPol = Actions.getASTContext().getPrintingPolicy(); 2367 ExpectAndConsume(tok::semi, diag::err_expected_after, 2368 DeclSpec::getSpecifierName(TagType, PPol)); 2369 // Push this token back into the preprocessor and change our current token 2370 // to ';' so that the rest of the code recovers as though there were an 2371 // ';' after the definition. 2372 PP.EnterToken(Tok, /*IsReinject=*/true); 2373 Tok.setKind(tok::semi); 2374 } 2375 } 2376 } 2377 2378 /// ParseBaseClause - Parse the base-clause of a C++ class [C++ class.derived]. 2379 /// 2380 /// base-clause : [C++ class.derived] 2381 /// ':' base-specifier-list 2382 /// base-specifier-list: 2383 /// base-specifier '...'[opt] 2384 /// base-specifier-list ',' base-specifier '...'[opt] 2385 void Parser::ParseBaseClause(Decl *ClassDecl) { 2386 assert(Tok.is(tok::colon) && "Not a base clause"); 2387 ConsumeToken(); 2388 2389 // Build up an array of parsed base specifiers. 2390 SmallVector<CXXBaseSpecifier *, 8> BaseInfo; 2391 2392 while (true) { 2393 // Parse a base-specifier. 2394 BaseResult Result = ParseBaseSpecifier(ClassDecl); 2395 if (Result.isInvalid()) { 2396 // Skip the rest of this base specifier, up until the comma or 2397 // opening brace. 2398 SkipUntil(tok::comma, tok::l_brace, StopAtSemi | StopBeforeMatch); 2399 } else { 2400 // Add this to our array of base specifiers. 2401 BaseInfo.push_back(Result.get()); 2402 } 2403 2404 // If the next token is a comma, consume it and keep reading 2405 // base-specifiers. 2406 if (!TryConsumeToken(tok::comma)) 2407 break; 2408 } 2409 2410 // Attach the base specifiers 2411 Actions.ActOnBaseSpecifiers(ClassDecl, BaseInfo); 2412 } 2413 2414 /// ParseBaseSpecifier - Parse a C++ base-specifier. A base-specifier is 2415 /// one entry in the base class list of a class specifier, for example: 2416 /// class foo : public bar, virtual private baz { 2417 /// 'public bar' and 'virtual private baz' are each base-specifiers. 2418 /// 2419 /// base-specifier: [C++ class.derived] 2420 /// attribute-specifier-seq[opt] base-type-specifier 2421 /// attribute-specifier-seq[opt] 'virtual' access-specifier[opt] 2422 /// base-type-specifier 2423 /// attribute-specifier-seq[opt] access-specifier 'virtual'[opt] 2424 /// base-type-specifier 2425 BaseResult Parser::ParseBaseSpecifier(Decl *ClassDecl) { 2426 bool IsVirtual = false; 2427 SourceLocation StartLoc = Tok.getLocation(); 2428 2429 ParsedAttributes Attributes(AttrFactory); 2430 MaybeParseCXX11Attributes(Attributes); 2431 2432 // Parse the 'virtual' keyword. 2433 if (TryConsumeToken(tok::kw_virtual)) 2434 IsVirtual = true; 2435 2436 CheckMisplacedCXX11Attribute(Attributes, StartLoc); 2437 2438 // Parse an (optional) access specifier. 2439 AccessSpecifier Access = getAccessSpecifierIfPresent(); 2440 if (Access != AS_none) { 2441 ConsumeToken(); 2442 if (getLangOpts().HLSL) 2443 Diag(Tok.getLocation(), diag::ext_hlsl_access_specifiers); 2444 } 2445 2446 CheckMisplacedCXX11Attribute(Attributes, StartLoc); 2447 2448 // Parse the 'virtual' keyword (again!), in case it came after the 2449 // access specifier. 2450 if (Tok.is(tok::kw_virtual)) { 2451 SourceLocation VirtualLoc = ConsumeToken(); 2452 if (IsVirtual) { 2453 // Complain about duplicate 'virtual' 2454 Diag(VirtualLoc, diag::err_dup_virtual) 2455 << FixItHint::CreateRemoval(VirtualLoc); 2456 } 2457 2458 IsVirtual = true; 2459 } 2460 2461 CheckMisplacedCXX11Attribute(Attributes, StartLoc); 2462 2463 // Parse the class-name. 2464 2465 // HACK: MSVC doesn't consider _Atomic to be a keyword and its STL 2466 // implementation for VS2013 uses _Atomic as an identifier for one of the 2467 // classes in <atomic>. Treat '_Atomic' to be an identifier when we are 2468 // parsing the class-name for a base specifier. 2469 if (getLangOpts().MSVCCompat && Tok.is(tok::kw__Atomic) && 2470 NextToken().is(tok::less)) 2471 Tok.setKind(tok::identifier); 2472 2473 SourceLocation EndLocation; 2474 SourceLocation BaseLoc; 2475 TypeResult BaseType = ParseBaseTypeSpecifier(BaseLoc, EndLocation); 2476 if (BaseType.isInvalid()) 2477 return true; 2478 2479 // Parse the optional ellipsis (for a pack expansion). The ellipsis is 2480 // actually part of the base-specifier-list grammar productions, but we 2481 // parse it here for convenience. 2482 SourceLocation EllipsisLoc; 2483 TryConsumeToken(tok::ellipsis, EllipsisLoc); 2484 2485 // Find the complete source range for the base-specifier. 2486 SourceRange Range(StartLoc, EndLocation); 2487 2488 // Notify semantic analysis that we have parsed a complete 2489 // base-specifier. 2490 return Actions.ActOnBaseSpecifier(ClassDecl, Range, Attributes, IsVirtual, 2491 Access, BaseType.get(), BaseLoc, 2492 EllipsisLoc); 2493 } 2494 2495 /// getAccessSpecifierIfPresent - Determine whether the next token is 2496 /// a C++ access-specifier. 2497 /// 2498 /// access-specifier: [C++ class.derived] 2499 /// 'private' 2500 /// 'protected' 2501 /// 'public' 2502 AccessSpecifier Parser::getAccessSpecifierIfPresent() const { 2503 switch (Tok.getKind()) { 2504 default: 2505 return AS_none; 2506 case tok::kw_private: 2507 return AS_private; 2508 case tok::kw_protected: 2509 return AS_protected; 2510 case tok::kw_public: 2511 return AS_public; 2512 } 2513 } 2514 2515 /// If the given declarator has any parts for which parsing has to be 2516 /// delayed, e.g., default arguments or an exception-specification, create a 2517 /// late-parsed method declaration record to handle the parsing at the end of 2518 /// the class definition. 2519 void Parser::HandleMemberFunctionDeclDelays(Declarator &DeclaratorInfo, 2520 Decl *ThisDecl) { 2521 DeclaratorChunk::FunctionTypeInfo &FTI = DeclaratorInfo.getFunctionTypeInfo(); 2522 // If there was a late-parsed exception-specification, we'll need a 2523 // late parse 2524 bool NeedLateParse = FTI.getExceptionSpecType() == EST_Unparsed; 2525 2526 if (!NeedLateParse) { 2527 // Look ahead to see if there are any default args 2528 for (unsigned ParamIdx = 0; ParamIdx < FTI.NumParams; ++ParamIdx) { 2529 const auto *Param = cast<ParmVarDecl>(FTI.Params[ParamIdx].Param); 2530 if (Param->hasUnparsedDefaultArg()) { 2531 NeedLateParse = true; 2532 break; 2533 } 2534 } 2535 } 2536 2537 if (NeedLateParse) { 2538 // Push this method onto the stack of late-parsed method 2539 // declarations. 2540 auto LateMethod = new LateParsedMethodDeclaration(this, ThisDecl); 2541 getCurrentClass().LateParsedDeclarations.push_back(LateMethod); 2542 2543 // Push tokens for each parameter. Those that do not have defaults will be 2544 // NULL. We need to track all the parameters so that we can push them into 2545 // scope for later parameters and perhaps for the exception specification. 2546 LateMethod->DefaultArgs.reserve(FTI.NumParams); 2547 for (unsigned ParamIdx = 0; ParamIdx < FTI.NumParams; ++ParamIdx) 2548 LateMethod->DefaultArgs.push_back(LateParsedDefaultArgument( 2549 FTI.Params[ParamIdx].Param, 2550 std::move(FTI.Params[ParamIdx].DefaultArgTokens))); 2551 2552 // Stash the exception-specification tokens in the late-pased method. 2553 if (FTI.getExceptionSpecType() == EST_Unparsed) { 2554 LateMethod->ExceptionSpecTokens = FTI.ExceptionSpecTokens; 2555 FTI.ExceptionSpecTokens = nullptr; 2556 } 2557 } 2558 } 2559 2560 /// isCXX11VirtSpecifier - Determine whether the given token is a C++11 2561 /// virt-specifier. 2562 /// 2563 /// virt-specifier: 2564 /// override 2565 /// final 2566 /// __final 2567 VirtSpecifiers::Specifier Parser::isCXX11VirtSpecifier(const Token &Tok) const { 2568 if (!getLangOpts().CPlusPlus || Tok.isNot(tok::identifier)) 2569 return VirtSpecifiers::VS_None; 2570 2571 const IdentifierInfo *II = Tok.getIdentifierInfo(); 2572 2573 // Initialize the contextual keywords. 2574 if (!Ident_final) { 2575 Ident_final = &PP.getIdentifierTable().get("final"); 2576 if (getLangOpts().GNUKeywords) 2577 Ident_GNU_final = &PP.getIdentifierTable().get("__final"); 2578 if (getLangOpts().MicrosoftExt) { 2579 Ident_sealed = &PP.getIdentifierTable().get("sealed"); 2580 Ident_abstract = &PP.getIdentifierTable().get("abstract"); 2581 } 2582 Ident_override = &PP.getIdentifierTable().get("override"); 2583 } 2584 2585 if (II == Ident_override) 2586 return VirtSpecifiers::VS_Override; 2587 2588 if (II == Ident_sealed) 2589 return VirtSpecifiers::VS_Sealed; 2590 2591 if (II == Ident_abstract) 2592 return VirtSpecifiers::VS_Abstract; 2593 2594 if (II == Ident_final) 2595 return VirtSpecifiers::VS_Final; 2596 2597 if (II == Ident_GNU_final) 2598 return VirtSpecifiers::VS_GNU_Final; 2599 2600 return VirtSpecifiers::VS_None; 2601 } 2602 2603 /// ParseOptionalCXX11VirtSpecifierSeq - Parse a virt-specifier-seq. 2604 /// 2605 /// virt-specifier-seq: 2606 /// virt-specifier 2607 /// virt-specifier-seq virt-specifier 2608 void Parser::ParseOptionalCXX11VirtSpecifierSeq(VirtSpecifiers &VS, 2609 bool IsInterface, 2610 SourceLocation FriendLoc) { 2611 while (true) { 2612 VirtSpecifiers::Specifier Specifier = isCXX11VirtSpecifier(); 2613 if (Specifier == VirtSpecifiers::VS_None) 2614 return; 2615 2616 if (FriendLoc.isValid()) { 2617 Diag(Tok.getLocation(), diag::err_friend_decl_spec) 2618 << VirtSpecifiers::getSpecifierName(Specifier) 2619 << FixItHint::CreateRemoval(Tok.getLocation()) 2620 << SourceRange(FriendLoc, FriendLoc); 2621 ConsumeToken(); 2622 continue; 2623 } 2624 2625 // C++ [class.mem]p8: 2626 // A virt-specifier-seq shall contain at most one of each virt-specifier. 2627 const char *PrevSpec = nullptr; 2628 if (VS.SetSpecifier(Specifier, Tok.getLocation(), PrevSpec)) 2629 Diag(Tok.getLocation(), diag::err_duplicate_virt_specifier) 2630 << PrevSpec << FixItHint::CreateRemoval(Tok.getLocation()); 2631 2632 if (IsInterface && (Specifier == VirtSpecifiers::VS_Final || 2633 Specifier == VirtSpecifiers::VS_Sealed)) { 2634 Diag(Tok.getLocation(), diag::err_override_control_interface) 2635 << VirtSpecifiers::getSpecifierName(Specifier); 2636 } else if (Specifier == VirtSpecifiers::VS_Sealed) { 2637 Diag(Tok.getLocation(), diag::ext_ms_sealed_keyword); 2638 } else if (Specifier == VirtSpecifiers::VS_Abstract) { 2639 Diag(Tok.getLocation(), diag::ext_ms_abstract_keyword); 2640 } else if (Specifier == VirtSpecifiers::VS_GNU_Final) { 2641 Diag(Tok.getLocation(), diag::ext_warn_gnu_final); 2642 } else { 2643 Diag(Tok.getLocation(), 2644 getLangOpts().CPlusPlus11 2645 ? diag::warn_cxx98_compat_override_control_keyword 2646 : diag::ext_override_control_keyword) 2647 << VirtSpecifiers::getSpecifierName(Specifier); 2648 } 2649 ConsumeToken(); 2650 } 2651 } 2652 2653 /// isCXX11FinalKeyword - Determine whether the next token is a C++11 2654 /// 'final' or Microsoft 'sealed' contextual keyword. 2655 bool Parser::isCXX11FinalKeyword() const { 2656 VirtSpecifiers::Specifier Specifier = isCXX11VirtSpecifier(); 2657 return Specifier == VirtSpecifiers::VS_Final || 2658 Specifier == VirtSpecifiers::VS_GNU_Final || 2659 Specifier == VirtSpecifiers::VS_Sealed; 2660 } 2661 2662 /// isClassCompatibleKeyword - Determine whether the next token is a C++11 2663 /// 'final' or Microsoft 'sealed' or 'abstract' contextual keywords. 2664 bool Parser::isClassCompatibleKeyword() const { 2665 VirtSpecifiers::Specifier Specifier = isCXX11VirtSpecifier(); 2666 return Specifier == VirtSpecifiers::VS_Final || 2667 Specifier == VirtSpecifiers::VS_GNU_Final || 2668 Specifier == VirtSpecifiers::VS_Sealed || 2669 Specifier == VirtSpecifiers::VS_Abstract; 2670 } 2671 2672 /// Parse a C++ member-declarator up to, but not including, the optional 2673 /// brace-or-equal-initializer or pure-specifier. 2674 bool Parser::ParseCXXMemberDeclaratorBeforeInitializer( 2675 Declarator &DeclaratorInfo, VirtSpecifiers &VS, ExprResult &BitfieldSize, 2676 LateParsedAttrList &LateParsedAttrs) { 2677 // member-declarator: 2678 // declarator virt-specifier-seq[opt] pure-specifier[opt] 2679 // declarator requires-clause 2680 // declarator brace-or-equal-initializer[opt] 2681 // identifier attribute-specifier-seq[opt] ':' constant-expression 2682 // brace-or-equal-initializer[opt] 2683 // ':' constant-expression 2684 // 2685 // NOTE: the latter two productions are a proposed bugfix rather than the 2686 // current grammar rules as of C++20. 2687 if (Tok.isNot(tok::colon)) 2688 ParseDeclarator(DeclaratorInfo); 2689 else 2690 DeclaratorInfo.SetIdentifier(nullptr, Tok.getLocation()); 2691 2692 if (getLangOpts().HLSL) 2693 MaybeParseHLSLAnnotations(DeclaratorInfo, nullptr, 2694 /*CouldBeBitField*/ true); 2695 2696 if (!DeclaratorInfo.isFunctionDeclarator() && TryConsumeToken(tok::colon)) { 2697 assert(DeclaratorInfo.isPastIdentifier() && 2698 "don't know where identifier would go yet?"); 2699 BitfieldSize = ParseConstantExpression(); 2700 if (BitfieldSize.isInvalid()) 2701 SkipUntil(tok::comma, StopAtSemi | StopBeforeMatch); 2702 } else if (Tok.is(tok::kw_requires)) { 2703 ParseTrailingRequiresClause(DeclaratorInfo); 2704 } else { 2705 ParseOptionalCXX11VirtSpecifierSeq( 2706 VS, getCurrentClass().IsInterface, 2707 DeclaratorInfo.getDeclSpec().getFriendSpecLoc()); 2708 if (!VS.isUnset()) 2709 MaybeParseAndDiagnoseDeclSpecAfterCXX11VirtSpecifierSeq(DeclaratorInfo, 2710 VS); 2711 } 2712 2713 // If a simple-asm-expr is present, parse it. 2714 if (Tok.is(tok::kw_asm)) { 2715 SourceLocation Loc; 2716 ExprResult AsmLabel(ParseSimpleAsm(/*ForAsmLabel*/ true, &Loc)); 2717 if (AsmLabel.isInvalid()) 2718 SkipUntil(tok::comma, StopAtSemi | StopBeforeMatch); 2719 2720 DeclaratorInfo.setAsmLabel(AsmLabel.get()); 2721 DeclaratorInfo.SetRangeEnd(Loc); 2722 } 2723 2724 // If attributes exist after the declarator, but before an '{', parse them. 2725 // However, this does not apply for [[]] attributes (which could show up 2726 // before or after the __attribute__ attributes). 2727 DiagnoseAndSkipCXX11Attributes(); 2728 MaybeParseGNUAttributes(DeclaratorInfo, &LateParsedAttrs); 2729 DiagnoseAndSkipCXX11Attributes(); 2730 2731 // For compatibility with code written to older Clang, also accept a 2732 // virt-specifier *after* the GNU attributes. 2733 if (BitfieldSize.isUnset() && VS.isUnset()) { 2734 ParseOptionalCXX11VirtSpecifierSeq( 2735 VS, getCurrentClass().IsInterface, 2736 DeclaratorInfo.getDeclSpec().getFriendSpecLoc()); 2737 if (!VS.isUnset()) { 2738 // If we saw any GNU-style attributes that are known to GCC followed by a 2739 // virt-specifier, issue a GCC-compat warning. 2740 for (const ParsedAttr &AL : DeclaratorInfo.getAttributes()) 2741 if (AL.isKnownToGCC() && !AL.isCXX11Attribute()) 2742 Diag(AL.getLoc(), diag::warn_gcc_attribute_location); 2743 2744 MaybeParseAndDiagnoseDeclSpecAfterCXX11VirtSpecifierSeq(DeclaratorInfo, 2745 VS); 2746 } 2747 } 2748 2749 // If this has neither a name nor a bit width, something has gone seriously 2750 // wrong. Skip until the semi-colon or }. 2751 if (!DeclaratorInfo.hasName() && BitfieldSize.isUnset()) { 2752 // If so, skip until the semi-colon or a }. 2753 SkipUntil(tok::r_brace, StopAtSemi | StopBeforeMatch); 2754 return true; 2755 } 2756 return false; 2757 } 2758 2759 /// Look for declaration specifiers possibly occurring after C++11 2760 /// virt-specifier-seq and diagnose them. 2761 void Parser::MaybeParseAndDiagnoseDeclSpecAfterCXX11VirtSpecifierSeq( 2762 Declarator &D, VirtSpecifiers &VS) { 2763 DeclSpec DS(AttrFactory); 2764 2765 // GNU-style and C++11 attributes are not allowed here, but they will be 2766 // handled by the caller. Diagnose everything else. 2767 ParseTypeQualifierListOpt( 2768 DS, AR_NoAttributesParsed, false, 2769 /*IdentifierRequired=*/false, llvm::function_ref<void()>([&]() { 2770 Actions.CodeCompletion().CodeCompleteFunctionQualifiers(DS, D, &VS); 2771 })); 2772 D.ExtendWithDeclSpec(DS); 2773 2774 if (D.isFunctionDeclarator()) { 2775 auto &Function = D.getFunctionTypeInfo(); 2776 if (DS.getTypeQualifiers() != DeclSpec::TQ_unspecified) { 2777 auto DeclSpecCheck = [&](DeclSpec::TQ TypeQual, StringRef FixItName, 2778 SourceLocation SpecLoc) { 2779 FixItHint Insertion; 2780 auto &MQ = Function.getOrCreateMethodQualifiers(); 2781 if (!(MQ.getTypeQualifiers() & TypeQual)) { 2782 std::string Name(FixItName.data()); 2783 Name += " "; 2784 Insertion = FixItHint::CreateInsertion(VS.getFirstLocation(), Name); 2785 MQ.SetTypeQual(TypeQual, SpecLoc); 2786 } 2787 Diag(SpecLoc, diag::err_declspec_after_virtspec) 2788 << FixItName 2789 << VirtSpecifiers::getSpecifierName(VS.getLastSpecifier()) 2790 << FixItHint::CreateRemoval(SpecLoc) << Insertion; 2791 }; 2792 DS.forEachQualifier(DeclSpecCheck); 2793 } 2794 2795 // Parse ref-qualifiers. 2796 bool RefQualifierIsLValueRef = true; 2797 SourceLocation RefQualifierLoc; 2798 if (ParseRefQualifier(RefQualifierIsLValueRef, RefQualifierLoc)) { 2799 const char *Name = (RefQualifierIsLValueRef ? "& " : "&& "); 2800 FixItHint Insertion = 2801 FixItHint::CreateInsertion(VS.getFirstLocation(), Name); 2802 Function.RefQualifierIsLValueRef = RefQualifierIsLValueRef; 2803 Function.RefQualifierLoc = RefQualifierLoc; 2804 2805 Diag(RefQualifierLoc, diag::err_declspec_after_virtspec) 2806 << (RefQualifierIsLValueRef ? "&" : "&&") 2807 << VirtSpecifiers::getSpecifierName(VS.getLastSpecifier()) 2808 << FixItHint::CreateRemoval(RefQualifierLoc) << Insertion; 2809 D.SetRangeEnd(RefQualifierLoc); 2810 } 2811 } 2812 } 2813 2814 /// ParseCXXClassMemberDeclaration - Parse a C++ class member declaration. 2815 /// 2816 /// member-declaration: 2817 /// decl-specifier-seq[opt] member-declarator-list[opt] ';' 2818 /// function-definition ';'[opt] 2819 /// ::[opt] nested-name-specifier template[opt] unqualified-id ';'[TODO] 2820 /// using-declaration [TODO] 2821 /// [C++0x] static_assert-declaration 2822 /// template-declaration 2823 /// [GNU] '__extension__' member-declaration 2824 /// 2825 /// member-declarator-list: 2826 /// member-declarator 2827 /// member-declarator-list ',' member-declarator 2828 /// 2829 /// member-declarator: 2830 /// declarator virt-specifier-seq[opt] pure-specifier[opt] 2831 /// [C++2a] declarator requires-clause 2832 /// declarator constant-initializer[opt] 2833 /// [C++11] declarator brace-or-equal-initializer[opt] 2834 /// identifier[opt] ':' constant-expression 2835 /// 2836 /// virt-specifier-seq: 2837 /// virt-specifier 2838 /// virt-specifier-seq virt-specifier 2839 /// 2840 /// virt-specifier: 2841 /// override 2842 /// final 2843 /// [MS] sealed 2844 /// 2845 /// pure-specifier: 2846 /// '= 0' 2847 /// 2848 /// constant-initializer: 2849 /// '=' constant-expression 2850 /// 2851 Parser::DeclGroupPtrTy Parser::ParseCXXClassMemberDeclaration( 2852 AccessSpecifier AS, ParsedAttributes &AccessAttrs, 2853 ParsedTemplateInfo &TemplateInfo, ParsingDeclRAIIObject *TemplateDiags) { 2854 assert(getLangOpts().CPlusPlus && 2855 "ParseCXXClassMemberDeclaration should only be called in C++ mode"); 2856 if (Tok.is(tok::at)) { 2857 if (getLangOpts().ObjC && NextToken().isObjCAtKeyword(tok::objc_defs)) 2858 Diag(Tok, diag::err_at_defs_cxx); 2859 else 2860 Diag(Tok, diag::err_at_in_class); 2861 2862 ConsumeToken(); 2863 SkipUntil(tok::r_brace, StopAtSemi); 2864 return nullptr; 2865 } 2866 2867 // Turn on colon protection early, while parsing declspec, although there is 2868 // nothing to protect there. It prevents from false errors if error recovery 2869 // incorrectly determines where the declspec ends, as in the example: 2870 // struct A { enum class B { C }; }; 2871 // const int C = 4; 2872 // struct D { A::B : C; }; 2873 ColonProtectionRAIIObject X(*this); 2874 2875 // Access declarations. 2876 bool MalformedTypeSpec = false; 2877 if (!TemplateInfo.Kind && 2878 Tok.isOneOf(tok::identifier, tok::coloncolon, tok::kw___super)) { 2879 if (TryAnnotateCXXScopeToken()) 2880 MalformedTypeSpec = true; 2881 2882 bool isAccessDecl; 2883 if (Tok.isNot(tok::annot_cxxscope)) 2884 isAccessDecl = false; 2885 else if (NextToken().is(tok::identifier)) 2886 isAccessDecl = GetLookAheadToken(2).is(tok::semi); 2887 else 2888 isAccessDecl = NextToken().is(tok::kw_operator); 2889 2890 if (isAccessDecl) { 2891 // Collect the scope specifier token we annotated earlier. 2892 CXXScopeSpec SS; 2893 ParseOptionalCXXScopeSpecifier(SS, /*ObjectType=*/nullptr, 2894 /*ObjectHasErrors=*/false, 2895 /*EnteringContext=*/false); 2896 2897 if (SS.isInvalid()) { 2898 SkipUntil(tok::semi); 2899 return nullptr; 2900 } 2901 2902 // Try to parse an unqualified-id. 2903 SourceLocation TemplateKWLoc; 2904 UnqualifiedId Name; 2905 if (ParseUnqualifiedId(SS, /*ObjectType=*/nullptr, 2906 /*ObjectHadErrors=*/false, false, true, true, 2907 false, &TemplateKWLoc, Name)) { 2908 SkipUntil(tok::semi); 2909 return nullptr; 2910 } 2911 2912 // TODO: recover from mistakenly-qualified operator declarations. 2913 if (ExpectAndConsume(tok::semi, diag::err_expected_after, 2914 "access declaration")) { 2915 SkipUntil(tok::semi); 2916 return nullptr; 2917 } 2918 2919 // FIXME: We should do something with the 'template' keyword here. 2920 return DeclGroupPtrTy::make(DeclGroupRef(Actions.ActOnUsingDeclaration( 2921 getCurScope(), AS, /*UsingLoc*/ SourceLocation(), 2922 /*TypenameLoc*/ SourceLocation(), SS, Name, 2923 /*EllipsisLoc*/ SourceLocation(), 2924 /*AttrList*/ ParsedAttributesView()))); 2925 } 2926 } 2927 2928 // static_assert-declaration. A templated static_assert declaration is 2929 // diagnosed in Parser::ParseDeclarationAfterTemplate. 2930 if (!TemplateInfo.Kind && 2931 Tok.isOneOf(tok::kw_static_assert, tok::kw__Static_assert)) { 2932 SourceLocation DeclEnd; 2933 return DeclGroupPtrTy::make( 2934 DeclGroupRef(ParseStaticAssertDeclaration(DeclEnd))); 2935 } 2936 2937 if (Tok.is(tok::kw_template)) { 2938 assert(!TemplateInfo.TemplateParams && 2939 "Nested template improperly parsed?"); 2940 ObjCDeclContextSwitch ObjCDC(*this); 2941 SourceLocation DeclEnd; 2942 return ParseTemplateDeclarationOrSpecialization(DeclaratorContext::Member, 2943 DeclEnd, AccessAttrs, AS); 2944 } 2945 2946 // Handle: member-declaration ::= '__extension__' member-declaration 2947 if (Tok.is(tok::kw___extension__)) { 2948 // __extension__ silences extension warnings in the subexpression. 2949 ExtensionRAIIObject O(Diags); // Use RAII to do this. 2950 ConsumeToken(); 2951 return ParseCXXClassMemberDeclaration(AS, AccessAttrs, TemplateInfo, 2952 TemplateDiags); 2953 } 2954 2955 ParsedAttributes DeclAttrs(AttrFactory); 2956 // Optional C++11 attribute-specifier 2957 MaybeParseCXX11Attributes(DeclAttrs); 2958 2959 // The next token may be an OpenMP pragma annotation token. That would 2960 // normally be handled from ParseCXXClassMemberDeclarationWithPragmas, but in 2961 // this case, it came from an *attribute* rather than a pragma. Handle it now. 2962 if (Tok.is(tok::annot_attr_openmp)) 2963 return ParseOpenMPDeclarativeDirectiveWithExtDecl(AS, DeclAttrs); 2964 2965 if (Tok.is(tok::kw_using)) { 2966 // Eat 'using'. 2967 SourceLocation UsingLoc = ConsumeToken(); 2968 2969 // Consume unexpected 'template' keywords. 2970 while (Tok.is(tok::kw_template)) { 2971 SourceLocation TemplateLoc = ConsumeToken(); 2972 Diag(TemplateLoc, diag::err_unexpected_template_after_using) 2973 << FixItHint::CreateRemoval(TemplateLoc); 2974 } 2975 2976 if (Tok.is(tok::kw_namespace)) { 2977 Diag(UsingLoc, diag::err_using_namespace_in_class); 2978 SkipUntil(tok::semi, StopBeforeMatch); 2979 return nullptr; 2980 } 2981 SourceLocation DeclEnd; 2982 // Otherwise, it must be a using-declaration or an alias-declaration. 2983 return ParseUsingDeclaration(DeclaratorContext::Member, TemplateInfo, 2984 UsingLoc, DeclEnd, DeclAttrs, AS); 2985 } 2986 2987 ParsedAttributes DeclSpecAttrs(AttrFactory); 2988 MaybeParseMicrosoftAttributes(DeclSpecAttrs); 2989 2990 // Hold late-parsed attributes so we can attach a Decl to them later. 2991 LateParsedAttrList CommonLateParsedAttrs; 2992 2993 // decl-specifier-seq: 2994 // Parse the common declaration-specifiers piece. 2995 ParsingDeclSpec DS(*this, TemplateDiags); 2996 DS.takeAttributesFrom(DeclSpecAttrs); 2997 2998 if (MalformedTypeSpec) 2999 DS.SetTypeSpecError(); 3000 3001 // Turn off usual access checking for templates explicit specialization 3002 // and instantiation. 3003 // C++20 [temp.spec] 13.9/6. 3004 // This disables the access checking rules for member function template 3005 // explicit instantiation and explicit specialization. 3006 bool IsTemplateSpecOrInst = 3007 (TemplateInfo.Kind == ParsedTemplateInfo::ExplicitInstantiation || 3008 TemplateInfo.Kind == ParsedTemplateInfo::ExplicitSpecialization); 3009 SuppressAccessChecks diagsFromTag(*this, IsTemplateSpecOrInst); 3010 3011 ParseDeclarationSpecifiers(DS, TemplateInfo, AS, DeclSpecContext::DSC_class, 3012 &CommonLateParsedAttrs); 3013 3014 if (IsTemplateSpecOrInst) 3015 diagsFromTag.done(); 3016 3017 // Turn off colon protection that was set for declspec. 3018 X.restore(); 3019 3020 // If we had a free-standing type definition with a missing semicolon, we 3021 // may get this far before the problem becomes obvious. 3022 if (DS.hasTagDefinition() && 3023 TemplateInfo.Kind == ParsedTemplateInfo::NonTemplate && 3024 DiagnoseMissingSemiAfterTagDefinition(DS, AS, DeclSpecContext::DSC_class, 3025 &CommonLateParsedAttrs)) 3026 return nullptr; 3027 3028 MultiTemplateParamsArg TemplateParams( 3029 TemplateInfo.TemplateParams ? TemplateInfo.TemplateParams->data() 3030 : nullptr, 3031 TemplateInfo.TemplateParams ? TemplateInfo.TemplateParams->size() : 0); 3032 3033 if (TryConsumeToken(tok::semi)) { 3034 if (DS.isFriendSpecified()) 3035 ProhibitAttributes(DeclAttrs); 3036 3037 RecordDecl *AnonRecord = nullptr; 3038 Decl *TheDecl = Actions.ParsedFreeStandingDeclSpec( 3039 getCurScope(), AS, DS, DeclAttrs, TemplateParams, false, AnonRecord); 3040 Actions.ActOnDefinedDeclarationSpecifier(TheDecl); 3041 DS.complete(TheDecl); 3042 if (AnonRecord) { 3043 Decl *decls[] = {AnonRecord, TheDecl}; 3044 return Actions.BuildDeclaratorGroup(decls); 3045 } 3046 return Actions.ConvertDeclToDeclGroup(TheDecl); 3047 } 3048 3049 if (DS.hasTagDefinition()) 3050 Actions.ActOnDefinedDeclarationSpecifier(DS.getRepAsDecl()); 3051 3052 ParsingDeclarator DeclaratorInfo(*this, DS, DeclAttrs, 3053 DeclaratorContext::Member); 3054 if (TemplateInfo.TemplateParams) 3055 DeclaratorInfo.setTemplateParameterLists(TemplateParams); 3056 VirtSpecifiers VS; 3057 3058 // Hold late-parsed attributes so we can attach a Decl to them later. 3059 LateParsedAttrList LateParsedAttrs; 3060 3061 SourceLocation EqualLoc; 3062 SourceLocation PureSpecLoc; 3063 3064 auto TryConsumePureSpecifier = [&](bool AllowDefinition) { 3065 if (Tok.isNot(tok::equal)) 3066 return false; 3067 3068 auto &Zero = NextToken(); 3069 SmallString<8> Buffer; 3070 if (Zero.isNot(tok::numeric_constant) || 3071 PP.getSpelling(Zero, Buffer) != "0") 3072 return false; 3073 3074 auto &After = GetLookAheadToken(2); 3075 if (!After.isOneOf(tok::semi, tok::comma) && 3076 !(AllowDefinition && 3077 After.isOneOf(tok::l_brace, tok::colon, tok::kw_try))) 3078 return false; 3079 3080 EqualLoc = ConsumeToken(); 3081 PureSpecLoc = ConsumeToken(); 3082 return true; 3083 }; 3084 3085 SmallVector<Decl *, 8> DeclsInGroup; 3086 ExprResult BitfieldSize; 3087 ExprResult TrailingRequiresClause; 3088 bool ExpectSemi = true; 3089 3090 // C++20 [temp.spec] 13.9/6. 3091 // This disables the access checking rules for member function template 3092 // explicit instantiation and explicit specialization. 3093 SuppressAccessChecks SAC(*this, IsTemplateSpecOrInst); 3094 3095 // Parse the first declarator. 3096 if (ParseCXXMemberDeclaratorBeforeInitializer( 3097 DeclaratorInfo, VS, BitfieldSize, LateParsedAttrs)) { 3098 TryConsumeToken(tok::semi); 3099 return nullptr; 3100 } 3101 3102 if (IsTemplateSpecOrInst) 3103 SAC.done(); 3104 3105 // Check for a member function definition. 3106 if (BitfieldSize.isUnset()) { 3107 // MSVC permits pure specifier on inline functions defined at class scope. 3108 // Hence check for =0 before checking for function definition. 3109 if (getLangOpts().MicrosoftExt && DeclaratorInfo.isDeclarationOfFunction()) 3110 TryConsumePureSpecifier(/*AllowDefinition*/ true); 3111 3112 FunctionDefinitionKind DefinitionKind = FunctionDefinitionKind::Declaration; 3113 // function-definition: 3114 // 3115 // In C++11, a non-function declarator followed by an open brace is a 3116 // braced-init-list for an in-class member initialization, not an 3117 // erroneous function definition. 3118 if (Tok.is(tok::l_brace) && !getLangOpts().CPlusPlus11) { 3119 DefinitionKind = FunctionDefinitionKind::Definition; 3120 } else if (DeclaratorInfo.isFunctionDeclarator()) { 3121 if (Tok.isOneOf(tok::l_brace, tok::colon, tok::kw_try)) { 3122 DefinitionKind = FunctionDefinitionKind::Definition; 3123 } else if (Tok.is(tok::equal)) { 3124 const Token &KW = NextToken(); 3125 if (KW.is(tok::kw_default)) 3126 DefinitionKind = FunctionDefinitionKind::Defaulted; 3127 else if (KW.is(tok::kw_delete)) 3128 DefinitionKind = FunctionDefinitionKind::Deleted; 3129 else if (KW.is(tok::code_completion)) { 3130 cutOffParsing(); 3131 Actions.CodeCompletion().CodeCompleteAfterFunctionEquals( 3132 DeclaratorInfo); 3133 return nullptr; 3134 } 3135 } 3136 } 3137 DeclaratorInfo.setFunctionDefinitionKind(DefinitionKind); 3138 3139 // C++11 [dcl.attr.grammar] p4: If an attribute-specifier-seq appertains 3140 // to a friend declaration, that declaration shall be a definition. 3141 if (DeclaratorInfo.isFunctionDeclarator() && 3142 DefinitionKind == FunctionDefinitionKind::Declaration && 3143 DS.isFriendSpecified()) { 3144 // Diagnose attributes that appear before decl specifier: 3145 // [[]] friend int foo(); 3146 ProhibitAttributes(DeclAttrs); 3147 } 3148 3149 if (DefinitionKind != FunctionDefinitionKind::Declaration) { 3150 if (!DeclaratorInfo.isFunctionDeclarator()) { 3151 Diag(DeclaratorInfo.getIdentifierLoc(), diag::err_func_def_no_params); 3152 ConsumeBrace(); 3153 SkipUntil(tok::r_brace); 3154 3155 // Consume the optional ';' 3156 TryConsumeToken(tok::semi); 3157 3158 return nullptr; 3159 } 3160 3161 if (DS.getStorageClassSpec() == DeclSpec::SCS_typedef) { 3162 Diag(DeclaratorInfo.getIdentifierLoc(), 3163 diag::err_function_declared_typedef); 3164 3165 // Recover by treating the 'typedef' as spurious. 3166 DS.ClearStorageClassSpecs(); 3167 } 3168 3169 Decl *FunDecl = ParseCXXInlineMethodDef(AS, AccessAttrs, DeclaratorInfo, 3170 TemplateInfo, VS, PureSpecLoc); 3171 3172 if (FunDecl) { 3173 for (unsigned i = 0, ni = CommonLateParsedAttrs.size(); i < ni; ++i) { 3174 CommonLateParsedAttrs[i]->addDecl(FunDecl); 3175 } 3176 for (unsigned i = 0, ni = LateParsedAttrs.size(); i < ni; ++i) { 3177 LateParsedAttrs[i]->addDecl(FunDecl); 3178 } 3179 } 3180 LateParsedAttrs.clear(); 3181 3182 // Consume the ';' - it's optional unless we have a delete or default 3183 if (Tok.is(tok::semi)) 3184 ConsumeExtraSemi(AfterMemberFunctionDefinition); 3185 3186 return DeclGroupPtrTy::make(DeclGroupRef(FunDecl)); 3187 } 3188 } 3189 3190 // member-declarator-list: 3191 // member-declarator 3192 // member-declarator-list ',' member-declarator 3193 3194 while (true) { 3195 InClassInitStyle HasInClassInit = ICIS_NoInit; 3196 bool HasStaticInitializer = false; 3197 if (Tok.isOneOf(tok::equal, tok::l_brace) && PureSpecLoc.isInvalid()) { 3198 // DRXXXX: Anonymous bit-fields cannot have a brace-or-equal-initializer. 3199 if (BitfieldSize.isUsable() && !DeclaratorInfo.hasName()) { 3200 // Diagnose the error and pretend there is no in-class initializer. 3201 Diag(Tok, diag::err_anon_bitfield_member_init); 3202 SkipUntil(tok::comma, StopAtSemi | StopBeforeMatch); 3203 } else if (DeclaratorInfo.isDeclarationOfFunction()) { 3204 // It's a pure-specifier. 3205 if (!TryConsumePureSpecifier(/*AllowFunctionDefinition*/ false)) 3206 // Parse it as an expression so that Sema can diagnose it. 3207 HasStaticInitializer = true; 3208 } else if (DeclaratorInfo.getDeclSpec().getStorageClassSpec() != 3209 DeclSpec::SCS_static && 3210 DeclaratorInfo.getDeclSpec().getStorageClassSpec() != 3211 DeclSpec::SCS_typedef && 3212 !DS.isFriendSpecified() && 3213 TemplateInfo.Kind == ParsedTemplateInfo::NonTemplate) { 3214 // It's a default member initializer. 3215 if (BitfieldSize.get()) 3216 Diag(Tok, getLangOpts().CPlusPlus20 3217 ? diag::warn_cxx17_compat_bitfield_member_init 3218 : diag::ext_bitfield_member_init); 3219 HasInClassInit = Tok.is(tok::equal) ? ICIS_CopyInit : ICIS_ListInit; 3220 } else { 3221 HasStaticInitializer = true; 3222 } 3223 } 3224 3225 // NOTE: If Sema is the Action module and declarator is an instance field, 3226 // this call will *not* return the created decl; It will return null. 3227 // See Sema::ActOnCXXMemberDeclarator for details. 3228 3229 NamedDecl *ThisDecl = nullptr; 3230 if (DS.isFriendSpecified()) { 3231 // C++11 [dcl.attr.grammar] p4: If an attribute-specifier-seq appertains 3232 // to a friend declaration, that declaration shall be a definition. 3233 // 3234 // Diagnose attributes that appear in a friend member function declarator: 3235 // friend int foo [[]] (); 3236 for (const ParsedAttr &AL : DeclaratorInfo.getAttributes()) 3237 if (AL.isCXX11Attribute() || AL.isRegularKeywordAttribute()) { 3238 auto Loc = AL.getRange().getBegin(); 3239 (AL.isRegularKeywordAttribute() 3240 ? Diag(Loc, diag::err_keyword_not_allowed) << AL 3241 : Diag(Loc, diag::err_attributes_not_allowed)) 3242 << AL.getRange(); 3243 } 3244 3245 ThisDecl = Actions.ActOnFriendFunctionDecl(getCurScope(), DeclaratorInfo, 3246 TemplateParams); 3247 } else { 3248 ThisDecl = Actions.ActOnCXXMemberDeclarator( 3249 getCurScope(), AS, DeclaratorInfo, TemplateParams, BitfieldSize.get(), 3250 VS, HasInClassInit); 3251 3252 if (VarTemplateDecl *VT = 3253 ThisDecl ? dyn_cast<VarTemplateDecl>(ThisDecl) : nullptr) 3254 // Re-direct this decl to refer to the templated decl so that we can 3255 // initialize it. 3256 ThisDecl = VT->getTemplatedDecl(); 3257 3258 if (ThisDecl) 3259 Actions.ProcessDeclAttributeList(getCurScope(), ThisDecl, AccessAttrs); 3260 } 3261 3262 // Error recovery might have converted a non-static member into a static 3263 // member. 3264 if (HasInClassInit != ICIS_NoInit && 3265 DeclaratorInfo.getDeclSpec().getStorageClassSpec() == 3266 DeclSpec::SCS_static) { 3267 HasInClassInit = ICIS_NoInit; 3268 HasStaticInitializer = true; 3269 } 3270 3271 if (PureSpecLoc.isValid() && VS.getAbstractLoc().isValid()) { 3272 Diag(PureSpecLoc, diag::err_duplicate_virt_specifier) << "abstract"; 3273 } 3274 if (ThisDecl && PureSpecLoc.isValid()) 3275 Actions.ActOnPureSpecifier(ThisDecl, PureSpecLoc); 3276 else if (ThisDecl && VS.getAbstractLoc().isValid()) 3277 Actions.ActOnPureSpecifier(ThisDecl, VS.getAbstractLoc()); 3278 3279 // Handle the initializer. 3280 if (HasInClassInit != ICIS_NoInit) { 3281 // The initializer was deferred; parse it and cache the tokens. 3282 Diag(Tok, getLangOpts().CPlusPlus11 3283 ? diag::warn_cxx98_compat_nonstatic_member_init 3284 : diag::ext_nonstatic_member_init); 3285 3286 if (DeclaratorInfo.isArrayOfUnknownBound()) { 3287 // C++11 [dcl.array]p3: An array bound may also be omitted when the 3288 // declarator is followed by an initializer. 3289 // 3290 // A brace-or-equal-initializer for a member-declarator is not an 3291 // initializer in the grammar, so this is ill-formed. 3292 Diag(Tok, diag::err_incomplete_array_member_init); 3293 SkipUntil(tok::comma, StopAtSemi | StopBeforeMatch); 3294 3295 // Avoid later warnings about a class member of incomplete type. 3296 if (ThisDecl) 3297 ThisDecl->setInvalidDecl(); 3298 } else 3299 ParseCXXNonStaticMemberInitializer(ThisDecl); 3300 } else if (HasStaticInitializer) { 3301 // Normal initializer. 3302 ExprResult Init = ParseCXXMemberInitializer( 3303 ThisDecl, DeclaratorInfo.isDeclarationOfFunction(), EqualLoc); 3304 3305 if (Init.isInvalid()) { 3306 if (ThisDecl) 3307 Actions.ActOnUninitializedDecl(ThisDecl); 3308 SkipUntil(tok::comma, StopAtSemi | StopBeforeMatch); 3309 } else if (ThisDecl) 3310 Actions.AddInitializerToDecl(ThisDecl, Init.get(), 3311 EqualLoc.isInvalid()); 3312 } else if (ThisDecl && DeclaratorInfo.isStaticMember()) 3313 // No initializer. 3314 Actions.ActOnUninitializedDecl(ThisDecl); 3315 3316 if (ThisDecl) { 3317 if (!ThisDecl->isInvalidDecl()) { 3318 // Set the Decl for any late parsed attributes 3319 for (unsigned i = 0, ni = CommonLateParsedAttrs.size(); i < ni; ++i) 3320 CommonLateParsedAttrs[i]->addDecl(ThisDecl); 3321 3322 for (unsigned i = 0, ni = LateParsedAttrs.size(); i < ni; ++i) 3323 LateParsedAttrs[i]->addDecl(ThisDecl); 3324 } 3325 Actions.FinalizeDeclaration(ThisDecl); 3326 DeclsInGroup.push_back(ThisDecl); 3327 3328 if (DeclaratorInfo.isFunctionDeclarator() && 3329 DeclaratorInfo.getDeclSpec().getStorageClassSpec() != 3330 DeclSpec::SCS_typedef) 3331 HandleMemberFunctionDeclDelays(DeclaratorInfo, ThisDecl); 3332 } 3333 LateParsedAttrs.clear(); 3334 3335 DeclaratorInfo.complete(ThisDecl); 3336 3337 // If we don't have a comma, it is either the end of the list (a ';') 3338 // or an error, bail out. 3339 SourceLocation CommaLoc; 3340 if (!TryConsumeToken(tok::comma, CommaLoc)) 3341 break; 3342 3343 if (Tok.isAtStartOfLine() && 3344 !MightBeDeclarator(DeclaratorContext::Member)) { 3345 // This comma was followed by a line-break and something which can't be 3346 // the start of a declarator. The comma was probably a typo for a 3347 // semicolon. 3348 Diag(CommaLoc, diag::err_expected_semi_declaration) 3349 << FixItHint::CreateReplacement(CommaLoc, ";"); 3350 ExpectSemi = false; 3351 break; 3352 } 3353 3354 // C++23 [temp.pre]p5: 3355 // In a template-declaration, explicit specialization, or explicit 3356 // instantiation the init-declarator-list in the declaration shall 3357 // contain at most one declarator. 3358 if (TemplateInfo.Kind != ParsedTemplateInfo::NonTemplate && 3359 DeclaratorInfo.isFirstDeclarator()) { 3360 Diag(CommaLoc, diag::err_multiple_template_declarators) 3361 << TemplateInfo.Kind; 3362 } 3363 3364 // Parse the next declarator. 3365 DeclaratorInfo.clear(); 3366 VS.clear(); 3367 BitfieldSize = ExprResult(/*Invalid=*/false); 3368 EqualLoc = PureSpecLoc = SourceLocation(); 3369 DeclaratorInfo.setCommaLoc(CommaLoc); 3370 3371 // GNU attributes are allowed before the second and subsequent declarator. 3372 // However, this does not apply for [[]] attributes (which could show up 3373 // before or after the __attribute__ attributes). 3374 DiagnoseAndSkipCXX11Attributes(); 3375 MaybeParseGNUAttributes(DeclaratorInfo); 3376 DiagnoseAndSkipCXX11Attributes(); 3377 3378 if (ParseCXXMemberDeclaratorBeforeInitializer( 3379 DeclaratorInfo, VS, BitfieldSize, LateParsedAttrs)) 3380 break; 3381 } 3382 3383 if (ExpectSemi && 3384 ExpectAndConsume(tok::semi, diag::err_expected_semi_decl_list)) { 3385 // Skip to end of block or statement. 3386 SkipUntil(tok::r_brace, StopAtSemi | StopBeforeMatch); 3387 // If we stopped at a ';', eat it. 3388 TryConsumeToken(tok::semi); 3389 return nullptr; 3390 } 3391 3392 return Actions.FinalizeDeclaratorGroup(getCurScope(), DS, DeclsInGroup); 3393 } 3394 3395 /// ParseCXXMemberInitializer - Parse the brace-or-equal-initializer. 3396 /// Also detect and reject any attempted defaulted/deleted function definition. 3397 /// The location of the '=', if any, will be placed in EqualLoc. 3398 /// 3399 /// This does not check for a pure-specifier; that's handled elsewhere. 3400 /// 3401 /// brace-or-equal-initializer: 3402 /// '=' initializer-expression 3403 /// braced-init-list 3404 /// 3405 /// initializer-clause: 3406 /// assignment-expression 3407 /// braced-init-list 3408 /// 3409 /// defaulted/deleted function-definition: 3410 /// '=' 'default' 3411 /// '=' 'delete' 3412 /// 3413 /// Prior to C++0x, the assignment-expression in an initializer-clause must 3414 /// be a constant-expression. 3415 ExprResult Parser::ParseCXXMemberInitializer(Decl *D, bool IsFunction, 3416 SourceLocation &EqualLoc) { 3417 assert(Tok.isOneOf(tok::equal, tok::l_brace) && 3418 "Data member initializer not starting with '=' or '{'"); 3419 3420 bool IsFieldInitialization = isa_and_present<FieldDecl>(D); 3421 3422 EnterExpressionEvaluationContext Context( 3423 Actions, 3424 IsFieldInitialization 3425 ? Sema::ExpressionEvaluationContext::PotentiallyEvaluatedIfUsed 3426 : Sema::ExpressionEvaluationContext::PotentiallyEvaluated, 3427 D); 3428 3429 // CWG2760 3430 // Default member initializers used to initialize a base or member subobject 3431 // [...] are considered to be part of the function body 3432 Actions.ExprEvalContexts.back().InImmediateEscalatingFunctionContext = 3433 IsFieldInitialization; 3434 3435 if (TryConsumeToken(tok::equal, EqualLoc)) { 3436 if (Tok.is(tok::kw_delete)) { 3437 // In principle, an initializer of '= delete p;' is legal, but it will 3438 // never type-check. It's better to diagnose it as an ill-formed 3439 // expression than as an ill-formed deleted non-function member. An 3440 // initializer of '= delete p, foo' will never be parsed, because a 3441 // top-level comma always ends the initializer expression. 3442 const Token &Next = NextToken(); 3443 if (IsFunction || Next.isOneOf(tok::semi, tok::comma, tok::eof)) { 3444 if (IsFunction) 3445 Diag(ConsumeToken(), diag::err_default_delete_in_multiple_declaration) 3446 << 1 /* delete */; 3447 else 3448 Diag(ConsumeToken(), diag::err_deleted_non_function); 3449 SkipDeletedFunctionBody(); 3450 return ExprError(); 3451 } 3452 } else if (Tok.is(tok::kw_default)) { 3453 if (IsFunction) 3454 Diag(Tok, diag::err_default_delete_in_multiple_declaration) 3455 << 0 /* default */; 3456 else 3457 Diag(ConsumeToken(), diag::err_default_special_members) 3458 << getLangOpts().CPlusPlus20; 3459 return ExprError(); 3460 } 3461 } 3462 if (const auto *PD = dyn_cast_or_null<MSPropertyDecl>(D)) { 3463 Diag(Tok, diag::err_ms_property_initializer) << PD; 3464 return ExprError(); 3465 } 3466 return ParseInitializer(); 3467 } 3468 3469 void Parser::SkipCXXMemberSpecification(SourceLocation RecordLoc, 3470 SourceLocation AttrFixitLoc, 3471 unsigned TagType, Decl *TagDecl) { 3472 // Skip the optional 'final' keyword. 3473 if (getLangOpts().CPlusPlus && Tok.is(tok::identifier)) { 3474 assert(isCXX11FinalKeyword() && "not a class definition"); 3475 ConsumeToken(); 3476 3477 // Diagnose any C++11 attributes after 'final' keyword. 3478 // We deliberately discard these attributes. 3479 ParsedAttributes Attrs(AttrFactory); 3480 CheckMisplacedCXX11Attribute(Attrs, AttrFixitLoc); 3481 3482 // This can only happen if we had malformed misplaced attributes; 3483 // we only get called if there is a colon or left-brace after the 3484 // attributes. 3485 if (Tok.isNot(tok::colon) && Tok.isNot(tok::l_brace)) 3486 return; 3487 } 3488 3489 // Skip the base clauses. This requires actually parsing them, because 3490 // otherwise we can't be sure where they end (a left brace may appear 3491 // within a template argument). 3492 if (Tok.is(tok::colon)) { 3493 // Enter the scope of the class so that we can correctly parse its bases. 3494 ParseScope ClassScope(this, Scope::ClassScope | Scope::DeclScope); 3495 ParsingClassDefinition ParsingDef(*this, TagDecl, /*NonNestedClass*/ true, 3496 TagType == DeclSpec::TST_interface); 3497 auto OldContext = 3498 Actions.ActOnTagStartSkippedDefinition(getCurScope(), TagDecl); 3499 3500 // Parse the bases but don't attach them to the class. 3501 ParseBaseClause(nullptr); 3502 3503 Actions.ActOnTagFinishSkippedDefinition(OldContext); 3504 3505 if (!Tok.is(tok::l_brace)) { 3506 Diag(PP.getLocForEndOfToken(PrevTokLocation), 3507 diag::err_expected_lbrace_after_base_specifiers); 3508 return; 3509 } 3510 } 3511 3512 // Skip the body. 3513 assert(Tok.is(tok::l_brace)); 3514 BalancedDelimiterTracker T(*this, tok::l_brace); 3515 T.consumeOpen(); 3516 T.skipToEnd(); 3517 3518 // Parse and discard any trailing attributes. 3519 if (Tok.is(tok::kw___attribute)) { 3520 ParsedAttributes Attrs(AttrFactory); 3521 MaybeParseGNUAttributes(Attrs); 3522 } 3523 } 3524 3525 Parser::DeclGroupPtrTy Parser::ParseCXXClassMemberDeclarationWithPragmas( 3526 AccessSpecifier &AS, ParsedAttributes &AccessAttrs, DeclSpec::TST TagType, 3527 Decl *TagDecl) { 3528 ParenBraceBracketBalancer BalancerRAIIObj(*this); 3529 3530 switch (Tok.getKind()) { 3531 case tok::kw___if_exists: 3532 case tok::kw___if_not_exists: 3533 ParseMicrosoftIfExistsClassDeclaration(TagType, AccessAttrs, AS); 3534 return nullptr; 3535 3536 case tok::semi: 3537 // Check for extraneous top-level semicolon. 3538 ConsumeExtraSemi(InsideStruct, TagType); 3539 return nullptr; 3540 3541 // Handle pragmas that can appear as member declarations. 3542 case tok::annot_pragma_vis: 3543 HandlePragmaVisibility(); 3544 return nullptr; 3545 case tok::annot_pragma_pack: 3546 HandlePragmaPack(); 3547 return nullptr; 3548 case tok::annot_pragma_align: 3549 HandlePragmaAlign(); 3550 return nullptr; 3551 case tok::annot_pragma_ms_pointers_to_members: 3552 HandlePragmaMSPointersToMembers(); 3553 return nullptr; 3554 case tok::annot_pragma_ms_pragma: 3555 HandlePragmaMSPragma(); 3556 return nullptr; 3557 case tok::annot_pragma_ms_vtordisp: 3558 HandlePragmaMSVtorDisp(); 3559 return nullptr; 3560 case tok::annot_pragma_dump: 3561 HandlePragmaDump(); 3562 return nullptr; 3563 3564 case tok::kw_namespace: 3565 // If we see a namespace here, a close brace was missing somewhere. 3566 DiagnoseUnexpectedNamespace(cast<NamedDecl>(TagDecl)); 3567 return nullptr; 3568 3569 case tok::kw_private: 3570 // FIXME: We don't accept GNU attributes on access specifiers in OpenCL mode 3571 // yet. 3572 if (getLangOpts().OpenCL && !NextToken().is(tok::colon)) { 3573 ParsedTemplateInfo TemplateInfo; 3574 return ParseCXXClassMemberDeclaration(AS, AccessAttrs, TemplateInfo); 3575 } 3576 [[fallthrough]]; 3577 case tok::kw_public: 3578 case tok::kw_protected: { 3579 if (getLangOpts().HLSL) 3580 Diag(Tok.getLocation(), diag::ext_hlsl_access_specifiers); 3581 AccessSpecifier NewAS = getAccessSpecifierIfPresent(); 3582 assert(NewAS != AS_none); 3583 // Current token is a C++ access specifier. 3584 AS = NewAS; 3585 SourceLocation ASLoc = Tok.getLocation(); 3586 unsigned TokLength = Tok.getLength(); 3587 ConsumeToken(); 3588 AccessAttrs.clear(); 3589 MaybeParseGNUAttributes(AccessAttrs); 3590 3591 SourceLocation EndLoc; 3592 if (TryConsumeToken(tok::colon, EndLoc)) { 3593 } else if (TryConsumeToken(tok::semi, EndLoc)) { 3594 Diag(EndLoc, diag::err_expected) 3595 << tok::colon << FixItHint::CreateReplacement(EndLoc, ":"); 3596 } else { 3597 EndLoc = ASLoc.getLocWithOffset(TokLength); 3598 Diag(EndLoc, diag::err_expected) 3599 << tok::colon << FixItHint::CreateInsertion(EndLoc, ":"); 3600 } 3601 3602 // The Microsoft extension __interface does not permit non-public 3603 // access specifiers. 3604 if (TagType == DeclSpec::TST_interface && AS != AS_public) { 3605 Diag(ASLoc, diag::err_access_specifier_interface) << (AS == AS_protected); 3606 } 3607 3608 if (Actions.ActOnAccessSpecifier(NewAS, ASLoc, EndLoc, AccessAttrs)) { 3609 // found another attribute than only annotations 3610 AccessAttrs.clear(); 3611 } 3612 3613 return nullptr; 3614 } 3615 3616 case tok::annot_attr_openmp: 3617 case tok::annot_pragma_openmp: 3618 return ParseOpenMPDeclarativeDirectiveWithExtDecl( 3619 AS, AccessAttrs, /*Delayed=*/true, TagType, TagDecl); 3620 case tok::annot_pragma_openacc: 3621 return ParseOpenACCDirectiveDecl(); 3622 3623 default: 3624 if (tok::isPragmaAnnotation(Tok.getKind())) { 3625 Diag(Tok.getLocation(), diag::err_pragma_misplaced_in_decl) 3626 << DeclSpec::getSpecifierName( 3627 TagType, Actions.getASTContext().getPrintingPolicy()); 3628 ConsumeAnnotationToken(); 3629 return nullptr; 3630 } 3631 ParsedTemplateInfo TemplateInfo; 3632 return ParseCXXClassMemberDeclaration(AS, AccessAttrs, TemplateInfo); 3633 } 3634 } 3635 3636 /// ParseCXXMemberSpecification - Parse the class definition. 3637 /// 3638 /// member-specification: 3639 /// member-declaration member-specification[opt] 3640 /// access-specifier ':' member-specification[opt] 3641 /// 3642 void Parser::ParseCXXMemberSpecification(SourceLocation RecordLoc, 3643 SourceLocation AttrFixitLoc, 3644 ParsedAttributes &Attrs, 3645 unsigned TagType, Decl *TagDecl) { 3646 assert((TagType == DeclSpec::TST_struct || 3647 TagType == DeclSpec::TST_interface || 3648 TagType == DeclSpec::TST_union || TagType == DeclSpec::TST_class) && 3649 "Invalid TagType!"); 3650 3651 llvm::TimeTraceScope TimeScope("ParseClass", [&]() { 3652 if (auto *TD = dyn_cast_or_null<NamedDecl>(TagDecl)) 3653 return TD->getQualifiedNameAsString(); 3654 return std::string("<anonymous>"); 3655 }); 3656 3657 PrettyDeclStackTraceEntry CrashInfo(Actions.Context, TagDecl, RecordLoc, 3658 "parsing struct/union/class body"); 3659 3660 // Determine whether this is a non-nested class. Note that local 3661 // classes are *not* considered to be nested classes. 3662 bool NonNestedClass = true; 3663 if (!ClassStack.empty()) { 3664 for (const Scope *S = getCurScope(); S; S = S->getParent()) { 3665 if (S->isClassScope()) { 3666 // We're inside a class scope, so this is a nested class. 3667 NonNestedClass = false; 3668 3669 // The Microsoft extension __interface does not permit nested classes. 3670 if (getCurrentClass().IsInterface) { 3671 Diag(RecordLoc, diag::err_invalid_member_in_interface) 3672 << /*ErrorType=*/6 3673 << (isa<NamedDecl>(TagDecl) 3674 ? cast<NamedDecl>(TagDecl)->getQualifiedNameAsString() 3675 : "(anonymous)"); 3676 } 3677 break; 3678 } 3679 3680 if (S->isFunctionScope()) 3681 // If we're in a function or function template then this is a local 3682 // class rather than a nested class. 3683 break; 3684 } 3685 } 3686 3687 // Enter a scope for the class. 3688 ParseScope ClassScope(this, Scope::ClassScope | Scope::DeclScope); 3689 3690 // Note that we are parsing a new (potentially-nested) class definition. 3691 ParsingClassDefinition ParsingDef(*this, TagDecl, NonNestedClass, 3692 TagType == DeclSpec::TST_interface); 3693 3694 if (TagDecl) 3695 Actions.ActOnTagStartDefinition(getCurScope(), TagDecl); 3696 3697 SourceLocation FinalLoc; 3698 SourceLocation AbstractLoc; 3699 bool IsFinalSpelledSealed = false; 3700 bool IsAbstract = false; 3701 3702 // Parse the optional 'final' keyword. 3703 if (getLangOpts().CPlusPlus && Tok.is(tok::identifier)) { 3704 while (true) { 3705 VirtSpecifiers::Specifier Specifier = isCXX11VirtSpecifier(Tok); 3706 if (Specifier == VirtSpecifiers::VS_None) 3707 break; 3708 if (isCXX11FinalKeyword()) { 3709 if (FinalLoc.isValid()) { 3710 auto Skipped = ConsumeToken(); 3711 Diag(Skipped, diag::err_duplicate_class_virt_specifier) 3712 << VirtSpecifiers::getSpecifierName(Specifier); 3713 } else { 3714 FinalLoc = ConsumeToken(); 3715 if (Specifier == VirtSpecifiers::VS_Sealed) 3716 IsFinalSpelledSealed = true; 3717 } 3718 } else { 3719 if (AbstractLoc.isValid()) { 3720 auto Skipped = ConsumeToken(); 3721 Diag(Skipped, diag::err_duplicate_class_virt_specifier) 3722 << VirtSpecifiers::getSpecifierName(Specifier); 3723 } else { 3724 AbstractLoc = ConsumeToken(); 3725 IsAbstract = true; 3726 } 3727 } 3728 if (TagType == DeclSpec::TST_interface) 3729 Diag(FinalLoc, diag::err_override_control_interface) 3730 << VirtSpecifiers::getSpecifierName(Specifier); 3731 else if (Specifier == VirtSpecifiers::VS_Final) 3732 Diag(FinalLoc, getLangOpts().CPlusPlus11 3733 ? diag::warn_cxx98_compat_override_control_keyword 3734 : diag::ext_override_control_keyword) 3735 << VirtSpecifiers::getSpecifierName(Specifier); 3736 else if (Specifier == VirtSpecifiers::VS_Sealed) 3737 Diag(FinalLoc, diag::ext_ms_sealed_keyword); 3738 else if (Specifier == VirtSpecifiers::VS_Abstract) 3739 Diag(AbstractLoc, diag::ext_ms_abstract_keyword); 3740 else if (Specifier == VirtSpecifiers::VS_GNU_Final) 3741 Diag(FinalLoc, diag::ext_warn_gnu_final); 3742 } 3743 assert((FinalLoc.isValid() || AbstractLoc.isValid()) && 3744 "not a class definition"); 3745 3746 // Parse any C++11 attributes after 'final' keyword. 3747 // These attributes are not allowed to appear here, 3748 // and the only possible place for them to appertain 3749 // to the class would be between class-key and class-name. 3750 CheckMisplacedCXX11Attribute(Attrs, AttrFixitLoc); 3751 3752 // ParseClassSpecifier() does only a superficial check for attributes before 3753 // deciding to call this method. For example, for 3754 // `class C final alignas ([l) {` it will decide that this looks like a 3755 // misplaced attribute since it sees `alignas '(' ')'`. But the actual 3756 // attribute parsing code will try to parse the '[' as a constexpr lambda 3757 // and consume enough tokens that the alignas parsing code will eat the 3758 // opening '{'. So bail out if the next token isn't one we expect. 3759 if (!Tok.is(tok::colon) && !Tok.is(tok::l_brace)) { 3760 if (TagDecl) 3761 Actions.ActOnTagDefinitionError(getCurScope(), TagDecl); 3762 return; 3763 } 3764 } 3765 3766 if (Tok.is(tok::colon)) { 3767 ParseScope InheritanceScope(this, getCurScope()->getFlags() | 3768 Scope::ClassInheritanceScope); 3769 3770 ParseBaseClause(TagDecl); 3771 if (!Tok.is(tok::l_brace)) { 3772 bool SuggestFixIt = false; 3773 SourceLocation BraceLoc = PP.getLocForEndOfToken(PrevTokLocation); 3774 if (Tok.isAtStartOfLine()) { 3775 switch (Tok.getKind()) { 3776 case tok::kw_private: 3777 case tok::kw_protected: 3778 case tok::kw_public: 3779 SuggestFixIt = NextToken().getKind() == tok::colon; 3780 break; 3781 case tok::kw_static_assert: 3782 case tok::r_brace: 3783 case tok::kw_using: 3784 // base-clause can have simple-template-id; 'template' can't be there 3785 case tok::kw_template: 3786 SuggestFixIt = true; 3787 break; 3788 case tok::identifier: 3789 SuggestFixIt = isConstructorDeclarator(true); 3790 break; 3791 default: 3792 SuggestFixIt = isCXXSimpleDeclaration(/*AllowForRangeDecl=*/false); 3793 break; 3794 } 3795 } 3796 DiagnosticBuilder LBraceDiag = 3797 Diag(BraceLoc, diag::err_expected_lbrace_after_base_specifiers); 3798 if (SuggestFixIt) { 3799 LBraceDiag << FixItHint::CreateInsertion(BraceLoc, " {"); 3800 // Try recovering from missing { after base-clause. 3801 PP.EnterToken(Tok, /*IsReinject*/ true); 3802 Tok.setKind(tok::l_brace); 3803 } else { 3804 if (TagDecl) 3805 Actions.ActOnTagDefinitionError(getCurScope(), TagDecl); 3806 return; 3807 } 3808 } 3809 } 3810 3811 assert(Tok.is(tok::l_brace)); 3812 BalancedDelimiterTracker T(*this, tok::l_brace); 3813 T.consumeOpen(); 3814 3815 if (TagDecl) 3816 Actions.ActOnStartCXXMemberDeclarations(getCurScope(), TagDecl, FinalLoc, 3817 IsFinalSpelledSealed, IsAbstract, 3818 T.getOpenLocation()); 3819 3820 // C++ 11p3: Members of a class defined with the keyword class are private 3821 // by default. Members of a class defined with the keywords struct or union 3822 // are public by default. 3823 // HLSL: In HLSL members of a class are public by default. 3824 AccessSpecifier CurAS; 3825 if (TagType == DeclSpec::TST_class && !getLangOpts().HLSL) 3826 CurAS = AS_private; 3827 else 3828 CurAS = AS_public; 3829 ParsedAttributes AccessAttrs(AttrFactory); 3830 3831 if (TagDecl) { 3832 // While we still have something to read, read the member-declarations. 3833 while (!tryParseMisplacedModuleImport() && Tok.isNot(tok::r_brace) && 3834 Tok.isNot(tok::eof)) { 3835 // Each iteration of this loop reads one member-declaration. 3836 ParseCXXClassMemberDeclarationWithPragmas( 3837 CurAS, AccessAttrs, static_cast<DeclSpec::TST>(TagType), TagDecl); 3838 MaybeDestroyTemplateIds(); 3839 } 3840 T.consumeClose(); 3841 } else { 3842 SkipUntil(tok::r_brace); 3843 } 3844 3845 // If attributes exist after class contents, parse them. 3846 ParsedAttributes attrs(AttrFactory); 3847 MaybeParseGNUAttributes(attrs); 3848 3849 if (TagDecl) 3850 Actions.ActOnFinishCXXMemberSpecification(getCurScope(), RecordLoc, TagDecl, 3851 T.getOpenLocation(), 3852 T.getCloseLocation(), attrs); 3853 3854 // C++11 [class.mem]p2: 3855 // Within the class member-specification, the class is regarded as complete 3856 // within function bodies, default arguments, exception-specifications, and 3857 // brace-or-equal-initializers for non-static data members (including such 3858 // things in nested classes). 3859 if (TagDecl && NonNestedClass) { 3860 // We are not inside a nested class. This class and its nested classes 3861 // are complete and we can parse the delayed portions of method 3862 // declarations and the lexed inline method definitions, along with any 3863 // delayed attributes. 3864 3865 SourceLocation SavedPrevTokLocation = PrevTokLocation; 3866 ParseLexedPragmas(getCurrentClass()); 3867 ParseLexedAttributes(getCurrentClass()); 3868 ParseLexedMethodDeclarations(getCurrentClass()); 3869 3870 // We've finished with all pending member declarations. 3871 Actions.ActOnFinishCXXMemberDecls(); 3872 3873 ParseLexedMemberInitializers(getCurrentClass()); 3874 ParseLexedMethodDefs(getCurrentClass()); 3875 PrevTokLocation = SavedPrevTokLocation; 3876 3877 // We've finished parsing everything, including default argument 3878 // initializers. 3879 Actions.ActOnFinishCXXNonNestedClass(); 3880 } 3881 3882 if (TagDecl) 3883 Actions.ActOnTagFinishDefinition(getCurScope(), TagDecl, T.getRange()); 3884 3885 // Leave the class scope. 3886 ParsingDef.Pop(); 3887 ClassScope.Exit(); 3888 } 3889 3890 void Parser::DiagnoseUnexpectedNamespace(NamedDecl *D) { 3891 assert(Tok.is(tok::kw_namespace)); 3892 3893 // FIXME: Suggest where the close brace should have gone by looking 3894 // at indentation changes within the definition body. 3895 Diag(D->getLocation(), diag::err_missing_end_of_definition) << D; 3896 Diag(Tok.getLocation(), diag::note_missing_end_of_definition_before) << D; 3897 3898 // Push '};' onto the token stream to recover. 3899 PP.EnterToken(Tok, /*IsReinject*/ true); 3900 3901 Tok.startToken(); 3902 Tok.setLocation(PP.getLocForEndOfToken(PrevTokLocation)); 3903 Tok.setKind(tok::semi); 3904 PP.EnterToken(Tok, /*IsReinject*/ true); 3905 3906 Tok.setKind(tok::r_brace); 3907 } 3908 3909 /// ParseConstructorInitializer - Parse a C++ constructor initializer, 3910 /// which explicitly initializes the members or base classes of a 3911 /// class (C++ [class.base.init]). For example, the three initializers 3912 /// after the ':' in the Derived constructor below: 3913 /// 3914 /// @code 3915 /// class Base { }; 3916 /// class Derived : Base { 3917 /// int x; 3918 /// float f; 3919 /// public: 3920 /// Derived(float f) : Base(), x(17), f(f) { } 3921 /// }; 3922 /// @endcode 3923 /// 3924 /// [C++] ctor-initializer: 3925 /// ':' mem-initializer-list 3926 /// 3927 /// [C++] mem-initializer-list: 3928 /// mem-initializer ...[opt] 3929 /// mem-initializer ...[opt] , mem-initializer-list 3930 void Parser::ParseConstructorInitializer(Decl *ConstructorDecl) { 3931 assert(Tok.is(tok::colon) && 3932 "Constructor initializer always starts with ':'"); 3933 3934 // Poison the SEH identifiers so they are flagged as illegal in constructor 3935 // initializers. 3936 PoisonSEHIdentifiersRAIIObject PoisonSEHIdentifiers(*this, true); 3937 SourceLocation ColonLoc = ConsumeToken(); 3938 3939 SmallVector<CXXCtorInitializer *, 4> MemInitializers; 3940 bool AnyErrors = false; 3941 3942 do { 3943 if (Tok.is(tok::code_completion)) { 3944 cutOffParsing(); 3945 Actions.CodeCompletion().CodeCompleteConstructorInitializer( 3946 ConstructorDecl, MemInitializers); 3947 return; 3948 } 3949 3950 MemInitResult MemInit = ParseMemInitializer(ConstructorDecl); 3951 if (!MemInit.isInvalid()) 3952 MemInitializers.push_back(MemInit.get()); 3953 else 3954 AnyErrors = true; 3955 3956 if (Tok.is(tok::comma)) 3957 ConsumeToken(); 3958 else if (Tok.is(tok::l_brace)) 3959 break; 3960 // If the previous initializer was valid and the next token looks like a 3961 // base or member initializer, assume that we're just missing a comma. 3962 else if (!MemInit.isInvalid() && 3963 Tok.isOneOf(tok::identifier, tok::coloncolon)) { 3964 SourceLocation Loc = PP.getLocForEndOfToken(PrevTokLocation); 3965 Diag(Loc, diag::err_ctor_init_missing_comma) 3966 << FixItHint::CreateInsertion(Loc, ", "); 3967 } else { 3968 // Skip over garbage, until we get to '{'. Don't eat the '{'. 3969 if (!MemInit.isInvalid()) 3970 Diag(Tok.getLocation(), diag::err_expected_either) 3971 << tok::l_brace << tok::comma; 3972 SkipUntil(tok::l_brace, StopAtSemi | StopBeforeMatch); 3973 break; 3974 } 3975 } while (true); 3976 3977 Actions.ActOnMemInitializers(ConstructorDecl, ColonLoc, MemInitializers, 3978 AnyErrors); 3979 } 3980 3981 /// ParseMemInitializer - Parse a C++ member initializer, which is 3982 /// part of a constructor initializer that explicitly initializes one 3983 /// member or base class (C++ [class.base.init]). See 3984 /// ParseConstructorInitializer for an example. 3985 /// 3986 /// [C++] mem-initializer: 3987 /// mem-initializer-id '(' expression-list[opt] ')' 3988 /// [C++0x] mem-initializer-id braced-init-list 3989 /// 3990 /// [C++] mem-initializer-id: 3991 /// '::'[opt] nested-name-specifier[opt] class-name 3992 /// identifier 3993 MemInitResult Parser::ParseMemInitializer(Decl *ConstructorDecl) { 3994 // parse '::'[opt] nested-name-specifier[opt] 3995 CXXScopeSpec SS; 3996 if (ParseOptionalCXXScopeSpecifier(SS, /*ObjectType=*/nullptr, 3997 /*ObjectHasErrors=*/false, 3998 /*EnteringContext=*/false)) 3999 return true; 4000 4001 // : identifier 4002 IdentifierInfo *II = nullptr; 4003 SourceLocation IdLoc = Tok.getLocation(); 4004 // : declype(...) 4005 DeclSpec DS(AttrFactory); 4006 // : template_name<...> 4007 TypeResult TemplateTypeTy; 4008 4009 if (Tok.is(tok::identifier)) { 4010 // Get the identifier. This may be a member name or a class name, 4011 // but we'll let the semantic analysis determine which it is. 4012 II = Tok.getIdentifierInfo(); 4013 ConsumeToken(); 4014 } else if (Tok.is(tok::annot_decltype)) { 4015 // Get the decltype expression, if there is one. 4016 // Uses of decltype will already have been converted to annot_decltype by 4017 // ParseOptionalCXXScopeSpecifier at this point. 4018 // FIXME: Can we get here with a scope specifier? 4019 ParseDecltypeSpecifier(DS); 4020 } else if (Tok.is(tok::annot_pack_indexing_type)) { 4021 // Uses of T...[N] will already have been converted to 4022 // annot_pack_indexing_type by ParseOptionalCXXScopeSpecifier at this point. 4023 ParsePackIndexingType(DS); 4024 } else { 4025 TemplateIdAnnotation *TemplateId = Tok.is(tok::annot_template_id) 4026 ? takeTemplateIdAnnotation(Tok) 4027 : nullptr; 4028 if (TemplateId && TemplateId->mightBeType()) { 4029 AnnotateTemplateIdTokenAsType(SS, ImplicitTypenameContext::No, 4030 /*IsClassName=*/true); 4031 assert(Tok.is(tok::annot_typename) && "template-id -> type failed"); 4032 TemplateTypeTy = getTypeAnnotation(Tok); 4033 ConsumeAnnotationToken(); 4034 } else { 4035 Diag(Tok, diag::err_expected_member_or_base_name); 4036 return true; 4037 } 4038 } 4039 4040 // Parse the '('. 4041 if (getLangOpts().CPlusPlus11 && Tok.is(tok::l_brace)) { 4042 Diag(Tok, diag::warn_cxx98_compat_generalized_initializer_lists); 4043 4044 // FIXME: Add support for signature help inside initializer lists. 4045 ExprResult InitList = ParseBraceInitializer(); 4046 if (InitList.isInvalid()) 4047 return true; 4048 4049 SourceLocation EllipsisLoc; 4050 TryConsumeToken(tok::ellipsis, EllipsisLoc); 4051 4052 if (TemplateTypeTy.isInvalid()) 4053 return true; 4054 return Actions.ActOnMemInitializer(ConstructorDecl, getCurScope(), SS, II, 4055 TemplateTypeTy.get(), DS, IdLoc, 4056 InitList.get(), EllipsisLoc); 4057 } else if (Tok.is(tok::l_paren)) { 4058 BalancedDelimiterTracker T(*this, tok::l_paren); 4059 T.consumeOpen(); 4060 4061 // Parse the optional expression-list. 4062 ExprVector ArgExprs; 4063 auto RunSignatureHelp = [&] { 4064 if (TemplateTypeTy.isInvalid()) 4065 return QualType(); 4066 QualType PreferredType = 4067 Actions.CodeCompletion().ProduceCtorInitMemberSignatureHelp( 4068 ConstructorDecl, SS, TemplateTypeTy.get(), ArgExprs, II, 4069 T.getOpenLocation(), /*Braced=*/false); 4070 CalledSignatureHelp = true; 4071 return PreferredType; 4072 }; 4073 if (Tok.isNot(tok::r_paren) && ParseExpressionList(ArgExprs, [&] { 4074 PreferredType.enterFunctionArgument(Tok.getLocation(), 4075 RunSignatureHelp); 4076 })) { 4077 if (PP.isCodeCompletionReached() && !CalledSignatureHelp) 4078 RunSignatureHelp(); 4079 SkipUntil(tok::r_paren, StopAtSemi); 4080 return true; 4081 } 4082 4083 T.consumeClose(); 4084 4085 SourceLocation EllipsisLoc; 4086 TryConsumeToken(tok::ellipsis, EllipsisLoc); 4087 4088 if (TemplateTypeTy.isInvalid()) 4089 return true; 4090 return Actions.ActOnMemInitializer( 4091 ConstructorDecl, getCurScope(), SS, II, TemplateTypeTy.get(), DS, IdLoc, 4092 T.getOpenLocation(), ArgExprs, T.getCloseLocation(), EllipsisLoc); 4093 } 4094 4095 if (TemplateTypeTy.isInvalid()) 4096 return true; 4097 4098 if (getLangOpts().CPlusPlus11) 4099 return Diag(Tok, diag::err_expected_either) << tok::l_paren << tok::l_brace; 4100 else 4101 return Diag(Tok, diag::err_expected) << tok::l_paren; 4102 } 4103 4104 /// Parse a C++ exception-specification if present (C++0x [except.spec]). 4105 /// 4106 /// exception-specification: 4107 /// dynamic-exception-specification 4108 /// noexcept-specification 4109 /// 4110 /// noexcept-specification: 4111 /// 'noexcept' 4112 /// 'noexcept' '(' constant-expression ')' 4113 ExceptionSpecificationType Parser::tryParseExceptionSpecification( 4114 bool Delayed, SourceRange &SpecificationRange, 4115 SmallVectorImpl<ParsedType> &DynamicExceptions, 4116 SmallVectorImpl<SourceRange> &DynamicExceptionRanges, 4117 ExprResult &NoexceptExpr, CachedTokens *&ExceptionSpecTokens) { 4118 ExceptionSpecificationType Result = EST_None; 4119 ExceptionSpecTokens = nullptr; 4120 4121 // Handle delayed parsing of exception-specifications. 4122 if (Delayed) { 4123 if (Tok.isNot(tok::kw_throw) && Tok.isNot(tok::kw_noexcept)) 4124 return EST_None; 4125 4126 // Consume and cache the starting token. 4127 bool IsNoexcept = Tok.is(tok::kw_noexcept); 4128 Token StartTok = Tok; 4129 SpecificationRange = SourceRange(ConsumeToken()); 4130 4131 // Check for a '('. 4132 if (!Tok.is(tok::l_paren)) { 4133 // If this is a bare 'noexcept', we're done. 4134 if (IsNoexcept) { 4135 Diag(Tok, diag::warn_cxx98_compat_noexcept_decl); 4136 NoexceptExpr = nullptr; 4137 return EST_BasicNoexcept; 4138 } 4139 4140 Diag(Tok, diag::err_expected_lparen_after) << "throw"; 4141 return EST_DynamicNone; 4142 } 4143 4144 // Cache the tokens for the exception-specification. 4145 ExceptionSpecTokens = new CachedTokens; 4146 ExceptionSpecTokens->push_back(StartTok); // 'throw' or 'noexcept' 4147 ExceptionSpecTokens->push_back(Tok); // '(' 4148 SpecificationRange.setEnd(ConsumeParen()); // '(' 4149 4150 ConsumeAndStoreUntil(tok::r_paren, *ExceptionSpecTokens, 4151 /*StopAtSemi=*/true, 4152 /*ConsumeFinalToken=*/true); 4153 SpecificationRange.setEnd(ExceptionSpecTokens->back().getLocation()); 4154 4155 return EST_Unparsed; 4156 } 4157 4158 // See if there's a dynamic specification. 4159 if (Tok.is(tok::kw_throw)) { 4160 Result = ParseDynamicExceptionSpecification( 4161 SpecificationRange, DynamicExceptions, DynamicExceptionRanges); 4162 assert(DynamicExceptions.size() == DynamicExceptionRanges.size() && 4163 "Produced different number of exception types and ranges."); 4164 } 4165 4166 // If there's no noexcept specification, we're done. 4167 if (Tok.isNot(tok::kw_noexcept)) 4168 return Result; 4169 4170 Diag(Tok, diag::warn_cxx98_compat_noexcept_decl); 4171 4172 // If we already had a dynamic specification, parse the noexcept for, 4173 // recovery, but emit a diagnostic and don't store the results. 4174 SourceRange NoexceptRange; 4175 ExceptionSpecificationType NoexceptType = EST_None; 4176 4177 SourceLocation KeywordLoc = ConsumeToken(); 4178 if (Tok.is(tok::l_paren)) { 4179 // There is an argument. 4180 BalancedDelimiterTracker T(*this, tok::l_paren); 4181 T.consumeOpen(); 4182 4183 EnterExpressionEvaluationContext ConstantEvaluated( 4184 Actions, Sema::ExpressionEvaluationContext::ConstantEvaluated); 4185 NoexceptExpr = ParseConstantExpressionInExprEvalContext(); 4186 4187 T.consumeClose(); 4188 if (!NoexceptExpr.isInvalid()) { 4189 NoexceptExpr = 4190 Actions.ActOnNoexceptSpec(NoexceptExpr.get(), NoexceptType); 4191 NoexceptRange = SourceRange(KeywordLoc, T.getCloseLocation()); 4192 } else { 4193 NoexceptType = EST_BasicNoexcept; 4194 } 4195 } else { 4196 // There is no argument. 4197 NoexceptType = EST_BasicNoexcept; 4198 NoexceptRange = SourceRange(KeywordLoc, KeywordLoc); 4199 } 4200 4201 if (Result == EST_None) { 4202 SpecificationRange = NoexceptRange; 4203 Result = NoexceptType; 4204 4205 // If there's a dynamic specification after a noexcept specification, 4206 // parse that and ignore the results. 4207 if (Tok.is(tok::kw_throw)) { 4208 Diag(Tok.getLocation(), diag::err_dynamic_and_noexcept_specification); 4209 ParseDynamicExceptionSpecification(NoexceptRange, DynamicExceptions, 4210 DynamicExceptionRanges); 4211 } 4212 } else { 4213 Diag(Tok.getLocation(), diag::err_dynamic_and_noexcept_specification); 4214 } 4215 4216 return Result; 4217 } 4218 4219 static void diagnoseDynamicExceptionSpecification(Parser &P, SourceRange Range, 4220 bool IsNoexcept) { 4221 if (P.getLangOpts().CPlusPlus11) { 4222 const char *Replacement = IsNoexcept ? "noexcept" : "noexcept(false)"; 4223 P.Diag(Range.getBegin(), P.getLangOpts().CPlusPlus17 && !IsNoexcept 4224 ? diag::ext_dynamic_exception_spec 4225 : diag::warn_exception_spec_deprecated) 4226 << Range; 4227 P.Diag(Range.getBegin(), diag::note_exception_spec_deprecated) 4228 << Replacement << FixItHint::CreateReplacement(Range, Replacement); 4229 } 4230 } 4231 4232 /// ParseDynamicExceptionSpecification - Parse a C++ 4233 /// dynamic-exception-specification (C++ [except.spec]). 4234 /// 4235 /// dynamic-exception-specification: 4236 /// 'throw' '(' type-id-list [opt] ')' 4237 /// [MS] 'throw' '(' '...' ')' 4238 /// 4239 /// type-id-list: 4240 /// type-id ... [opt] 4241 /// type-id-list ',' type-id ... [opt] 4242 /// 4243 ExceptionSpecificationType Parser::ParseDynamicExceptionSpecification( 4244 SourceRange &SpecificationRange, SmallVectorImpl<ParsedType> &Exceptions, 4245 SmallVectorImpl<SourceRange> &Ranges) { 4246 assert(Tok.is(tok::kw_throw) && "expected throw"); 4247 4248 SpecificationRange.setBegin(ConsumeToken()); 4249 BalancedDelimiterTracker T(*this, tok::l_paren); 4250 if (T.consumeOpen()) { 4251 Diag(Tok, diag::err_expected_lparen_after) << "throw"; 4252 SpecificationRange.setEnd(SpecificationRange.getBegin()); 4253 return EST_DynamicNone; 4254 } 4255 4256 // Parse throw(...), a Microsoft extension that means "this function 4257 // can throw anything". 4258 if (Tok.is(tok::ellipsis)) { 4259 SourceLocation EllipsisLoc = ConsumeToken(); 4260 if (!getLangOpts().MicrosoftExt) 4261 Diag(EllipsisLoc, diag::ext_ellipsis_exception_spec); 4262 T.consumeClose(); 4263 SpecificationRange.setEnd(T.getCloseLocation()); 4264 diagnoseDynamicExceptionSpecification(*this, SpecificationRange, false); 4265 return EST_MSAny; 4266 } 4267 4268 // Parse the sequence of type-ids. 4269 SourceRange Range; 4270 while (Tok.isNot(tok::r_paren)) { 4271 TypeResult Res(ParseTypeName(&Range)); 4272 4273 if (Tok.is(tok::ellipsis)) { 4274 // C++0x [temp.variadic]p5: 4275 // - In a dynamic-exception-specification (15.4); the pattern is a 4276 // type-id. 4277 SourceLocation Ellipsis = ConsumeToken(); 4278 Range.setEnd(Ellipsis); 4279 if (!Res.isInvalid()) 4280 Res = Actions.ActOnPackExpansion(Res.get(), Ellipsis); 4281 } 4282 4283 if (!Res.isInvalid()) { 4284 Exceptions.push_back(Res.get()); 4285 Ranges.push_back(Range); 4286 } 4287 4288 if (!TryConsumeToken(tok::comma)) 4289 break; 4290 } 4291 4292 T.consumeClose(); 4293 SpecificationRange.setEnd(T.getCloseLocation()); 4294 diagnoseDynamicExceptionSpecification(*this, SpecificationRange, 4295 Exceptions.empty()); 4296 return Exceptions.empty() ? EST_DynamicNone : EST_Dynamic; 4297 } 4298 4299 /// ParseTrailingReturnType - Parse a trailing return type on a new-style 4300 /// function declaration. 4301 TypeResult Parser::ParseTrailingReturnType(SourceRange &Range, 4302 bool MayBeFollowedByDirectInit) { 4303 assert(Tok.is(tok::arrow) && "expected arrow"); 4304 4305 ConsumeToken(); 4306 4307 return ParseTypeName(&Range, MayBeFollowedByDirectInit 4308 ? DeclaratorContext::TrailingReturnVar 4309 : DeclaratorContext::TrailingReturn); 4310 } 4311 4312 /// Parse a requires-clause as part of a function declaration. 4313 void Parser::ParseTrailingRequiresClause(Declarator &D) { 4314 assert(Tok.is(tok::kw_requires) && "expected requires"); 4315 4316 SourceLocation RequiresKWLoc = ConsumeToken(); 4317 4318 // C++23 [basic.scope.namespace]p1: 4319 // For each non-friend redeclaration or specialization whose target scope 4320 // is or is contained by the scope, the portion after the declarator-id, 4321 // class-head-name, or enum-head-name is also included in the scope. 4322 // C++23 [basic.scope.class]p1: 4323 // For each non-friend redeclaration or specialization whose target scope 4324 // is or is contained by the scope, the portion after the declarator-id, 4325 // class-head-name, or enum-head-name is also included in the scope. 4326 // 4327 // FIXME: We should really be calling ParseTrailingRequiresClause in 4328 // ParseDirectDeclarator, when we are already in the declarator scope. 4329 // This would also correctly suppress access checks for specializations 4330 // and explicit instantiations, which we currently do not do. 4331 CXXScopeSpec &SS = D.getCXXScopeSpec(); 4332 DeclaratorScopeObj DeclScopeObj(*this, SS); 4333 if (SS.isValid() && Actions.ShouldEnterDeclaratorScope(getCurScope(), SS)) 4334 DeclScopeObj.EnterDeclaratorScope(); 4335 4336 ExprResult TrailingRequiresClause; 4337 ParseScope ParamScope(this, Scope::DeclScope | 4338 Scope::FunctionDeclarationScope | 4339 Scope::FunctionPrototypeScope); 4340 4341 Actions.ActOnStartTrailingRequiresClause(getCurScope(), D); 4342 4343 std::optional<Sema::CXXThisScopeRAII> ThisScope; 4344 InitCXXThisScopeForDeclaratorIfRelevant(D, D.getDeclSpec(), ThisScope); 4345 4346 TrailingRequiresClause = 4347 ParseConstraintLogicalOrExpression(/*IsTrailingRequiresClause=*/true); 4348 4349 TrailingRequiresClause = 4350 Actions.ActOnFinishTrailingRequiresClause(TrailingRequiresClause); 4351 4352 if (!D.isDeclarationOfFunction()) { 4353 Diag(RequiresKWLoc, 4354 diag::err_requires_clause_on_declarator_not_declaring_a_function); 4355 return; 4356 } 4357 4358 if (TrailingRequiresClause.isInvalid()) 4359 SkipUntil({tok::l_brace, tok::arrow, tok::kw_try, tok::comma, tok::colon}, 4360 StopAtSemi | StopBeforeMatch); 4361 else 4362 D.setTrailingRequiresClause(TrailingRequiresClause.get()); 4363 4364 // Did the user swap the trailing return type and requires clause? 4365 if (D.isFunctionDeclarator() && Tok.is(tok::arrow) && 4366 D.getDeclSpec().getTypeSpecType() == TST_auto) { 4367 SourceLocation ArrowLoc = Tok.getLocation(); 4368 SourceRange Range; 4369 TypeResult TrailingReturnType = 4370 ParseTrailingReturnType(Range, /*MayBeFollowedByDirectInit=*/false); 4371 4372 if (!TrailingReturnType.isInvalid()) { 4373 Diag(ArrowLoc, 4374 diag::err_requires_clause_must_appear_after_trailing_return) 4375 << Range; 4376 auto &FunctionChunk = D.getFunctionTypeInfo(); 4377 FunctionChunk.HasTrailingReturnType = TrailingReturnType.isUsable(); 4378 FunctionChunk.TrailingReturnType = TrailingReturnType.get(); 4379 FunctionChunk.TrailingReturnTypeLoc = Range.getBegin(); 4380 } else 4381 SkipUntil({tok::equal, tok::l_brace, tok::arrow, tok::kw_try, tok::comma}, 4382 StopAtSemi | StopBeforeMatch); 4383 } 4384 } 4385 4386 /// We have just started parsing the definition of a new class, 4387 /// so push that class onto our stack of classes that is currently 4388 /// being parsed. 4389 Sema::ParsingClassState Parser::PushParsingClass(Decl *ClassDecl, 4390 bool NonNestedClass, 4391 bool IsInterface) { 4392 assert((NonNestedClass || !ClassStack.empty()) && 4393 "Nested class without outer class"); 4394 ClassStack.push(new ParsingClass(ClassDecl, NonNestedClass, IsInterface)); 4395 return Actions.PushParsingClass(); 4396 } 4397 4398 /// Deallocate the given parsed class and all of its nested 4399 /// classes. 4400 void Parser::DeallocateParsedClasses(Parser::ParsingClass *Class) { 4401 for (unsigned I = 0, N = Class->LateParsedDeclarations.size(); I != N; ++I) 4402 delete Class->LateParsedDeclarations[I]; 4403 delete Class; 4404 } 4405 4406 /// Pop the top class of the stack of classes that are 4407 /// currently being parsed. 4408 /// 4409 /// This routine should be called when we have finished parsing the 4410 /// definition of a class, but have not yet popped the Scope 4411 /// associated with the class's definition. 4412 void Parser::PopParsingClass(Sema::ParsingClassState state) { 4413 assert(!ClassStack.empty() && "Mismatched push/pop for class parsing"); 4414 4415 Actions.PopParsingClass(state); 4416 4417 ParsingClass *Victim = ClassStack.top(); 4418 ClassStack.pop(); 4419 if (Victim->TopLevelClass) { 4420 // Deallocate all of the nested classes of this class, 4421 // recursively: we don't need to keep any of this information. 4422 DeallocateParsedClasses(Victim); 4423 return; 4424 } 4425 assert(!ClassStack.empty() && "Missing top-level class?"); 4426 4427 if (Victim->LateParsedDeclarations.empty()) { 4428 // The victim is a nested class, but we will not need to perform 4429 // any processing after the definition of this class since it has 4430 // no members whose handling was delayed. Therefore, we can just 4431 // remove this nested class. 4432 DeallocateParsedClasses(Victim); 4433 return; 4434 } 4435 4436 // This nested class has some members that will need to be processed 4437 // after the top-level class is completely defined. Therefore, add 4438 // it to the list of nested classes within its parent. 4439 assert(getCurScope()->isClassScope() && 4440 "Nested class outside of class scope?"); 4441 ClassStack.top()->LateParsedDeclarations.push_back( 4442 new LateParsedClass(this, Victim)); 4443 } 4444 4445 /// Try to parse an 'identifier' which appears within an attribute-token. 4446 /// 4447 /// \return the parsed identifier on success, and 0 if the next token is not an 4448 /// attribute-token. 4449 /// 4450 /// C++11 [dcl.attr.grammar]p3: 4451 /// If a keyword or an alternative token that satisfies the syntactic 4452 /// requirements of an identifier is contained in an attribute-token, 4453 /// it is considered an identifier. 4454 IdentifierInfo *Parser::TryParseCXX11AttributeIdentifier( 4455 SourceLocation &Loc, SemaCodeCompletion::AttributeCompletion Completion, 4456 const IdentifierInfo *Scope) { 4457 switch (Tok.getKind()) { 4458 default: 4459 // Identifiers and keywords have identifier info attached. 4460 if (!Tok.isAnnotation()) { 4461 if (IdentifierInfo *II = Tok.getIdentifierInfo()) { 4462 Loc = ConsumeToken(); 4463 return II; 4464 } 4465 } 4466 return nullptr; 4467 4468 case tok::code_completion: 4469 cutOffParsing(); 4470 Actions.CodeCompletion().CodeCompleteAttribute( 4471 getLangOpts().CPlusPlus ? ParsedAttr::AS_CXX11 : ParsedAttr::AS_C23, 4472 Completion, Scope); 4473 return nullptr; 4474 4475 case tok::numeric_constant: { 4476 // If we got a numeric constant, check to see if it comes from a macro that 4477 // corresponds to the predefined __clang__ macro. If it does, warn the user 4478 // and recover by pretending they said _Clang instead. 4479 if (Tok.getLocation().isMacroID()) { 4480 SmallString<8> ExpansionBuf; 4481 SourceLocation ExpansionLoc = 4482 PP.getSourceManager().getExpansionLoc(Tok.getLocation()); 4483 StringRef Spelling = PP.getSpelling(ExpansionLoc, ExpansionBuf); 4484 if (Spelling == "__clang__") { 4485 SourceRange TokRange( 4486 ExpansionLoc, 4487 PP.getSourceManager().getExpansionLoc(Tok.getEndLoc())); 4488 Diag(Tok, diag::warn_wrong_clang_attr_namespace) 4489 << FixItHint::CreateReplacement(TokRange, "_Clang"); 4490 Loc = ConsumeToken(); 4491 return &PP.getIdentifierTable().get("_Clang"); 4492 } 4493 } 4494 return nullptr; 4495 } 4496 4497 case tok::ampamp: // 'and' 4498 case tok::pipe: // 'bitor' 4499 case tok::pipepipe: // 'or' 4500 case tok::caret: // 'xor' 4501 case tok::tilde: // 'compl' 4502 case tok::amp: // 'bitand' 4503 case tok::ampequal: // 'and_eq' 4504 case tok::pipeequal: // 'or_eq' 4505 case tok::caretequal: // 'xor_eq' 4506 case tok::exclaim: // 'not' 4507 case tok::exclaimequal: // 'not_eq' 4508 // Alternative tokens do not have identifier info, but their spelling 4509 // starts with an alphabetical character. 4510 SmallString<8> SpellingBuf; 4511 SourceLocation SpellingLoc = 4512 PP.getSourceManager().getSpellingLoc(Tok.getLocation()); 4513 StringRef Spelling = PP.getSpelling(SpellingLoc, SpellingBuf); 4514 if (isLetter(Spelling[0])) { 4515 Loc = ConsumeToken(); 4516 return &PP.getIdentifierTable().get(Spelling); 4517 } 4518 return nullptr; 4519 } 4520 } 4521 4522 void Parser::ParseOpenMPAttributeArgs(const IdentifierInfo *AttrName, 4523 CachedTokens &OpenMPTokens) { 4524 // Both 'sequence' and 'directive' attributes require arguments, so parse the 4525 // open paren for the argument list. 4526 BalancedDelimiterTracker T(*this, tok::l_paren); 4527 if (T.consumeOpen()) { 4528 Diag(Tok, diag::err_expected) << tok::l_paren; 4529 return; 4530 } 4531 4532 if (AttrName->isStr("directive")) { 4533 // If the attribute is named `directive`, we can consume its argument list 4534 // and push the tokens from it into the cached token stream for a new OpenMP 4535 // pragma directive. 4536 Token OMPBeginTok; 4537 OMPBeginTok.startToken(); 4538 OMPBeginTok.setKind(tok::annot_attr_openmp); 4539 OMPBeginTok.setLocation(Tok.getLocation()); 4540 OpenMPTokens.push_back(OMPBeginTok); 4541 4542 ConsumeAndStoreUntil(tok::r_paren, OpenMPTokens, /*StopAtSemi=*/false, 4543 /*ConsumeFinalToken*/ false); 4544 Token OMPEndTok; 4545 OMPEndTok.startToken(); 4546 OMPEndTok.setKind(tok::annot_pragma_openmp_end); 4547 OMPEndTok.setLocation(Tok.getLocation()); 4548 OpenMPTokens.push_back(OMPEndTok); 4549 } else { 4550 assert(AttrName->isStr("sequence") && 4551 "Expected either 'directive' or 'sequence'"); 4552 // If the attribute is named 'sequence', its argument is a list of one or 4553 // more OpenMP attributes (either 'omp::directive' or 'omp::sequence', 4554 // where the 'omp::' is optional). 4555 do { 4556 // We expect to see one of the following: 4557 // * An identifier (omp) for the attribute namespace followed by :: 4558 // * An identifier (directive) or an identifier (sequence). 4559 SourceLocation IdentLoc; 4560 const IdentifierInfo *Ident = TryParseCXX11AttributeIdentifier(IdentLoc); 4561 4562 // If there is an identifier and it is 'omp', a double colon is required 4563 // followed by the actual identifier we're after. 4564 if (Ident && Ident->isStr("omp") && !ExpectAndConsume(tok::coloncolon)) 4565 Ident = TryParseCXX11AttributeIdentifier(IdentLoc); 4566 4567 // If we failed to find an identifier (scoped or otherwise), or we found 4568 // an unexpected identifier, diagnose. 4569 if (!Ident || (!Ident->isStr("directive") && !Ident->isStr("sequence"))) { 4570 Diag(Tok.getLocation(), diag::err_expected_sequence_or_directive); 4571 SkipUntil(tok::r_paren, StopBeforeMatch); 4572 continue; 4573 } 4574 // We read an identifier. If the identifier is one of the ones we 4575 // expected, we can recurse to parse the args. 4576 ParseOpenMPAttributeArgs(Ident, OpenMPTokens); 4577 4578 // There may be a comma to signal that we expect another directive in the 4579 // sequence. 4580 } while (TryConsumeToken(tok::comma)); 4581 } 4582 // Parse the closing paren for the argument list. 4583 T.consumeClose(); 4584 } 4585 4586 static bool IsBuiltInOrStandardCXX11Attribute(IdentifierInfo *AttrName, 4587 IdentifierInfo *ScopeName) { 4588 switch ( 4589 ParsedAttr::getParsedKind(AttrName, ScopeName, ParsedAttr::AS_CXX11)) { 4590 case ParsedAttr::AT_CarriesDependency: 4591 case ParsedAttr::AT_Deprecated: 4592 case ParsedAttr::AT_FallThrough: 4593 case ParsedAttr::AT_CXX11NoReturn: 4594 case ParsedAttr::AT_NoUniqueAddress: 4595 case ParsedAttr::AT_Likely: 4596 case ParsedAttr::AT_Unlikely: 4597 return true; 4598 case ParsedAttr::AT_WarnUnusedResult: 4599 return !ScopeName && AttrName->getName() == "nodiscard"; 4600 case ParsedAttr::AT_Unused: 4601 return !ScopeName && AttrName->getName() == "maybe_unused"; 4602 default: 4603 return false; 4604 } 4605 } 4606 4607 /// Parse the argument to C++23's [[assume()]] attribute. 4608 bool Parser::ParseCXXAssumeAttributeArg(ParsedAttributes &Attrs, 4609 IdentifierInfo *AttrName, 4610 SourceLocation AttrNameLoc, 4611 SourceLocation *EndLoc, 4612 ParsedAttr::Form Form) { 4613 assert(Tok.is(tok::l_paren) && "Not a C++11 attribute argument list"); 4614 BalancedDelimiterTracker T(*this, tok::l_paren); 4615 T.consumeOpen(); 4616 4617 // [dcl.attr.assume]: The expression is potentially evaluated. 4618 EnterExpressionEvaluationContext Unevaluated( 4619 Actions, Sema::ExpressionEvaluationContext::PotentiallyEvaluated); 4620 4621 TentativeParsingAction TPA(*this); 4622 ExprResult Res( 4623 Actions.CorrectDelayedTyposInExpr(ParseConditionalExpression())); 4624 if (Res.isInvalid()) { 4625 TPA.Commit(); 4626 SkipUntil(tok::r_paren, tok::r_square, StopAtSemi | StopBeforeMatch); 4627 if (Tok.is(tok::r_paren)) 4628 T.consumeClose(); 4629 return true; 4630 } 4631 4632 if (!Tok.isOneOf(tok::r_paren, tok::r_square)) { 4633 // Emit a better diagnostic if this is an otherwise valid expression that 4634 // is not allowed here. 4635 TPA.Revert(); 4636 Res = ParseExpression(); 4637 if (!Res.isInvalid()) { 4638 auto *E = Res.get(); 4639 Diag(E->getExprLoc(), diag::err_assume_attr_expects_cond_expr) 4640 << AttrName << FixItHint::CreateInsertion(E->getBeginLoc(), "(") 4641 << FixItHint::CreateInsertion(PP.getLocForEndOfToken(E->getEndLoc()), 4642 ")") 4643 << E->getSourceRange(); 4644 } 4645 4646 T.consumeClose(); 4647 return true; 4648 } 4649 4650 TPA.Commit(); 4651 ArgsUnion Assumption = Res.get(); 4652 auto RParen = Tok.getLocation(); 4653 T.consumeClose(); 4654 Attrs.addNew(AttrName, SourceRange(AttrNameLoc, RParen), nullptr, 4655 SourceLocation(), &Assumption, 1, Form); 4656 4657 if (EndLoc) 4658 *EndLoc = RParen; 4659 4660 return false; 4661 } 4662 4663 /// ParseCXX11AttributeArgs -- Parse a C++11 attribute-argument-clause. 4664 /// 4665 /// [C++11] attribute-argument-clause: 4666 /// '(' balanced-token-seq ')' 4667 /// 4668 /// [C++11] balanced-token-seq: 4669 /// balanced-token 4670 /// balanced-token-seq balanced-token 4671 /// 4672 /// [C++11] balanced-token: 4673 /// '(' balanced-token-seq ')' 4674 /// '[' balanced-token-seq ']' 4675 /// '{' balanced-token-seq '}' 4676 /// any token but '(', ')', '[', ']', '{', or '}' 4677 bool Parser::ParseCXX11AttributeArgs( 4678 IdentifierInfo *AttrName, SourceLocation AttrNameLoc, 4679 ParsedAttributes &Attrs, SourceLocation *EndLoc, IdentifierInfo *ScopeName, 4680 SourceLocation ScopeLoc, CachedTokens &OpenMPTokens) { 4681 assert(Tok.is(tok::l_paren) && "Not a C++11 attribute argument list"); 4682 SourceLocation LParenLoc = Tok.getLocation(); 4683 const LangOptions &LO = getLangOpts(); 4684 ParsedAttr::Form Form = 4685 LO.CPlusPlus ? ParsedAttr::Form::CXX11() : ParsedAttr::Form::C23(); 4686 4687 // Try parsing microsoft attributes 4688 if (getLangOpts().MicrosoftExt || getLangOpts().HLSL) { 4689 if (hasAttribute(AttributeCommonInfo::Syntax::AS_Microsoft, ScopeName, 4690 AttrName, getTargetInfo(), getLangOpts())) 4691 Form = ParsedAttr::Form::Microsoft(); 4692 } 4693 4694 // If the attribute isn't known, we will not attempt to parse any 4695 // arguments. 4696 if (Form.getSyntax() != ParsedAttr::AS_Microsoft && 4697 !hasAttribute(LO.CPlusPlus ? AttributeCommonInfo::Syntax::AS_CXX11 4698 : AttributeCommonInfo::Syntax::AS_C23, 4699 ScopeName, AttrName, getTargetInfo(), getLangOpts())) { 4700 // Eat the left paren, then skip to the ending right paren. 4701 ConsumeParen(); 4702 SkipUntil(tok::r_paren); 4703 return false; 4704 } 4705 4706 if (ScopeName && (ScopeName->isStr("gnu") || ScopeName->isStr("__gnu__"))) { 4707 // GNU-scoped attributes have some special cases to handle GNU-specific 4708 // behaviors. 4709 ParseGNUAttributeArgs(AttrName, AttrNameLoc, Attrs, EndLoc, ScopeName, 4710 ScopeLoc, Form, nullptr); 4711 return true; 4712 } 4713 4714 // [[omp::directive]] and [[omp::sequence]] need special handling. 4715 if (ScopeName && ScopeName->isStr("omp") && 4716 (AttrName->isStr("directive") || AttrName->isStr("sequence"))) { 4717 Diag(AttrNameLoc, getLangOpts().OpenMP >= 51 4718 ? diag::warn_omp51_compat_attributes 4719 : diag::ext_omp_attributes); 4720 4721 ParseOpenMPAttributeArgs(AttrName, OpenMPTokens); 4722 4723 // We claim that an attribute was parsed and added so that one is not 4724 // created for us by the caller. 4725 return true; 4726 } 4727 4728 unsigned NumArgs; 4729 // Some Clang-scoped attributes have some special parsing behavior. 4730 if (ScopeName && (ScopeName->isStr("clang") || ScopeName->isStr("_Clang"))) 4731 NumArgs = ParseClangAttributeArgs(AttrName, AttrNameLoc, Attrs, EndLoc, 4732 ScopeName, ScopeLoc, Form); 4733 // So does C++23's assume() attribute. 4734 else if (!ScopeName && AttrName->isStr("assume")) { 4735 if (ParseCXXAssumeAttributeArg(Attrs, AttrName, AttrNameLoc, EndLoc, Form)) 4736 return true; 4737 NumArgs = 1; 4738 } else 4739 NumArgs = ParseAttributeArgsCommon(AttrName, AttrNameLoc, Attrs, EndLoc, 4740 ScopeName, ScopeLoc, Form); 4741 4742 if (!Attrs.empty() && 4743 IsBuiltInOrStandardCXX11Attribute(AttrName, ScopeName)) { 4744 ParsedAttr &Attr = Attrs.back(); 4745 4746 // Ignore attributes that don't exist for the target. 4747 if (!Attr.existsInTarget(getTargetInfo())) { 4748 Diag(LParenLoc, diag::warn_unknown_attribute_ignored) << AttrName; 4749 Attr.setInvalid(true); 4750 return true; 4751 } 4752 4753 // If the attribute is a standard or built-in attribute and we are 4754 // parsing an argument list, we need to determine whether this attribute 4755 // was allowed to have an argument list (such as [[deprecated]]), and how 4756 // many arguments were parsed (so we can diagnose on [[deprecated()]]). 4757 if (Attr.getMaxArgs() && !NumArgs) { 4758 // The attribute was allowed to have arguments, but none were provided 4759 // even though the attribute parsed successfully. This is an error. 4760 Diag(LParenLoc, diag::err_attribute_requires_arguments) << AttrName; 4761 Attr.setInvalid(true); 4762 } else if (!Attr.getMaxArgs()) { 4763 // The attribute parsed successfully, but was not allowed to have any 4764 // arguments. It doesn't matter whether any were provided -- the 4765 // presence of the argument list (even if empty) is diagnosed. 4766 Diag(LParenLoc, diag::err_cxx11_attribute_forbids_arguments) 4767 << AttrName 4768 << FixItHint::CreateRemoval(SourceRange(LParenLoc, *EndLoc)); 4769 Attr.setInvalid(true); 4770 } 4771 } 4772 return true; 4773 } 4774 4775 /// Parse a C++11 or C23 attribute-specifier. 4776 /// 4777 /// [C++11] attribute-specifier: 4778 /// '[' '[' attribute-list ']' ']' 4779 /// alignment-specifier 4780 /// 4781 /// [C++11] attribute-list: 4782 /// attribute[opt] 4783 /// attribute-list ',' attribute[opt] 4784 /// attribute '...' 4785 /// attribute-list ',' attribute '...' 4786 /// 4787 /// [C++11] attribute: 4788 /// attribute-token attribute-argument-clause[opt] 4789 /// 4790 /// [C++11] attribute-token: 4791 /// identifier 4792 /// attribute-scoped-token 4793 /// 4794 /// [C++11] attribute-scoped-token: 4795 /// attribute-namespace '::' identifier 4796 /// 4797 /// [C++11] attribute-namespace: 4798 /// identifier 4799 void Parser::ParseCXX11AttributeSpecifierInternal(ParsedAttributes &Attrs, 4800 CachedTokens &OpenMPTokens, 4801 SourceLocation *EndLoc) { 4802 if (Tok.is(tok::kw_alignas)) { 4803 // alignas is a valid token in C23 but it is not an attribute, it's a type- 4804 // specifier-qualifier, which means it has different parsing behavior. We 4805 // handle this in ParseDeclarationSpecifiers() instead of here in C. We 4806 // should not get here for C any longer. 4807 assert(getLangOpts().CPlusPlus && "'alignas' is not an attribute in C"); 4808 Diag(Tok.getLocation(), diag::warn_cxx98_compat_alignas); 4809 ParseAlignmentSpecifier(Attrs, EndLoc); 4810 return; 4811 } 4812 4813 if (Tok.isRegularKeywordAttribute()) { 4814 SourceLocation Loc = Tok.getLocation(); 4815 IdentifierInfo *AttrName = Tok.getIdentifierInfo(); 4816 ParsedAttr::Form Form = ParsedAttr::Form(Tok.getKind()); 4817 bool TakesArgs = doesKeywordAttributeTakeArgs(Tok.getKind()); 4818 ConsumeToken(); 4819 if (TakesArgs) { 4820 if (!Tok.is(tok::l_paren)) 4821 Diag(Tok.getLocation(), diag::err_expected_lparen_after) << AttrName; 4822 else 4823 ParseAttributeArgsCommon(AttrName, Loc, Attrs, EndLoc, 4824 /*ScopeName*/ nullptr, 4825 /*ScopeLoc*/ Loc, Form); 4826 } else 4827 Attrs.addNew(AttrName, Loc, nullptr, Loc, nullptr, 0, Form); 4828 return; 4829 } 4830 4831 assert(Tok.is(tok::l_square) && NextToken().is(tok::l_square) && 4832 "Not a double square bracket attribute list"); 4833 4834 SourceLocation OpenLoc = Tok.getLocation(); 4835 if (getLangOpts().CPlusPlus) { 4836 Diag(OpenLoc, getLangOpts().CPlusPlus11 ? diag::warn_cxx98_compat_attribute 4837 : diag::warn_ext_cxx11_attributes); 4838 } else { 4839 Diag(OpenLoc, getLangOpts().C23 ? diag::warn_pre_c23_compat_attributes 4840 : diag::warn_ext_c23_attributes); 4841 } 4842 4843 ConsumeBracket(); 4844 checkCompoundToken(OpenLoc, tok::l_square, CompoundToken::AttrBegin); 4845 ConsumeBracket(); 4846 4847 SourceLocation CommonScopeLoc; 4848 IdentifierInfo *CommonScopeName = nullptr; 4849 if (Tok.is(tok::kw_using)) { 4850 Diag(Tok.getLocation(), getLangOpts().CPlusPlus17 4851 ? diag::warn_cxx14_compat_using_attribute_ns 4852 : diag::ext_using_attribute_ns); 4853 ConsumeToken(); 4854 4855 CommonScopeName = TryParseCXX11AttributeIdentifier( 4856 CommonScopeLoc, SemaCodeCompletion::AttributeCompletion::Scope); 4857 if (!CommonScopeName) { 4858 Diag(Tok.getLocation(), diag::err_expected) << tok::identifier; 4859 SkipUntil(tok::r_square, tok::colon, StopBeforeMatch); 4860 } 4861 if (!TryConsumeToken(tok::colon) && CommonScopeName) 4862 Diag(Tok.getLocation(), diag::err_expected) << tok::colon; 4863 } 4864 4865 bool AttrParsed = false; 4866 while (!Tok.isOneOf(tok::r_square, tok::semi, tok::eof)) { 4867 if (AttrParsed) { 4868 // If we parsed an attribute, a comma is required before parsing any 4869 // additional attributes. 4870 if (ExpectAndConsume(tok::comma)) { 4871 SkipUntil(tok::r_square, StopAtSemi | StopBeforeMatch); 4872 continue; 4873 } 4874 AttrParsed = false; 4875 } 4876 4877 // Eat all remaining superfluous commas before parsing the next attribute. 4878 while (TryConsumeToken(tok::comma)) 4879 ; 4880 4881 SourceLocation ScopeLoc, AttrLoc; 4882 IdentifierInfo *ScopeName = nullptr, *AttrName = nullptr; 4883 4884 AttrName = TryParseCXX11AttributeIdentifier( 4885 AttrLoc, SemaCodeCompletion::AttributeCompletion::Attribute, 4886 CommonScopeName); 4887 if (!AttrName) 4888 // Break out to the "expected ']'" diagnostic. 4889 break; 4890 4891 // scoped attribute 4892 if (TryConsumeToken(tok::coloncolon)) { 4893 ScopeName = AttrName; 4894 ScopeLoc = AttrLoc; 4895 4896 AttrName = TryParseCXX11AttributeIdentifier( 4897 AttrLoc, SemaCodeCompletion::AttributeCompletion::Attribute, 4898 ScopeName); 4899 if (!AttrName) { 4900 Diag(Tok.getLocation(), diag::err_expected) << tok::identifier; 4901 SkipUntil(tok::r_square, tok::comma, StopAtSemi | StopBeforeMatch); 4902 continue; 4903 } 4904 } 4905 4906 if (CommonScopeName) { 4907 if (ScopeName) { 4908 Diag(ScopeLoc, diag::err_using_attribute_ns_conflict) 4909 << SourceRange(CommonScopeLoc); 4910 } else { 4911 ScopeName = CommonScopeName; 4912 ScopeLoc = CommonScopeLoc; 4913 } 4914 } 4915 4916 // Parse attribute arguments 4917 if (Tok.is(tok::l_paren)) 4918 AttrParsed = ParseCXX11AttributeArgs(AttrName, AttrLoc, Attrs, EndLoc, 4919 ScopeName, ScopeLoc, OpenMPTokens); 4920 4921 if (!AttrParsed) { 4922 Attrs.addNew( 4923 AttrName, 4924 SourceRange(ScopeLoc.isValid() ? ScopeLoc : AttrLoc, AttrLoc), 4925 ScopeName, ScopeLoc, nullptr, 0, 4926 getLangOpts().CPlusPlus ? ParsedAttr::Form::CXX11() 4927 : ParsedAttr::Form::C23()); 4928 AttrParsed = true; 4929 } 4930 4931 if (TryConsumeToken(tok::ellipsis)) 4932 Diag(Tok, diag::err_cxx11_attribute_forbids_ellipsis) << AttrName; 4933 } 4934 4935 // If we hit an error and recovered by parsing up to a semicolon, eat the 4936 // semicolon and don't issue further diagnostics about missing brackets. 4937 if (Tok.is(tok::semi)) { 4938 ConsumeToken(); 4939 return; 4940 } 4941 4942 SourceLocation CloseLoc = Tok.getLocation(); 4943 if (ExpectAndConsume(tok::r_square)) 4944 SkipUntil(tok::r_square); 4945 else if (Tok.is(tok::r_square)) 4946 checkCompoundToken(CloseLoc, tok::r_square, CompoundToken::AttrEnd); 4947 if (EndLoc) 4948 *EndLoc = Tok.getLocation(); 4949 if (ExpectAndConsume(tok::r_square)) 4950 SkipUntil(tok::r_square); 4951 } 4952 4953 /// ParseCXX11Attributes - Parse a C++11 or C23 attribute-specifier-seq. 4954 /// 4955 /// attribute-specifier-seq: 4956 /// attribute-specifier-seq[opt] attribute-specifier 4957 void Parser::ParseCXX11Attributes(ParsedAttributes &Attrs) { 4958 SourceLocation StartLoc = Tok.getLocation(); 4959 SourceLocation EndLoc = StartLoc; 4960 4961 do { 4962 ParseCXX11AttributeSpecifier(Attrs, &EndLoc); 4963 } while (isAllowedCXX11AttributeSpecifier()); 4964 4965 Attrs.Range = SourceRange(StartLoc, EndLoc); 4966 } 4967 4968 void Parser::DiagnoseAndSkipCXX11Attributes() { 4969 auto Keyword = 4970 Tok.isRegularKeywordAttribute() ? Tok.getIdentifierInfo() : nullptr; 4971 // Start and end location of an attribute or an attribute list. 4972 SourceLocation StartLoc = Tok.getLocation(); 4973 SourceLocation EndLoc = SkipCXX11Attributes(); 4974 4975 if (EndLoc.isValid()) { 4976 SourceRange Range(StartLoc, EndLoc); 4977 (Keyword ? Diag(StartLoc, diag::err_keyword_not_allowed) << Keyword 4978 : Diag(StartLoc, diag::err_attributes_not_allowed)) 4979 << Range; 4980 } 4981 } 4982 4983 SourceLocation Parser::SkipCXX11Attributes() { 4984 SourceLocation EndLoc; 4985 4986 if (!isCXX11AttributeSpecifier()) 4987 return EndLoc; 4988 4989 do { 4990 if (Tok.is(tok::l_square)) { 4991 BalancedDelimiterTracker T(*this, tok::l_square); 4992 T.consumeOpen(); 4993 T.skipToEnd(); 4994 EndLoc = T.getCloseLocation(); 4995 } else if (Tok.isRegularKeywordAttribute() && 4996 !doesKeywordAttributeTakeArgs(Tok.getKind())) { 4997 EndLoc = Tok.getLocation(); 4998 ConsumeToken(); 4999 } else { 5000 assert((Tok.is(tok::kw_alignas) || Tok.isRegularKeywordAttribute()) && 5001 "not an attribute specifier"); 5002 ConsumeToken(); 5003 BalancedDelimiterTracker T(*this, tok::l_paren); 5004 if (!T.consumeOpen()) 5005 T.skipToEnd(); 5006 EndLoc = T.getCloseLocation(); 5007 } 5008 } while (isCXX11AttributeSpecifier()); 5009 5010 return EndLoc; 5011 } 5012 5013 /// Parse uuid() attribute when it appears in a [] Microsoft attribute. 5014 void Parser::ParseMicrosoftUuidAttributeArgs(ParsedAttributes &Attrs) { 5015 assert(Tok.is(tok::identifier) && "Not a Microsoft attribute list"); 5016 IdentifierInfo *UuidIdent = Tok.getIdentifierInfo(); 5017 assert(UuidIdent->getName() == "uuid" && "Not a Microsoft attribute list"); 5018 5019 SourceLocation UuidLoc = Tok.getLocation(); 5020 ConsumeToken(); 5021 5022 // Ignore the left paren location for now. 5023 BalancedDelimiterTracker T(*this, tok::l_paren); 5024 if (T.consumeOpen()) { 5025 Diag(Tok, diag::err_expected) << tok::l_paren; 5026 return; 5027 } 5028 5029 ArgsVector ArgExprs; 5030 if (isTokenStringLiteral()) { 5031 // Easy case: uuid("...") -- quoted string. 5032 ExprResult StringResult = ParseUnevaluatedStringLiteralExpression(); 5033 if (StringResult.isInvalid()) 5034 return; 5035 ArgExprs.push_back(StringResult.get()); 5036 } else { 5037 // something like uuid({000000A0-0000-0000-C000-000000000049}) -- no 5038 // quotes in the parens. Just append the spelling of all tokens encountered 5039 // until the closing paren. 5040 5041 SmallString<42> StrBuffer; // 2 "", 36 bytes UUID, 2 optional {}, 1 nul 5042 StrBuffer += "\""; 5043 5044 // Since none of C++'s keywords match [a-f]+, accepting just tok::l_brace, 5045 // tok::r_brace, tok::minus, tok::identifier (think C000) and 5046 // tok::numeric_constant (0000) should be enough. But the spelling of the 5047 // uuid argument is checked later anyways, so there's no harm in accepting 5048 // almost anything here. 5049 // cl is very strict about whitespace in this form and errors out if any 5050 // is present, so check the space flags on the tokens. 5051 SourceLocation StartLoc = Tok.getLocation(); 5052 while (Tok.isNot(tok::r_paren)) { 5053 if (Tok.hasLeadingSpace() || Tok.isAtStartOfLine()) { 5054 Diag(Tok, diag::err_attribute_uuid_malformed_guid); 5055 SkipUntil(tok::r_paren, StopAtSemi); 5056 return; 5057 } 5058 SmallString<16> SpellingBuffer; 5059 SpellingBuffer.resize(Tok.getLength() + 1); 5060 bool Invalid = false; 5061 StringRef TokSpelling = PP.getSpelling(Tok, SpellingBuffer, &Invalid); 5062 if (Invalid) { 5063 SkipUntil(tok::r_paren, StopAtSemi); 5064 return; 5065 } 5066 StrBuffer += TokSpelling; 5067 ConsumeAnyToken(); 5068 } 5069 StrBuffer += "\""; 5070 5071 if (Tok.hasLeadingSpace() || Tok.isAtStartOfLine()) { 5072 Diag(Tok, diag::err_attribute_uuid_malformed_guid); 5073 ConsumeParen(); 5074 return; 5075 } 5076 5077 // Pretend the user wrote the appropriate string literal here. 5078 // ActOnStringLiteral() copies the string data into the literal, so it's 5079 // ok that the Token points to StrBuffer. 5080 Token Toks[1]; 5081 Toks[0].startToken(); 5082 Toks[0].setKind(tok::string_literal); 5083 Toks[0].setLocation(StartLoc); 5084 Toks[0].setLiteralData(StrBuffer.data()); 5085 Toks[0].setLength(StrBuffer.size()); 5086 StringLiteral *UuidString = 5087 cast<StringLiteral>(Actions.ActOnUnevaluatedStringLiteral(Toks).get()); 5088 ArgExprs.push_back(UuidString); 5089 } 5090 5091 if (!T.consumeClose()) { 5092 Attrs.addNew(UuidIdent, SourceRange(UuidLoc, T.getCloseLocation()), nullptr, 5093 SourceLocation(), ArgExprs.data(), ArgExprs.size(), 5094 ParsedAttr::Form::Microsoft()); 5095 } 5096 } 5097 5098 /// ParseMicrosoftAttributes - Parse Microsoft attributes [Attr] 5099 /// 5100 /// [MS] ms-attribute: 5101 /// '[' token-seq ']' 5102 /// 5103 /// [MS] ms-attribute-seq: 5104 /// ms-attribute[opt] 5105 /// ms-attribute ms-attribute-seq 5106 void Parser::ParseMicrosoftAttributes(ParsedAttributes &Attrs) { 5107 assert(Tok.is(tok::l_square) && "Not a Microsoft attribute list"); 5108 5109 SourceLocation StartLoc = Tok.getLocation(); 5110 SourceLocation EndLoc = StartLoc; 5111 do { 5112 // FIXME: If this is actually a C++11 attribute, parse it as one. 5113 BalancedDelimiterTracker T(*this, tok::l_square); 5114 T.consumeOpen(); 5115 5116 // Skip most ms attributes except for a specific list. 5117 while (true) { 5118 SkipUntil(tok::r_square, tok::identifier, 5119 StopAtSemi | StopBeforeMatch | StopAtCodeCompletion); 5120 if (Tok.is(tok::code_completion)) { 5121 cutOffParsing(); 5122 Actions.CodeCompletion().CodeCompleteAttribute( 5123 AttributeCommonInfo::AS_Microsoft, 5124 SemaCodeCompletion::AttributeCompletion::Attribute, 5125 /*Scope=*/nullptr); 5126 break; 5127 } 5128 if (Tok.isNot(tok::identifier)) // ']', but also eof 5129 break; 5130 if (Tok.getIdentifierInfo()->getName() == "uuid") 5131 ParseMicrosoftUuidAttributeArgs(Attrs); 5132 else { 5133 IdentifierInfo *II = Tok.getIdentifierInfo(); 5134 SourceLocation NameLoc = Tok.getLocation(); 5135 ConsumeToken(); 5136 ParsedAttr::Kind AttrKind = 5137 ParsedAttr::getParsedKind(II, nullptr, ParsedAttr::AS_Microsoft); 5138 // For HLSL we want to handle all attributes, but for MSVC compat, we 5139 // silently ignore unknown Microsoft attributes. 5140 if (getLangOpts().HLSL || AttrKind != ParsedAttr::UnknownAttribute) { 5141 bool AttrParsed = false; 5142 if (Tok.is(tok::l_paren)) { 5143 CachedTokens OpenMPTokens; 5144 AttrParsed = 5145 ParseCXX11AttributeArgs(II, NameLoc, Attrs, &EndLoc, nullptr, 5146 SourceLocation(), OpenMPTokens); 5147 ReplayOpenMPAttributeTokens(OpenMPTokens); 5148 } 5149 if (!AttrParsed) { 5150 Attrs.addNew(II, NameLoc, nullptr, SourceLocation(), nullptr, 0, 5151 ParsedAttr::Form::Microsoft()); 5152 } 5153 } 5154 } 5155 } 5156 5157 T.consumeClose(); 5158 EndLoc = T.getCloseLocation(); 5159 } while (Tok.is(tok::l_square)); 5160 5161 Attrs.Range = SourceRange(StartLoc, EndLoc); 5162 } 5163 5164 void Parser::ParseMicrosoftIfExistsClassDeclaration( 5165 DeclSpec::TST TagType, ParsedAttributes &AccessAttrs, 5166 AccessSpecifier &CurAS) { 5167 IfExistsCondition Result; 5168 if (ParseMicrosoftIfExistsCondition(Result)) 5169 return; 5170 5171 BalancedDelimiterTracker Braces(*this, tok::l_brace); 5172 if (Braces.consumeOpen()) { 5173 Diag(Tok, diag::err_expected) << tok::l_brace; 5174 return; 5175 } 5176 5177 switch (Result.Behavior) { 5178 case IEB_Parse: 5179 // Parse the declarations below. 5180 break; 5181 5182 case IEB_Dependent: 5183 Diag(Result.KeywordLoc, diag::warn_microsoft_dependent_exists) 5184 << Result.IsIfExists; 5185 // Fall through to skip. 5186 [[fallthrough]]; 5187 5188 case IEB_Skip: 5189 Braces.skipToEnd(); 5190 return; 5191 } 5192 5193 while (Tok.isNot(tok::r_brace) && !isEofOrEom()) { 5194 // __if_exists, __if_not_exists can nest. 5195 if (Tok.isOneOf(tok::kw___if_exists, tok::kw___if_not_exists)) { 5196 ParseMicrosoftIfExistsClassDeclaration(TagType, AccessAttrs, CurAS); 5197 continue; 5198 } 5199 5200 // Check for extraneous top-level semicolon. 5201 if (Tok.is(tok::semi)) { 5202 ConsumeExtraSemi(InsideStruct, TagType); 5203 continue; 5204 } 5205 5206 AccessSpecifier AS = getAccessSpecifierIfPresent(); 5207 if (AS != AS_none) { 5208 // Current token is a C++ access specifier. 5209 CurAS = AS; 5210 SourceLocation ASLoc = Tok.getLocation(); 5211 ConsumeToken(); 5212 if (Tok.is(tok::colon)) 5213 Actions.ActOnAccessSpecifier(AS, ASLoc, Tok.getLocation(), 5214 ParsedAttributesView{}); 5215 else 5216 Diag(Tok, diag::err_expected) << tok::colon; 5217 ConsumeToken(); 5218 continue; 5219 } 5220 5221 ParsedTemplateInfo TemplateInfo; 5222 // Parse all the comma separated declarators. 5223 ParseCXXClassMemberDeclaration(CurAS, AccessAttrs, TemplateInfo); 5224 } 5225 5226 Braces.consumeClose(); 5227 } 5228