1 //===--- ParseDeclCXX.cpp - C++ Declaration Parsing -----------------------===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 // This file implements the C++ Declaration portions of the Parser interfaces. 11 // 12 //===----------------------------------------------------------------------===// 13 14 #include "clang/Parse/Parser.h" 15 #include "RAIIObjectsForParser.h" 16 #include "clang/Basic/CharInfo.h" 17 #include "clang/Basic/OperatorKinds.h" 18 #include "clang/AST/DeclTemplate.h" 19 #include "clang/Parse/ParseDiagnostic.h" 20 #include "clang/Sema/DeclSpec.h" 21 #include "clang/Sema/ParsedTemplate.h" 22 #include "clang/Sema/PrettyDeclStackTrace.h" 23 #include "clang/Sema/Scope.h" 24 #include "clang/Sema/SemaDiagnostic.h" 25 #include "llvm/ADT/SmallString.h" 26 using namespace clang; 27 28 /// ParseNamespace - We know that the current token is a namespace keyword. This 29 /// may either be a top level namespace or a block-level namespace alias. If 30 /// there was an inline keyword, it has already been parsed. 31 /// 32 /// namespace-definition: [C++ 7.3: basic.namespace] 33 /// named-namespace-definition 34 /// unnamed-namespace-definition 35 /// 36 /// unnamed-namespace-definition: 37 /// 'inline'[opt] 'namespace' attributes[opt] '{' namespace-body '}' 38 /// 39 /// named-namespace-definition: 40 /// original-namespace-definition 41 /// extension-namespace-definition 42 /// 43 /// original-namespace-definition: 44 /// 'inline'[opt] 'namespace' identifier attributes[opt] 45 /// '{' namespace-body '}' 46 /// 47 /// extension-namespace-definition: 48 /// 'inline'[opt] 'namespace' original-namespace-name 49 /// '{' namespace-body '}' 50 /// 51 /// namespace-alias-definition: [C++ 7.3.2: namespace.alias] 52 /// 'namespace' identifier '=' qualified-namespace-specifier ';' 53 /// 54 Decl *Parser::ParseNamespace(unsigned Context, 55 SourceLocation &DeclEnd, 56 SourceLocation InlineLoc) { 57 assert(Tok.is(tok::kw_namespace) && "Not a namespace!"); 58 SourceLocation NamespaceLoc = ConsumeToken(); // eat the 'namespace'. 59 ObjCDeclContextSwitch ObjCDC(*this); 60 61 if (Tok.is(tok::code_completion)) { 62 Actions.CodeCompleteNamespaceDecl(getCurScope()); 63 cutOffParsing(); 64 return 0; 65 } 66 67 SourceLocation IdentLoc; 68 IdentifierInfo *Ident = 0; 69 std::vector<SourceLocation> ExtraIdentLoc; 70 std::vector<IdentifierInfo*> ExtraIdent; 71 std::vector<SourceLocation> ExtraNamespaceLoc; 72 73 Token attrTok; 74 75 if (Tok.is(tok::identifier)) { 76 Ident = Tok.getIdentifierInfo(); 77 IdentLoc = ConsumeToken(); // eat the identifier. 78 while (Tok.is(tok::coloncolon) && NextToken().is(tok::identifier)) { 79 ExtraNamespaceLoc.push_back(ConsumeToken()); 80 ExtraIdent.push_back(Tok.getIdentifierInfo()); 81 ExtraIdentLoc.push_back(ConsumeToken()); 82 } 83 } 84 85 // Read label attributes, if present. 86 ParsedAttributes attrs(AttrFactory); 87 if (Tok.is(tok::kw___attribute)) { 88 attrTok = Tok; 89 ParseGNUAttributes(attrs); 90 } 91 92 if (Tok.is(tok::equal)) { 93 if (Ident == 0) { 94 Diag(Tok, diag::err_expected_ident); 95 // Skip to end of the definition and eat the ';'. 96 SkipUntil(tok::semi); 97 return 0; 98 } 99 if (!attrs.empty()) 100 Diag(attrTok, diag::err_unexpected_namespace_attributes_alias); 101 if (InlineLoc.isValid()) 102 Diag(InlineLoc, diag::err_inline_namespace_alias) 103 << FixItHint::CreateRemoval(InlineLoc); 104 return ParseNamespaceAlias(NamespaceLoc, IdentLoc, Ident, DeclEnd); 105 } 106 107 108 BalancedDelimiterTracker T(*this, tok::l_brace); 109 if (T.consumeOpen()) { 110 if (!ExtraIdent.empty()) { 111 Diag(ExtraNamespaceLoc[0], diag::err_nested_namespaces_with_double_colon) 112 << SourceRange(ExtraNamespaceLoc.front(), ExtraIdentLoc.back()); 113 } 114 Diag(Tok, Ident ? diag::err_expected_lbrace : 115 diag::err_expected_ident_lbrace); 116 return 0; 117 } 118 119 if (getCurScope()->isClassScope() || getCurScope()->isTemplateParamScope() || 120 getCurScope()->isInObjcMethodScope() || getCurScope()->getBlockParent() || 121 getCurScope()->getFnParent()) { 122 if (!ExtraIdent.empty()) { 123 Diag(ExtraNamespaceLoc[0], diag::err_nested_namespaces_with_double_colon) 124 << SourceRange(ExtraNamespaceLoc.front(), ExtraIdentLoc.back()); 125 } 126 Diag(T.getOpenLocation(), diag::err_namespace_nonnamespace_scope); 127 SkipUntil(tok::r_brace, false); 128 return 0; 129 } 130 131 if (!ExtraIdent.empty()) { 132 TentativeParsingAction TPA(*this); 133 SkipUntil(tok::r_brace, /*StopAtSemi*/false, /*DontConsume*/true); 134 Token rBraceToken = Tok; 135 TPA.Revert(); 136 137 if (!rBraceToken.is(tok::r_brace)) { 138 Diag(ExtraNamespaceLoc[0], diag::err_nested_namespaces_with_double_colon) 139 << SourceRange(ExtraNamespaceLoc.front(), ExtraIdentLoc.back()); 140 } else { 141 std::string NamespaceFix; 142 for (std::vector<IdentifierInfo*>::iterator I = ExtraIdent.begin(), 143 E = ExtraIdent.end(); I != E; ++I) { 144 NamespaceFix += " { namespace "; 145 NamespaceFix += (*I)->getName(); 146 } 147 148 std::string RBraces; 149 for (unsigned i = 0, e = ExtraIdent.size(); i != e; ++i) 150 RBraces += "} "; 151 152 Diag(ExtraNamespaceLoc[0], diag::err_nested_namespaces_with_double_colon) 153 << FixItHint::CreateReplacement(SourceRange(ExtraNamespaceLoc.front(), 154 ExtraIdentLoc.back()), 155 NamespaceFix) 156 << FixItHint::CreateInsertion(rBraceToken.getLocation(), RBraces); 157 } 158 } 159 160 // If we're still good, complain about inline namespaces in non-C++0x now. 161 if (InlineLoc.isValid()) 162 Diag(InlineLoc, getLangOpts().CPlusPlus11 ? 163 diag::warn_cxx98_compat_inline_namespace : diag::ext_inline_namespace); 164 165 // Enter a scope for the namespace. 166 ParseScope NamespaceScope(this, Scope::DeclScope); 167 168 Decl *NamespcDecl = 169 Actions.ActOnStartNamespaceDef(getCurScope(), InlineLoc, NamespaceLoc, 170 IdentLoc, Ident, T.getOpenLocation(), 171 attrs.getList()); 172 173 PrettyDeclStackTraceEntry CrashInfo(Actions, NamespcDecl, NamespaceLoc, 174 "parsing namespace"); 175 176 // Parse the contents of the namespace. This includes parsing recovery on 177 // any improperly nested namespaces. 178 ParseInnerNamespace(ExtraIdentLoc, ExtraIdent, ExtraNamespaceLoc, 0, 179 InlineLoc, attrs, T); 180 181 // Leave the namespace scope. 182 NamespaceScope.Exit(); 183 184 DeclEnd = T.getCloseLocation(); 185 Actions.ActOnFinishNamespaceDef(NamespcDecl, DeclEnd); 186 187 return NamespcDecl; 188 } 189 190 /// ParseInnerNamespace - Parse the contents of a namespace. 191 void Parser::ParseInnerNamespace(std::vector<SourceLocation>& IdentLoc, 192 std::vector<IdentifierInfo*>& Ident, 193 std::vector<SourceLocation>& NamespaceLoc, 194 unsigned int index, SourceLocation& InlineLoc, 195 ParsedAttributes& attrs, 196 BalancedDelimiterTracker &Tracker) { 197 if (index == Ident.size()) { 198 while (Tok.isNot(tok::r_brace) && Tok.isNot(tok::eof)) { 199 ParsedAttributesWithRange attrs(AttrFactory); 200 MaybeParseCXX11Attributes(attrs); 201 MaybeParseMicrosoftAttributes(attrs); 202 ParseExternalDeclaration(attrs); 203 } 204 205 // The caller is what called check -- we are simply calling 206 // the close for it. 207 Tracker.consumeClose(); 208 209 return; 210 } 211 212 // Parse improperly nested namespaces. 213 ParseScope NamespaceScope(this, Scope::DeclScope); 214 Decl *NamespcDecl = 215 Actions.ActOnStartNamespaceDef(getCurScope(), SourceLocation(), 216 NamespaceLoc[index], IdentLoc[index], 217 Ident[index], Tracker.getOpenLocation(), 218 attrs.getList()); 219 220 ParseInnerNamespace(IdentLoc, Ident, NamespaceLoc, ++index, InlineLoc, 221 attrs, Tracker); 222 223 NamespaceScope.Exit(); 224 225 Actions.ActOnFinishNamespaceDef(NamespcDecl, Tracker.getCloseLocation()); 226 } 227 228 /// ParseNamespaceAlias - Parse the part after the '=' in a namespace 229 /// alias definition. 230 /// 231 Decl *Parser::ParseNamespaceAlias(SourceLocation NamespaceLoc, 232 SourceLocation AliasLoc, 233 IdentifierInfo *Alias, 234 SourceLocation &DeclEnd) { 235 assert(Tok.is(tok::equal) && "Not equal token"); 236 237 ConsumeToken(); // eat the '='. 238 239 if (Tok.is(tok::code_completion)) { 240 Actions.CodeCompleteNamespaceAliasDecl(getCurScope()); 241 cutOffParsing(); 242 return 0; 243 } 244 245 CXXScopeSpec SS; 246 // Parse (optional) nested-name-specifier. 247 ParseOptionalCXXScopeSpecifier(SS, ParsedType(), /*EnteringContext=*/false); 248 249 if (SS.isInvalid() || Tok.isNot(tok::identifier)) { 250 Diag(Tok, diag::err_expected_namespace_name); 251 // Skip to end of the definition and eat the ';'. 252 SkipUntil(tok::semi); 253 return 0; 254 } 255 256 // Parse identifier. 257 IdentifierInfo *Ident = Tok.getIdentifierInfo(); 258 SourceLocation IdentLoc = ConsumeToken(); 259 260 // Eat the ';'. 261 DeclEnd = Tok.getLocation(); 262 ExpectAndConsume(tok::semi, diag::err_expected_semi_after_namespace_name, 263 "", tok::semi); 264 265 return Actions.ActOnNamespaceAliasDef(getCurScope(), NamespaceLoc, AliasLoc, Alias, 266 SS, IdentLoc, Ident); 267 } 268 269 /// ParseLinkage - We know that the current token is a string_literal 270 /// and just before that, that extern was seen. 271 /// 272 /// linkage-specification: [C++ 7.5p2: dcl.link] 273 /// 'extern' string-literal '{' declaration-seq[opt] '}' 274 /// 'extern' string-literal declaration 275 /// 276 Decl *Parser::ParseLinkage(ParsingDeclSpec &DS, unsigned Context) { 277 assert(Tok.is(tok::string_literal) && "Not a string literal!"); 278 SmallString<8> LangBuffer; 279 bool Invalid = false; 280 StringRef Lang = PP.getSpelling(Tok, LangBuffer, &Invalid); 281 if (Invalid) 282 return 0; 283 284 // FIXME: This is incorrect: linkage-specifiers are parsed in translation 285 // phase 7, so string-literal concatenation is supposed to occur. 286 // extern "" "C" "" "+" "+" { } is legal. 287 if (Tok.hasUDSuffix()) 288 Diag(Tok, diag::err_invalid_string_udl); 289 SourceLocation Loc = ConsumeStringToken(); 290 291 ParseScope LinkageScope(this, Scope::DeclScope); 292 Decl *LinkageSpec 293 = Actions.ActOnStartLinkageSpecification(getCurScope(), 294 DS.getSourceRange().getBegin(), 295 Loc, Lang, 296 Tok.is(tok::l_brace) ? Tok.getLocation() 297 : SourceLocation()); 298 299 ParsedAttributesWithRange attrs(AttrFactory); 300 MaybeParseCXX11Attributes(attrs); 301 MaybeParseMicrosoftAttributes(attrs); 302 303 if (Tok.isNot(tok::l_brace)) { 304 // Reset the source range in DS, as the leading "extern" 305 // does not really belong to the inner declaration ... 306 DS.SetRangeStart(SourceLocation()); 307 DS.SetRangeEnd(SourceLocation()); 308 // ... but anyway remember that such an "extern" was seen. 309 DS.setExternInLinkageSpec(true); 310 ParseExternalDeclaration(attrs, &DS); 311 return Actions.ActOnFinishLinkageSpecification(getCurScope(), LinkageSpec, 312 SourceLocation()); 313 } 314 315 DS.abort(); 316 317 ProhibitAttributes(attrs); 318 319 BalancedDelimiterTracker T(*this, tok::l_brace); 320 T.consumeOpen(); 321 while (Tok.isNot(tok::r_brace) && Tok.isNot(tok::eof)) { 322 ParsedAttributesWithRange attrs(AttrFactory); 323 MaybeParseCXX11Attributes(attrs); 324 MaybeParseMicrosoftAttributes(attrs); 325 ParseExternalDeclaration(attrs); 326 } 327 328 T.consumeClose(); 329 return Actions.ActOnFinishLinkageSpecification(getCurScope(), LinkageSpec, 330 T.getCloseLocation()); 331 } 332 333 /// ParseUsingDirectiveOrDeclaration - Parse C++ using using-declaration or 334 /// using-directive. Assumes that current token is 'using'. 335 Decl *Parser::ParseUsingDirectiveOrDeclaration(unsigned Context, 336 const ParsedTemplateInfo &TemplateInfo, 337 SourceLocation &DeclEnd, 338 ParsedAttributesWithRange &attrs, 339 Decl **OwnedType) { 340 assert(Tok.is(tok::kw_using) && "Not using token"); 341 ObjCDeclContextSwitch ObjCDC(*this); 342 343 // Eat 'using'. 344 SourceLocation UsingLoc = ConsumeToken(); 345 346 if (Tok.is(tok::code_completion)) { 347 Actions.CodeCompleteUsing(getCurScope()); 348 cutOffParsing(); 349 return 0; 350 } 351 352 // 'using namespace' means this is a using-directive. 353 if (Tok.is(tok::kw_namespace)) { 354 // Template parameters are always an error here. 355 if (TemplateInfo.Kind) { 356 SourceRange R = TemplateInfo.getSourceRange(); 357 Diag(UsingLoc, diag::err_templated_using_directive) 358 << R << FixItHint::CreateRemoval(R); 359 } 360 361 return ParseUsingDirective(Context, UsingLoc, DeclEnd, attrs); 362 } 363 364 // Otherwise, it must be a using-declaration or an alias-declaration. 365 366 // Using declarations can't have attributes. 367 ProhibitAttributes(attrs); 368 369 return ParseUsingDeclaration(Context, TemplateInfo, UsingLoc, DeclEnd, 370 AS_none, OwnedType); 371 } 372 373 /// ParseUsingDirective - Parse C++ using-directive, assumes 374 /// that current token is 'namespace' and 'using' was already parsed. 375 /// 376 /// using-directive: [C++ 7.3.p4: namespace.udir] 377 /// 'using' 'namespace' ::[opt] nested-name-specifier[opt] 378 /// namespace-name ; 379 /// [GNU] using-directive: 380 /// 'using' 'namespace' ::[opt] nested-name-specifier[opt] 381 /// namespace-name attributes[opt] ; 382 /// 383 Decl *Parser::ParseUsingDirective(unsigned Context, 384 SourceLocation UsingLoc, 385 SourceLocation &DeclEnd, 386 ParsedAttributes &attrs) { 387 assert(Tok.is(tok::kw_namespace) && "Not 'namespace' token"); 388 389 // Eat 'namespace'. 390 SourceLocation NamespcLoc = ConsumeToken(); 391 392 if (Tok.is(tok::code_completion)) { 393 Actions.CodeCompleteUsingDirective(getCurScope()); 394 cutOffParsing(); 395 return 0; 396 } 397 398 CXXScopeSpec SS; 399 // Parse (optional) nested-name-specifier. 400 ParseOptionalCXXScopeSpecifier(SS, ParsedType(), /*EnteringContext=*/false); 401 402 IdentifierInfo *NamespcName = 0; 403 SourceLocation IdentLoc = SourceLocation(); 404 405 // Parse namespace-name. 406 if (SS.isInvalid() || Tok.isNot(tok::identifier)) { 407 Diag(Tok, diag::err_expected_namespace_name); 408 // If there was invalid namespace name, skip to end of decl, and eat ';'. 409 SkipUntil(tok::semi); 410 // FIXME: Are there cases, when we would like to call ActOnUsingDirective? 411 return 0; 412 } 413 414 // Parse identifier. 415 NamespcName = Tok.getIdentifierInfo(); 416 IdentLoc = ConsumeToken(); 417 418 // Parse (optional) attributes (most likely GNU strong-using extension). 419 bool GNUAttr = false; 420 if (Tok.is(tok::kw___attribute)) { 421 GNUAttr = true; 422 ParseGNUAttributes(attrs); 423 } 424 425 // Eat ';'. 426 DeclEnd = Tok.getLocation(); 427 ExpectAndConsume(tok::semi, 428 GNUAttr ? diag::err_expected_semi_after_attribute_list 429 : diag::err_expected_semi_after_namespace_name, 430 "", tok::semi); 431 432 return Actions.ActOnUsingDirective(getCurScope(), UsingLoc, NamespcLoc, SS, 433 IdentLoc, NamespcName, attrs.getList()); 434 } 435 436 /// ParseUsingDeclaration - Parse C++ using-declaration or alias-declaration. 437 /// Assumes that 'using' was already seen. 438 /// 439 /// using-declaration: [C++ 7.3.p3: namespace.udecl] 440 /// 'using' 'typename'[opt] ::[opt] nested-name-specifier 441 /// unqualified-id 442 /// 'using' :: unqualified-id 443 /// 444 /// alias-declaration: C++11 [dcl.dcl]p1 445 /// 'using' identifier attribute-specifier-seq[opt] = type-id ; 446 /// 447 Decl *Parser::ParseUsingDeclaration(unsigned Context, 448 const ParsedTemplateInfo &TemplateInfo, 449 SourceLocation UsingLoc, 450 SourceLocation &DeclEnd, 451 AccessSpecifier AS, 452 Decl **OwnedType) { 453 CXXScopeSpec SS; 454 SourceLocation TypenameLoc; 455 bool HasTypenameKeyword = false; 456 ParsedAttributesWithRange Attrs(AttrFactory); 457 458 // FIXME: Simply skip the attributes and diagnose, don't bother parsing them. 459 MaybeParseCXX11Attributes(Attrs); 460 ProhibitAttributes(Attrs); 461 Attrs.clear(); 462 Attrs.Range = SourceRange(); 463 464 // Ignore optional 'typename'. 465 // FIXME: This is wrong; we should parse this as a typename-specifier. 466 if (Tok.is(tok::kw_typename)) { 467 TypenameLoc = ConsumeToken(); 468 HasTypenameKeyword = true; 469 } 470 471 // Parse nested-name-specifier. 472 IdentifierInfo *LastII = 0; 473 ParseOptionalCXXScopeSpecifier(SS, ParsedType(), /*EnteringContext=*/false, 474 /*MayBePseudoDtor=*/0, /*IsTypename=*/false, 475 /*LastII=*/&LastII); 476 477 // Check nested-name specifier. 478 if (SS.isInvalid()) { 479 SkipUntil(tok::semi); 480 return 0; 481 } 482 483 SourceLocation TemplateKWLoc; 484 UnqualifiedId Name; 485 486 // Parse the unqualified-id. We allow parsing of both constructor and 487 // destructor names and allow the action module to diagnose any semantic 488 // errors. 489 // 490 // C++11 [class.qual]p2: 491 // [...] in a using-declaration that is a member-declaration, if the name 492 // specified after the nested-name-specifier is the same as the identifier 493 // or the simple-template-id's template-name in the last component of the 494 // nested-name-specifier, the name is [...] considered to name the 495 // constructor. 496 if (getLangOpts().CPlusPlus11 && Context == Declarator::MemberContext && 497 Tok.is(tok::identifier) && NextToken().is(tok::semi) && 498 SS.isNotEmpty() && LastII == Tok.getIdentifierInfo() && 499 !SS.getScopeRep()->getAsNamespace() && 500 !SS.getScopeRep()->getAsNamespaceAlias()) { 501 SourceLocation IdLoc = ConsumeToken(); 502 ParsedType Type = Actions.getInheritingConstructorName(SS, IdLoc, *LastII); 503 Name.setConstructorName(Type, IdLoc, IdLoc); 504 } else if (ParseUnqualifiedId(SS, /*EnteringContext=*/ false, 505 /*AllowDestructorName=*/ true, 506 /*AllowConstructorName=*/ true, ParsedType(), 507 TemplateKWLoc, Name)) { 508 SkipUntil(tok::semi); 509 return 0; 510 } 511 512 MaybeParseCXX11Attributes(Attrs); 513 514 // Maybe this is an alias-declaration. 515 bool IsAliasDecl = Tok.is(tok::equal); 516 TypeResult TypeAlias; 517 if (IsAliasDecl) { 518 // TODO: Can GNU attributes appear here? 519 ConsumeToken(); 520 521 Diag(Tok.getLocation(), getLangOpts().CPlusPlus11 ? 522 diag::warn_cxx98_compat_alias_declaration : 523 diag::ext_alias_declaration); 524 525 // Type alias templates cannot be specialized. 526 int SpecKind = -1; 527 if (TemplateInfo.Kind == ParsedTemplateInfo::Template && 528 Name.getKind() == UnqualifiedId::IK_TemplateId) 529 SpecKind = 0; 530 if (TemplateInfo.Kind == ParsedTemplateInfo::ExplicitSpecialization) 531 SpecKind = 1; 532 if (TemplateInfo.Kind == ParsedTemplateInfo::ExplicitInstantiation) 533 SpecKind = 2; 534 if (SpecKind != -1) { 535 SourceRange Range; 536 if (SpecKind == 0) 537 Range = SourceRange(Name.TemplateId->LAngleLoc, 538 Name.TemplateId->RAngleLoc); 539 else 540 Range = TemplateInfo.getSourceRange(); 541 Diag(Range.getBegin(), diag::err_alias_declaration_specialization) 542 << SpecKind << Range; 543 SkipUntil(tok::semi); 544 return 0; 545 } 546 547 // Name must be an identifier. 548 if (Name.getKind() != UnqualifiedId::IK_Identifier) { 549 Diag(Name.StartLocation, diag::err_alias_declaration_not_identifier); 550 // No removal fixit: can't recover from this. 551 SkipUntil(tok::semi); 552 return 0; 553 } else if (HasTypenameKeyword) 554 Diag(TypenameLoc, diag::err_alias_declaration_not_identifier) 555 << FixItHint::CreateRemoval(SourceRange(TypenameLoc, 556 SS.isNotEmpty() ? SS.getEndLoc() : TypenameLoc)); 557 else if (SS.isNotEmpty()) 558 Diag(SS.getBeginLoc(), diag::err_alias_declaration_not_identifier) 559 << FixItHint::CreateRemoval(SS.getRange()); 560 561 TypeAlias = ParseTypeName(0, TemplateInfo.Kind ? 562 Declarator::AliasTemplateContext : 563 Declarator::AliasDeclContext, AS, OwnedType, 564 &Attrs); 565 } else { 566 // C++11 attributes are not allowed on a using-declaration, but GNU ones 567 // are. 568 ProhibitAttributes(Attrs); 569 570 // Parse (optional) attributes (most likely GNU strong-using extension). 571 MaybeParseGNUAttributes(Attrs); 572 } 573 574 // Eat ';'. 575 DeclEnd = Tok.getLocation(); 576 ExpectAndConsume(tok::semi, diag::err_expected_semi_after, 577 !Attrs.empty() ? "attributes list" : 578 IsAliasDecl ? "alias declaration" : "using declaration", 579 tok::semi); 580 581 // Diagnose an attempt to declare a templated using-declaration. 582 // In C++11, alias-declarations can be templates: 583 // template <...> using id = type; 584 if (TemplateInfo.Kind && !IsAliasDecl) { 585 SourceRange R = TemplateInfo.getSourceRange(); 586 Diag(UsingLoc, diag::err_templated_using_declaration) 587 << R << FixItHint::CreateRemoval(R); 588 589 // Unfortunately, we have to bail out instead of recovering by 590 // ignoring the parameters, just in case the nested name specifier 591 // depends on the parameters. 592 return 0; 593 } 594 595 // "typename" keyword is allowed for identifiers only, 596 // because it may be a type definition. 597 if (HasTypenameKeyword && Name.getKind() != UnqualifiedId::IK_Identifier) { 598 Diag(Name.getSourceRange().getBegin(), diag::err_typename_identifiers_only) 599 << FixItHint::CreateRemoval(SourceRange(TypenameLoc)); 600 // Proceed parsing, but reset the HasTypenameKeyword flag. 601 HasTypenameKeyword = false; 602 } 603 604 if (IsAliasDecl) { 605 TemplateParameterLists *TemplateParams = TemplateInfo.TemplateParams; 606 MultiTemplateParamsArg TemplateParamsArg( 607 TemplateParams ? TemplateParams->data() : 0, 608 TemplateParams ? TemplateParams->size() : 0); 609 return Actions.ActOnAliasDeclaration(getCurScope(), AS, TemplateParamsArg, 610 UsingLoc, Name, Attrs.getList(), 611 TypeAlias); 612 } 613 614 return Actions.ActOnUsingDeclaration(getCurScope(), AS, 615 /* HasUsingKeyword */ true, UsingLoc, 616 SS, Name, Attrs.getList(), 617 HasTypenameKeyword, TypenameLoc); 618 } 619 620 /// ParseStaticAssertDeclaration - Parse C++0x or C11 static_assert-declaration. 621 /// 622 /// [C++0x] static_assert-declaration: 623 /// static_assert ( constant-expression , string-literal ) ; 624 /// 625 /// [C11] static_assert-declaration: 626 /// _Static_assert ( constant-expression , string-literal ) ; 627 /// 628 Decl *Parser::ParseStaticAssertDeclaration(SourceLocation &DeclEnd){ 629 assert((Tok.is(tok::kw_static_assert) || Tok.is(tok::kw__Static_assert)) && 630 "Not a static_assert declaration"); 631 632 if (Tok.is(tok::kw__Static_assert) && !getLangOpts().C11) 633 Diag(Tok, diag::ext_c11_static_assert); 634 if (Tok.is(tok::kw_static_assert)) 635 Diag(Tok, diag::warn_cxx98_compat_static_assert); 636 637 SourceLocation StaticAssertLoc = ConsumeToken(); 638 639 BalancedDelimiterTracker T(*this, tok::l_paren); 640 if (T.consumeOpen()) { 641 Diag(Tok, diag::err_expected_lparen); 642 SkipMalformedDecl(); 643 return 0; 644 } 645 646 ExprResult AssertExpr(ParseConstantExpression()); 647 if (AssertExpr.isInvalid()) { 648 SkipMalformedDecl(); 649 return 0; 650 } 651 652 if (ExpectAndConsume(tok::comma, diag::err_expected_comma, "", tok::semi)) 653 return 0; 654 655 if (!isTokenStringLiteral()) { 656 Diag(Tok, diag::err_expected_string_literal) 657 << /*Source='static_assert'*/1; 658 SkipMalformedDecl(); 659 return 0; 660 } 661 662 ExprResult AssertMessage(ParseStringLiteralExpression()); 663 if (AssertMessage.isInvalid()) { 664 SkipMalformedDecl(); 665 return 0; 666 } 667 668 T.consumeClose(); 669 670 DeclEnd = Tok.getLocation(); 671 ExpectAndConsumeSemi(diag::err_expected_semi_after_static_assert); 672 673 return Actions.ActOnStaticAssertDeclaration(StaticAssertLoc, 674 AssertExpr.take(), 675 AssertMessage.take(), 676 T.getCloseLocation()); 677 } 678 679 /// ParseDecltypeSpecifier - Parse a C++11 decltype specifier. 680 /// 681 /// 'decltype' ( expression ) 682 /// 'decltype' ( 'auto' ) [C++1y] 683 /// 684 SourceLocation Parser::ParseDecltypeSpecifier(DeclSpec &DS) { 685 assert((Tok.is(tok::kw_decltype) || Tok.is(tok::annot_decltype)) 686 && "Not a decltype specifier"); 687 688 ExprResult Result; 689 SourceLocation StartLoc = Tok.getLocation(); 690 SourceLocation EndLoc; 691 692 if (Tok.is(tok::annot_decltype)) { 693 Result = getExprAnnotation(Tok); 694 EndLoc = Tok.getAnnotationEndLoc(); 695 ConsumeToken(); 696 if (Result.isInvalid()) { 697 DS.SetTypeSpecError(); 698 return EndLoc; 699 } 700 } else { 701 if (Tok.getIdentifierInfo()->isStr("decltype")) 702 Diag(Tok, diag::warn_cxx98_compat_decltype); 703 704 ConsumeToken(); 705 706 BalancedDelimiterTracker T(*this, tok::l_paren); 707 if (T.expectAndConsume(diag::err_expected_lparen_after, 708 "decltype", tok::r_paren)) { 709 DS.SetTypeSpecError(); 710 return T.getOpenLocation() == Tok.getLocation() ? 711 StartLoc : T.getOpenLocation(); 712 } 713 714 // Check for C++1y 'decltype(auto)'. 715 if (Tok.is(tok::kw_auto)) { 716 // No need to disambiguate here: an expression can't start with 'auto', 717 // because the typename-specifier in a function-style cast operation can't 718 // be 'auto'. 719 Diag(Tok.getLocation(), 720 getLangOpts().CPlusPlus1y 721 ? diag::warn_cxx11_compat_decltype_auto_type_specifier 722 : diag::ext_decltype_auto_type_specifier); 723 ConsumeToken(); 724 } else { 725 // Parse the expression 726 727 // C++11 [dcl.type.simple]p4: 728 // The operand of the decltype specifier is an unevaluated operand. 729 EnterExpressionEvaluationContext Unevaluated(Actions, Sema::Unevaluated, 730 0, /*IsDecltype=*/true); 731 Result = ParseExpression(); 732 if (Result.isInvalid()) { 733 DS.SetTypeSpecError(); 734 if (SkipUntil(tok::r_paren, /*StopAtSemi=*/true, 735 /*DontConsume=*/true)) { 736 EndLoc = ConsumeParen(); 737 } else { 738 if (PP.isBacktrackEnabled() && Tok.is(tok::semi)) { 739 // Backtrack to get the location of the last token before the semi. 740 PP.RevertCachedTokens(2); 741 ConsumeToken(); // the semi. 742 EndLoc = ConsumeAnyToken(); 743 assert(Tok.is(tok::semi)); 744 } else { 745 EndLoc = Tok.getLocation(); 746 } 747 } 748 return EndLoc; 749 } 750 751 Result = Actions.ActOnDecltypeExpression(Result.take()); 752 } 753 754 // Match the ')' 755 T.consumeClose(); 756 if (T.getCloseLocation().isInvalid()) { 757 DS.SetTypeSpecError(); 758 // FIXME: this should return the location of the last token 759 // that was consumed (by "consumeClose()") 760 return T.getCloseLocation(); 761 } 762 763 if (Result.isInvalid()) { 764 DS.SetTypeSpecError(); 765 return T.getCloseLocation(); 766 } 767 768 EndLoc = T.getCloseLocation(); 769 } 770 assert(!Result.isInvalid()); 771 772 const char *PrevSpec = 0; 773 unsigned DiagID; 774 // Check for duplicate type specifiers (e.g. "int decltype(a)"). 775 if (Result.get() 776 ? DS.SetTypeSpecType(DeclSpec::TST_decltype, StartLoc, PrevSpec, 777 DiagID, Result.release()) 778 : DS.SetTypeSpecType(DeclSpec::TST_decltype_auto, StartLoc, PrevSpec, 779 DiagID)) { 780 Diag(StartLoc, DiagID) << PrevSpec; 781 DS.SetTypeSpecError(); 782 } 783 return EndLoc; 784 } 785 786 void Parser::AnnotateExistingDecltypeSpecifier(const DeclSpec& DS, 787 SourceLocation StartLoc, 788 SourceLocation EndLoc) { 789 // make sure we have a token we can turn into an annotation token 790 if (PP.isBacktrackEnabled()) 791 PP.RevertCachedTokens(1); 792 else 793 PP.EnterToken(Tok); 794 795 Tok.setKind(tok::annot_decltype); 796 setExprAnnotation(Tok, 797 DS.getTypeSpecType() == TST_decltype ? DS.getRepAsExpr() : 798 DS.getTypeSpecType() == TST_decltype_auto ? ExprResult() : 799 ExprError()); 800 Tok.setAnnotationEndLoc(EndLoc); 801 Tok.setLocation(StartLoc); 802 PP.AnnotateCachedTokens(Tok); 803 } 804 805 void Parser::ParseUnderlyingTypeSpecifier(DeclSpec &DS) { 806 assert(Tok.is(tok::kw___underlying_type) && 807 "Not an underlying type specifier"); 808 809 SourceLocation StartLoc = ConsumeToken(); 810 BalancedDelimiterTracker T(*this, tok::l_paren); 811 if (T.expectAndConsume(diag::err_expected_lparen_after, 812 "__underlying_type", tok::r_paren)) { 813 return; 814 } 815 816 TypeResult Result = ParseTypeName(); 817 if (Result.isInvalid()) { 818 SkipUntil(tok::r_paren); 819 return; 820 } 821 822 // Match the ')' 823 T.consumeClose(); 824 if (T.getCloseLocation().isInvalid()) 825 return; 826 827 const char *PrevSpec = 0; 828 unsigned DiagID; 829 if (DS.SetTypeSpecType(DeclSpec::TST_underlyingType, StartLoc, PrevSpec, 830 DiagID, Result.release())) 831 Diag(StartLoc, DiagID) << PrevSpec; 832 DS.setTypeofParensRange(T.getRange()); 833 } 834 835 /// ParseBaseTypeSpecifier - Parse a C++ base-type-specifier which is either a 836 /// class name or decltype-specifier. Note that we only check that the result 837 /// names a type; semantic analysis will need to verify that the type names a 838 /// class. The result is either a type or null, depending on whether a type 839 /// name was found. 840 /// 841 /// base-type-specifier: [C++11 class.derived] 842 /// class-or-decltype 843 /// class-or-decltype: [C++11 class.derived] 844 /// nested-name-specifier[opt] class-name 845 /// decltype-specifier 846 /// class-name: [C++ class.name] 847 /// identifier 848 /// simple-template-id 849 /// 850 /// In C++98, instead of base-type-specifier, we have: 851 /// 852 /// ::[opt] nested-name-specifier[opt] class-name 853 Parser::TypeResult Parser::ParseBaseTypeSpecifier(SourceLocation &BaseLoc, 854 SourceLocation &EndLocation) { 855 // Ignore attempts to use typename 856 if (Tok.is(tok::kw_typename)) { 857 Diag(Tok, diag::err_expected_class_name_not_template) 858 << FixItHint::CreateRemoval(Tok.getLocation()); 859 ConsumeToken(); 860 } 861 862 // Parse optional nested-name-specifier 863 CXXScopeSpec SS; 864 ParseOptionalCXXScopeSpecifier(SS, ParsedType(), /*EnteringContext=*/false); 865 866 BaseLoc = Tok.getLocation(); 867 868 // Parse decltype-specifier 869 // tok == kw_decltype is just error recovery, it can only happen when SS 870 // isn't empty 871 if (Tok.is(tok::kw_decltype) || Tok.is(tok::annot_decltype)) { 872 if (SS.isNotEmpty()) 873 Diag(SS.getBeginLoc(), diag::err_unexpected_scope_on_base_decltype) 874 << FixItHint::CreateRemoval(SS.getRange()); 875 // Fake up a Declarator to use with ActOnTypeName. 876 DeclSpec DS(AttrFactory); 877 878 EndLocation = ParseDecltypeSpecifier(DS); 879 880 Declarator DeclaratorInfo(DS, Declarator::TypeNameContext); 881 return Actions.ActOnTypeName(getCurScope(), DeclaratorInfo); 882 } 883 884 // Check whether we have a template-id that names a type. 885 if (Tok.is(tok::annot_template_id)) { 886 TemplateIdAnnotation *TemplateId = takeTemplateIdAnnotation(Tok); 887 if (TemplateId->Kind == TNK_Type_template || 888 TemplateId->Kind == TNK_Dependent_template_name) { 889 AnnotateTemplateIdTokenAsType(); 890 891 assert(Tok.is(tok::annot_typename) && "template-id -> type failed"); 892 ParsedType Type = getTypeAnnotation(Tok); 893 EndLocation = Tok.getAnnotationEndLoc(); 894 ConsumeToken(); 895 896 if (Type) 897 return Type; 898 return true; 899 } 900 901 // Fall through to produce an error below. 902 } 903 904 if (Tok.isNot(tok::identifier)) { 905 Diag(Tok, diag::err_expected_class_name); 906 return true; 907 } 908 909 IdentifierInfo *Id = Tok.getIdentifierInfo(); 910 SourceLocation IdLoc = ConsumeToken(); 911 912 if (Tok.is(tok::less)) { 913 // It looks the user intended to write a template-id here, but the 914 // template-name was wrong. Try to fix that. 915 TemplateNameKind TNK = TNK_Type_template; 916 TemplateTy Template; 917 if (!Actions.DiagnoseUnknownTemplateName(*Id, IdLoc, getCurScope(), 918 &SS, Template, TNK)) { 919 Diag(IdLoc, diag::err_unknown_template_name) 920 << Id; 921 } 922 923 if (!Template) 924 return true; 925 926 // Form the template name 927 UnqualifiedId TemplateName; 928 TemplateName.setIdentifier(Id, IdLoc); 929 930 // Parse the full template-id, then turn it into a type. 931 if (AnnotateTemplateIdToken(Template, TNK, SS, SourceLocation(), 932 TemplateName, true)) 933 return true; 934 if (TNK == TNK_Dependent_template_name) 935 AnnotateTemplateIdTokenAsType(); 936 937 // If we didn't end up with a typename token, there's nothing more we 938 // can do. 939 if (Tok.isNot(tok::annot_typename)) 940 return true; 941 942 // Retrieve the type from the annotation token, consume that token, and 943 // return. 944 EndLocation = Tok.getAnnotationEndLoc(); 945 ParsedType Type = getTypeAnnotation(Tok); 946 ConsumeToken(); 947 return Type; 948 } 949 950 // We have an identifier; check whether it is actually a type. 951 IdentifierInfo *CorrectedII = 0; 952 ParsedType Type = Actions.getTypeName(*Id, IdLoc, getCurScope(), &SS, true, 953 false, ParsedType(), 954 /*IsCtorOrDtorName=*/false, 955 /*NonTrivialTypeSourceInfo=*/true, 956 &CorrectedII); 957 if (!Type) { 958 Diag(IdLoc, diag::err_expected_class_name); 959 return true; 960 } 961 962 // Consume the identifier. 963 EndLocation = IdLoc; 964 965 // Fake up a Declarator to use with ActOnTypeName. 966 DeclSpec DS(AttrFactory); 967 DS.SetRangeStart(IdLoc); 968 DS.SetRangeEnd(EndLocation); 969 DS.getTypeSpecScope() = SS; 970 971 const char *PrevSpec = 0; 972 unsigned DiagID; 973 DS.SetTypeSpecType(TST_typename, IdLoc, PrevSpec, DiagID, Type); 974 975 Declarator DeclaratorInfo(DS, Declarator::TypeNameContext); 976 return Actions.ActOnTypeName(getCurScope(), DeclaratorInfo); 977 } 978 979 void Parser::ParseMicrosoftInheritanceClassAttributes(ParsedAttributes &attrs) { 980 while (Tok.is(tok::kw___single_inheritance) || 981 Tok.is(tok::kw___multiple_inheritance) || 982 Tok.is(tok::kw___virtual_inheritance)) { 983 IdentifierInfo *AttrName = Tok.getIdentifierInfo(); 984 SourceLocation AttrNameLoc = ConsumeToken(); 985 attrs.addNew(AttrName, AttrNameLoc, 0, AttrNameLoc, 0, 986 SourceLocation(), 0, 0, AttributeList::AS_GNU); 987 } 988 } 989 990 /// Determine whether the following tokens are valid after a type-specifier 991 /// which could be a standalone declaration. This will conservatively return 992 /// true if there's any doubt, and is appropriate for insert-';' fixits. 993 bool Parser::isValidAfterTypeSpecifier(bool CouldBeBitfield) { 994 // This switch enumerates the valid "follow" set for type-specifiers. 995 switch (Tok.getKind()) { 996 default: break; 997 case tok::semi: // struct foo {...} ; 998 case tok::star: // struct foo {...} * P; 999 case tok::amp: // struct foo {...} & R = ... 1000 case tok::ampamp: // struct foo {...} && R = ... 1001 case tok::identifier: // struct foo {...} V ; 1002 case tok::r_paren: //(struct foo {...} ) {4} 1003 case tok::annot_cxxscope: // struct foo {...} a:: b; 1004 case tok::annot_typename: // struct foo {...} a ::b; 1005 case tok::annot_template_id: // struct foo {...} a<int> ::b; 1006 case tok::l_paren: // struct foo {...} ( x); 1007 case tok::comma: // __builtin_offsetof(struct foo{...} , 1008 case tok::kw_operator: // struct foo operator ++() {...} 1009 return true; 1010 case tok::colon: 1011 return CouldBeBitfield; // enum E { ... } : 2; 1012 // Type qualifiers 1013 case tok::kw_const: // struct foo {...} const x; 1014 case tok::kw_volatile: // struct foo {...} volatile x; 1015 case tok::kw_restrict: // struct foo {...} restrict x; 1016 // Function specifiers 1017 // Note, no 'explicit'. An explicit function must be either a conversion 1018 // operator or a constructor. Either way, it can't have a return type. 1019 case tok::kw_inline: // struct foo inline f(); 1020 case tok::kw_virtual: // struct foo virtual f(); 1021 case tok::kw_friend: // struct foo friend f(); 1022 // Storage-class specifiers 1023 case tok::kw_static: // struct foo {...} static x; 1024 case tok::kw_extern: // struct foo {...} extern x; 1025 case tok::kw_typedef: // struct foo {...} typedef x; 1026 case tok::kw_register: // struct foo {...} register x; 1027 case tok::kw_auto: // struct foo {...} auto x; 1028 case tok::kw_mutable: // struct foo {...} mutable x; 1029 case tok::kw_thread_local: // struct foo {...} thread_local x; 1030 case tok::kw_constexpr: // struct foo {...} constexpr x; 1031 // As shown above, type qualifiers and storage class specifiers absolutely 1032 // can occur after class specifiers according to the grammar. However, 1033 // almost no one actually writes code like this. If we see one of these, 1034 // it is much more likely that someone missed a semi colon and the 1035 // type/storage class specifier we're seeing is part of the *next* 1036 // intended declaration, as in: 1037 // 1038 // struct foo { ... } 1039 // typedef int X; 1040 // 1041 // We'd really like to emit a missing semicolon error instead of emitting 1042 // an error on the 'int' saying that you can't have two type specifiers in 1043 // the same declaration of X. Because of this, we look ahead past this 1044 // token to see if it's a type specifier. If so, we know the code is 1045 // otherwise invalid, so we can produce the expected semi error. 1046 if (!isKnownToBeTypeSpecifier(NextToken())) 1047 return true; 1048 break; 1049 case tok::r_brace: // struct bar { struct foo {...} } 1050 // Missing ';' at end of struct is accepted as an extension in C mode. 1051 if (!getLangOpts().CPlusPlus) 1052 return true; 1053 break; 1054 // C++11 attributes 1055 case tok::l_square: // enum E [[]] x 1056 // Note, no tok::kw_alignas here; alignas cannot appertain to a type. 1057 return getLangOpts().CPlusPlus11 && NextToken().is(tok::l_square); 1058 case tok::greater: 1059 // template<class T = class X> 1060 return getLangOpts().CPlusPlus; 1061 } 1062 return false; 1063 } 1064 1065 /// ParseClassSpecifier - Parse a C++ class-specifier [C++ class] or 1066 /// elaborated-type-specifier [C++ dcl.type.elab]; we can't tell which 1067 /// until we reach the start of a definition or see a token that 1068 /// cannot start a definition. 1069 /// 1070 /// class-specifier: [C++ class] 1071 /// class-head '{' member-specification[opt] '}' 1072 /// class-head '{' member-specification[opt] '}' attributes[opt] 1073 /// class-head: 1074 /// class-key identifier[opt] base-clause[opt] 1075 /// class-key nested-name-specifier identifier base-clause[opt] 1076 /// class-key nested-name-specifier[opt] simple-template-id 1077 /// base-clause[opt] 1078 /// [GNU] class-key attributes[opt] identifier[opt] base-clause[opt] 1079 /// [GNU] class-key attributes[opt] nested-name-specifier 1080 /// identifier base-clause[opt] 1081 /// [GNU] class-key attributes[opt] nested-name-specifier[opt] 1082 /// simple-template-id base-clause[opt] 1083 /// class-key: 1084 /// 'class' 1085 /// 'struct' 1086 /// 'union' 1087 /// 1088 /// elaborated-type-specifier: [C++ dcl.type.elab] 1089 /// class-key ::[opt] nested-name-specifier[opt] identifier 1090 /// class-key ::[opt] nested-name-specifier[opt] 'template'[opt] 1091 /// simple-template-id 1092 /// 1093 /// Note that the C++ class-specifier and elaborated-type-specifier, 1094 /// together, subsume the C99 struct-or-union-specifier: 1095 /// 1096 /// struct-or-union-specifier: [C99 6.7.2.1] 1097 /// struct-or-union identifier[opt] '{' struct-contents '}' 1098 /// struct-or-union identifier 1099 /// [GNU] struct-or-union attributes[opt] identifier[opt] '{' struct-contents 1100 /// '}' attributes[opt] 1101 /// [GNU] struct-or-union attributes[opt] identifier 1102 /// struct-or-union: 1103 /// 'struct' 1104 /// 'union' 1105 void Parser::ParseClassSpecifier(tok::TokenKind TagTokKind, 1106 SourceLocation StartLoc, DeclSpec &DS, 1107 const ParsedTemplateInfo &TemplateInfo, 1108 AccessSpecifier AS, 1109 bool EnteringContext, DeclSpecContext DSC, 1110 ParsedAttributesWithRange &Attributes) { 1111 DeclSpec::TST TagType; 1112 if (TagTokKind == tok::kw_struct) 1113 TagType = DeclSpec::TST_struct; 1114 else if (TagTokKind == tok::kw___interface) 1115 TagType = DeclSpec::TST_interface; 1116 else if (TagTokKind == tok::kw_class) 1117 TagType = DeclSpec::TST_class; 1118 else { 1119 assert(TagTokKind == tok::kw_union && "Not a class specifier"); 1120 TagType = DeclSpec::TST_union; 1121 } 1122 1123 if (Tok.is(tok::code_completion)) { 1124 // Code completion for a struct, class, or union name. 1125 Actions.CodeCompleteTag(getCurScope(), TagType); 1126 return cutOffParsing(); 1127 } 1128 1129 // C++03 [temp.explicit] 14.7.2/8: 1130 // The usual access checking rules do not apply to names used to specify 1131 // explicit instantiations. 1132 // 1133 // As an extension we do not perform access checking on the names used to 1134 // specify explicit specializations either. This is important to allow 1135 // specializing traits classes for private types. 1136 // 1137 // Note that we don't suppress if this turns out to be an elaborated 1138 // type specifier. 1139 bool shouldDelayDiagsInTag = 1140 (TemplateInfo.Kind == ParsedTemplateInfo::ExplicitInstantiation || 1141 TemplateInfo.Kind == ParsedTemplateInfo::ExplicitSpecialization); 1142 SuppressAccessChecks diagsFromTag(*this, shouldDelayDiagsInTag); 1143 1144 ParsedAttributesWithRange attrs(AttrFactory); 1145 // If attributes exist after tag, parse them. 1146 if (Tok.is(tok::kw___attribute)) 1147 ParseGNUAttributes(attrs); 1148 1149 // If declspecs exist after tag, parse them. 1150 while (Tok.is(tok::kw___declspec)) 1151 ParseMicrosoftDeclSpec(attrs); 1152 1153 // Parse inheritance specifiers. 1154 if (Tok.is(tok::kw___single_inheritance) || 1155 Tok.is(tok::kw___multiple_inheritance) || 1156 Tok.is(tok::kw___virtual_inheritance)) 1157 ParseMicrosoftInheritanceClassAttributes(attrs); 1158 1159 // If C++0x attributes exist here, parse them. 1160 // FIXME: Are we consistent with the ordering of parsing of different 1161 // styles of attributes? 1162 MaybeParseCXX11Attributes(attrs); 1163 1164 // Source location used by FIXIT to insert misplaced 1165 // C++11 attributes 1166 SourceLocation AttrFixitLoc = Tok.getLocation(); 1167 1168 if (TagType == DeclSpec::TST_struct && 1169 !Tok.is(tok::identifier) && 1170 Tok.getIdentifierInfo() && 1171 (Tok.is(tok::kw___is_arithmetic) || 1172 Tok.is(tok::kw___is_convertible) || 1173 Tok.is(tok::kw___is_empty) || 1174 Tok.is(tok::kw___is_floating_point) || 1175 Tok.is(tok::kw___is_function) || 1176 Tok.is(tok::kw___is_fundamental) || 1177 Tok.is(tok::kw___is_integral) || 1178 Tok.is(tok::kw___is_member_function_pointer) || 1179 Tok.is(tok::kw___is_member_pointer) || 1180 Tok.is(tok::kw___is_pod) || 1181 Tok.is(tok::kw___is_pointer) || 1182 Tok.is(tok::kw___is_same) || 1183 Tok.is(tok::kw___is_scalar) || 1184 Tok.is(tok::kw___is_signed) || 1185 Tok.is(tok::kw___is_unsigned) || 1186 Tok.is(tok::kw___is_void))) { 1187 // GNU libstdc++ 4.2 and libc++ use certain intrinsic names as the 1188 // name of struct templates, but some are keywords in GCC >= 4.3 1189 // and Clang. Therefore, when we see the token sequence "struct 1190 // X", make X into a normal identifier rather than a keyword, to 1191 // allow libstdc++ 4.2 and libc++ to work properly. 1192 Tok.getIdentifierInfo()->RevertTokenIDToIdentifier(); 1193 Tok.setKind(tok::identifier); 1194 } 1195 1196 // Parse the (optional) nested-name-specifier. 1197 CXXScopeSpec &SS = DS.getTypeSpecScope(); 1198 if (getLangOpts().CPlusPlus) { 1199 // "FOO : BAR" is not a potential typo for "FOO::BAR". 1200 ColonProtectionRAIIObject X(*this); 1201 1202 if (ParseOptionalCXXScopeSpecifier(SS, ParsedType(), EnteringContext)) 1203 DS.SetTypeSpecError(); 1204 if (SS.isSet()) 1205 if (Tok.isNot(tok::identifier) && Tok.isNot(tok::annot_template_id)) 1206 Diag(Tok, diag::err_expected_ident); 1207 } 1208 1209 TemplateParameterLists *TemplateParams = TemplateInfo.TemplateParams; 1210 1211 // Parse the (optional) class name or simple-template-id. 1212 IdentifierInfo *Name = 0; 1213 SourceLocation NameLoc; 1214 TemplateIdAnnotation *TemplateId = 0; 1215 if (Tok.is(tok::identifier)) { 1216 Name = Tok.getIdentifierInfo(); 1217 NameLoc = ConsumeToken(); 1218 1219 if (Tok.is(tok::less) && getLangOpts().CPlusPlus) { 1220 // The name was supposed to refer to a template, but didn't. 1221 // Eat the template argument list and try to continue parsing this as 1222 // a class (or template thereof). 1223 TemplateArgList TemplateArgs; 1224 SourceLocation LAngleLoc, RAngleLoc; 1225 if (ParseTemplateIdAfterTemplateName(TemplateTy(), NameLoc, SS, 1226 true, LAngleLoc, 1227 TemplateArgs, RAngleLoc)) { 1228 // We couldn't parse the template argument list at all, so don't 1229 // try to give any location information for the list. 1230 LAngleLoc = RAngleLoc = SourceLocation(); 1231 } 1232 1233 Diag(NameLoc, diag::err_explicit_spec_non_template) 1234 << (TemplateInfo.Kind == ParsedTemplateInfo::ExplicitInstantiation) 1235 << (TagType == DeclSpec::TST_class? 0 1236 : TagType == DeclSpec::TST_struct? 1 1237 : TagType == DeclSpec::TST_interface? 2 1238 : 3) 1239 << Name 1240 << SourceRange(LAngleLoc, RAngleLoc); 1241 1242 // Strip off the last template parameter list if it was empty, since 1243 // we've removed its template argument list. 1244 if (TemplateParams && TemplateInfo.LastParameterListWasEmpty) { 1245 if (TemplateParams && TemplateParams->size() > 1) { 1246 TemplateParams->pop_back(); 1247 } else { 1248 TemplateParams = 0; 1249 const_cast<ParsedTemplateInfo&>(TemplateInfo).Kind 1250 = ParsedTemplateInfo::NonTemplate; 1251 } 1252 } else if (TemplateInfo.Kind 1253 == ParsedTemplateInfo::ExplicitInstantiation) { 1254 // Pretend this is just a forward declaration. 1255 TemplateParams = 0; 1256 const_cast<ParsedTemplateInfo&>(TemplateInfo).Kind 1257 = ParsedTemplateInfo::NonTemplate; 1258 const_cast<ParsedTemplateInfo&>(TemplateInfo).TemplateLoc 1259 = SourceLocation(); 1260 const_cast<ParsedTemplateInfo&>(TemplateInfo).ExternLoc 1261 = SourceLocation(); 1262 } 1263 } 1264 } else if (Tok.is(tok::annot_template_id)) { 1265 TemplateId = takeTemplateIdAnnotation(Tok); 1266 NameLoc = ConsumeToken(); 1267 1268 if (TemplateId->Kind != TNK_Type_template && 1269 TemplateId->Kind != TNK_Dependent_template_name) { 1270 // The template-name in the simple-template-id refers to 1271 // something other than a class template. Give an appropriate 1272 // error message and skip to the ';'. 1273 SourceRange Range(NameLoc); 1274 if (SS.isNotEmpty()) 1275 Range.setBegin(SS.getBeginLoc()); 1276 1277 Diag(TemplateId->LAngleLoc, diag::err_template_spec_syntax_non_template) 1278 << TemplateId->Name << static_cast<int>(TemplateId->Kind) << Range; 1279 1280 DS.SetTypeSpecError(); 1281 SkipUntil(tok::semi, false, true); 1282 return; 1283 } 1284 } 1285 1286 // There are four options here. 1287 // - If we are in a trailing return type, this is always just a reference, 1288 // and we must not try to parse a definition. For instance, 1289 // [] () -> struct S { }; 1290 // does not define a type. 1291 // - If we have 'struct foo {...', 'struct foo :...', 1292 // 'struct foo final :' or 'struct foo final {', then this is a definition. 1293 // - If we have 'struct foo;', then this is either a forward declaration 1294 // or a friend declaration, which have to be treated differently. 1295 // - Otherwise we have something like 'struct foo xyz', a reference. 1296 // 1297 // We also detect these erroneous cases to provide better diagnostic for 1298 // C++11 attributes parsing. 1299 // - attributes follow class name: 1300 // struct foo [[]] {}; 1301 // - attributes appear before or after 'final': 1302 // struct foo [[]] final [[]] {}; 1303 // 1304 // However, in type-specifier-seq's, things look like declarations but are 1305 // just references, e.g. 1306 // new struct s; 1307 // or 1308 // &T::operator struct s; 1309 // For these, DSC is DSC_type_specifier. 1310 1311 // If there are attributes after class name, parse them. 1312 MaybeParseCXX11Attributes(Attributes); 1313 1314 Sema::TagUseKind TUK; 1315 if (DSC == DSC_trailing) 1316 TUK = Sema::TUK_Reference; 1317 else if (Tok.is(tok::l_brace) || 1318 (getLangOpts().CPlusPlus && Tok.is(tok::colon)) || 1319 (isCXX11FinalKeyword() && 1320 (NextToken().is(tok::l_brace) || NextToken().is(tok::colon)))) { 1321 if (DS.isFriendSpecified()) { 1322 // C++ [class.friend]p2: 1323 // A class shall not be defined in a friend declaration. 1324 Diag(Tok.getLocation(), diag::err_friend_decl_defines_type) 1325 << SourceRange(DS.getFriendSpecLoc()); 1326 1327 // Skip everything up to the semicolon, so that this looks like a proper 1328 // friend class (or template thereof) declaration. 1329 SkipUntil(tok::semi, true, true); 1330 TUK = Sema::TUK_Friend; 1331 } else { 1332 // Okay, this is a class definition. 1333 TUK = Sema::TUK_Definition; 1334 } 1335 } else if (isCXX11FinalKeyword() && (NextToken().is(tok::l_square) || 1336 NextToken().is(tok::kw_alignas))) { 1337 // We can't tell if this is a definition or reference 1338 // until we skipped the 'final' and C++11 attribute specifiers. 1339 TentativeParsingAction PA(*this); 1340 1341 // Skip the 'final' keyword. 1342 ConsumeToken(); 1343 1344 // Skip C++11 attribute specifiers. 1345 while (true) { 1346 if (Tok.is(tok::l_square) && NextToken().is(tok::l_square)) { 1347 ConsumeBracket(); 1348 if (!SkipUntil(tok::r_square)) 1349 break; 1350 } else if (Tok.is(tok::kw_alignas) && NextToken().is(tok::l_paren)) { 1351 ConsumeToken(); 1352 ConsumeParen(); 1353 if (!SkipUntil(tok::r_paren)) 1354 break; 1355 } else { 1356 break; 1357 } 1358 } 1359 1360 if (Tok.is(tok::l_brace) || Tok.is(tok::colon)) 1361 TUK = Sema::TUK_Definition; 1362 else 1363 TUK = Sema::TUK_Reference; 1364 1365 PA.Revert(); 1366 } else if (DSC != DSC_type_specifier && 1367 (Tok.is(tok::semi) || 1368 (Tok.isAtStartOfLine() && !isValidAfterTypeSpecifier(false)))) { 1369 TUK = DS.isFriendSpecified() ? Sema::TUK_Friend : Sema::TUK_Declaration; 1370 if (Tok.isNot(tok::semi)) { 1371 // A semicolon was missing after this declaration. Diagnose and recover. 1372 ExpectAndConsume(tok::semi, diag::err_expected_semi_after_tagdecl, 1373 DeclSpec::getSpecifierName(TagType)); 1374 PP.EnterToken(Tok); 1375 Tok.setKind(tok::semi); 1376 } 1377 } else 1378 TUK = Sema::TUK_Reference; 1379 1380 // Forbid misplaced attributes. In cases of a reference, we pass attributes 1381 // to caller to handle. 1382 if (TUK != Sema::TUK_Reference) { 1383 // If this is not a reference, then the only possible 1384 // valid place for C++11 attributes to appear here 1385 // is between class-key and class-name. If there are 1386 // any attributes after class-name, we try a fixit to move 1387 // them to the right place. 1388 SourceRange AttrRange = Attributes.Range; 1389 if (AttrRange.isValid()) { 1390 Diag(AttrRange.getBegin(), diag::err_attributes_not_allowed) 1391 << AttrRange 1392 << FixItHint::CreateInsertionFromRange(AttrFixitLoc, 1393 CharSourceRange(AttrRange, true)) 1394 << FixItHint::CreateRemoval(AttrRange); 1395 1396 // Recover by adding misplaced attributes to the attribute list 1397 // of the class so they can be applied on the class later. 1398 attrs.takeAllFrom(Attributes); 1399 } 1400 } 1401 1402 // If this is an elaborated type specifier, and we delayed 1403 // diagnostics before, just merge them into the current pool. 1404 if (shouldDelayDiagsInTag) { 1405 diagsFromTag.done(); 1406 if (TUK == Sema::TUK_Reference) 1407 diagsFromTag.redelay(); 1408 } 1409 1410 if (!Name && !TemplateId && (DS.getTypeSpecType() == DeclSpec::TST_error || 1411 TUK != Sema::TUK_Definition)) { 1412 if (DS.getTypeSpecType() != DeclSpec::TST_error) { 1413 // We have a declaration or reference to an anonymous class. 1414 Diag(StartLoc, diag::err_anon_type_definition) 1415 << DeclSpec::getSpecifierName(TagType); 1416 } 1417 1418 SkipUntil(tok::comma, true); 1419 return; 1420 } 1421 1422 // Create the tag portion of the class or class template. 1423 DeclResult TagOrTempResult = true; // invalid 1424 TypeResult TypeResult = true; // invalid 1425 1426 bool Owned = false; 1427 if (TemplateId) { 1428 // Explicit specialization, class template partial specialization, 1429 // or explicit instantiation. 1430 ASTTemplateArgsPtr TemplateArgsPtr(TemplateId->getTemplateArgs(), 1431 TemplateId->NumArgs); 1432 if (TemplateInfo.Kind == ParsedTemplateInfo::ExplicitInstantiation && 1433 TUK == Sema::TUK_Declaration) { 1434 // This is an explicit instantiation of a class template. 1435 ProhibitAttributes(attrs); 1436 1437 TagOrTempResult 1438 = Actions.ActOnExplicitInstantiation(getCurScope(), 1439 TemplateInfo.ExternLoc, 1440 TemplateInfo.TemplateLoc, 1441 TagType, 1442 StartLoc, 1443 SS, 1444 TemplateId->Template, 1445 TemplateId->TemplateNameLoc, 1446 TemplateId->LAngleLoc, 1447 TemplateArgsPtr, 1448 TemplateId->RAngleLoc, 1449 attrs.getList()); 1450 1451 // Friend template-ids are treated as references unless 1452 // they have template headers, in which case they're ill-formed 1453 // (FIXME: "template <class T> friend class A<T>::B<int>;"). 1454 // We diagnose this error in ActOnClassTemplateSpecialization. 1455 } else if (TUK == Sema::TUK_Reference || 1456 (TUK == Sema::TUK_Friend && 1457 TemplateInfo.Kind == ParsedTemplateInfo::NonTemplate)) { 1458 ProhibitAttributes(attrs); 1459 TypeResult = Actions.ActOnTagTemplateIdType(TUK, TagType, StartLoc, 1460 TemplateId->SS, 1461 TemplateId->TemplateKWLoc, 1462 TemplateId->Template, 1463 TemplateId->TemplateNameLoc, 1464 TemplateId->LAngleLoc, 1465 TemplateArgsPtr, 1466 TemplateId->RAngleLoc); 1467 } else { 1468 // This is an explicit specialization or a class template 1469 // partial specialization. 1470 TemplateParameterLists FakedParamLists; 1471 if (TemplateInfo.Kind == ParsedTemplateInfo::ExplicitInstantiation) { 1472 // This looks like an explicit instantiation, because we have 1473 // something like 1474 // 1475 // template class Foo<X> 1476 // 1477 // but it actually has a definition. Most likely, this was 1478 // meant to be an explicit specialization, but the user forgot 1479 // the '<>' after 'template'. 1480 // It this is friend declaration however, since it cannot have a 1481 // template header, it is most likely that the user meant to 1482 // remove the 'template' keyword. 1483 assert((TUK == Sema::TUK_Definition || TUK == Sema::TUK_Friend) && 1484 "Expected a definition here"); 1485 1486 if (TUK == Sema::TUK_Friend) { 1487 Diag(DS.getFriendSpecLoc(), 1488 diag::err_friend_explicit_instantiation); 1489 TemplateParams = 0; 1490 } else { 1491 SourceLocation LAngleLoc 1492 = PP.getLocForEndOfToken(TemplateInfo.TemplateLoc); 1493 Diag(TemplateId->TemplateNameLoc, 1494 diag::err_explicit_instantiation_with_definition) 1495 << SourceRange(TemplateInfo.TemplateLoc) 1496 << FixItHint::CreateInsertion(LAngleLoc, "<>"); 1497 1498 // Create a fake template parameter list that contains only 1499 // "template<>", so that we treat this construct as a class 1500 // template specialization. 1501 FakedParamLists.push_back( 1502 Actions.ActOnTemplateParameterList(0, SourceLocation(), 1503 TemplateInfo.TemplateLoc, 1504 LAngleLoc, 1505 0, 0, 1506 LAngleLoc)); 1507 TemplateParams = &FakedParamLists; 1508 } 1509 } 1510 1511 // Build the class template specialization. 1512 TagOrTempResult 1513 = Actions.ActOnClassTemplateSpecialization(getCurScope(), TagType, TUK, 1514 StartLoc, DS.getModulePrivateSpecLoc(), SS, 1515 TemplateId->Template, 1516 TemplateId->TemplateNameLoc, 1517 TemplateId->LAngleLoc, 1518 TemplateArgsPtr, 1519 TemplateId->RAngleLoc, 1520 attrs.getList(), 1521 MultiTemplateParamsArg( 1522 TemplateParams? &(*TemplateParams)[0] : 0, 1523 TemplateParams? TemplateParams->size() : 0)); 1524 } 1525 } else if (TemplateInfo.Kind == ParsedTemplateInfo::ExplicitInstantiation && 1526 TUK == Sema::TUK_Declaration) { 1527 // Explicit instantiation of a member of a class template 1528 // specialization, e.g., 1529 // 1530 // template struct Outer<int>::Inner; 1531 // 1532 ProhibitAttributes(attrs); 1533 1534 TagOrTempResult 1535 = Actions.ActOnExplicitInstantiation(getCurScope(), 1536 TemplateInfo.ExternLoc, 1537 TemplateInfo.TemplateLoc, 1538 TagType, StartLoc, SS, Name, 1539 NameLoc, attrs.getList()); 1540 } else if (TUK == Sema::TUK_Friend && 1541 TemplateInfo.Kind != ParsedTemplateInfo::NonTemplate) { 1542 ProhibitAttributes(attrs); 1543 1544 TagOrTempResult = 1545 Actions.ActOnTemplatedFriendTag(getCurScope(), DS.getFriendSpecLoc(), 1546 TagType, StartLoc, SS, 1547 Name, NameLoc, attrs.getList(), 1548 MultiTemplateParamsArg( 1549 TemplateParams? &(*TemplateParams)[0] : 0, 1550 TemplateParams? TemplateParams->size() : 0)); 1551 } else { 1552 if (TUK != Sema::TUK_Declaration && TUK != Sema::TUK_Definition) 1553 ProhibitAttributes(attrs); 1554 1555 if (TUK == Sema::TUK_Definition && 1556 TemplateInfo.Kind == ParsedTemplateInfo::ExplicitInstantiation) { 1557 // If the declarator-id is not a template-id, issue a diagnostic and 1558 // recover by ignoring the 'template' keyword. 1559 Diag(Tok, diag::err_template_defn_explicit_instantiation) 1560 << 1 << FixItHint::CreateRemoval(TemplateInfo.TemplateLoc); 1561 TemplateParams = 0; 1562 } 1563 1564 bool IsDependent = false; 1565 1566 // Don't pass down template parameter lists if this is just a tag 1567 // reference. For example, we don't need the template parameters here: 1568 // template <class T> class A *makeA(T t); 1569 MultiTemplateParamsArg TParams; 1570 if (TUK != Sema::TUK_Reference && TemplateParams) 1571 TParams = 1572 MultiTemplateParamsArg(&(*TemplateParams)[0], TemplateParams->size()); 1573 1574 // Declaration or definition of a class type 1575 TagOrTempResult = Actions.ActOnTag(getCurScope(), TagType, TUK, StartLoc, 1576 SS, Name, NameLoc, attrs.getList(), AS, 1577 DS.getModulePrivateSpecLoc(), 1578 TParams, Owned, IsDependent, 1579 SourceLocation(), false, 1580 clang::TypeResult()); 1581 1582 // If ActOnTag said the type was dependent, try again with the 1583 // less common call. 1584 if (IsDependent) { 1585 assert(TUK == Sema::TUK_Reference || TUK == Sema::TUK_Friend); 1586 TypeResult = Actions.ActOnDependentTag(getCurScope(), TagType, TUK, 1587 SS, Name, StartLoc, NameLoc); 1588 } 1589 } 1590 1591 // If there is a body, parse it and inform the actions module. 1592 if (TUK == Sema::TUK_Definition) { 1593 assert(Tok.is(tok::l_brace) || 1594 (getLangOpts().CPlusPlus && Tok.is(tok::colon)) || 1595 isCXX11FinalKeyword()); 1596 if (getLangOpts().CPlusPlus) 1597 ParseCXXMemberSpecification(StartLoc, AttrFixitLoc, attrs, TagType, 1598 TagOrTempResult.get()); 1599 else 1600 ParseStructUnionBody(StartLoc, TagType, TagOrTempResult.get()); 1601 } 1602 1603 const char *PrevSpec = 0; 1604 unsigned DiagID; 1605 bool Result; 1606 if (!TypeResult.isInvalid()) { 1607 Result = DS.SetTypeSpecType(DeclSpec::TST_typename, StartLoc, 1608 NameLoc.isValid() ? NameLoc : StartLoc, 1609 PrevSpec, DiagID, TypeResult.get()); 1610 } else if (!TagOrTempResult.isInvalid()) { 1611 Result = DS.SetTypeSpecType(TagType, StartLoc, 1612 NameLoc.isValid() ? NameLoc : StartLoc, 1613 PrevSpec, DiagID, TagOrTempResult.get(), Owned); 1614 } else { 1615 DS.SetTypeSpecError(); 1616 return; 1617 } 1618 1619 if (Result) 1620 Diag(StartLoc, DiagID) << PrevSpec; 1621 1622 // At this point, we've successfully parsed a class-specifier in 'definition' 1623 // form (e.g. "struct foo { int x; }". While we could just return here, we're 1624 // going to look at what comes after it to improve error recovery. If an 1625 // impossible token occurs next, we assume that the programmer forgot a ; at 1626 // the end of the declaration and recover that way. 1627 // 1628 // Also enforce C++ [temp]p3: 1629 // In a template-declaration which defines a class, no declarator 1630 // is permitted. 1631 if (TUK == Sema::TUK_Definition && 1632 (TemplateInfo.Kind || !isValidAfterTypeSpecifier(false))) { 1633 if (Tok.isNot(tok::semi)) { 1634 ExpectAndConsume(tok::semi, diag::err_expected_semi_after_tagdecl, 1635 DeclSpec::getSpecifierName(TagType)); 1636 // Push this token back into the preprocessor and change our current token 1637 // to ';' so that the rest of the code recovers as though there were an 1638 // ';' after the definition. 1639 PP.EnterToken(Tok); 1640 Tok.setKind(tok::semi); 1641 } 1642 } 1643 } 1644 1645 /// ParseBaseClause - Parse the base-clause of a C++ class [C++ class.derived]. 1646 /// 1647 /// base-clause : [C++ class.derived] 1648 /// ':' base-specifier-list 1649 /// base-specifier-list: 1650 /// base-specifier '...'[opt] 1651 /// base-specifier-list ',' base-specifier '...'[opt] 1652 void Parser::ParseBaseClause(Decl *ClassDecl) { 1653 assert(Tok.is(tok::colon) && "Not a base clause"); 1654 ConsumeToken(); 1655 1656 // Build up an array of parsed base specifiers. 1657 SmallVector<CXXBaseSpecifier *, 8> BaseInfo; 1658 1659 while (true) { 1660 // Parse a base-specifier. 1661 BaseResult Result = ParseBaseSpecifier(ClassDecl); 1662 if (Result.isInvalid()) { 1663 // Skip the rest of this base specifier, up until the comma or 1664 // opening brace. 1665 SkipUntil(tok::comma, tok::l_brace, true, true); 1666 } else { 1667 // Add this to our array of base specifiers. 1668 BaseInfo.push_back(Result.get()); 1669 } 1670 1671 // If the next token is a comma, consume it and keep reading 1672 // base-specifiers. 1673 if (Tok.isNot(tok::comma)) break; 1674 1675 // Consume the comma. 1676 ConsumeToken(); 1677 } 1678 1679 // Attach the base specifiers 1680 Actions.ActOnBaseSpecifiers(ClassDecl, BaseInfo.data(), BaseInfo.size()); 1681 } 1682 1683 /// ParseBaseSpecifier - Parse a C++ base-specifier. A base-specifier is 1684 /// one entry in the base class list of a class specifier, for example: 1685 /// class foo : public bar, virtual private baz { 1686 /// 'public bar' and 'virtual private baz' are each base-specifiers. 1687 /// 1688 /// base-specifier: [C++ class.derived] 1689 /// attribute-specifier-seq[opt] base-type-specifier 1690 /// attribute-specifier-seq[opt] 'virtual' access-specifier[opt] 1691 /// base-type-specifier 1692 /// attribute-specifier-seq[opt] access-specifier 'virtual'[opt] 1693 /// base-type-specifier 1694 Parser::BaseResult Parser::ParseBaseSpecifier(Decl *ClassDecl) { 1695 bool IsVirtual = false; 1696 SourceLocation StartLoc = Tok.getLocation(); 1697 1698 ParsedAttributesWithRange Attributes(AttrFactory); 1699 MaybeParseCXX11Attributes(Attributes); 1700 1701 // Parse the 'virtual' keyword. 1702 if (Tok.is(tok::kw_virtual)) { 1703 ConsumeToken(); 1704 IsVirtual = true; 1705 } 1706 1707 CheckMisplacedCXX11Attribute(Attributes, StartLoc); 1708 1709 // Parse an (optional) access specifier. 1710 AccessSpecifier Access = getAccessSpecifierIfPresent(); 1711 if (Access != AS_none) 1712 ConsumeToken(); 1713 1714 CheckMisplacedCXX11Attribute(Attributes, StartLoc); 1715 1716 // Parse the 'virtual' keyword (again!), in case it came after the 1717 // access specifier. 1718 if (Tok.is(tok::kw_virtual)) { 1719 SourceLocation VirtualLoc = ConsumeToken(); 1720 if (IsVirtual) { 1721 // Complain about duplicate 'virtual' 1722 Diag(VirtualLoc, diag::err_dup_virtual) 1723 << FixItHint::CreateRemoval(VirtualLoc); 1724 } 1725 1726 IsVirtual = true; 1727 } 1728 1729 CheckMisplacedCXX11Attribute(Attributes, StartLoc); 1730 1731 // Parse the class-name. 1732 SourceLocation EndLocation; 1733 SourceLocation BaseLoc; 1734 TypeResult BaseType = ParseBaseTypeSpecifier(BaseLoc, EndLocation); 1735 if (BaseType.isInvalid()) 1736 return true; 1737 1738 // Parse the optional ellipsis (for a pack expansion). The ellipsis is 1739 // actually part of the base-specifier-list grammar productions, but we 1740 // parse it here for convenience. 1741 SourceLocation EllipsisLoc; 1742 if (Tok.is(tok::ellipsis)) 1743 EllipsisLoc = ConsumeToken(); 1744 1745 // Find the complete source range for the base-specifier. 1746 SourceRange Range(StartLoc, EndLocation); 1747 1748 // Notify semantic analysis that we have parsed a complete 1749 // base-specifier. 1750 return Actions.ActOnBaseSpecifier(ClassDecl, Range, Attributes, IsVirtual, 1751 Access, BaseType.get(), BaseLoc, 1752 EllipsisLoc); 1753 } 1754 1755 /// getAccessSpecifierIfPresent - Determine whether the next token is 1756 /// a C++ access-specifier. 1757 /// 1758 /// access-specifier: [C++ class.derived] 1759 /// 'private' 1760 /// 'protected' 1761 /// 'public' 1762 AccessSpecifier Parser::getAccessSpecifierIfPresent() const { 1763 switch (Tok.getKind()) { 1764 default: return AS_none; 1765 case tok::kw_private: return AS_private; 1766 case tok::kw_protected: return AS_protected; 1767 case tok::kw_public: return AS_public; 1768 } 1769 } 1770 1771 /// \brief If the given declarator has any parts for which parsing has to be 1772 /// delayed, e.g., default arguments, create a late-parsed method declaration 1773 /// record to handle the parsing at the end of the class definition. 1774 void Parser::HandleMemberFunctionDeclDelays(Declarator& DeclaratorInfo, 1775 Decl *ThisDecl) { 1776 // We just declared a member function. If this member function 1777 // has any default arguments, we'll need to parse them later. 1778 LateParsedMethodDeclaration *LateMethod = 0; 1779 DeclaratorChunk::FunctionTypeInfo &FTI 1780 = DeclaratorInfo.getFunctionTypeInfo(); 1781 1782 for (unsigned ParamIdx = 0; ParamIdx < FTI.NumArgs; ++ParamIdx) { 1783 if (LateMethod || FTI.ArgInfo[ParamIdx].DefaultArgTokens) { 1784 if (!LateMethod) { 1785 // Push this method onto the stack of late-parsed method 1786 // declarations. 1787 LateMethod = new LateParsedMethodDeclaration(this, ThisDecl); 1788 getCurrentClass().LateParsedDeclarations.push_back(LateMethod); 1789 LateMethod->TemplateScope = getCurScope()->isTemplateParamScope(); 1790 1791 // Add all of the parameters prior to this one (they don't 1792 // have default arguments). 1793 LateMethod->DefaultArgs.reserve(FTI.NumArgs); 1794 for (unsigned I = 0; I < ParamIdx; ++I) 1795 LateMethod->DefaultArgs.push_back( 1796 LateParsedDefaultArgument(FTI.ArgInfo[I].Param)); 1797 } 1798 1799 // Add this parameter to the list of parameters (it may or may 1800 // not have a default argument). 1801 LateMethod->DefaultArgs.push_back( 1802 LateParsedDefaultArgument(FTI.ArgInfo[ParamIdx].Param, 1803 FTI.ArgInfo[ParamIdx].DefaultArgTokens)); 1804 } 1805 } 1806 } 1807 1808 /// isCXX11VirtSpecifier - Determine whether the given token is a C++11 1809 /// virt-specifier. 1810 /// 1811 /// virt-specifier: 1812 /// override 1813 /// final 1814 VirtSpecifiers::Specifier Parser::isCXX11VirtSpecifier(const Token &Tok) const { 1815 if (!getLangOpts().CPlusPlus) 1816 return VirtSpecifiers::VS_None; 1817 1818 if (Tok.is(tok::identifier)) { 1819 IdentifierInfo *II = Tok.getIdentifierInfo(); 1820 1821 // Initialize the contextual keywords. 1822 if (!Ident_final) { 1823 Ident_final = &PP.getIdentifierTable().get("final"); 1824 Ident_override = &PP.getIdentifierTable().get("override"); 1825 } 1826 1827 if (II == Ident_override) 1828 return VirtSpecifiers::VS_Override; 1829 1830 if (II == Ident_final) 1831 return VirtSpecifiers::VS_Final; 1832 } 1833 1834 return VirtSpecifiers::VS_None; 1835 } 1836 1837 /// ParseOptionalCXX11VirtSpecifierSeq - Parse a virt-specifier-seq. 1838 /// 1839 /// virt-specifier-seq: 1840 /// virt-specifier 1841 /// virt-specifier-seq virt-specifier 1842 void Parser::ParseOptionalCXX11VirtSpecifierSeq(VirtSpecifiers &VS, 1843 bool IsInterface) { 1844 while (true) { 1845 VirtSpecifiers::Specifier Specifier = isCXX11VirtSpecifier(); 1846 if (Specifier == VirtSpecifiers::VS_None) 1847 return; 1848 1849 // C++ [class.mem]p8: 1850 // A virt-specifier-seq shall contain at most one of each virt-specifier. 1851 const char *PrevSpec = 0; 1852 if (VS.SetSpecifier(Specifier, Tok.getLocation(), PrevSpec)) 1853 Diag(Tok.getLocation(), diag::err_duplicate_virt_specifier) 1854 << PrevSpec 1855 << FixItHint::CreateRemoval(Tok.getLocation()); 1856 1857 if (IsInterface && Specifier == VirtSpecifiers::VS_Final) { 1858 Diag(Tok.getLocation(), diag::err_override_control_interface) 1859 << VirtSpecifiers::getSpecifierName(Specifier); 1860 } else { 1861 Diag(Tok.getLocation(), getLangOpts().CPlusPlus11 ? 1862 diag::warn_cxx98_compat_override_control_keyword : 1863 diag::ext_override_control_keyword) 1864 << VirtSpecifiers::getSpecifierName(Specifier); 1865 } 1866 ConsumeToken(); 1867 } 1868 } 1869 1870 /// isCXX11FinalKeyword - Determine whether the next token is a C++11 1871 /// contextual 'final' keyword. 1872 bool Parser::isCXX11FinalKeyword() const { 1873 if (!getLangOpts().CPlusPlus) 1874 return false; 1875 1876 if (!Tok.is(tok::identifier)) 1877 return false; 1878 1879 // Initialize the contextual keywords. 1880 if (!Ident_final) { 1881 Ident_final = &PP.getIdentifierTable().get("final"); 1882 Ident_override = &PP.getIdentifierTable().get("override"); 1883 } 1884 1885 return Tok.getIdentifierInfo() == Ident_final; 1886 } 1887 1888 /// ParseCXXClassMemberDeclaration - Parse a C++ class member declaration. 1889 /// 1890 /// member-declaration: 1891 /// decl-specifier-seq[opt] member-declarator-list[opt] ';' 1892 /// function-definition ';'[opt] 1893 /// ::[opt] nested-name-specifier template[opt] unqualified-id ';'[TODO] 1894 /// using-declaration [TODO] 1895 /// [C++0x] static_assert-declaration 1896 /// template-declaration 1897 /// [GNU] '__extension__' member-declaration 1898 /// 1899 /// member-declarator-list: 1900 /// member-declarator 1901 /// member-declarator-list ',' member-declarator 1902 /// 1903 /// member-declarator: 1904 /// declarator virt-specifier-seq[opt] pure-specifier[opt] 1905 /// declarator constant-initializer[opt] 1906 /// [C++11] declarator brace-or-equal-initializer[opt] 1907 /// identifier[opt] ':' constant-expression 1908 /// 1909 /// virt-specifier-seq: 1910 /// virt-specifier 1911 /// virt-specifier-seq virt-specifier 1912 /// 1913 /// virt-specifier: 1914 /// override 1915 /// final 1916 /// 1917 /// pure-specifier: 1918 /// '= 0' 1919 /// 1920 /// constant-initializer: 1921 /// '=' constant-expression 1922 /// 1923 void Parser::ParseCXXClassMemberDeclaration(AccessSpecifier AS, 1924 AttributeList *AccessAttrs, 1925 const ParsedTemplateInfo &TemplateInfo, 1926 ParsingDeclRAIIObject *TemplateDiags) { 1927 if (Tok.is(tok::at)) { 1928 if (getLangOpts().ObjC1 && NextToken().isObjCAtKeyword(tok::objc_defs)) 1929 Diag(Tok, diag::err_at_defs_cxx); 1930 else 1931 Diag(Tok, diag::err_at_in_class); 1932 1933 ConsumeToken(); 1934 SkipUntil(tok::r_brace); 1935 return; 1936 } 1937 1938 // Access declarations. 1939 bool MalformedTypeSpec = false; 1940 if (!TemplateInfo.Kind && 1941 (Tok.is(tok::identifier) || Tok.is(tok::coloncolon))) { 1942 if (TryAnnotateCXXScopeToken()) 1943 MalformedTypeSpec = true; 1944 1945 bool isAccessDecl; 1946 if (Tok.isNot(tok::annot_cxxscope)) 1947 isAccessDecl = false; 1948 else if (NextToken().is(tok::identifier)) 1949 isAccessDecl = GetLookAheadToken(2).is(tok::semi); 1950 else 1951 isAccessDecl = NextToken().is(tok::kw_operator); 1952 1953 if (isAccessDecl) { 1954 // Collect the scope specifier token we annotated earlier. 1955 CXXScopeSpec SS; 1956 ParseOptionalCXXScopeSpecifier(SS, ParsedType(), 1957 /*EnteringContext=*/false); 1958 1959 // Try to parse an unqualified-id. 1960 SourceLocation TemplateKWLoc; 1961 UnqualifiedId Name; 1962 if (ParseUnqualifiedId(SS, false, true, true, ParsedType(), 1963 TemplateKWLoc, Name)) { 1964 SkipUntil(tok::semi); 1965 return; 1966 } 1967 1968 // TODO: recover from mistakenly-qualified operator declarations. 1969 if (ExpectAndConsume(tok::semi, 1970 diag::err_expected_semi_after, 1971 "access declaration", 1972 tok::semi)) 1973 return; 1974 1975 Actions.ActOnUsingDeclaration(getCurScope(), AS, 1976 /* HasUsingKeyword */ false, 1977 SourceLocation(), 1978 SS, Name, 1979 /* AttrList */ 0, 1980 /* HasTypenameKeyword */ false, 1981 SourceLocation()); 1982 return; 1983 } 1984 } 1985 1986 // static_assert-declaration 1987 if (Tok.is(tok::kw_static_assert) || Tok.is(tok::kw__Static_assert)) { 1988 // FIXME: Check for templates 1989 SourceLocation DeclEnd; 1990 ParseStaticAssertDeclaration(DeclEnd); 1991 return; 1992 } 1993 1994 if (Tok.is(tok::kw_template)) { 1995 assert(!TemplateInfo.TemplateParams && 1996 "Nested template improperly parsed?"); 1997 SourceLocation DeclEnd; 1998 ParseDeclarationStartingWithTemplate(Declarator::MemberContext, DeclEnd, 1999 AS, AccessAttrs); 2000 return; 2001 } 2002 2003 // Handle: member-declaration ::= '__extension__' member-declaration 2004 if (Tok.is(tok::kw___extension__)) { 2005 // __extension__ silences extension warnings in the subexpression. 2006 ExtensionRAIIObject O(Diags); // Use RAII to do this. 2007 ConsumeToken(); 2008 return ParseCXXClassMemberDeclaration(AS, AccessAttrs, 2009 TemplateInfo, TemplateDiags); 2010 } 2011 2012 // Don't parse FOO:BAR as if it were a typo for FOO::BAR, in this context it 2013 // is a bitfield. 2014 ColonProtectionRAIIObject X(*this); 2015 2016 ParsedAttributesWithRange attrs(AttrFactory); 2017 ParsedAttributesWithRange FnAttrs(AttrFactory); 2018 // Optional C++11 attribute-specifier 2019 MaybeParseCXX11Attributes(attrs); 2020 // We need to keep these attributes for future diagnostic 2021 // before they are taken over by declaration specifier. 2022 FnAttrs.addAll(attrs.getList()); 2023 FnAttrs.Range = attrs.Range; 2024 2025 MaybeParseMicrosoftAttributes(attrs); 2026 2027 if (Tok.is(tok::kw_using)) { 2028 ProhibitAttributes(attrs); 2029 2030 // Eat 'using'. 2031 SourceLocation UsingLoc = ConsumeToken(); 2032 2033 if (Tok.is(tok::kw_namespace)) { 2034 Diag(UsingLoc, diag::err_using_namespace_in_class); 2035 SkipUntil(tok::semi, true, true); 2036 } else { 2037 SourceLocation DeclEnd; 2038 // Otherwise, it must be a using-declaration or an alias-declaration. 2039 ParseUsingDeclaration(Declarator::MemberContext, TemplateInfo, 2040 UsingLoc, DeclEnd, AS); 2041 } 2042 return; 2043 } 2044 2045 // Hold late-parsed attributes so we can attach a Decl to them later. 2046 LateParsedAttrList CommonLateParsedAttrs; 2047 2048 // decl-specifier-seq: 2049 // Parse the common declaration-specifiers piece. 2050 ParsingDeclSpec DS(*this, TemplateDiags); 2051 DS.takeAttributesFrom(attrs); 2052 if (MalformedTypeSpec) 2053 DS.SetTypeSpecError(); 2054 ParseDeclarationSpecifiers(DS, TemplateInfo, AS, DSC_class, 2055 &CommonLateParsedAttrs); 2056 2057 MultiTemplateParamsArg TemplateParams( 2058 TemplateInfo.TemplateParams? TemplateInfo.TemplateParams->data() : 0, 2059 TemplateInfo.TemplateParams? TemplateInfo.TemplateParams->size() : 0); 2060 2061 if (Tok.is(tok::semi)) { 2062 ConsumeToken(); 2063 2064 if (DS.isFriendSpecified()) 2065 ProhibitAttributes(FnAttrs); 2066 2067 Decl *TheDecl = 2068 Actions.ParsedFreeStandingDeclSpec(getCurScope(), AS, DS, TemplateParams); 2069 DS.complete(TheDecl); 2070 return; 2071 } 2072 2073 ParsingDeclarator DeclaratorInfo(*this, DS, Declarator::MemberContext); 2074 VirtSpecifiers VS; 2075 2076 // Hold late-parsed attributes so we can attach a Decl to them later. 2077 LateParsedAttrList LateParsedAttrs; 2078 2079 SourceLocation EqualLoc; 2080 bool HasInitializer = false; 2081 ExprResult Init; 2082 if (Tok.isNot(tok::colon)) { 2083 // Don't parse FOO:BAR as if it were a typo for FOO::BAR. 2084 ColonProtectionRAIIObject X(*this); 2085 2086 // Parse the first declarator. 2087 ParseDeclarator(DeclaratorInfo); 2088 // Error parsing the declarator? 2089 if (!DeclaratorInfo.hasName()) { 2090 // If so, skip until the semi-colon or a }. 2091 SkipUntil(tok::r_brace, true, true); 2092 if (Tok.is(tok::semi)) 2093 ConsumeToken(); 2094 return; 2095 } 2096 2097 ParseOptionalCXX11VirtSpecifierSeq(VS, getCurrentClass().IsInterface); 2098 2099 // If attributes exist after the declarator, but before an '{', parse them. 2100 MaybeParseGNUAttributes(DeclaratorInfo, &LateParsedAttrs); 2101 2102 // MSVC permits pure specifier on inline functions declared at class scope. 2103 // Hence check for =0 before checking for function definition. 2104 if (getLangOpts().MicrosoftExt && Tok.is(tok::equal) && 2105 DeclaratorInfo.isFunctionDeclarator() && 2106 NextToken().is(tok::numeric_constant)) { 2107 EqualLoc = ConsumeToken(); 2108 Init = ParseInitializer(); 2109 if (Init.isInvalid()) 2110 SkipUntil(tok::comma, true, true); 2111 else 2112 HasInitializer = true; 2113 } 2114 2115 FunctionDefinitionKind DefinitionKind = FDK_Declaration; 2116 // function-definition: 2117 // 2118 // In C++11, a non-function declarator followed by an open brace is a 2119 // braced-init-list for an in-class member initialization, not an 2120 // erroneous function definition. 2121 if (Tok.is(tok::l_brace) && !getLangOpts().CPlusPlus11) { 2122 DefinitionKind = FDK_Definition; 2123 } else if (DeclaratorInfo.isFunctionDeclarator()) { 2124 if (Tok.is(tok::l_brace) || Tok.is(tok::colon) || Tok.is(tok::kw_try)) { 2125 DefinitionKind = FDK_Definition; 2126 } else if (Tok.is(tok::equal)) { 2127 const Token &KW = NextToken(); 2128 if (KW.is(tok::kw_default)) 2129 DefinitionKind = FDK_Defaulted; 2130 else if (KW.is(tok::kw_delete)) 2131 DefinitionKind = FDK_Deleted; 2132 } 2133 } 2134 2135 // C++11 [dcl.attr.grammar] p4: If an attribute-specifier-seq appertains 2136 // to a friend declaration, that declaration shall be a definition. 2137 if (DeclaratorInfo.isFunctionDeclarator() && 2138 DefinitionKind != FDK_Definition && DS.isFriendSpecified()) { 2139 // Diagnose attributes that appear before decl specifier: 2140 // [[]] friend int foo(); 2141 ProhibitAttributes(FnAttrs); 2142 } 2143 2144 if (DefinitionKind) { 2145 if (!DeclaratorInfo.isFunctionDeclarator()) { 2146 Diag(DeclaratorInfo.getIdentifierLoc(), diag::err_func_def_no_params); 2147 ConsumeBrace(); 2148 SkipUntil(tok::r_brace, /*StopAtSemi*/false); 2149 2150 // Consume the optional ';' 2151 if (Tok.is(tok::semi)) 2152 ConsumeToken(); 2153 return; 2154 } 2155 2156 if (DS.getStorageClassSpec() == DeclSpec::SCS_typedef) { 2157 Diag(DeclaratorInfo.getIdentifierLoc(), 2158 diag::err_function_declared_typedef); 2159 2160 // Recover by treating the 'typedef' as spurious. 2161 DS.ClearStorageClassSpecs(); 2162 } 2163 2164 Decl *FunDecl = 2165 ParseCXXInlineMethodDef(AS, AccessAttrs, DeclaratorInfo, TemplateInfo, 2166 VS, DefinitionKind, Init); 2167 2168 if (FunDecl) { 2169 for (unsigned i = 0, ni = CommonLateParsedAttrs.size(); i < ni; ++i) { 2170 CommonLateParsedAttrs[i]->addDecl(FunDecl); 2171 } 2172 for (unsigned i = 0, ni = LateParsedAttrs.size(); i < ni; ++i) { 2173 LateParsedAttrs[i]->addDecl(FunDecl); 2174 } 2175 } 2176 LateParsedAttrs.clear(); 2177 2178 // Consume the ';' - it's optional unless we have a delete or default 2179 if (Tok.is(tok::semi)) 2180 ConsumeExtraSemi(AfterMemberFunctionDefinition); 2181 2182 return; 2183 } 2184 } 2185 2186 // member-declarator-list: 2187 // member-declarator 2188 // member-declarator-list ',' member-declarator 2189 2190 SmallVector<Decl *, 8> DeclsInGroup; 2191 ExprResult BitfieldSize; 2192 bool ExpectSemi = true; 2193 2194 while (1) { 2195 // member-declarator: 2196 // declarator pure-specifier[opt] 2197 // declarator brace-or-equal-initializer[opt] 2198 // identifier[opt] ':' constant-expression 2199 if (Tok.is(tok::colon)) { 2200 ConsumeToken(); 2201 BitfieldSize = ParseConstantExpression(); 2202 if (BitfieldSize.isInvalid()) 2203 SkipUntil(tok::comma, true, true); 2204 } 2205 2206 // If a simple-asm-expr is present, parse it. 2207 if (Tok.is(tok::kw_asm)) { 2208 SourceLocation Loc; 2209 ExprResult AsmLabel(ParseSimpleAsm(&Loc)); 2210 if (AsmLabel.isInvalid()) 2211 SkipUntil(tok::comma, true, true); 2212 2213 DeclaratorInfo.setAsmLabel(AsmLabel.release()); 2214 DeclaratorInfo.SetRangeEnd(Loc); 2215 } 2216 2217 // If attributes exist after the declarator, parse them. 2218 MaybeParseGNUAttributes(DeclaratorInfo, &LateParsedAttrs); 2219 2220 // FIXME: When g++ adds support for this, we'll need to check whether it 2221 // goes before or after the GNU attributes and __asm__. 2222 ParseOptionalCXX11VirtSpecifierSeq(VS, getCurrentClass().IsInterface); 2223 2224 InClassInitStyle HasInClassInit = ICIS_NoInit; 2225 if ((Tok.is(tok::equal) || Tok.is(tok::l_brace)) && !HasInitializer) { 2226 if (BitfieldSize.get()) { 2227 Diag(Tok, diag::err_bitfield_member_init); 2228 SkipUntil(tok::comma, true, true); 2229 } else { 2230 HasInitializer = true; 2231 if (!DeclaratorInfo.isDeclarationOfFunction() && 2232 DeclaratorInfo.getDeclSpec().getStorageClassSpec() 2233 != DeclSpec::SCS_typedef) 2234 HasInClassInit = Tok.is(tok::equal) ? ICIS_CopyInit : ICIS_ListInit; 2235 } 2236 } 2237 2238 // NOTE: If Sema is the Action module and declarator is an instance field, 2239 // this call will *not* return the created decl; It will return null. 2240 // See Sema::ActOnCXXMemberDeclarator for details. 2241 2242 NamedDecl *ThisDecl = 0; 2243 if (DS.isFriendSpecified()) { 2244 // C++11 [dcl.attr.grammar] p4: If an attribute-specifier-seq appertains 2245 // to a friend declaration, that declaration shall be a definition. 2246 // 2247 // Diagnose attributes appear after friend member function declarator: 2248 // foo [[]] (); 2249 SmallVector<SourceRange, 4> Ranges; 2250 DeclaratorInfo.getCXX11AttributeRanges(Ranges); 2251 if (!Ranges.empty()) { 2252 for (SmallVectorImpl<SourceRange>::iterator I = Ranges.begin(), 2253 E = Ranges.end(); I != E; ++I) { 2254 Diag((*I).getBegin(), diag::err_attributes_not_allowed) 2255 << *I; 2256 } 2257 } 2258 2259 // TODO: handle initializers, bitfields, 'delete' 2260 ThisDecl = Actions.ActOnFriendFunctionDecl(getCurScope(), DeclaratorInfo, 2261 TemplateParams); 2262 } else { 2263 ThisDecl = Actions.ActOnCXXMemberDeclarator(getCurScope(), AS, 2264 DeclaratorInfo, 2265 TemplateParams, 2266 BitfieldSize.release(), 2267 VS, HasInClassInit); 2268 2269 if (VarTemplateDecl *VT = 2270 ThisDecl ? dyn_cast<VarTemplateDecl>(ThisDecl) : 0) 2271 // Re-direct this decl to refer to the templated decl so that we can 2272 // initialize it. 2273 ThisDecl = VT->getTemplatedDecl(); 2274 2275 if (ThisDecl && AccessAttrs) 2276 Actions.ProcessDeclAttributeList(getCurScope(), ThisDecl, AccessAttrs, 2277 false, true); 2278 } 2279 2280 // Handle the initializer. 2281 if (HasInClassInit != ICIS_NoInit && 2282 DeclaratorInfo.getDeclSpec().getStorageClassSpec() != 2283 DeclSpec::SCS_static) { 2284 // The initializer was deferred; parse it and cache the tokens. 2285 Diag(Tok, getLangOpts().CPlusPlus11 2286 ? diag::warn_cxx98_compat_nonstatic_member_init 2287 : diag::ext_nonstatic_member_init); 2288 2289 if (DeclaratorInfo.isArrayOfUnknownBound()) { 2290 // C++11 [dcl.array]p3: An array bound may also be omitted when the 2291 // declarator is followed by an initializer. 2292 // 2293 // A brace-or-equal-initializer for a member-declarator is not an 2294 // initializer in the grammar, so this is ill-formed. 2295 Diag(Tok, diag::err_incomplete_array_member_init); 2296 SkipUntil(tok::comma, true, true); 2297 2298 // Avoid later warnings about a class member of incomplete type. 2299 if (ThisDecl) 2300 ThisDecl->setInvalidDecl(); 2301 } else 2302 ParseCXXNonStaticMemberInitializer(ThisDecl); 2303 } else if (HasInitializer) { 2304 // Normal initializer. 2305 if (!Init.isUsable()) 2306 Init = ParseCXXMemberInitializer( 2307 ThisDecl, DeclaratorInfo.isDeclarationOfFunction(), EqualLoc); 2308 2309 if (Init.isInvalid()) 2310 SkipUntil(tok::comma, true, true); 2311 else if (ThisDecl) 2312 Actions.AddInitializerToDecl(ThisDecl, Init.get(), EqualLoc.isInvalid(), 2313 DS.containsPlaceholderType()); 2314 } else if (ThisDecl && DS.getStorageClassSpec() == DeclSpec::SCS_static) 2315 // No initializer. 2316 Actions.ActOnUninitializedDecl(ThisDecl, DS.containsPlaceholderType()); 2317 2318 if (ThisDecl) { 2319 if (!ThisDecl->isInvalidDecl()) { 2320 // Set the Decl for any late parsed attributes 2321 for (unsigned i = 0, ni = CommonLateParsedAttrs.size(); i < ni; ++i) 2322 CommonLateParsedAttrs[i]->addDecl(ThisDecl); 2323 2324 for (unsigned i = 0, ni = LateParsedAttrs.size(); i < ni; ++i) 2325 LateParsedAttrs[i]->addDecl(ThisDecl); 2326 } 2327 Actions.FinalizeDeclaration(ThisDecl); 2328 DeclsInGroup.push_back(ThisDecl); 2329 2330 if (DeclaratorInfo.isFunctionDeclarator() && 2331 DeclaratorInfo.getDeclSpec().getStorageClassSpec() != 2332 DeclSpec::SCS_typedef) 2333 HandleMemberFunctionDeclDelays(DeclaratorInfo, ThisDecl); 2334 } 2335 LateParsedAttrs.clear(); 2336 2337 DeclaratorInfo.complete(ThisDecl); 2338 2339 // If we don't have a comma, it is either the end of the list (a ';') 2340 // or an error, bail out. 2341 if (Tok.isNot(tok::comma)) 2342 break; 2343 2344 // Consume the comma. 2345 SourceLocation CommaLoc = ConsumeToken(); 2346 2347 if (Tok.isAtStartOfLine() && 2348 !MightBeDeclarator(Declarator::MemberContext)) { 2349 // This comma was followed by a line-break and something which can't be 2350 // the start of a declarator. The comma was probably a typo for a 2351 // semicolon. 2352 Diag(CommaLoc, diag::err_expected_semi_declaration) 2353 << FixItHint::CreateReplacement(CommaLoc, ";"); 2354 ExpectSemi = false; 2355 break; 2356 } 2357 2358 // Parse the next declarator. 2359 DeclaratorInfo.clear(); 2360 VS.clear(); 2361 BitfieldSize = true; 2362 Init = true; 2363 HasInitializer = false; 2364 DeclaratorInfo.setCommaLoc(CommaLoc); 2365 2366 // Attributes are only allowed on the second declarator. 2367 MaybeParseGNUAttributes(DeclaratorInfo); 2368 2369 if (Tok.isNot(tok::colon)) 2370 ParseDeclarator(DeclaratorInfo); 2371 } 2372 2373 if (ExpectSemi && 2374 ExpectAndConsume(tok::semi, diag::err_expected_semi_decl_list)) { 2375 // Skip to end of block or statement. 2376 SkipUntil(tok::r_brace, true, true); 2377 // If we stopped at a ';', eat it. 2378 if (Tok.is(tok::semi)) ConsumeToken(); 2379 return; 2380 } 2381 2382 Actions.FinalizeDeclaratorGroup(getCurScope(), DS, DeclsInGroup); 2383 } 2384 2385 /// ParseCXXMemberInitializer - Parse the brace-or-equal-initializer or 2386 /// pure-specifier. Also detect and reject any attempted defaulted/deleted 2387 /// function definition. The location of the '=', if any, will be placed in 2388 /// EqualLoc. 2389 /// 2390 /// pure-specifier: 2391 /// '= 0' 2392 /// 2393 /// brace-or-equal-initializer: 2394 /// '=' initializer-expression 2395 /// braced-init-list 2396 /// 2397 /// initializer-clause: 2398 /// assignment-expression 2399 /// braced-init-list 2400 /// 2401 /// defaulted/deleted function-definition: 2402 /// '=' 'default' 2403 /// '=' 'delete' 2404 /// 2405 /// Prior to C++0x, the assignment-expression in an initializer-clause must 2406 /// be a constant-expression. 2407 ExprResult Parser::ParseCXXMemberInitializer(Decl *D, bool IsFunction, 2408 SourceLocation &EqualLoc) { 2409 assert((Tok.is(tok::equal) || Tok.is(tok::l_brace)) 2410 && "Data member initializer not starting with '=' or '{'"); 2411 2412 EnterExpressionEvaluationContext Context(Actions, 2413 Sema::PotentiallyEvaluated, 2414 D); 2415 if (Tok.is(tok::equal)) { 2416 EqualLoc = ConsumeToken(); 2417 if (Tok.is(tok::kw_delete)) { 2418 // In principle, an initializer of '= delete p;' is legal, but it will 2419 // never type-check. It's better to diagnose it as an ill-formed expression 2420 // than as an ill-formed deleted non-function member. 2421 // An initializer of '= delete p, foo' will never be parsed, because 2422 // a top-level comma always ends the initializer expression. 2423 const Token &Next = NextToken(); 2424 if (IsFunction || Next.is(tok::semi) || Next.is(tok::comma) || 2425 Next.is(tok::eof)) { 2426 if (IsFunction) 2427 Diag(ConsumeToken(), diag::err_default_delete_in_multiple_declaration) 2428 << 1 /* delete */; 2429 else 2430 Diag(ConsumeToken(), diag::err_deleted_non_function); 2431 return ExprResult(); 2432 } 2433 } else if (Tok.is(tok::kw_default)) { 2434 if (IsFunction) 2435 Diag(Tok, diag::err_default_delete_in_multiple_declaration) 2436 << 0 /* default */; 2437 else 2438 Diag(ConsumeToken(), diag::err_default_special_members); 2439 return ExprResult(); 2440 } 2441 2442 } 2443 return ParseInitializer(); 2444 } 2445 2446 /// ParseCXXMemberSpecification - Parse the class definition. 2447 /// 2448 /// member-specification: 2449 /// member-declaration member-specification[opt] 2450 /// access-specifier ':' member-specification[opt] 2451 /// 2452 void Parser::ParseCXXMemberSpecification(SourceLocation RecordLoc, 2453 SourceLocation AttrFixitLoc, 2454 ParsedAttributesWithRange &Attrs, 2455 unsigned TagType, Decl *TagDecl) { 2456 assert((TagType == DeclSpec::TST_struct || 2457 TagType == DeclSpec::TST_interface || 2458 TagType == DeclSpec::TST_union || 2459 TagType == DeclSpec::TST_class) && "Invalid TagType!"); 2460 2461 PrettyDeclStackTraceEntry CrashInfo(Actions, TagDecl, RecordLoc, 2462 "parsing struct/union/class body"); 2463 2464 // Determine whether this is a non-nested class. Note that local 2465 // classes are *not* considered to be nested classes. 2466 bool NonNestedClass = true; 2467 if (!ClassStack.empty()) { 2468 for (const Scope *S = getCurScope(); S; S = S->getParent()) { 2469 if (S->isClassScope()) { 2470 // We're inside a class scope, so this is a nested class. 2471 NonNestedClass = false; 2472 2473 // The Microsoft extension __interface does not permit nested classes. 2474 if (getCurrentClass().IsInterface) { 2475 Diag(RecordLoc, diag::err_invalid_member_in_interface) 2476 << /*ErrorType=*/6 2477 << (isa<NamedDecl>(TagDecl) 2478 ? cast<NamedDecl>(TagDecl)->getQualifiedNameAsString() 2479 : "<anonymous>"); 2480 } 2481 break; 2482 } 2483 2484 if ((S->getFlags() & Scope::FnScope)) { 2485 // If we're in a function or function template declared in the 2486 // body of a class, then this is a local class rather than a 2487 // nested class. 2488 const Scope *Parent = S->getParent(); 2489 if (Parent->isTemplateParamScope()) 2490 Parent = Parent->getParent(); 2491 if (Parent->isClassScope()) 2492 break; 2493 } 2494 } 2495 } 2496 2497 // Enter a scope for the class. 2498 ParseScope ClassScope(this, Scope::ClassScope|Scope::DeclScope); 2499 2500 // Note that we are parsing a new (potentially-nested) class definition. 2501 ParsingClassDefinition ParsingDef(*this, TagDecl, NonNestedClass, 2502 TagType == DeclSpec::TST_interface); 2503 2504 if (TagDecl) 2505 Actions.ActOnTagStartDefinition(getCurScope(), TagDecl); 2506 2507 SourceLocation FinalLoc; 2508 2509 // Parse the optional 'final' keyword. 2510 if (getLangOpts().CPlusPlus && Tok.is(tok::identifier)) { 2511 assert(isCXX11FinalKeyword() && "not a class definition"); 2512 FinalLoc = ConsumeToken(); 2513 2514 if (TagType == DeclSpec::TST_interface) { 2515 Diag(FinalLoc, diag::err_override_control_interface) 2516 << "final"; 2517 } else { 2518 Diag(FinalLoc, getLangOpts().CPlusPlus11 ? 2519 diag::warn_cxx98_compat_override_control_keyword : 2520 diag::ext_override_control_keyword) << "final"; 2521 } 2522 2523 // Parse any C++11 attributes after 'final' keyword. 2524 // These attributes are not allowed to appear here, 2525 // and the only possible place for them to appertain 2526 // to the class would be between class-key and class-name. 2527 CheckMisplacedCXX11Attribute(Attrs, AttrFixitLoc); 2528 } 2529 2530 if (Tok.is(tok::colon)) { 2531 ParseBaseClause(TagDecl); 2532 2533 if (!Tok.is(tok::l_brace)) { 2534 Diag(Tok, diag::err_expected_lbrace_after_base_specifiers); 2535 2536 if (TagDecl) 2537 Actions.ActOnTagDefinitionError(getCurScope(), TagDecl); 2538 return; 2539 } 2540 } 2541 2542 assert(Tok.is(tok::l_brace)); 2543 BalancedDelimiterTracker T(*this, tok::l_brace); 2544 T.consumeOpen(); 2545 2546 if (TagDecl) 2547 Actions.ActOnStartCXXMemberDeclarations(getCurScope(), TagDecl, FinalLoc, 2548 T.getOpenLocation()); 2549 2550 // C++ 11p3: Members of a class defined with the keyword class are private 2551 // by default. Members of a class defined with the keywords struct or union 2552 // are public by default. 2553 AccessSpecifier CurAS; 2554 if (TagType == DeclSpec::TST_class) 2555 CurAS = AS_private; 2556 else 2557 CurAS = AS_public; 2558 ParsedAttributes AccessAttrs(AttrFactory); 2559 2560 if (TagDecl) { 2561 // While we still have something to read, read the member-declarations. 2562 while (Tok.isNot(tok::r_brace) && Tok.isNot(tok::eof)) { 2563 // Each iteration of this loop reads one member-declaration. 2564 2565 if (getLangOpts().MicrosoftExt && (Tok.is(tok::kw___if_exists) || 2566 Tok.is(tok::kw___if_not_exists))) { 2567 ParseMicrosoftIfExistsClassDeclaration((DeclSpec::TST)TagType, CurAS); 2568 continue; 2569 } 2570 2571 // Check for extraneous top-level semicolon. 2572 if (Tok.is(tok::semi)) { 2573 ConsumeExtraSemi(InsideStruct, TagType); 2574 continue; 2575 } 2576 2577 if (Tok.is(tok::annot_pragma_vis)) { 2578 HandlePragmaVisibility(); 2579 continue; 2580 } 2581 2582 if (Tok.is(tok::annot_pragma_pack)) { 2583 HandlePragmaPack(); 2584 continue; 2585 } 2586 2587 if (Tok.is(tok::annot_pragma_align)) { 2588 HandlePragmaAlign(); 2589 continue; 2590 } 2591 2592 if (Tok.is(tok::annot_pragma_openmp)) { 2593 ParseOpenMPDeclarativeDirective(); 2594 continue; 2595 } 2596 2597 AccessSpecifier AS = getAccessSpecifierIfPresent(); 2598 if (AS != AS_none) { 2599 // Current token is a C++ access specifier. 2600 CurAS = AS; 2601 SourceLocation ASLoc = Tok.getLocation(); 2602 unsigned TokLength = Tok.getLength(); 2603 ConsumeToken(); 2604 AccessAttrs.clear(); 2605 MaybeParseGNUAttributes(AccessAttrs); 2606 2607 SourceLocation EndLoc; 2608 if (Tok.is(tok::colon)) { 2609 EndLoc = Tok.getLocation(); 2610 ConsumeToken(); 2611 } else if (Tok.is(tok::semi)) { 2612 EndLoc = Tok.getLocation(); 2613 ConsumeToken(); 2614 Diag(EndLoc, diag::err_expected_colon) 2615 << FixItHint::CreateReplacement(EndLoc, ":"); 2616 } else { 2617 EndLoc = ASLoc.getLocWithOffset(TokLength); 2618 Diag(EndLoc, diag::err_expected_colon) 2619 << FixItHint::CreateInsertion(EndLoc, ":"); 2620 } 2621 2622 // The Microsoft extension __interface does not permit non-public 2623 // access specifiers. 2624 if (TagType == DeclSpec::TST_interface && CurAS != AS_public) { 2625 Diag(ASLoc, diag::err_access_specifier_interface) 2626 << (CurAS == AS_protected); 2627 } 2628 2629 if (Actions.ActOnAccessSpecifier(AS, ASLoc, EndLoc, 2630 AccessAttrs.getList())) { 2631 // found another attribute than only annotations 2632 AccessAttrs.clear(); 2633 } 2634 2635 continue; 2636 } 2637 2638 // FIXME: Make sure we don't have a template here. 2639 2640 // Parse all the comma separated declarators. 2641 ParseCXXClassMemberDeclaration(CurAS, AccessAttrs.getList()); 2642 } 2643 2644 T.consumeClose(); 2645 } else { 2646 SkipUntil(tok::r_brace, false, false); 2647 } 2648 2649 // If attributes exist after class contents, parse them. 2650 ParsedAttributes attrs(AttrFactory); 2651 MaybeParseGNUAttributes(attrs); 2652 2653 if (TagDecl) 2654 Actions.ActOnFinishCXXMemberSpecification(getCurScope(), RecordLoc, TagDecl, 2655 T.getOpenLocation(), 2656 T.getCloseLocation(), 2657 attrs.getList()); 2658 2659 // C++11 [class.mem]p2: 2660 // Within the class member-specification, the class is regarded as complete 2661 // within function bodies, default arguments, and 2662 // brace-or-equal-initializers for non-static data members (including such 2663 // things in nested classes). 2664 if (TagDecl && NonNestedClass) { 2665 // We are not inside a nested class. This class and its nested classes 2666 // are complete and we can parse the delayed portions of method 2667 // declarations and the lexed inline method definitions, along with any 2668 // delayed attributes. 2669 SourceLocation SavedPrevTokLocation = PrevTokLocation; 2670 ParseLexedAttributes(getCurrentClass()); 2671 ParseLexedMethodDeclarations(getCurrentClass()); 2672 2673 // We've finished with all pending member declarations. 2674 Actions.ActOnFinishCXXMemberDecls(); 2675 2676 ParseLexedMemberInitializers(getCurrentClass()); 2677 ParseLexedMethodDefs(getCurrentClass()); 2678 PrevTokLocation = SavedPrevTokLocation; 2679 } 2680 2681 if (TagDecl) 2682 Actions.ActOnTagFinishDefinition(getCurScope(), TagDecl, 2683 T.getCloseLocation()); 2684 2685 // Leave the class scope. 2686 ParsingDef.Pop(); 2687 ClassScope.Exit(); 2688 } 2689 2690 /// ParseConstructorInitializer - Parse a C++ constructor initializer, 2691 /// which explicitly initializes the members or base classes of a 2692 /// class (C++ [class.base.init]). For example, the three initializers 2693 /// after the ':' in the Derived constructor below: 2694 /// 2695 /// @code 2696 /// class Base { }; 2697 /// class Derived : Base { 2698 /// int x; 2699 /// float f; 2700 /// public: 2701 /// Derived(float f) : Base(), x(17), f(f) { } 2702 /// }; 2703 /// @endcode 2704 /// 2705 /// [C++] ctor-initializer: 2706 /// ':' mem-initializer-list 2707 /// 2708 /// [C++] mem-initializer-list: 2709 /// mem-initializer ...[opt] 2710 /// mem-initializer ...[opt] , mem-initializer-list 2711 void Parser::ParseConstructorInitializer(Decl *ConstructorDecl) { 2712 assert(Tok.is(tok::colon) && "Constructor initializer always starts with ':'"); 2713 2714 // Poison the SEH identifiers so they are flagged as illegal in constructor initializers 2715 PoisonSEHIdentifiersRAIIObject PoisonSEHIdentifiers(*this, true); 2716 SourceLocation ColonLoc = ConsumeToken(); 2717 2718 SmallVector<CXXCtorInitializer*, 4> MemInitializers; 2719 bool AnyErrors = false; 2720 2721 do { 2722 if (Tok.is(tok::code_completion)) { 2723 Actions.CodeCompleteConstructorInitializer(ConstructorDecl, 2724 MemInitializers); 2725 return cutOffParsing(); 2726 } else { 2727 MemInitResult MemInit = ParseMemInitializer(ConstructorDecl); 2728 if (!MemInit.isInvalid()) 2729 MemInitializers.push_back(MemInit.get()); 2730 else 2731 AnyErrors = true; 2732 } 2733 2734 if (Tok.is(tok::comma)) 2735 ConsumeToken(); 2736 else if (Tok.is(tok::l_brace)) 2737 break; 2738 // If the next token looks like a base or member initializer, assume that 2739 // we're just missing a comma. 2740 else if (Tok.is(tok::identifier) || Tok.is(tok::coloncolon)) { 2741 SourceLocation Loc = PP.getLocForEndOfToken(PrevTokLocation); 2742 Diag(Loc, diag::err_ctor_init_missing_comma) 2743 << FixItHint::CreateInsertion(Loc, ", "); 2744 } else { 2745 // Skip over garbage, until we get to '{'. Don't eat the '{'. 2746 Diag(Tok.getLocation(), diag::err_expected_lbrace_or_comma); 2747 SkipUntil(tok::l_brace, true, true); 2748 break; 2749 } 2750 } while (true); 2751 2752 Actions.ActOnMemInitializers(ConstructorDecl, ColonLoc, MemInitializers, 2753 AnyErrors); 2754 } 2755 2756 /// ParseMemInitializer - Parse a C++ member initializer, which is 2757 /// part of a constructor initializer that explicitly initializes one 2758 /// member or base class (C++ [class.base.init]). See 2759 /// ParseConstructorInitializer for an example. 2760 /// 2761 /// [C++] mem-initializer: 2762 /// mem-initializer-id '(' expression-list[opt] ')' 2763 /// [C++0x] mem-initializer-id braced-init-list 2764 /// 2765 /// [C++] mem-initializer-id: 2766 /// '::'[opt] nested-name-specifier[opt] class-name 2767 /// identifier 2768 Parser::MemInitResult Parser::ParseMemInitializer(Decl *ConstructorDecl) { 2769 // parse '::'[opt] nested-name-specifier[opt] 2770 CXXScopeSpec SS; 2771 ParseOptionalCXXScopeSpecifier(SS, ParsedType(), /*EnteringContext=*/false); 2772 ParsedType TemplateTypeTy; 2773 if (Tok.is(tok::annot_template_id)) { 2774 TemplateIdAnnotation *TemplateId = takeTemplateIdAnnotation(Tok); 2775 if (TemplateId->Kind == TNK_Type_template || 2776 TemplateId->Kind == TNK_Dependent_template_name) { 2777 AnnotateTemplateIdTokenAsType(); 2778 assert(Tok.is(tok::annot_typename) && "template-id -> type failed"); 2779 TemplateTypeTy = getTypeAnnotation(Tok); 2780 } 2781 } 2782 // Uses of decltype will already have been converted to annot_decltype by 2783 // ParseOptionalCXXScopeSpecifier at this point. 2784 if (!TemplateTypeTy && Tok.isNot(tok::identifier) 2785 && Tok.isNot(tok::annot_decltype)) { 2786 Diag(Tok, diag::err_expected_member_or_base_name); 2787 return true; 2788 } 2789 2790 IdentifierInfo *II = 0; 2791 DeclSpec DS(AttrFactory); 2792 SourceLocation IdLoc = Tok.getLocation(); 2793 if (Tok.is(tok::annot_decltype)) { 2794 // Get the decltype expression, if there is one. 2795 ParseDecltypeSpecifier(DS); 2796 } else { 2797 if (Tok.is(tok::identifier)) 2798 // Get the identifier. This may be a member name or a class name, 2799 // but we'll let the semantic analysis determine which it is. 2800 II = Tok.getIdentifierInfo(); 2801 ConsumeToken(); 2802 } 2803 2804 2805 // Parse the '('. 2806 if (getLangOpts().CPlusPlus11 && Tok.is(tok::l_brace)) { 2807 Diag(Tok, diag::warn_cxx98_compat_generalized_initializer_lists); 2808 2809 ExprResult InitList = ParseBraceInitializer(); 2810 if (InitList.isInvalid()) 2811 return true; 2812 2813 SourceLocation EllipsisLoc; 2814 if (Tok.is(tok::ellipsis)) 2815 EllipsisLoc = ConsumeToken(); 2816 2817 return Actions.ActOnMemInitializer(ConstructorDecl, getCurScope(), SS, II, 2818 TemplateTypeTy, DS, IdLoc, 2819 InitList.take(), EllipsisLoc); 2820 } else if(Tok.is(tok::l_paren)) { 2821 BalancedDelimiterTracker T(*this, tok::l_paren); 2822 T.consumeOpen(); 2823 2824 // Parse the optional expression-list. 2825 ExprVector ArgExprs; 2826 CommaLocsTy CommaLocs; 2827 if (Tok.isNot(tok::r_paren) && ParseExpressionList(ArgExprs, CommaLocs)) { 2828 SkipUntil(tok::r_paren); 2829 return true; 2830 } 2831 2832 T.consumeClose(); 2833 2834 SourceLocation EllipsisLoc; 2835 if (Tok.is(tok::ellipsis)) 2836 EllipsisLoc = ConsumeToken(); 2837 2838 return Actions.ActOnMemInitializer(ConstructorDecl, getCurScope(), SS, II, 2839 TemplateTypeTy, DS, IdLoc, 2840 T.getOpenLocation(), ArgExprs, 2841 T.getCloseLocation(), EllipsisLoc); 2842 } 2843 2844 Diag(Tok, getLangOpts().CPlusPlus11 ? diag::err_expected_lparen_or_lbrace 2845 : diag::err_expected_lparen); 2846 return true; 2847 } 2848 2849 /// \brief Parse a C++ exception-specification if present (C++0x [except.spec]). 2850 /// 2851 /// exception-specification: 2852 /// dynamic-exception-specification 2853 /// noexcept-specification 2854 /// 2855 /// noexcept-specification: 2856 /// 'noexcept' 2857 /// 'noexcept' '(' constant-expression ')' 2858 ExceptionSpecificationType 2859 Parser::tryParseExceptionSpecification( 2860 SourceRange &SpecificationRange, 2861 SmallVectorImpl<ParsedType> &DynamicExceptions, 2862 SmallVectorImpl<SourceRange> &DynamicExceptionRanges, 2863 ExprResult &NoexceptExpr) { 2864 ExceptionSpecificationType Result = EST_None; 2865 2866 // See if there's a dynamic specification. 2867 if (Tok.is(tok::kw_throw)) { 2868 Result = ParseDynamicExceptionSpecification(SpecificationRange, 2869 DynamicExceptions, 2870 DynamicExceptionRanges); 2871 assert(DynamicExceptions.size() == DynamicExceptionRanges.size() && 2872 "Produced different number of exception types and ranges."); 2873 } 2874 2875 // If there's no noexcept specification, we're done. 2876 if (Tok.isNot(tok::kw_noexcept)) 2877 return Result; 2878 2879 Diag(Tok, diag::warn_cxx98_compat_noexcept_decl); 2880 2881 // If we already had a dynamic specification, parse the noexcept for, 2882 // recovery, but emit a diagnostic and don't store the results. 2883 SourceRange NoexceptRange; 2884 ExceptionSpecificationType NoexceptType = EST_None; 2885 2886 SourceLocation KeywordLoc = ConsumeToken(); 2887 if (Tok.is(tok::l_paren)) { 2888 // There is an argument. 2889 BalancedDelimiterTracker T(*this, tok::l_paren); 2890 T.consumeOpen(); 2891 NoexceptType = EST_ComputedNoexcept; 2892 NoexceptExpr = ParseConstantExpression(); 2893 // The argument must be contextually convertible to bool. We use 2894 // ActOnBooleanCondition for this purpose. 2895 if (!NoexceptExpr.isInvalid()) 2896 NoexceptExpr = Actions.ActOnBooleanCondition(getCurScope(), KeywordLoc, 2897 NoexceptExpr.get()); 2898 T.consumeClose(); 2899 NoexceptRange = SourceRange(KeywordLoc, T.getCloseLocation()); 2900 } else { 2901 // There is no argument. 2902 NoexceptType = EST_BasicNoexcept; 2903 NoexceptRange = SourceRange(KeywordLoc, KeywordLoc); 2904 } 2905 2906 if (Result == EST_None) { 2907 SpecificationRange = NoexceptRange; 2908 Result = NoexceptType; 2909 2910 // If there's a dynamic specification after a noexcept specification, 2911 // parse that and ignore the results. 2912 if (Tok.is(tok::kw_throw)) { 2913 Diag(Tok.getLocation(), diag::err_dynamic_and_noexcept_specification); 2914 ParseDynamicExceptionSpecification(NoexceptRange, DynamicExceptions, 2915 DynamicExceptionRanges); 2916 } 2917 } else { 2918 Diag(Tok.getLocation(), diag::err_dynamic_and_noexcept_specification); 2919 } 2920 2921 return Result; 2922 } 2923 2924 static void diagnoseDynamicExceptionSpecification( 2925 Parser &P, const SourceRange &Range, bool IsNoexcept) { 2926 if (P.getLangOpts().CPlusPlus11) { 2927 const char *Replacement = IsNoexcept ? "noexcept" : "noexcept(false)"; 2928 P.Diag(Range.getBegin(), diag::warn_exception_spec_deprecated) << Range; 2929 P.Diag(Range.getBegin(), diag::note_exception_spec_deprecated) 2930 << Replacement << FixItHint::CreateReplacement(Range, Replacement); 2931 } 2932 } 2933 2934 /// ParseDynamicExceptionSpecification - Parse a C++ 2935 /// dynamic-exception-specification (C++ [except.spec]). 2936 /// 2937 /// dynamic-exception-specification: 2938 /// 'throw' '(' type-id-list [opt] ')' 2939 /// [MS] 'throw' '(' '...' ')' 2940 /// 2941 /// type-id-list: 2942 /// type-id ... [opt] 2943 /// type-id-list ',' type-id ... [opt] 2944 /// 2945 ExceptionSpecificationType Parser::ParseDynamicExceptionSpecification( 2946 SourceRange &SpecificationRange, 2947 SmallVectorImpl<ParsedType> &Exceptions, 2948 SmallVectorImpl<SourceRange> &Ranges) { 2949 assert(Tok.is(tok::kw_throw) && "expected throw"); 2950 2951 SpecificationRange.setBegin(ConsumeToken()); 2952 BalancedDelimiterTracker T(*this, tok::l_paren); 2953 if (T.consumeOpen()) { 2954 Diag(Tok, diag::err_expected_lparen_after) << "throw"; 2955 SpecificationRange.setEnd(SpecificationRange.getBegin()); 2956 return EST_DynamicNone; 2957 } 2958 2959 // Parse throw(...), a Microsoft extension that means "this function 2960 // can throw anything". 2961 if (Tok.is(tok::ellipsis)) { 2962 SourceLocation EllipsisLoc = ConsumeToken(); 2963 if (!getLangOpts().MicrosoftExt) 2964 Diag(EllipsisLoc, diag::ext_ellipsis_exception_spec); 2965 T.consumeClose(); 2966 SpecificationRange.setEnd(T.getCloseLocation()); 2967 diagnoseDynamicExceptionSpecification(*this, SpecificationRange, false); 2968 return EST_MSAny; 2969 } 2970 2971 // Parse the sequence of type-ids. 2972 SourceRange Range; 2973 while (Tok.isNot(tok::r_paren)) { 2974 TypeResult Res(ParseTypeName(&Range)); 2975 2976 if (Tok.is(tok::ellipsis)) { 2977 // C++0x [temp.variadic]p5: 2978 // - In a dynamic-exception-specification (15.4); the pattern is a 2979 // type-id. 2980 SourceLocation Ellipsis = ConsumeToken(); 2981 Range.setEnd(Ellipsis); 2982 if (!Res.isInvalid()) 2983 Res = Actions.ActOnPackExpansion(Res.get(), Ellipsis); 2984 } 2985 2986 if (!Res.isInvalid()) { 2987 Exceptions.push_back(Res.get()); 2988 Ranges.push_back(Range); 2989 } 2990 2991 if (Tok.is(tok::comma)) 2992 ConsumeToken(); 2993 else 2994 break; 2995 } 2996 2997 T.consumeClose(); 2998 SpecificationRange.setEnd(T.getCloseLocation()); 2999 diagnoseDynamicExceptionSpecification(*this, SpecificationRange, 3000 Exceptions.empty()); 3001 return Exceptions.empty() ? EST_DynamicNone : EST_Dynamic; 3002 } 3003 3004 /// ParseTrailingReturnType - Parse a trailing return type on a new-style 3005 /// function declaration. 3006 TypeResult Parser::ParseTrailingReturnType(SourceRange &Range) { 3007 assert(Tok.is(tok::arrow) && "expected arrow"); 3008 3009 ConsumeToken(); 3010 3011 return ParseTypeName(&Range, Declarator::TrailingReturnContext); 3012 } 3013 3014 /// \brief We have just started parsing the definition of a new class, 3015 /// so push that class onto our stack of classes that is currently 3016 /// being parsed. 3017 Sema::ParsingClassState 3018 Parser::PushParsingClass(Decl *ClassDecl, bool NonNestedClass, 3019 bool IsInterface) { 3020 assert((NonNestedClass || !ClassStack.empty()) && 3021 "Nested class without outer class"); 3022 ClassStack.push(new ParsingClass(ClassDecl, NonNestedClass, IsInterface)); 3023 return Actions.PushParsingClass(); 3024 } 3025 3026 /// \brief Deallocate the given parsed class and all of its nested 3027 /// classes. 3028 void Parser::DeallocateParsedClasses(Parser::ParsingClass *Class) { 3029 for (unsigned I = 0, N = Class->LateParsedDeclarations.size(); I != N; ++I) 3030 delete Class->LateParsedDeclarations[I]; 3031 delete Class; 3032 } 3033 3034 /// \brief Pop the top class of the stack of classes that are 3035 /// currently being parsed. 3036 /// 3037 /// This routine should be called when we have finished parsing the 3038 /// definition of a class, but have not yet popped the Scope 3039 /// associated with the class's definition. 3040 void Parser::PopParsingClass(Sema::ParsingClassState state) { 3041 assert(!ClassStack.empty() && "Mismatched push/pop for class parsing"); 3042 3043 Actions.PopParsingClass(state); 3044 3045 ParsingClass *Victim = ClassStack.top(); 3046 ClassStack.pop(); 3047 if (Victim->TopLevelClass) { 3048 // Deallocate all of the nested classes of this class, 3049 // recursively: we don't need to keep any of this information. 3050 DeallocateParsedClasses(Victim); 3051 return; 3052 } 3053 assert(!ClassStack.empty() && "Missing top-level class?"); 3054 3055 if (Victim->LateParsedDeclarations.empty()) { 3056 // The victim is a nested class, but we will not need to perform 3057 // any processing after the definition of this class since it has 3058 // no members whose handling was delayed. Therefore, we can just 3059 // remove this nested class. 3060 DeallocateParsedClasses(Victim); 3061 return; 3062 } 3063 3064 // This nested class has some members that will need to be processed 3065 // after the top-level class is completely defined. Therefore, add 3066 // it to the list of nested classes within its parent. 3067 assert(getCurScope()->isClassScope() && "Nested class outside of class scope?"); 3068 ClassStack.top()->LateParsedDeclarations.push_back(new LateParsedClass(this, Victim)); 3069 Victim->TemplateScope = getCurScope()->getParent()->isTemplateParamScope(); 3070 } 3071 3072 /// \brief Try to parse an 'identifier' which appears within an attribute-token. 3073 /// 3074 /// \return the parsed identifier on success, and 0 if the next token is not an 3075 /// attribute-token. 3076 /// 3077 /// C++11 [dcl.attr.grammar]p3: 3078 /// If a keyword or an alternative token that satisfies the syntactic 3079 /// requirements of an identifier is contained in an attribute-token, 3080 /// it is considered an identifier. 3081 IdentifierInfo *Parser::TryParseCXX11AttributeIdentifier(SourceLocation &Loc) { 3082 switch (Tok.getKind()) { 3083 default: 3084 // Identifiers and keywords have identifier info attached. 3085 if (IdentifierInfo *II = Tok.getIdentifierInfo()) { 3086 Loc = ConsumeToken(); 3087 return II; 3088 } 3089 return 0; 3090 3091 case tok::ampamp: // 'and' 3092 case tok::pipe: // 'bitor' 3093 case tok::pipepipe: // 'or' 3094 case tok::caret: // 'xor' 3095 case tok::tilde: // 'compl' 3096 case tok::amp: // 'bitand' 3097 case tok::ampequal: // 'and_eq' 3098 case tok::pipeequal: // 'or_eq' 3099 case tok::caretequal: // 'xor_eq' 3100 case tok::exclaim: // 'not' 3101 case tok::exclaimequal: // 'not_eq' 3102 // Alternative tokens do not have identifier info, but their spelling 3103 // starts with an alphabetical character. 3104 SmallString<8> SpellingBuf; 3105 StringRef Spelling = PP.getSpelling(Tok.getLocation(), SpellingBuf); 3106 if (isLetter(Spelling[0])) { 3107 Loc = ConsumeToken(); 3108 return &PP.getIdentifierTable().get(Spelling); 3109 } 3110 return 0; 3111 } 3112 } 3113 3114 static bool IsBuiltInOrStandardCXX11Attribute(IdentifierInfo *AttrName, 3115 IdentifierInfo *ScopeName) { 3116 switch (AttributeList::getKind(AttrName, ScopeName, 3117 AttributeList::AS_CXX11)) { 3118 case AttributeList::AT_CarriesDependency: 3119 case AttributeList::AT_FallThrough: 3120 case AttributeList::AT_CXX11NoReturn: { 3121 return true; 3122 } 3123 3124 default: 3125 return false; 3126 } 3127 } 3128 3129 /// ParseCXX11AttributeSpecifier - Parse a C++11 attribute-specifier. Currently 3130 /// only parses standard attributes. 3131 /// 3132 /// [C++11] attribute-specifier: 3133 /// '[' '[' attribute-list ']' ']' 3134 /// alignment-specifier 3135 /// 3136 /// [C++11] attribute-list: 3137 /// attribute[opt] 3138 /// attribute-list ',' attribute[opt] 3139 /// attribute '...' 3140 /// attribute-list ',' attribute '...' 3141 /// 3142 /// [C++11] attribute: 3143 /// attribute-token attribute-argument-clause[opt] 3144 /// 3145 /// [C++11] attribute-token: 3146 /// identifier 3147 /// attribute-scoped-token 3148 /// 3149 /// [C++11] attribute-scoped-token: 3150 /// attribute-namespace '::' identifier 3151 /// 3152 /// [C++11] attribute-namespace: 3153 /// identifier 3154 /// 3155 /// [C++11] attribute-argument-clause: 3156 /// '(' balanced-token-seq ')' 3157 /// 3158 /// [C++11] balanced-token-seq: 3159 /// balanced-token 3160 /// balanced-token-seq balanced-token 3161 /// 3162 /// [C++11] balanced-token: 3163 /// '(' balanced-token-seq ')' 3164 /// '[' balanced-token-seq ']' 3165 /// '{' balanced-token-seq '}' 3166 /// any token but '(', ')', '[', ']', '{', or '}' 3167 void Parser::ParseCXX11AttributeSpecifier(ParsedAttributes &attrs, 3168 SourceLocation *endLoc) { 3169 if (Tok.is(tok::kw_alignas)) { 3170 Diag(Tok.getLocation(), diag::warn_cxx98_compat_alignas); 3171 ParseAlignmentSpecifier(attrs, endLoc); 3172 return; 3173 } 3174 3175 assert(Tok.is(tok::l_square) && NextToken().is(tok::l_square) 3176 && "Not a C++11 attribute list"); 3177 3178 Diag(Tok.getLocation(), diag::warn_cxx98_compat_attribute); 3179 3180 ConsumeBracket(); 3181 ConsumeBracket(); 3182 3183 llvm::SmallDenseMap<IdentifierInfo*, SourceLocation, 4> SeenAttrs; 3184 3185 while (Tok.isNot(tok::r_square)) { 3186 // attribute not present 3187 if (Tok.is(tok::comma)) { 3188 ConsumeToken(); 3189 continue; 3190 } 3191 3192 SourceLocation ScopeLoc, AttrLoc; 3193 IdentifierInfo *ScopeName = 0, *AttrName = 0; 3194 3195 AttrName = TryParseCXX11AttributeIdentifier(AttrLoc); 3196 if (!AttrName) 3197 // Break out to the "expected ']'" diagnostic. 3198 break; 3199 3200 // scoped attribute 3201 if (Tok.is(tok::coloncolon)) { 3202 ConsumeToken(); 3203 3204 ScopeName = AttrName; 3205 ScopeLoc = AttrLoc; 3206 3207 AttrName = TryParseCXX11AttributeIdentifier(AttrLoc); 3208 if (!AttrName) { 3209 Diag(Tok.getLocation(), diag::err_expected_ident); 3210 SkipUntil(tok::r_square, tok::comma, true, true); 3211 continue; 3212 } 3213 } 3214 3215 bool StandardAttr = IsBuiltInOrStandardCXX11Attribute(AttrName,ScopeName); 3216 bool AttrParsed = false; 3217 3218 if (StandardAttr && 3219 !SeenAttrs.insert(std::make_pair(AttrName, AttrLoc)).second) 3220 Diag(AttrLoc, diag::err_cxx11_attribute_repeated) 3221 << AttrName << SourceRange(SeenAttrs[AttrName]); 3222 3223 // Parse attribute arguments 3224 if (Tok.is(tok::l_paren)) { 3225 if (ScopeName && ScopeName->getName() == "gnu") { 3226 ParseGNUAttributeArgs(AttrName, AttrLoc, attrs, endLoc, 3227 ScopeName, ScopeLoc, AttributeList::AS_CXX11); 3228 AttrParsed = true; 3229 } else { 3230 if (StandardAttr) 3231 Diag(Tok.getLocation(), diag::err_cxx11_attribute_forbids_arguments) 3232 << AttrName->getName(); 3233 3234 // FIXME: handle other formats of c++11 attribute arguments 3235 ConsumeParen(); 3236 SkipUntil(tok::r_paren, false); 3237 } 3238 } 3239 3240 if (!AttrParsed) 3241 attrs.addNew(AttrName, 3242 SourceRange(ScopeLoc.isValid() ? ScopeLoc : AttrLoc, 3243 AttrLoc), 3244 ScopeName, ScopeLoc, 0, 3245 SourceLocation(), 0, 0, AttributeList::AS_CXX11); 3246 3247 if (Tok.is(tok::ellipsis)) { 3248 ConsumeToken(); 3249 3250 Diag(Tok, diag::err_cxx11_attribute_forbids_ellipsis) 3251 << AttrName->getName(); 3252 } 3253 } 3254 3255 if (ExpectAndConsume(tok::r_square, diag::err_expected_rsquare)) 3256 SkipUntil(tok::r_square, false); 3257 if (endLoc) 3258 *endLoc = Tok.getLocation(); 3259 if (ExpectAndConsume(tok::r_square, diag::err_expected_rsquare)) 3260 SkipUntil(tok::r_square, false); 3261 } 3262 3263 /// ParseCXX11Attributes - Parse a C++11 attribute-specifier-seq. 3264 /// 3265 /// attribute-specifier-seq: 3266 /// attribute-specifier-seq[opt] attribute-specifier 3267 void Parser::ParseCXX11Attributes(ParsedAttributesWithRange &attrs, 3268 SourceLocation *endLoc) { 3269 assert(getLangOpts().CPlusPlus11); 3270 3271 SourceLocation StartLoc = Tok.getLocation(), Loc; 3272 if (!endLoc) 3273 endLoc = &Loc; 3274 3275 do { 3276 ParseCXX11AttributeSpecifier(attrs, endLoc); 3277 } while (isCXX11AttributeSpecifier()); 3278 3279 attrs.Range = SourceRange(StartLoc, *endLoc); 3280 } 3281 3282 /// ParseMicrosoftAttributes - Parse a Microsoft attribute [Attr] 3283 /// 3284 /// [MS] ms-attribute: 3285 /// '[' token-seq ']' 3286 /// 3287 /// [MS] ms-attribute-seq: 3288 /// ms-attribute[opt] 3289 /// ms-attribute ms-attribute-seq 3290 void Parser::ParseMicrosoftAttributes(ParsedAttributes &attrs, 3291 SourceLocation *endLoc) { 3292 assert(Tok.is(tok::l_square) && "Not a Microsoft attribute list"); 3293 3294 while (Tok.is(tok::l_square)) { 3295 // FIXME: If this is actually a C++11 attribute, parse it as one. 3296 ConsumeBracket(); 3297 SkipUntil(tok::r_square, true, true); 3298 if (endLoc) *endLoc = Tok.getLocation(); 3299 ExpectAndConsume(tok::r_square, diag::err_expected_rsquare); 3300 } 3301 } 3302 3303 void Parser::ParseMicrosoftIfExistsClassDeclaration(DeclSpec::TST TagType, 3304 AccessSpecifier& CurAS) { 3305 IfExistsCondition Result; 3306 if (ParseMicrosoftIfExistsCondition(Result)) 3307 return; 3308 3309 BalancedDelimiterTracker Braces(*this, tok::l_brace); 3310 if (Braces.consumeOpen()) { 3311 Diag(Tok, diag::err_expected_lbrace); 3312 return; 3313 } 3314 3315 switch (Result.Behavior) { 3316 case IEB_Parse: 3317 // Parse the declarations below. 3318 break; 3319 3320 case IEB_Dependent: 3321 Diag(Result.KeywordLoc, diag::warn_microsoft_dependent_exists) 3322 << Result.IsIfExists; 3323 // Fall through to skip. 3324 3325 case IEB_Skip: 3326 Braces.skipToEnd(); 3327 return; 3328 } 3329 3330 while (Tok.isNot(tok::r_brace) && Tok.isNot(tok::eof)) { 3331 // __if_exists, __if_not_exists can nest. 3332 if ((Tok.is(tok::kw___if_exists) || Tok.is(tok::kw___if_not_exists))) { 3333 ParseMicrosoftIfExistsClassDeclaration((DeclSpec::TST)TagType, CurAS); 3334 continue; 3335 } 3336 3337 // Check for extraneous top-level semicolon. 3338 if (Tok.is(tok::semi)) { 3339 ConsumeExtraSemi(InsideStruct, TagType); 3340 continue; 3341 } 3342 3343 AccessSpecifier AS = getAccessSpecifierIfPresent(); 3344 if (AS != AS_none) { 3345 // Current token is a C++ access specifier. 3346 CurAS = AS; 3347 SourceLocation ASLoc = Tok.getLocation(); 3348 ConsumeToken(); 3349 if (Tok.is(tok::colon)) 3350 Actions.ActOnAccessSpecifier(AS, ASLoc, Tok.getLocation()); 3351 else 3352 Diag(Tok, diag::err_expected_colon); 3353 ConsumeToken(); 3354 continue; 3355 } 3356 3357 // Parse all the comma separated declarators. 3358 ParseCXXClassMemberDeclaration(CurAS, 0); 3359 } 3360 3361 Braces.consumeClose(); 3362 } 3363