187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar//===--- ParseDeclCXX.cpp - C++ Declaration Parsing -------------*- C++ -*-===// 28f08cb7d0b97786b17ef05e05caa55aad4d6bd39Chris Lattner// 38f08cb7d0b97786b17ef05e05caa55aad4d6bd39Chris Lattner// The LLVM Compiler Infrastructure 48f08cb7d0b97786b17ef05e05caa55aad4d6bd39Chris Lattner// 50bc735ffcfb223c0186419547abaa5c84482663eChris Lattner// This file is distributed under the University of Illinois Open Source 60bc735ffcfb223c0186419547abaa5c84482663eChris Lattner// License. See LICENSE.TXT for details. 78f08cb7d0b97786b17ef05e05caa55aad4d6bd39Chris Lattner// 88f08cb7d0b97786b17ef05e05caa55aad4d6bd39Chris Lattner//===----------------------------------------------------------------------===// 98f08cb7d0b97786b17ef05e05caa55aad4d6bd39Chris Lattner// 108f08cb7d0b97786b17ef05e05caa55aad4d6bd39Chris Lattner// This file implements the C++ Declaration portions of the Parser interfaces. 118f08cb7d0b97786b17ef05e05caa55aad4d6bd39Chris Lattner// 128f08cb7d0b97786b17ef05e05caa55aad4d6bd39Chris Lattner//===----------------------------------------------------------------------===// 138f08cb7d0b97786b17ef05e05caa55aad4d6bd39Chris Lattner 141b7f89846f10681ce3cbe89ef5d60691d55bd918Douglas Gregor#include "clang/Parse/Parser.h" 1555fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "RAIIObjectsForParser.h" 16651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#include "clang/AST/ASTContext.h" 17651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#include "clang/AST/DeclTemplate.h" 18651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#include "clang/Basic/Attributes.h" 193f6f51e28231f65de9c2dd150a2d757b2162cfa3Jordan Rose#include "clang/Basic/CharInfo.h" 2055fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/Basic/OperatorKinds.h" 210e2c34f92f00628d48968dfea096d36381f494cbStephen Hines#include "clang/Basic/TargetInfo.h" 22500d3297d2a21edeac4d46cbcbe21bc2352c2a28Chris Lattner#include "clang/Parse/ParseDiagnostic.h" 2319510856727e0e14a3696b2a72c35163bff2a71fJohn McCall#include "clang/Sema/DeclSpec.h" 2419510856727e0e14a3696b2a72c35163bff2a71fJohn McCall#include "clang/Sema/ParsedTemplate.h" 25f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall#include "clang/Sema/PrettyDeclStackTrace.h" 2655fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/Sema/Scope.h" 27e402e72273cde2a64fa6097c1fe93f500038675dJohn McCall#include "clang/Sema/SemaDiagnostic.h" 288fe83e1df954d72c0f4ffc15d20a5222ec151c21Benjamin Kramer#include "llvm/ADT/SmallString.h" 2987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 308f08cb7d0b97786b17ef05e05caa55aad4d6bd39Chris Lattnerusing namespace clang; 318f08cb7d0b97786b17ef05e05caa55aad4d6bd39Chris Lattner 328f08cb7d0b97786b17ef05e05caa55aad4d6bd39Chris Lattner/// ParseNamespace - We know that the current token is a namespace keyword. This 33d078e641450bbc5a20df8d3b54f87b27e398acb3Sebastian Redl/// may either be a top level namespace or a block-level namespace alias. If 34d078e641450bbc5a20df8d3b54f87b27e398acb3Sebastian Redl/// there was an inline keyword, it has already been parsed. 358f08cb7d0b97786b17ef05e05caa55aad4d6bd39Chris Lattner/// 368f08cb7d0b97786b17ef05e05caa55aad4d6bd39Chris Lattner/// namespace-definition: [C++ 7.3: basic.namespace] 378f08cb7d0b97786b17ef05e05caa55aad4d6bd39Chris Lattner/// named-namespace-definition 388f08cb7d0b97786b17ef05e05caa55aad4d6bd39Chris Lattner/// unnamed-namespace-definition 398f08cb7d0b97786b17ef05e05caa55aad4d6bd39Chris Lattner/// 408f08cb7d0b97786b17ef05e05caa55aad4d6bd39Chris Lattner/// unnamed-namespace-definition: 41d078e641450bbc5a20df8d3b54f87b27e398acb3Sebastian Redl/// 'inline'[opt] 'namespace' attributes[opt] '{' namespace-body '}' 428f08cb7d0b97786b17ef05e05caa55aad4d6bd39Chris Lattner/// 438f08cb7d0b97786b17ef05e05caa55aad4d6bd39Chris Lattner/// named-namespace-definition: 448f08cb7d0b97786b17ef05e05caa55aad4d6bd39Chris Lattner/// original-namespace-definition 458f08cb7d0b97786b17ef05e05caa55aad4d6bd39Chris Lattner/// extension-namespace-definition 468f08cb7d0b97786b17ef05e05caa55aad4d6bd39Chris Lattner/// 478f08cb7d0b97786b17ef05e05caa55aad4d6bd39Chris Lattner/// original-namespace-definition: 48d078e641450bbc5a20df8d3b54f87b27e398acb3Sebastian Redl/// 'inline'[opt] 'namespace' identifier attributes[opt] 49d078e641450bbc5a20df8d3b54f87b27e398acb3Sebastian Redl/// '{' namespace-body '}' 508f08cb7d0b97786b17ef05e05caa55aad4d6bd39Chris Lattner/// 518f08cb7d0b97786b17ef05e05caa55aad4d6bd39Chris Lattner/// extension-namespace-definition: 52d078e641450bbc5a20df8d3b54f87b27e398acb3Sebastian Redl/// 'inline'[opt] 'namespace' original-namespace-name 53d078e641450bbc5a20df8d3b54f87b27e398acb3Sebastian Redl/// '{' namespace-body '}' 541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// 558f08cb7d0b97786b17ef05e05caa55aad4d6bd39Chris Lattner/// namespace-alias-definition: [C++ 7.3.2: namespace.alias] 568f08cb7d0b97786b17ef05e05caa55aad4d6bd39Chris Lattner/// 'namespace' identifier '=' qualified-namespace-specifier ';' 578f08cb7d0b97786b17ef05e05caa55aad4d6bd39Chris Lattner/// 5887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga NainarParser::DeclGroupPtrTy Parser::ParseNamespace(unsigned Context, 5987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar SourceLocation &DeclEnd, 6087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar SourceLocation InlineLoc) { 6104d6666eee19bbf25bdfcb8e79eb8b00ace03f0cChris Lattner assert(Tok.is(tok::kw_namespace) && "Not a namespace!"); 628f08cb7d0b97786b17ef05e05caa55aad4d6bd39Chris Lattner SourceLocation NamespaceLoc = ConsumeToken(); // eat the 'namespace'. 639735c5e60027b26a809df19677ff16a4d13f1321Fariborz Jahanian ObjCDeclContextSwitch ObjCDC(*this); 64a28948f34817476d02412fa204cae038e228c827Fariborz Jahanian 6549f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor if (Tok.is(tok::code_completion)) { 6623c94dbb6631fecdb55ba401aa93722803d980c6Douglas Gregor Actions.CodeCompleteNamespaceDecl(getCurScope()); 677d100872341f233c81e1d7b72b40457e62c36862Argyrios Kyrtzidis cutOffParsing(); 684967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return nullptr; 6949f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor } 70193575455e00eca03fd7177f60e3f2e6263cb661Kovarththanan Rajaratnam 718f08cb7d0b97786b17ef05e05caa55aad4d6bd39Chris Lattner SourceLocation IdentLoc; 726bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines IdentifierInfo *Ident = nullptr; 73f858bd817e8d6eac58ae496fa96a2f508fbb286fRichard Trieu std::vector<SourceLocation> ExtraIdentLoc; 74f858bd817e8d6eac58ae496fa96a2f508fbb286fRichard Trieu std::vector<IdentifierInfo*> ExtraIdent; 75f858bd817e8d6eac58ae496fa96a2f508fbb286fRichard Trieu std::vector<SourceLocation> ExtraNamespaceLoc; 766a588dd230c14a364d222d6057bbcf11afbd9ffdDouglas Gregor 77176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines ParsedAttributesWithRange attrs(AttrFactory); 78176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines SourceLocation attrLoc; 79176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (getLangOpts().CPlusPlus11 && isCXX11AttributeSpecifier()) { 80176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (!getLangOpts().CPlusPlus1z) 81176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Diag(Tok.getLocation(), diag::warn_cxx14_compat_attribute) 82176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines << 0 /*namespace*/; 83176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines attrLoc = Tok.getLocation(); 84176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines ParseCXX11Attributes(attrs); 85176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 8704d6666eee19bbf25bdfcb8e79eb8b00ace03f0cChris Lattner if (Tok.is(tok::identifier)) { 888f08cb7d0b97786b17ef05e05caa55aad4d6bd39Chris Lattner Ident = Tok.getIdentifierInfo(); 898f08cb7d0b97786b17ef05e05caa55aad4d6bd39Chris Lattner IdentLoc = ConsumeToken(); // eat the identifier. 90f858bd817e8d6eac58ae496fa96a2f508fbb286fRichard Trieu while (Tok.is(tok::coloncolon) && NextToken().is(tok::identifier)) { 91f858bd817e8d6eac58ae496fa96a2f508fbb286fRichard Trieu ExtraNamespaceLoc.push_back(ConsumeToken()); 92f858bd817e8d6eac58ae496fa96a2f508fbb286fRichard Trieu ExtraIdent.push_back(Tok.getIdentifierInfo()); 93f858bd817e8d6eac58ae496fa96a2f508fbb286fRichard Trieu ExtraIdentLoc.push_back(ConsumeToken()); 94f858bd817e8d6eac58ae496fa96a2f508fbb286fRichard Trieu } 958f08cb7d0b97786b17ef05e05caa55aad4d6bd39Chris Lattner } 961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 97176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // A nested namespace definition cannot have attributes. 98176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (!ExtraNamespaceLoc.empty() && attrLoc.isValid()) 99176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Diag(attrLoc, diag::err_unexpected_nested_namespace_attribute); 100176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 1018f08cb7d0b97786b17ef05e05caa55aad4d6bd39Chris Lattner // Read label attributes, if present. 1026a588dd230c14a364d222d6057bbcf11afbd9ffdDouglas Gregor if (Tok.is(tok::kw___attribute)) { 103176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines attrLoc = Tok.getLocation(); 1047f040a9d817cd1c72b565e92abff473510bf9e1dJohn McCall ParseGNUAttributes(attrs); 1056a588dd230c14a364d222d6057bbcf11afbd9ffdDouglas Gregor } 1061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1076a588dd230c14a364d222d6057bbcf11afbd9ffdDouglas Gregor if (Tok.is(tok::equal)) { 1086bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (!Ident) { 109651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Diag(Tok, diag::err_expected) << tok::identifier; 110e1bb329744ec98ca921bfc4f0888cff7ab4d1bf4Nico Weber // Skip to end of the definition and eat the ';'. 111e1bb329744ec98ca921bfc4f0888cff7ab4d1bf4Nico Weber SkipUntil(tok::semi); 1124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return nullptr; 113e1bb329744ec98ca921bfc4f0888cff7ab4d1bf4Nico Weber } 114176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (attrLoc.isValid()) 115176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Diag(attrLoc, diag::err_unexpected_namespace_attributes_alias); 116d078e641450bbc5a20df8d3b54f87b27e398acb3Sebastian Redl if (InlineLoc.isValid()) 117d078e641450bbc5a20df8d3b54f87b27e398acb3Sebastian Redl Diag(InlineLoc, diag::err_inline_namespace_alias) 118d078e641450bbc5a20df8d3b54f87b27e398acb3Sebastian Redl << FixItHint::CreateRemoval(InlineLoc); 11987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Decl *NSAlias = ParseNamespaceAlias(NamespaceLoc, IdentLoc, Ident, DeclEnd); 12087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return Actions.ConvertDeclToDeclGroup(NSAlias); 12187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar} 122f858bd817e8d6eac58ae496fa96a2f508fbb286fRichard Trieu 1234a8dfb511e8f84b2e38b7a86d8ddf05ac1e1a41bDouglas Gregor BalancedDelimiterTracker T(*this, tok::l_brace); 1244a8dfb511e8f84b2e38b7a86d8ddf05ac1e1a41bDouglas Gregor if (T.consumeOpen()) { 125651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (Ident) 126651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Diag(Tok, diag::err_expected) << tok::l_brace; 127651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines else 128651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Diag(Tok, diag::err_expected_either) << tok::identifier << tok::l_brace; 1294967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return nullptr; 1305144832ae62cf97543b274d4bb88d5f74d0f7a20Chris Lattner } 1311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 13223c94dbb6631fecdb55ba401aa93722803d980c6Douglas Gregor if (getCurScope()->isClassScope() || getCurScope()->isTemplateParamScope() || 13323c94dbb6631fecdb55ba401aa93722803d980c6Douglas Gregor getCurScope()->isInObjcMethodScope() || getCurScope()->getBlockParent() || 13423c94dbb6631fecdb55ba401aa93722803d980c6Douglas Gregor getCurScope()->getFnParent()) { 1354a8dfb511e8f84b2e38b7a86d8ddf05ac1e1a41bDouglas Gregor Diag(T.getOpenLocation(), diag::err_namespace_nonnamespace_scope); 1368fe2475a4b4c00475709c13d43eb9a57cce87cbcAlexey Bataev SkipUntil(tok::r_brace); 1374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return nullptr; 13895f1b15ce1b281c8517d77792abe540753fbcc12Douglas Gregor } 13995f1b15ce1b281c8517d77792abe540753fbcc12Douglas Gregor 140176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (ExtraIdent.empty()) { 141176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // Normal namespace definition, not a nested-namespace-definition. 142176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } else if (InlineLoc.isValid()) { 143176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Diag(InlineLoc, diag::err_inline_nested_namespace_definition); 144176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } else if (getLangOpts().CPlusPlus1z) { 145176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Diag(ExtraNamespaceLoc[0], 146176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines diag::warn_cxx14_compat_nested_namespace_definition); 147176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } else { 148f858bd817e8d6eac58ae496fa96a2f508fbb286fRichard Trieu TentativeParsingAction TPA(*this); 1498fe2475a4b4c00475709c13d43eb9a57cce87cbcAlexey Bataev SkipUntil(tok::r_brace, StopBeforeMatch); 150f858bd817e8d6eac58ae496fa96a2f508fbb286fRichard Trieu Token rBraceToken = Tok; 151f858bd817e8d6eac58ae496fa96a2f508fbb286fRichard Trieu TPA.Revert(); 152f858bd817e8d6eac58ae496fa96a2f508fbb286fRichard Trieu 153f858bd817e8d6eac58ae496fa96a2f508fbb286fRichard Trieu if (!rBraceToken.is(tok::r_brace)) { 154176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Diag(ExtraNamespaceLoc[0], diag::ext_nested_namespace_definition) 155f858bd817e8d6eac58ae496fa96a2f508fbb286fRichard Trieu << SourceRange(ExtraNamespaceLoc.front(), ExtraIdentLoc.back()); 156f858bd817e8d6eac58ae496fa96a2f508fbb286fRichard Trieu } else { 1579910df05e9b5f03043f4d8dc12ea1bbb722664dfBenjamin Kramer std::string NamespaceFix; 158f858bd817e8d6eac58ae496fa96a2f508fbb286fRichard Trieu for (std::vector<IdentifierInfo*>::iterator I = ExtraIdent.begin(), 159f858bd817e8d6eac58ae496fa96a2f508fbb286fRichard Trieu E = ExtraIdent.end(); I != E; ++I) { 160f858bd817e8d6eac58ae496fa96a2f508fbb286fRichard Trieu NamespaceFix += " { namespace "; 161f858bd817e8d6eac58ae496fa96a2f508fbb286fRichard Trieu NamespaceFix += (*I)->getName(); 162f858bd817e8d6eac58ae496fa96a2f508fbb286fRichard Trieu } 1639910df05e9b5f03043f4d8dc12ea1bbb722664dfBenjamin Kramer 164f858bd817e8d6eac58ae496fa96a2f508fbb286fRichard Trieu std::string RBraces; 1659910df05e9b5f03043f4d8dc12ea1bbb722664dfBenjamin Kramer for (unsigned i = 0, e = ExtraIdent.size(); i != e; ++i) 166f858bd817e8d6eac58ae496fa96a2f508fbb286fRichard Trieu RBraces += "} "; 1679910df05e9b5f03043f4d8dc12ea1bbb722664dfBenjamin Kramer 168176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Diag(ExtraNamespaceLoc[0], diag::ext_nested_namespace_definition) 169f858bd817e8d6eac58ae496fa96a2f508fbb286fRichard Trieu << FixItHint::CreateReplacement(SourceRange(ExtraNamespaceLoc.front(), 170f858bd817e8d6eac58ae496fa96a2f508fbb286fRichard Trieu ExtraIdentLoc.back()), 171f858bd817e8d6eac58ae496fa96a2f508fbb286fRichard Trieu NamespaceFix) 172f858bd817e8d6eac58ae496fa96a2f508fbb286fRichard Trieu << FixItHint::CreateInsertion(rBraceToken.getLocation(), RBraces); 173f858bd817e8d6eac58ae496fa96a2f508fbb286fRichard Trieu } 174f858bd817e8d6eac58ae496fa96a2f508fbb286fRichard Trieu } 175f858bd817e8d6eac58ae496fa96a2f508fbb286fRichard Trieu 17688e64ca96d6c00c6f3bd43772cd325bede795d2aSebastian Redl // If we're still good, complain about inline namespaces in non-C++0x now. 1777fe6208c3fa91f835813bb78236ef5c2bbf81053Richard Smith if (InlineLoc.isValid()) 17880ad52f327b532bded5c5b0ee38779d841c6cd35Richard Smith Diag(InlineLoc, getLangOpts().CPlusPlus11 ? 1797fe6208c3fa91f835813bb78236ef5c2bbf81053Richard Smith diag::warn_cxx98_compat_inline_namespace : diag::ext_inline_namespace); 18088e64ca96d6c00c6f3bd43772cd325bede795d2aSebastian Redl 1815144832ae62cf97543b274d4bb88d5f74d0f7a20Chris Lattner // Enter a scope for the namespace. 1825144832ae62cf97543b274d4bb88d5f74d0f7a20Chris Lattner ParseScope NamespaceScope(this, Scope::DeclScope); 1832d1c5d313cd0c229cc614e74baa4c5756a4b46f4Argyrios Kyrtzidis 18487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar UsingDirectiveDecl *ImplicitUsingDirectiveDecl = nullptr; 185d226f65006733ed7f709c3174f22ce33391cb58fJohn McCall Decl *NamespcDecl = 186acba90f30876b4140b738f0d3dd0e50724053a96Abramo Bagnara Actions.ActOnStartNamespaceDef(getCurScope(), InlineLoc, NamespaceLoc, 1874a8dfb511e8f84b2e38b7a86d8ddf05ac1e1a41bDouglas Gregor IdentLoc, Ident, T.getOpenLocation(), 18887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar attrs.getList(), ImplicitUsingDirectiveDecl); 1892d1c5d313cd0c229cc614e74baa4c5756a4b46f4Argyrios Kyrtzidis 190f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall PrettyDeclStackTraceEntry CrashInfo(Actions, NamespcDecl, NamespaceLoc, 191f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall "parsing namespace"); 1921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 193f858bd817e8d6eac58ae496fa96a2f508fbb286fRichard Trieu // Parse the contents of the namespace. This includes parsing recovery on 194f858bd817e8d6eac58ae496fa96a2f508fbb286fRichard Trieu // any improperly nested namespaces. 195f858bd817e8d6eac58ae496fa96a2f508fbb286fRichard Trieu ParseInnerNamespace(ExtraIdentLoc, ExtraIdent, ExtraNamespaceLoc, 0, 1964a8dfb511e8f84b2e38b7a86d8ddf05ac1e1a41bDouglas Gregor InlineLoc, attrs, T); 1971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1985144832ae62cf97543b274d4bb88d5f74d0f7a20Chris Lattner // Leave the namespace scope. 1995144832ae62cf97543b274d4bb88d5f74d0f7a20Chris Lattner NamespaceScope.Exit(); 2008ba5d792032f475eb653ca6340eb51068df0fa90Argyrios Kyrtzidis 2014a8dfb511e8f84b2e38b7a86d8ddf05ac1e1a41bDouglas Gregor DeclEnd = T.getCloseLocation(); 2024a8dfb511e8f84b2e38b7a86d8ddf05ac1e1a41bDouglas Gregor Actions.ActOnFinishNamespaceDef(NamespcDecl, DeclEnd); 20387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 20487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return Actions.ConvertDeclToDeclGroup(NamespcDecl, 20587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar ImplicitUsingDirectiveDecl); 2068f08cb7d0b97786b17ef05e05caa55aad4d6bd39Chris Lattner} 207c6fdc34ac0183bfa03d65f317c78b7bdac52897eChris Lattner 208f858bd817e8d6eac58ae496fa96a2f508fbb286fRichard Trieu/// ParseInnerNamespace - Parse the contents of a namespace. 209176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesvoid Parser::ParseInnerNamespace(std::vector<SourceLocation> &IdentLoc, 210176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines std::vector<IdentifierInfo *> &Ident, 211176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines std::vector<SourceLocation> &NamespaceLoc, 212176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines unsigned int index, SourceLocation &InlineLoc, 213176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines ParsedAttributes &attrs, 2144a8dfb511e8f84b2e38b7a86d8ddf05ac1e1a41bDouglas Gregor BalancedDelimiterTracker &Tracker) { 215f858bd817e8d6eac58ae496fa96a2f508fbb286fRichard Trieu if (index == Ident.size()) { 21687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar while (!tryParseMisplacedModuleImport() && Tok.isNot(tok::r_brace) && 21787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Tok.isNot(tok::eof)) { 218f858bd817e8d6eac58ae496fa96a2f508fbb286fRichard Trieu ParsedAttributesWithRange attrs(AttrFactory); 2194e24f0f711e2c9fde79f19fa1c80deaab3f3b356Richard Smith MaybeParseCXX11Attributes(attrs); 220f858bd817e8d6eac58ae496fa96a2f508fbb286fRichard Trieu MaybeParseMicrosoftAttributes(attrs); 221f858bd817e8d6eac58ae496fa96a2f508fbb286fRichard Trieu ParseExternalDeclaration(attrs); 222f858bd817e8d6eac58ae496fa96a2f508fbb286fRichard Trieu } 2234a8dfb511e8f84b2e38b7a86d8ddf05ac1e1a41bDouglas Gregor 2244a8dfb511e8f84b2e38b7a86d8ddf05ac1e1a41bDouglas Gregor // The caller is what called check -- we are simply calling 2254a8dfb511e8f84b2e38b7a86d8ddf05ac1e1a41bDouglas Gregor // the close for it. 2264a8dfb511e8f84b2e38b7a86d8ddf05ac1e1a41bDouglas Gregor Tracker.consumeClose(); 227f858bd817e8d6eac58ae496fa96a2f508fbb286fRichard Trieu 228f858bd817e8d6eac58ae496fa96a2f508fbb286fRichard Trieu return; 229f858bd817e8d6eac58ae496fa96a2f508fbb286fRichard Trieu } 230f858bd817e8d6eac58ae496fa96a2f508fbb286fRichard Trieu 231176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // Handle a nested namespace definition. 232176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // FIXME: Preserve the source information through to the AST rather than 233176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // desugaring it here. 234f858bd817e8d6eac58ae496fa96a2f508fbb286fRichard Trieu ParseScope NamespaceScope(this, Scope::DeclScope); 23587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar UsingDirectiveDecl *ImplicitUsingDirectiveDecl = nullptr; 236f858bd817e8d6eac58ae496fa96a2f508fbb286fRichard Trieu Decl *NamespcDecl = 237f858bd817e8d6eac58ae496fa96a2f508fbb286fRichard Trieu Actions.ActOnStartNamespaceDef(getCurScope(), SourceLocation(), 238f858bd817e8d6eac58ae496fa96a2f508fbb286fRichard Trieu NamespaceLoc[index], IdentLoc[index], 2394a8dfb511e8f84b2e38b7a86d8ddf05ac1e1a41bDouglas Gregor Ident[index], Tracker.getOpenLocation(), 24087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar attrs.getList(), ImplicitUsingDirectiveDecl); 24187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar assert(!ImplicitUsingDirectiveDecl && 24287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar "nested namespace definition cannot define anonymous namespace"); 243f858bd817e8d6eac58ae496fa96a2f508fbb286fRichard Trieu 244f858bd817e8d6eac58ae496fa96a2f508fbb286fRichard Trieu ParseInnerNamespace(IdentLoc, Ident, NamespaceLoc, ++index, InlineLoc, 2454a8dfb511e8f84b2e38b7a86d8ddf05ac1e1a41bDouglas Gregor attrs, Tracker); 246f858bd817e8d6eac58ae496fa96a2f508fbb286fRichard Trieu 247f858bd817e8d6eac58ae496fa96a2f508fbb286fRichard Trieu NamespaceScope.Exit(); 2484a8dfb511e8f84b2e38b7a86d8ddf05ac1e1a41bDouglas Gregor Actions.ActOnFinishNamespaceDef(NamespcDecl, Tracker.getCloseLocation()); 249f858bd817e8d6eac58ae496fa96a2f508fbb286fRichard Trieu} 250f858bd817e8d6eac58ae496fa96a2f508fbb286fRichard Trieu 251f67606ae2febe3bb0718f05040c6c4bc2c2c3276Anders Carlsson/// ParseNamespaceAlias - Parse the part after the '=' in a namespace 252f67606ae2febe3bb0718f05040c6c4bc2c2c3276Anders Carlsson/// alias definition. 253f67606ae2febe3bb0718f05040c6c4bc2c2c3276Anders Carlsson/// 254d226f65006733ed7f709c3174f22ce33391cb58fJohn McCallDecl *Parser::ParseNamespaceAlias(SourceLocation NamespaceLoc, 2550b7e678a11ece4288dc01aebb5b17e5eef8f8d2dJohn McCall SourceLocation AliasLoc, 2560b7e678a11ece4288dc01aebb5b17e5eef8f8d2dJohn McCall IdentifierInfo *Alias, 2570b7e678a11ece4288dc01aebb5b17e5eef8f8d2dJohn McCall SourceLocation &DeclEnd) { 258f67606ae2febe3bb0718f05040c6c4bc2c2c3276Anders Carlsson assert(Tok.is(tok::equal) && "Not equal token"); 2591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 260f67606ae2febe3bb0718f05040c6c4bc2c2c3276Anders Carlsson ConsumeToken(); // eat the '='. 2611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 26249f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor if (Tok.is(tok::code_completion)) { 26323c94dbb6631fecdb55ba401aa93722803d980c6Douglas Gregor Actions.CodeCompleteNamespaceAliasDecl(getCurScope()); 2647d100872341f233c81e1d7b72b40457e62c36862Argyrios Kyrtzidis cutOffParsing(); 2656bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 26649f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor } 267193575455e00eca03fd7177f60e3f2e6263cb661Kovarththanan Rajaratnam 268f67606ae2febe3bb0718f05040c6c4bc2c2c3276Anders Carlsson CXXScopeSpec SS; 269f67606ae2febe3bb0718f05040c6c4bc2c2c3276Anders Carlsson // Parse (optional) nested-name-specifier. 2704967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ParseOptionalCXXScopeSpecifier(SS, nullptr, /*EnteringContext=*/false); 271f67606ae2febe3bb0718f05040c6c4bc2c2c3276Anders Carlsson 272f67606ae2febe3bb0718f05040c6c4bc2c2c3276Anders Carlsson if (SS.isInvalid() || Tok.isNot(tok::identifier)) { 273f67606ae2febe3bb0718f05040c6c4bc2c2c3276Anders Carlsson Diag(Tok, diag::err_expected_namespace_name); 274f67606ae2febe3bb0718f05040c6c4bc2c2c3276Anders Carlsson // Skip to end of the definition and eat the ';'. 275f67606ae2febe3bb0718f05040c6c4bc2c2c3276Anders Carlsson SkipUntil(tok::semi); 2766bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 277f67606ae2febe3bb0718f05040c6c4bc2c2c3276Anders Carlsson } 278f67606ae2febe3bb0718f05040c6c4bc2c2c3276Anders Carlsson 279f67606ae2febe3bb0718f05040c6c4bc2c2c3276Anders Carlsson // Parse identifier. 28003bd5a1e9a54b62b10ae8aeb6eb5245e2031d98bAnders Carlsson IdentifierInfo *Ident = Tok.getIdentifierInfo(); 28103bd5a1e9a54b62b10ae8aeb6eb5245e2031d98bAnders Carlsson SourceLocation IdentLoc = ConsumeToken(); 2821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 283f67606ae2febe3bb0718f05040c6c4bc2c2c3276Anders Carlsson // Eat the ';'. 28497144fc41a9419bf6d74fc9450e8ef3f6e11f7e0Chris Lattner DeclEnd = Tok.getLocation(); 285651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (ExpectAndConsume(tok::semi, diag::err_expected_semi_after_namespace_name)) 286651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines SkipUntil(tok::semi); 2871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 28887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return Actions.ActOnNamespaceAliasDef(getCurScope(), NamespaceLoc, AliasLoc, 28987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Alias, SS, IdentLoc, Ident); 290f67606ae2febe3bb0718f05040c6c4bc2c2c3276Anders Carlsson} 291f67606ae2febe3bb0718f05040c6c4bc2c2c3276Anders Carlsson 292c6fdc34ac0183bfa03d65f317c78b7bdac52897eChris Lattner/// ParseLinkage - We know that the current token is a string_literal 293c6fdc34ac0183bfa03d65f317c78b7bdac52897eChris Lattner/// and just before that, that extern was seen. 294c6fdc34ac0183bfa03d65f317c78b7bdac52897eChris Lattner/// 295c6fdc34ac0183bfa03d65f317c78b7bdac52897eChris Lattner/// linkage-specification: [C++ 7.5p2: dcl.link] 296c6fdc34ac0183bfa03d65f317c78b7bdac52897eChris Lattner/// 'extern' string-literal '{' declaration-seq[opt] '}' 297c6fdc34ac0183bfa03d65f317c78b7bdac52897eChris Lattner/// 'extern' string-literal declaration 298c6fdc34ac0183bfa03d65f317c78b7bdac52897eChris Lattner/// 2997d64271b162eaf5cae264ff64465b28af623dc17Chris LattnerDecl *Parser::ParseLinkage(ParsingDeclSpec &DS, unsigned Context) { 300651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines assert(isTokenStringLiteral() && "Not a string literal!"); 301651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines ExprResult Lang = ParseStringLiteralExpression(false); 302c6fdc34ac0183bfa03d65f317c78b7bdac52897eChris Lattner 303074149e11baf5f7db12f84efd5c34ba6e35d5cdfDouglas Gregor ParseScope LinkageScope(this, Scope::DeclScope); 304651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Decl *LinkageSpec = 305651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Lang.isInvalid() 3066bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines ? nullptr 307651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines : Actions.ActOnStartLinkageSpecification( 308c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines getCurScope(), DS.getSourceRange().getBegin(), Lang.get(), 309651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Tok.is(tok::l_brace) ? Tok.getLocation() : SourceLocation()); 310074149e11baf5f7db12f84efd5c34ba6e35d5cdfDouglas Gregor 3110b7e678a11ece4288dc01aebb5b17e5eef8f8d2dJohn McCall ParsedAttributesWithRange attrs(AttrFactory); 3124e24f0f711e2c9fde79f19fa1c80deaab3f3b356Richard Smith MaybeParseCXX11Attributes(attrs); 3137f040a9d817cd1c72b565e92abff473510bf9e1dJohn McCall MaybeParseMicrosoftAttributes(attrs); 314193575455e00eca03fd7177f60e3f2e6263cb661Kovarththanan Rajaratnam 315074149e11baf5f7db12f84efd5c34ba6e35d5cdfDouglas Gregor if (Tok.isNot(tok::l_brace)) { 316f41e33c29cd4b21065956129d5e923f3d73d97d3Abramo Bagnara // Reset the source range in DS, as the leading "extern" 317f41e33c29cd4b21065956129d5e923f3d73d97d3Abramo Bagnara // does not really belong to the inner declaration ... 318f41e33c29cd4b21065956129d5e923f3d73d97d3Abramo Bagnara DS.SetRangeStart(SourceLocation()); 319f41e33c29cd4b21065956129d5e923f3d73d97d3Abramo Bagnara DS.SetRangeEnd(SourceLocation()); 320f41e33c29cd4b21065956129d5e923f3d73d97d3Abramo Bagnara // ... but anyway remember that such an "extern" was seen. 32135f9a196ef897b9559de25aaecd957208f0b4f59Abramo Bagnara DS.setExternInLinkageSpec(true); 3227f040a9d817cd1c72b565e92abff473510bf9e1dJohn McCall ParseExternalDeclaration(attrs, &DS); 323651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return LinkageSpec ? Actions.ActOnFinishLinkageSpecification( 324651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines getCurScope(), LinkageSpec, SourceLocation()) 3256bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines : nullptr; 3261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 327f44515a49b549171dc3ee9faa6281b72609da563Douglas Gregor 32863a011378d4b9483ce24400c163cb8d65ea096a5Douglas Gregor DS.abort(); 32963a011378d4b9483ce24400c163cb8d65ea096a5Douglas Gregor 3307f040a9d817cd1c72b565e92abff473510bf9e1dJohn McCall ProhibitAttributes(attrs); 331bbd37c62e34db3f5a95c899723484a76c71d7757Sean Hunt 3324a8dfb511e8f84b2e38b7a86d8ddf05ac1e1a41bDouglas Gregor BalancedDelimiterTracker T(*this, tok::l_brace); 3334a8dfb511e8f84b2e38b7a86d8ddf05ac1e1a41bDouglas Gregor T.consumeOpen(); 334651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 335651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines unsigned NestedModules = 0; 336651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines while (true) { 337651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines switch (Tok.getKind()) { 338651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines case tok::annot_module_begin: 339651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines ++NestedModules; 340651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines ParseTopLevelDecl(); 341651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines continue; 342651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 343651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines case tok::annot_module_end: 344651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (!NestedModules) 345651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines break; 346651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines --NestedModules; 347651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines ParseTopLevelDecl(); 348651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines continue; 349651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 350651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines case tok::annot_module_include: 351651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines ParseTopLevelDecl(); 352651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines continue; 353651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 354651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines case tok::eof: 355651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines break; 356651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 357651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines case tok::r_brace: 358651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (!NestedModules) 359651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines break; 360651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // Fall through. 361651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines default: 362651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines ParsedAttributesWithRange attrs(AttrFactory); 363651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines MaybeParseCXX11Attributes(attrs); 364651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines MaybeParseMicrosoftAttributes(attrs); 365651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines ParseExternalDeclaration(attrs); 366651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines continue; 367651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 368651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 369651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines break; 370f44515a49b549171dc3ee9faa6281b72609da563Douglas Gregor } 371c6fdc34ac0183bfa03d65f317c78b7bdac52897eChris Lattner 3724a8dfb511e8f84b2e38b7a86d8ddf05ac1e1a41bDouglas Gregor T.consumeClose(); 373651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return LinkageSpec ? Actions.ActOnFinishLinkageSpecification( 374651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines getCurScope(), LinkageSpec, T.getCloseLocation()) 3756bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines : nullptr; 376c6fdc34ac0183bfa03d65f317c78b7bdac52897eChris Lattner} 377e37ac4ff1620ed2d7026f52baccbfa022d79ced1Douglas Gregor 378f780abc21c39cd4731b9e38f2d2d9f7d1510bd7bDouglas Gregor/// ParseUsingDirectiveOrDeclaration - Parse C++ using using-declaration or 379f780abc21c39cd4731b9e38f2d2d9f7d1510bd7bDouglas Gregor/// using-directive. Assumes that current token is 'using'. 380d226f65006733ed7f709c3174f22ce33391cb58fJohn McCallDecl *Parser::ParseUsingDirectiveOrDeclaration(unsigned Context, 38178b810559d89e996e00684335407443936ce34a1John McCall const ParsedTemplateInfo &TemplateInfo, 38278b810559d89e996e00684335407443936ce34a1John McCall SourceLocation &DeclEnd, 383c89edf5aaa08683f4afcf61a7a1d183c08b76498Richard Smith ParsedAttributesWithRange &attrs, 384c89edf5aaa08683f4afcf61a7a1d183c08b76498Richard Smith Decl **OwnedType) { 385f780abc21c39cd4731b9e38f2d2d9f7d1510bd7bDouglas Gregor assert(Tok.is(tok::kw_using) && "Not using token"); 3869735c5e60027b26a809df19677ff16a4d13f1321Fariborz Jahanian ObjCDeclContextSwitch ObjCDC(*this); 3879735c5e60027b26a809df19677ff16a4d13f1321Fariborz Jahanian 388f780abc21c39cd4731b9e38f2d2d9f7d1510bd7bDouglas Gregor // Eat 'using'. 389f780abc21c39cd4731b9e38f2d2d9f7d1510bd7bDouglas Gregor SourceLocation UsingLoc = ConsumeToken(); 390f780abc21c39cd4731b9e38f2d2d9f7d1510bd7bDouglas Gregor 39149f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor if (Tok.is(tok::code_completion)) { 39223c94dbb6631fecdb55ba401aa93722803d980c6Douglas Gregor Actions.CodeCompleteUsing(getCurScope()); 3937d100872341f233c81e1d7b72b40457e62c36862Argyrios Kyrtzidis cutOffParsing(); 3946bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 39549f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor } 396193575455e00eca03fd7177f60e3f2e6263cb661Kovarththanan Rajaratnam 39778b810559d89e996e00684335407443936ce34a1John McCall // 'using namespace' means this is a using-directive. 39878b810559d89e996e00684335407443936ce34a1John McCall if (Tok.is(tok::kw_namespace)) { 39978b810559d89e996e00684335407443936ce34a1John McCall // Template parameters are always an error here. 40078b810559d89e996e00684335407443936ce34a1John McCall if (TemplateInfo.Kind) { 40178b810559d89e996e00684335407443936ce34a1John McCall SourceRange R = TemplateInfo.getSourceRange(); 40287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Diag(UsingLoc, diag::err_templated_using_directive_declaration) 40387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar << 0 /* directive */ << R << FixItHint::CreateRemoval(R); 40478b810559d89e996e00684335407443936ce34a1John McCall } 40578b810559d89e996e00684335407443936ce34a1John McCall 4069735c5e60027b26a809df19677ff16a4d13f1321Fariborz Jahanian return ParseUsingDirective(Context, UsingLoc, DeclEnd, attrs); 40778b810559d89e996e00684335407443936ce34a1John McCall } 408bbd37c62e34db3f5a95c899723484a76c71d7757Sean Hunt 409162e1c1b487352434552147967c3dd296ebee2f7Richard Smith // Otherwise, it must be a using-declaration or an alias-declaration. 41078b810559d89e996e00684335407443936ce34a1John McCall 41178b810559d89e996e00684335407443936ce34a1John McCall // Using declarations can't have attributes. 4127f040a9d817cd1c72b565e92abff473510bf9e1dJohn McCall ProhibitAttributes(attrs); 4132f27477a29b6f5365ee545c1cac666cc8b95f518Chris Lattner 4149735c5e60027b26a809df19677ff16a4d13f1321Fariborz Jahanian return ParseUsingDeclaration(Context, TemplateInfo, UsingLoc, DeclEnd, 415a28948f34817476d02412fa204cae038e228c827Fariborz Jahanian AS_none, OwnedType); 416f780abc21c39cd4731b9e38f2d2d9f7d1510bd7bDouglas Gregor} 417f780abc21c39cd4731b9e38f2d2d9f7d1510bd7bDouglas Gregor 418f780abc21c39cd4731b9e38f2d2d9f7d1510bd7bDouglas Gregor/// ParseUsingDirective - Parse C++ using-directive, assumes 419f780abc21c39cd4731b9e38f2d2d9f7d1510bd7bDouglas Gregor/// that current token is 'namespace' and 'using' was already parsed. 420f780abc21c39cd4731b9e38f2d2d9f7d1510bd7bDouglas Gregor/// 421f780abc21c39cd4731b9e38f2d2d9f7d1510bd7bDouglas Gregor/// using-directive: [C++ 7.3.p4: namespace.udir] 422f780abc21c39cd4731b9e38f2d2d9f7d1510bd7bDouglas Gregor/// 'using' 'namespace' ::[opt] nested-name-specifier[opt] 423f780abc21c39cd4731b9e38f2d2d9f7d1510bd7bDouglas Gregor/// namespace-name ; 424f780abc21c39cd4731b9e38f2d2d9f7d1510bd7bDouglas Gregor/// [GNU] using-directive: 425f780abc21c39cd4731b9e38f2d2d9f7d1510bd7bDouglas Gregor/// 'using' 'namespace' ::[opt] nested-name-specifier[opt] 426f780abc21c39cd4731b9e38f2d2d9f7d1510bd7bDouglas Gregor/// namespace-name attributes[opt] ; 427f780abc21c39cd4731b9e38f2d2d9f7d1510bd7bDouglas Gregor/// 428d226f65006733ed7f709c3174f22ce33391cb58fJohn McCallDecl *Parser::ParseUsingDirective(unsigned Context, 42978b810559d89e996e00684335407443936ce34a1John McCall SourceLocation UsingLoc, 43078b810559d89e996e00684335407443936ce34a1John McCall SourceLocation &DeclEnd, 4317f040a9d817cd1c72b565e92abff473510bf9e1dJohn McCall ParsedAttributes &attrs) { 432f780abc21c39cd4731b9e38f2d2d9f7d1510bd7bDouglas Gregor assert(Tok.is(tok::kw_namespace) && "Not 'namespace' token"); 433f780abc21c39cd4731b9e38f2d2d9f7d1510bd7bDouglas Gregor 434f780abc21c39cd4731b9e38f2d2d9f7d1510bd7bDouglas Gregor // Eat 'namespace'. 435f780abc21c39cd4731b9e38f2d2d9f7d1510bd7bDouglas Gregor SourceLocation NamespcLoc = ConsumeToken(); 436f780abc21c39cd4731b9e38f2d2d9f7d1510bd7bDouglas Gregor 43749f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor if (Tok.is(tok::code_completion)) { 43823c94dbb6631fecdb55ba401aa93722803d980c6Douglas Gregor Actions.CodeCompleteUsingDirective(getCurScope()); 4397d100872341f233c81e1d7b72b40457e62c36862Argyrios Kyrtzidis cutOffParsing(); 4406bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 44149f40bd0c9c9de5e74727774fec429b47d36303aDouglas Gregor } 442193575455e00eca03fd7177f60e3f2e6263cb661Kovarththanan Rajaratnam 443f780abc21c39cd4731b9e38f2d2d9f7d1510bd7bDouglas Gregor CXXScopeSpec SS; 444f780abc21c39cd4731b9e38f2d2d9f7d1510bd7bDouglas Gregor // Parse (optional) nested-name-specifier. 4454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ParseOptionalCXXScopeSpecifier(SS, nullptr, /*EnteringContext=*/false); 446f780abc21c39cd4731b9e38f2d2d9f7d1510bd7bDouglas Gregor 4476bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines IdentifierInfo *NamespcName = nullptr; 448f780abc21c39cd4731b9e38f2d2d9f7d1510bd7bDouglas Gregor SourceLocation IdentLoc = SourceLocation(); 449f780abc21c39cd4731b9e38f2d2d9f7d1510bd7bDouglas Gregor 450f780abc21c39cd4731b9e38f2d2d9f7d1510bd7bDouglas Gregor // Parse namespace-name. 451823c44e6d73141f642e207980b4021ddcf09897bChris Lattner if (SS.isInvalid() || Tok.isNot(tok::identifier)) { 452f780abc21c39cd4731b9e38f2d2d9f7d1510bd7bDouglas Gregor Diag(Tok, diag::err_expected_namespace_name); 453f780abc21c39cd4731b9e38f2d2d9f7d1510bd7bDouglas Gregor // If there was invalid namespace name, skip to end of decl, and eat ';'. 454f780abc21c39cd4731b9e38f2d2d9f7d1510bd7bDouglas Gregor SkipUntil(tok::semi); 455f780abc21c39cd4731b9e38f2d2d9f7d1510bd7bDouglas Gregor // FIXME: Are there cases, when we would like to call ActOnUsingDirective? 4566bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 457f780abc21c39cd4731b9e38f2d2d9f7d1510bd7bDouglas Gregor } 4581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 459823c44e6d73141f642e207980b4021ddcf09897bChris Lattner // Parse identifier. 460823c44e6d73141f642e207980b4021ddcf09897bChris Lattner NamespcName = Tok.getIdentifierInfo(); 461823c44e6d73141f642e207980b4021ddcf09897bChris Lattner IdentLoc = ConsumeToken(); 4621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 463823c44e6d73141f642e207980b4021ddcf09897bChris Lattner // Parse (optional) attributes (most likely GNU strong-using extension). 464bbd37c62e34db3f5a95c899723484a76c71d7757Sean Hunt bool GNUAttr = false; 465bbd37c62e34db3f5a95c899723484a76c71d7757Sean Hunt if (Tok.is(tok::kw___attribute)) { 466bbd37c62e34db3f5a95c899723484a76c71d7757Sean Hunt GNUAttr = true; 4677f040a9d817cd1c72b565e92abff473510bf9e1dJohn McCall ParseGNUAttributes(attrs); 468bbd37c62e34db3f5a95c899723484a76c71d7757Sean Hunt } 4691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 470823c44e6d73141f642e207980b4021ddcf09897bChris Lattner // Eat ';'. 47197144fc41a9419bf6d74fc9450e8ef3f6e11f7e0Chris Lattner DeclEnd = Tok.getLocation(); 472651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (ExpectAndConsume(tok::semi, 473651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines GNUAttr ? diag::err_expected_semi_after_attribute_list 474651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines : diag::err_expected_semi_after_namespace_name)) 475651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines SkipUntil(tok::semi); 476f780abc21c39cd4731b9e38f2d2d9f7d1510bd7bDouglas Gregor 47723c94dbb6631fecdb55ba401aa93722803d980c6Douglas Gregor return Actions.ActOnUsingDirective(getCurScope(), UsingLoc, NamespcLoc, SS, 4787f040a9d817cd1c72b565e92abff473510bf9e1dJohn McCall IdentLoc, NamespcName, attrs.getList()); 479f780abc21c39cd4731b9e38f2d2d9f7d1510bd7bDouglas Gregor} 480f780abc21c39cd4731b9e38f2d2d9f7d1510bd7bDouglas Gregor 481162e1c1b487352434552147967c3dd296ebee2f7Richard Smith/// ParseUsingDeclaration - Parse C++ using-declaration or alias-declaration. 482162e1c1b487352434552147967c3dd296ebee2f7Richard Smith/// Assumes that 'using' was already seen. 483f780abc21c39cd4731b9e38f2d2d9f7d1510bd7bDouglas Gregor/// 484f780abc21c39cd4731b9e38f2d2d9f7d1510bd7bDouglas Gregor/// using-declaration: [C++ 7.3.p3: namespace.udecl] 485f780abc21c39cd4731b9e38f2d2d9f7d1510bd7bDouglas Gregor/// 'using' 'typename'[opt] ::[opt] nested-name-specifier 4869cfbe48a7a20a217fdb2920b29b67ae7941cb116Douglas Gregor/// unqualified-id 4879cfbe48a7a20a217fdb2920b29b67ae7941cb116Douglas Gregor/// 'using' :: unqualified-id 488f780abc21c39cd4731b9e38f2d2d9f7d1510bd7bDouglas Gregor/// 489d03de6aaa312d57dcd6e2bc76bed1e89f5c5019dRichard Smith/// alias-declaration: C++11 [dcl.dcl]p1 490d03de6aaa312d57dcd6e2bc76bed1e89f5c5019dRichard Smith/// 'using' identifier attribute-specifier-seq[opt] = type-id ; 491162e1c1b487352434552147967c3dd296ebee2f7Richard Smith/// 492d226f65006733ed7f709c3174f22ce33391cb58fJohn McCallDecl *Parser::ParseUsingDeclaration(unsigned Context, 49378b810559d89e996e00684335407443936ce34a1John McCall const ParsedTemplateInfo &TemplateInfo, 49478b810559d89e996e00684335407443936ce34a1John McCall SourceLocation UsingLoc, 49578b810559d89e996e00684335407443936ce34a1John McCall SourceLocation &DeclEnd, 496c89edf5aaa08683f4afcf61a7a1d183c08b76498Richard Smith AccessSpecifier AS, 497c89edf5aaa08683f4afcf61a7a1d183c08b76498Richard Smith Decl **OwnedType) { 4989cfbe48a7a20a217fdb2920b29b67ae7941cb116Douglas Gregor CXXScopeSpec SS; 4997ba107a1863ddfa1664555854f0d7bdb3c491c92John McCall SourceLocation TypenameLoc; 5008d030c7a6f36438f6c7dd977f8be0de0cc781ad5Enea Zaffanella bool HasTypenameKeyword = false; 5012edf0a2520313cde900799b1eb9bd11c9c776afeSean Hunt 5025eed7e00b4ac8d589ca83e126dafa8767e8a0358Richard Smith // Check for misplaced attributes before the identifier in an 5035eed7e00b4ac8d589ca83e126dafa8767e8a0358Richard Smith // alias-declaration. 5045eed7e00b4ac8d589ca83e126dafa8767e8a0358Richard Smith ParsedAttributesWithRange MisplacedAttrs(AttrFactory); 5055eed7e00b4ac8d589ca83e126dafa8767e8a0358Richard Smith MaybeParseCXX11Attributes(MisplacedAttrs); 5069cfbe48a7a20a217fdb2920b29b67ae7941cb116Douglas Gregor 5079cfbe48a7a20a217fdb2920b29b67ae7941cb116Douglas Gregor // Ignore optional 'typename'. 50812c118a8ff9f61a4d63146fe1a5c0d60987f99bbDouglas Gregor // FIXME: This is wrong; we should parse this as a typename-specifier. 509651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (TryConsumeToken(tok::kw_typename, TypenameLoc)) 5108d030c7a6f36438f6c7dd977f8be0de0cc781ad5Enea Zaffanella HasTypenameKeyword = true; 5119cfbe48a7a20a217fdb2920b29b67ae7941cb116Douglas Gregor 512176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (Tok.is(tok::kw___super)) { 513176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Diag(Tok.getLocation(), diag::err_super_in_using_declaration); 514176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines SkipUntil(tok::semi); 515176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines return nullptr; 516176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 517176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 5189cfbe48a7a20a217fdb2920b29b67ae7941cb116Douglas Gregor // Parse nested-name-specifier. 5196bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines IdentifierInfo *LastII = nullptr; 5204967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ParseOptionalCXXScopeSpecifier(SS, nullptr, /*EnteringContext=*/false, 5216bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines /*MayBePseudoDtor=*/nullptr, 5226bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines /*IsTypename=*/false, 5232db075b1d3b16f0100fe06408dfb4ab7d50700a4Richard Smith /*LastII=*/&LastII); 5249cfbe48a7a20a217fdb2920b29b67ae7941cb116Douglas Gregor 5259cfbe48a7a20a217fdb2920b29b67ae7941cb116Douglas Gregor // Check nested-name specifier. 5269cfbe48a7a20a217fdb2920b29b67ae7941cb116Douglas Gregor if (SS.isInvalid()) { 5279cfbe48a7a20a217fdb2920b29b67ae7941cb116Douglas Gregor SkipUntil(tok::semi); 5286bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 5299cfbe48a7a20a217fdb2920b29b67ae7941cb116Douglas Gregor } 5301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5312db075b1d3b16f0100fe06408dfb4ab7d50700a4Richard Smith SourceLocation TemplateKWLoc; 5322db075b1d3b16f0100fe06408dfb4ab7d50700a4Richard Smith UnqualifiedId Name; 5332db075b1d3b16f0100fe06408dfb4ab7d50700a4Richard Smith 534193575455e00eca03fd7177f60e3f2e6263cb661Kovarththanan Rajaratnam // Parse the unqualified-id. We allow parsing of both constructor and 53512c118a8ff9f61a4d63146fe1a5c0d60987f99bbDouglas Gregor // destructor names and allow the action module to diagnose any semantic 53612c118a8ff9f61a4d63146fe1a5c0d60987f99bbDouglas Gregor // errors. 5372db075b1d3b16f0100fe06408dfb4ab7d50700a4Richard Smith // 5382db075b1d3b16f0100fe06408dfb4ab7d50700a4Richard Smith // C++11 [class.qual]p2: 5392db075b1d3b16f0100fe06408dfb4ab7d50700a4Richard Smith // [...] in a using-declaration that is a member-declaration, if the name 5402db075b1d3b16f0100fe06408dfb4ab7d50700a4Richard Smith // specified after the nested-name-specifier is the same as the identifier 5412db075b1d3b16f0100fe06408dfb4ab7d50700a4Richard Smith // or the simple-template-id's template-name in the last component of the 5422db075b1d3b16f0100fe06408dfb4ab7d50700a4Richard Smith // nested-name-specifier, the name is [...] considered to name the 5432db075b1d3b16f0100fe06408dfb4ab7d50700a4Richard Smith // constructor. 5442db075b1d3b16f0100fe06408dfb4ab7d50700a4Richard Smith if (getLangOpts().CPlusPlus11 && Context == Declarator::MemberContext && 5452db075b1d3b16f0100fe06408dfb4ab7d50700a4Richard Smith Tok.is(tok::identifier) && NextToken().is(tok::semi) && 5462db075b1d3b16f0100fe06408dfb4ab7d50700a4Richard Smith SS.isNotEmpty() && LastII == Tok.getIdentifierInfo() && 5472db075b1d3b16f0100fe06408dfb4ab7d50700a4Richard Smith !SS.getScopeRep()->getAsNamespace() && 5482db075b1d3b16f0100fe06408dfb4ab7d50700a4Richard Smith !SS.getScopeRep()->getAsNamespaceAlias()) { 5492db075b1d3b16f0100fe06408dfb4ab7d50700a4Richard Smith SourceLocation IdLoc = ConsumeToken(); 5502db075b1d3b16f0100fe06408dfb4ab7d50700a4Richard Smith ParsedType Type = Actions.getInheritingConstructorName(SS, IdLoc, *LastII); 5512db075b1d3b16f0100fe06408dfb4ab7d50700a4Richard Smith Name.setConstructorName(Type, IdLoc, IdLoc); 55287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } else if (ParseUnqualifiedId( 55387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar SS, /*EnteringContext=*/false, 55487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar /*AllowDestructorName=*/true, 55587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar /*AllowConstructorName=*/!(Tok.is(tok::identifier) && 55687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar NextToken().is(tok::equal)), 5574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar nullptr, TemplateKWLoc, Name)) { 5589cfbe48a7a20a217fdb2920b29b67ae7941cb116Douglas Gregor SkipUntil(tok::semi); 5596bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 5609cfbe48a7a20a217fdb2920b29b67ae7941cb116Douglas Gregor } 561193575455e00eca03fd7177f60e3f2e6263cb661Kovarththanan Rajaratnam 5625eed7e00b4ac8d589ca83e126dafa8767e8a0358Richard Smith ParsedAttributesWithRange Attrs(AttrFactory); 563df1cce5bcd367ee47f4a7579c3a1cb4618248514Richard Smith MaybeParseGNUAttributes(Attrs); 5646b3d3e54c003b03f16e235ad2ff49e95587bbf92Richard Smith MaybeParseCXX11Attributes(Attrs); 565162e1c1b487352434552147967c3dd296ebee2f7Richard Smith 566162e1c1b487352434552147967c3dd296ebee2f7Richard Smith // Maybe this is an alias-declaration. 567162e1c1b487352434552147967c3dd296ebee2f7Richard Smith TypeResult TypeAlias; 5685eed7e00b4ac8d589ca83e126dafa8767e8a0358Richard Smith bool IsAliasDecl = Tok.is(tok::equal); 5693ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar Decl *DeclFromDeclSpec = nullptr; 570162e1c1b487352434552147967c3dd296ebee2f7Richard Smith if (IsAliasDecl) { 5715eed7e00b4ac8d589ca83e126dafa8767e8a0358Richard Smith // If we had any misplaced attributes from earlier, this is where they 5725eed7e00b4ac8d589ca83e126dafa8767e8a0358Richard Smith // should have been written. 5735eed7e00b4ac8d589ca83e126dafa8767e8a0358Richard Smith if (MisplacedAttrs.Range.isValid()) { 5745eed7e00b4ac8d589ca83e126dafa8767e8a0358Richard Smith Diag(MisplacedAttrs.Range.getBegin(), diag::err_attributes_not_allowed) 5755eed7e00b4ac8d589ca83e126dafa8767e8a0358Richard Smith << FixItHint::CreateInsertionFromRange( 5765eed7e00b4ac8d589ca83e126dafa8767e8a0358Richard Smith Tok.getLocation(), 5775eed7e00b4ac8d589ca83e126dafa8767e8a0358Richard Smith CharSourceRange::getTokenRange(MisplacedAttrs.Range)) 5785eed7e00b4ac8d589ca83e126dafa8767e8a0358Richard Smith << FixItHint::CreateRemoval(MisplacedAttrs.Range); 5795eed7e00b4ac8d589ca83e126dafa8767e8a0358Richard Smith Attrs.takeAllFrom(MisplacedAttrs); 5805eed7e00b4ac8d589ca83e126dafa8767e8a0358Richard Smith } 5815eed7e00b4ac8d589ca83e126dafa8767e8a0358Richard Smith 582162e1c1b487352434552147967c3dd296ebee2f7Richard Smith ConsumeToken(); 583162e1c1b487352434552147967c3dd296ebee2f7Richard Smith 58480ad52f327b532bded5c5b0ee38779d841c6cd35Richard Smith Diag(Tok.getLocation(), getLangOpts().CPlusPlus11 ? 5857fe6208c3fa91f835813bb78236ef5c2bbf81053Richard Smith diag::warn_cxx98_compat_alias_declaration : 5867fe6208c3fa91f835813bb78236ef5c2bbf81053Richard Smith diag::ext_alias_declaration); 587162e1c1b487352434552147967c3dd296ebee2f7Richard Smith 5883e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith // Type alias templates cannot be specialized. 5893e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith int SpecKind = -1; 590536e9c1f103f3e59ed47e35090819eb93596c35bRichard Smith if (TemplateInfo.Kind == ParsedTemplateInfo::Template && 591536e9c1f103f3e59ed47e35090819eb93596c35bRichard Smith Name.getKind() == UnqualifiedId::IK_TemplateId) 5923e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith SpecKind = 0; 5933e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith if (TemplateInfo.Kind == ParsedTemplateInfo::ExplicitSpecialization) 5943e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith SpecKind = 1; 5953e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith if (TemplateInfo.Kind == ParsedTemplateInfo::ExplicitInstantiation) 5963e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith SpecKind = 2; 5973e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith if (SpecKind != -1) { 5983e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith SourceRange Range; 5993e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith if (SpecKind == 0) 6003e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith Range = SourceRange(Name.TemplateId->LAngleLoc, 6013e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith Name.TemplateId->RAngleLoc); 6023e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith else 6033e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith Range = TemplateInfo.getSourceRange(); 6043e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith Diag(Range.getBegin(), diag::err_alias_declaration_specialization) 6053e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith << SpecKind << Range; 6063e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith SkipUntil(tok::semi); 6076bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 6083e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith } 6093e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith 610162e1c1b487352434552147967c3dd296ebee2f7Richard Smith // Name must be an identifier. 611162e1c1b487352434552147967c3dd296ebee2f7Richard Smith if (Name.getKind() != UnqualifiedId::IK_Identifier) { 612162e1c1b487352434552147967c3dd296ebee2f7Richard Smith Diag(Name.StartLocation, diag::err_alias_declaration_not_identifier); 613162e1c1b487352434552147967c3dd296ebee2f7Richard Smith // No removal fixit: can't recover from this. 614162e1c1b487352434552147967c3dd296ebee2f7Richard Smith SkipUntil(tok::semi); 6156bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 6168d030c7a6f36438f6c7dd977f8be0de0cc781ad5Enea Zaffanella } else if (HasTypenameKeyword) 617162e1c1b487352434552147967c3dd296ebee2f7Richard Smith Diag(TypenameLoc, diag::err_alias_declaration_not_identifier) 618162e1c1b487352434552147967c3dd296ebee2f7Richard Smith << FixItHint::CreateRemoval(SourceRange(TypenameLoc, 619162e1c1b487352434552147967c3dd296ebee2f7Richard Smith SS.isNotEmpty() ? SS.getEndLoc() : TypenameLoc)); 620162e1c1b487352434552147967c3dd296ebee2f7Richard Smith else if (SS.isNotEmpty()) 621162e1c1b487352434552147967c3dd296ebee2f7Richard Smith Diag(SS.getBeginLoc(), diag::err_alias_declaration_not_identifier) 622162e1c1b487352434552147967c3dd296ebee2f7Richard Smith << FixItHint::CreateRemoval(SS.getRange()); 623162e1c1b487352434552147967c3dd296ebee2f7Richard Smith 6243ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar TypeAlias = ParseTypeName(nullptr, TemplateInfo.Kind 6253ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar ? Declarator::AliasTemplateContext 6263ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar : Declarator::AliasDeclContext, 6273ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar AS, &DeclFromDeclSpec, &Attrs); 6283ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar if (OwnedType) 6293ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar *OwnedType = DeclFromDeclSpec; 6302edf0a2520313cde900799b1eb9bd11c9c776afeSean Hunt } else { 6312edf0a2520313cde900799b1eb9bd11c9c776afeSean Hunt // C++11 attributes are not allowed on a using-declaration, but GNU ones 6322edf0a2520313cde900799b1eb9bd11c9c776afeSean Hunt // are. 6335eed7e00b4ac8d589ca83e126dafa8767e8a0358Richard Smith ProhibitAttributes(MisplacedAttrs); 6346b3d3e54c003b03f16e235ad2ff49e95587bbf92Richard Smith ProhibitAttributes(Attrs); 6352edf0a2520313cde900799b1eb9bd11c9c776afeSean Hunt 636162e1c1b487352434552147967c3dd296ebee2f7Richard Smith // Parse (optional) attributes (most likely GNU strong-using extension). 6376b3d3e54c003b03f16e235ad2ff49e95587bbf92Richard Smith MaybeParseGNUAttributes(Attrs); 6382edf0a2520313cde900799b1eb9bd11c9c776afeSean Hunt } 6391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6409cfbe48a7a20a217fdb2920b29b67ae7941cb116Douglas Gregor // Eat ';'. 6419cfbe48a7a20a217fdb2920b29b67ae7941cb116Douglas Gregor DeclEnd = Tok.getLocation(); 642651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (ExpectAndConsume(tok::semi, diag::err_expected_after, 643651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines !Attrs.empty() ? "attributes list" 644651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines : IsAliasDecl ? "alias declaration" 645651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines : "using declaration")) 646651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines SkipUntil(tok::semi); 6479cfbe48a7a20a217fdb2920b29b67ae7941cb116Douglas Gregor 64878b810559d89e996e00684335407443936ce34a1John McCall // Diagnose an attempt to declare a templated using-declaration. 649d03de6aaa312d57dcd6e2bc76bed1e89f5c5019dRichard Smith // In C++11, alias-declarations can be templates: 650162e1c1b487352434552147967c3dd296ebee2f7Richard Smith // template <...> using id = type; 6513e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith if (TemplateInfo.Kind && !IsAliasDecl) { 65278b810559d89e996e00684335407443936ce34a1John McCall SourceRange R = TemplateInfo.getSourceRange(); 65387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Diag(UsingLoc, diag::err_templated_using_directive_declaration) 65487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar << 1 /* declaration */ << R << FixItHint::CreateRemoval(R); 65578b810559d89e996e00684335407443936ce34a1John McCall 65678b810559d89e996e00684335407443936ce34a1John McCall // Unfortunately, we have to bail out instead of recovering by 65778b810559d89e996e00684335407443936ce34a1John McCall // ignoring the parameters, just in case the nested name specifier 65878b810559d89e996e00684335407443936ce34a1John McCall // depends on the parameters. 6596bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 66078b810559d89e996e00684335407443936ce34a1John McCall } 66178b810559d89e996e00684335407443936ce34a1John McCall 662480b53cfff18c40d10fcb09b0185a9b75dfd491eDouglas Gregor // "typename" keyword is allowed for identifiers only, 663480b53cfff18c40d10fcb09b0185a9b75dfd491eDouglas Gregor // because it may be a type definition. 6648d030c7a6f36438f6c7dd977f8be0de0cc781ad5Enea Zaffanella if (HasTypenameKeyword && Name.getKind() != UnqualifiedId::IK_Identifier) { 665480b53cfff18c40d10fcb09b0185a9b75dfd491eDouglas Gregor Diag(Name.getSourceRange().getBegin(), diag::err_typename_identifiers_only) 666480b53cfff18c40d10fcb09b0185a9b75dfd491eDouglas Gregor << FixItHint::CreateRemoval(SourceRange(TypenameLoc)); 6678d030c7a6f36438f6c7dd977f8be0de0cc781ad5Enea Zaffanella // Proceed parsing, but reset the HasTypenameKeyword flag. 6688d030c7a6f36438f6c7dd977f8be0de0cc781ad5Enea Zaffanella HasTypenameKeyword = false; 669480b53cfff18c40d10fcb09b0185a9b75dfd491eDouglas Gregor } 670480b53cfff18c40d10fcb09b0185a9b75dfd491eDouglas Gregor 6713e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith if (IsAliasDecl) { 6723e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith TemplateParameterLists *TemplateParams = TemplateInfo.TemplateParams; 6735354e77e60e82828c7c2361f5c688c2667ab59ccBenjamin Kramer MultiTemplateParamsArg TemplateParamsArg( 6746bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines TemplateParams ? TemplateParams->data() : nullptr, 6753e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith TemplateParams ? TemplateParams->size() : 0); 6763e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith return Actions.ActOnAliasDeclaration(getCurScope(), AS, TemplateParamsArg, 6776b3d3e54c003b03f16e235ad2ff49e95587bbf92Richard Smith UsingLoc, Name, Attrs.getList(), 6783ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar TypeAlias, DeclFromDeclSpec); 6793e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith } 680162e1c1b487352434552147967c3dd296ebee2f7Richard Smith 6818d030c7a6f36438f6c7dd977f8be0de0cc781ad5Enea Zaffanella return Actions.ActOnUsingDeclaration(getCurScope(), AS, 6828d030c7a6f36438f6c7dd977f8be0de0cc781ad5Enea Zaffanella /* HasUsingKeyword */ true, UsingLoc, 6838d030c7a6f36438f6c7dd977f8be0de0cc781ad5Enea Zaffanella SS, Name, Attrs.getList(), 6848d030c7a6f36438f6c7dd977f8be0de0cc781ad5Enea Zaffanella HasTypenameKeyword, TypenameLoc); 685f780abc21c39cd4731b9e38f2d2d9f7d1510bd7bDouglas Gregor} 686f780abc21c39cd4731b9e38f2d2d9f7d1510bd7bDouglas Gregor 687ffbe9b9c64ab2e94b9d48ec56e511f75826fc80aBenjamin Kramer/// ParseStaticAssertDeclaration - Parse C++0x or C11 static_assert-declaration. 688511d7aba3b12853fdb88729a0313b80a60eab8adAnders Carlsson/// 689c6eb44b321c543c5bcf28727228a0cceced57e2ePeter Collingbourne/// [C++0x] static_assert-declaration: 690c6eb44b321c543c5bcf28727228a0cceced57e2ePeter Collingbourne/// static_assert ( constant-expression , string-literal ) ; 691c6eb44b321c543c5bcf28727228a0cceced57e2ePeter Collingbourne/// 692ffbe9b9c64ab2e94b9d48ec56e511f75826fc80aBenjamin Kramer/// [C11] static_assert-declaration: 693c6eb44b321c543c5bcf28727228a0cceced57e2ePeter Collingbourne/// _Static_assert ( constant-expression , string-literal ) ; 694511d7aba3b12853fdb88729a0313b80a60eab8adAnders Carlsson/// 695d226f65006733ed7f709c3174f22ce33391cb58fJohn McCallDecl *Parser::ParseStaticAssertDeclaration(SourceLocation &DeclEnd){ 69687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar assert(Tok.isOneOf(tok::kw_static_assert, tok::kw__Static_assert) && 697c6eb44b321c543c5bcf28727228a0cceced57e2ePeter Collingbourne "Not a static_assert declaration"); 698c6eb44b321c543c5bcf28727228a0cceced57e2ePeter Collingbourne 6994e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (Tok.is(tok::kw__Static_assert) && !getLangOpts().C11) 700ffbe9b9c64ab2e94b9d48ec56e511f75826fc80aBenjamin Kramer Diag(Tok, diag::ext_c11_static_assert); 701841804baff6ea8ba1904a2ba81265aae1479e882Richard Smith if (Tok.is(tok::kw_static_assert)) 702841804baff6ea8ba1904a2ba81265aae1479e882Richard Smith Diag(Tok, diag::warn_cxx98_compat_static_assert); 703c6eb44b321c543c5bcf28727228a0cceced57e2ePeter Collingbourne 704511d7aba3b12853fdb88729a0313b80a60eab8adAnders Carlsson SourceLocation StaticAssertLoc = ConsumeToken(); 7051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7064a8dfb511e8f84b2e38b7a86d8ddf05ac1e1a41bDouglas Gregor BalancedDelimiterTracker T(*this, tok::l_paren); 7074a8dfb511e8f84b2e38b7a86d8ddf05ac1e1a41bDouglas Gregor if (T.consumeOpen()) { 708651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Diag(Tok, diag::err_expected) << tok::l_paren; 7093686c71ff92e4357a78993a16a27185f16ab6234Richard Smith SkipMalformedDecl(); 7106bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 711511d7aba3b12853fdb88729a0313b80a60eab8adAnders Carlsson } 7121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 71360d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult AssertExpr(ParseConstantExpression()); 714511d7aba3b12853fdb88729a0313b80a60eab8adAnders Carlsson if (AssertExpr.isInvalid()) { 7153686c71ff92e4357a78993a16a27185f16ab6234Richard Smith SkipMalformedDecl(); 7166bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 717511d7aba3b12853fdb88729a0313b80a60eab8adAnders Carlsson } 7181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 719c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines ExprResult AssertMessage; 720c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines if (Tok.is(tok::r_paren)) { 721c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines Diag(Tok, getLangOpts().CPlusPlus1z 722176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines ? diag::warn_cxx14_compat_static_assert_no_message 723c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines : diag::ext_static_assert_no_message) 724c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines << (getLangOpts().CPlusPlus1z 725c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines ? FixItHint() 726c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines : FixItHint::CreateInsertion(Tok.getLocation(), ", \"\"")); 727c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines } else { 728c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines if (ExpectAndConsume(tok::comma)) { 729c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines SkipUntil(tok::semi); 730c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines return nullptr; 731c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines } 732ad5f960f9e42568a87bf5e03dce7ad878f9ba6daAnders Carlsson 733c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines if (!isTokenStringLiteral()) { 734c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines Diag(Tok, diag::err_expected_string_literal) 735c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines << /*Source='static_assert'*/1; 736c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines SkipMalformedDecl(); 737c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines return nullptr; 738c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines } 7391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 740c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines AssertMessage = ParseStringLiteralExpression(); 741c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines if (AssertMessage.isInvalid()) { 742c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines SkipMalformedDecl(); 743c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines return nullptr; 744c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines } 74599831e4677a7e2e051af636221694d60ba31fcdbRichard Smith } 746511d7aba3b12853fdb88729a0313b80a60eab8adAnders Carlsson 7474a8dfb511e8f84b2e38b7a86d8ddf05ac1e1a41bDouglas Gregor T.consumeClose(); 7481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 74997144fc41a9419bf6d74fc9450e8ef3f6e11f7e0Chris Lattner DeclEnd = Tok.getLocation(); 7509ba23b4ceacd77cd264501690a7a9e94184ef71bDouglas Gregor ExpectAndConsumeSemi(diag::err_expected_semi_after_static_assert); 751511d7aba3b12853fdb88729a0313b80a60eab8adAnders Carlsson 7529ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return Actions.ActOnStaticAssertDeclaration(StaticAssertLoc, 753c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines AssertExpr.get(), 754c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines AssertMessage.get(), 7554a8dfb511e8f84b2e38b7a86d8ddf05ac1e1a41bDouglas Gregor T.getCloseLocation()); 756511d7aba3b12853fdb88729a0313b80a60eab8adAnders Carlsson} 757511d7aba3b12853fdb88729a0313b80a60eab8adAnders Carlsson 758a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith/// ParseDecltypeSpecifier - Parse a C++11 decltype specifier. 7596fd634f4ac59f5923cffadadb99d19f23c18707aAnders Carlsson/// 7606fd634f4ac59f5923cffadadb99d19f23c18707aAnders Carlsson/// 'decltype' ( expression ) 761a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith/// 'decltype' ( 'auto' ) [C++1y] 7626fd634f4ac59f5923cffadadb99d19f23c18707aAnders Carlsson/// 76342d6d0c91ab089cb252ab2f91c16d4557f458a2cDavid BlaikieSourceLocation Parser::ParseDecltypeSpecifier(DeclSpec &DS) { 76487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar assert(Tok.isOneOf(tok::kw_decltype, tok::annot_decltype) 76542d6d0c91ab089cb252ab2f91c16d4557f458a2cDavid Blaikie && "Not a decltype specifier"); 76642d6d0c91ab089cb252ab2f91c16d4557f458a2cDavid Blaikie 76742d6d0c91ab089cb252ab2f91c16d4557f458a2cDavid Blaikie ExprResult Result; 76842d6d0c91ab089cb252ab2f91c16d4557f458a2cDavid Blaikie SourceLocation StartLoc = Tok.getLocation(); 76942d6d0c91ab089cb252ab2f91c16d4557f458a2cDavid Blaikie SourceLocation EndLoc; 7701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 77142d6d0c91ab089cb252ab2f91c16d4557f458a2cDavid Blaikie if (Tok.is(tok::annot_decltype)) { 77242d6d0c91ab089cb252ab2f91c16d4557f458a2cDavid Blaikie Result = getExprAnnotation(Tok); 77342d6d0c91ab089cb252ab2f91c16d4557f458a2cDavid Blaikie EndLoc = Tok.getAnnotationEndLoc(); 77442d6d0c91ab089cb252ab2f91c16d4557f458a2cDavid Blaikie ConsumeToken(); 77542d6d0c91ab089cb252ab2f91c16d4557f458a2cDavid Blaikie if (Result.isInvalid()) { 77642d6d0c91ab089cb252ab2f91c16d4557f458a2cDavid Blaikie DS.SetTypeSpecError(); 77742d6d0c91ab089cb252ab2f91c16d4557f458a2cDavid Blaikie return EndLoc; 77842d6d0c91ab089cb252ab2f91c16d4557f458a2cDavid Blaikie } 77942d6d0c91ab089cb252ab2f91c16d4557f458a2cDavid Blaikie } else { 780c7b5543ad32a5c265c02e71b2a6f9856440ed13fRichard Smith if (Tok.getIdentifierInfo()->isStr("decltype")) 781c7b5543ad32a5c265c02e71b2a6f9856440ed13fRichard Smith Diag(Tok, diag::warn_cxx98_compat_decltype); 78239304fad1c8a7b7e64121e9ae544b18e460b682cRichard Smith 78342d6d0c91ab089cb252ab2f91c16d4557f458a2cDavid Blaikie ConsumeToken(); 7841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 78542d6d0c91ab089cb252ab2f91c16d4557f458a2cDavid Blaikie BalancedDelimiterTracker T(*this, tok::l_paren); 78642d6d0c91ab089cb252ab2f91c16d4557f458a2cDavid Blaikie if (T.expectAndConsume(diag::err_expected_lparen_after, 78742d6d0c91ab089cb252ab2f91c16d4557f458a2cDavid Blaikie "decltype", tok::r_paren)) { 78842d6d0c91ab089cb252ab2f91c16d4557f458a2cDavid Blaikie DS.SetTypeSpecError(); 78942d6d0c91ab089cb252ab2f91c16d4557f458a2cDavid Blaikie return T.getOpenLocation() == Tok.getLocation() ? 79042d6d0c91ab089cb252ab2f91c16d4557f458a2cDavid Blaikie StartLoc : T.getOpenLocation(); 79142d6d0c91ab089cb252ab2f91c16d4557f458a2cDavid Blaikie } 7921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 793a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith // Check for C++1y 'decltype(auto)'. 794a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith if (Tok.is(tok::kw_auto)) { 795a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith // No need to disambiguate here: an expression can't start with 'auto', 796a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith // because the typename-specifier in a function-style cast operation can't 797a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith // be 'auto'. 798a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith Diag(Tok.getLocation(), 799176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines getLangOpts().CPlusPlus14 800a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith ? diag::warn_cxx11_compat_decltype_auto_type_specifier 801a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith : diag::ext_decltype_auto_type_specifier); 802a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith ConsumeToken(); 803a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith } else { 804a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith // Parse the expression 805a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith 806a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith // C++11 [dcl.type.simple]p4: 807a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith // The operand of the decltype specifier is an unevaluated operand. 808a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith EnterExpressionEvaluationContext Unevaluated(Actions, Sema::Unevaluated, 8096bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines nullptr,/*IsDecltype=*/true); 81058878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar Result = 81158878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar Actions.CorrectDelayedTyposInExpr(ParseExpression(), [](Expr *E) { 81258878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar return E->hasPlaceholderType() ? ExprError() : E; 81358878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar }); 814a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith if (Result.isInvalid()) { 815a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith DS.SetTypeSpecError(); 8168fe2475a4b4c00475709c13d43eb9a57cce87cbcAlexey Bataev if (SkipUntil(tok::r_paren, StopAtSemi | StopBeforeMatch)) { 817a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith EndLoc = ConsumeParen(); 8181e584697aa795f915cd46afefd4e1141ee356b8cArgyrios Kyrtzidis } else { 819a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith if (PP.isBacktrackEnabled() && Tok.is(tok::semi)) { 820a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith // Backtrack to get the location of the last token before the semi. 821a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith PP.RevertCachedTokens(2); 822a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith ConsumeToken(); // the semi. 823a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith EndLoc = ConsumeAnyToken(); 824a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith assert(Tok.is(tok::semi)); 825a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith } else { 826a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith EndLoc = Tok.getLocation(); 827a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith } 8281e584697aa795f915cd46afefd4e1141ee356b8cArgyrios Kyrtzidis } 829a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith return EndLoc; 8301e584697aa795f915cd46afefd4e1141ee356b8cArgyrios Kyrtzidis } 831a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith 832c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines Result = Actions.ActOnDecltypeExpression(Result.get()); 83342d6d0c91ab089cb252ab2f91c16d4557f458a2cDavid Blaikie } 83442d6d0c91ab089cb252ab2f91c16d4557f458a2cDavid Blaikie 83542d6d0c91ab089cb252ab2f91c16d4557f458a2cDavid Blaikie // Match the ')' 83642d6d0c91ab089cb252ab2f91c16d4557f458a2cDavid Blaikie T.consumeClose(); 83742d6d0c91ab089cb252ab2f91c16d4557f458a2cDavid Blaikie if (T.getCloseLocation().isInvalid()) { 83842d6d0c91ab089cb252ab2f91c16d4557f458a2cDavid Blaikie DS.SetTypeSpecError(); 83942d6d0c91ab089cb252ab2f91c16d4557f458a2cDavid Blaikie // FIXME: this should return the location of the last token 84042d6d0c91ab089cb252ab2f91c16d4557f458a2cDavid Blaikie // that was consumed (by "consumeClose()") 84142d6d0c91ab089cb252ab2f91c16d4557f458a2cDavid Blaikie return T.getCloseLocation(); 84242d6d0c91ab089cb252ab2f91c16d4557f458a2cDavid Blaikie } 84342d6d0c91ab089cb252ab2f91c16d4557f458a2cDavid Blaikie 84476f3f69db1416425070177243e9f390122c553e0Richard Smith if (Result.isInvalid()) { 84576f3f69db1416425070177243e9f390122c553e0Richard Smith DS.SetTypeSpecError(); 84676f3f69db1416425070177243e9f390122c553e0Richard Smith return T.getCloseLocation(); 84776f3f69db1416425070177243e9f390122c553e0Richard Smith } 84876f3f69db1416425070177243e9f390122c553e0Richard Smith 84942d6d0c91ab089cb252ab2f91c16d4557f458a2cDavid Blaikie EndLoc = T.getCloseLocation(); 85042d6d0c91ab089cb252ab2f91c16d4557f458a2cDavid Blaikie } 851a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith assert(!Result.isInvalid()); 8526fd634f4ac59f5923cffadadb99d19f23c18707aAnders Carlsson 8536bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines const char *PrevSpec = nullptr; 854fec54013fcd0eb72642741584ca04c1bc292bef8John McCall unsigned DiagID; 855651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines const PrintingPolicy &Policy = Actions.getASTContext().getPrintingPolicy(); 8566fd634f4ac59f5923cffadadb99d19f23c18707aAnders Carlsson // Check for duplicate type specifiers (e.g. "int decltype(a)"). 857a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith if (Result.get() 858a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith ? DS.SetTypeSpecType(DeclSpec::TST_decltype, StartLoc, PrevSpec, 859c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines DiagID, Result.get(), Policy) 860a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith : DS.SetTypeSpecType(DeclSpec::TST_decltype_auto, StartLoc, PrevSpec, 861651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines DiagID, Policy)) { 862fec54013fcd0eb72642741584ca04c1bc292bef8John McCall Diag(StartLoc, DiagID) << PrevSpec; 86342d6d0c91ab089cb252ab2f91c16d4557f458a2cDavid Blaikie DS.SetTypeSpecError(); 86442d6d0c91ab089cb252ab2f91c16d4557f458a2cDavid Blaikie } 86542d6d0c91ab089cb252ab2f91c16d4557f458a2cDavid Blaikie return EndLoc; 86642d6d0c91ab089cb252ab2f91c16d4557f458a2cDavid Blaikie} 86742d6d0c91ab089cb252ab2f91c16d4557f458a2cDavid Blaikie 86842d6d0c91ab089cb252ab2f91c16d4557f458a2cDavid Blaikievoid Parser::AnnotateExistingDecltypeSpecifier(const DeclSpec& DS, 86942d6d0c91ab089cb252ab2f91c16d4557f458a2cDavid Blaikie SourceLocation StartLoc, 87042d6d0c91ab089cb252ab2f91c16d4557f458a2cDavid Blaikie SourceLocation EndLoc) { 87142d6d0c91ab089cb252ab2f91c16d4557f458a2cDavid Blaikie // make sure we have a token we can turn into an annotation token 87242d6d0c91ab089cb252ab2f91c16d4557f458a2cDavid Blaikie if (PP.isBacktrackEnabled()) 87342d6d0c91ab089cb252ab2f91c16d4557f458a2cDavid Blaikie PP.RevertCachedTokens(1); 87442d6d0c91ab089cb252ab2f91c16d4557f458a2cDavid Blaikie else 87542d6d0c91ab089cb252ab2f91c16d4557f458a2cDavid Blaikie PP.EnterToken(Tok); 87642d6d0c91ab089cb252ab2f91c16d4557f458a2cDavid Blaikie 87742d6d0c91ab089cb252ab2f91c16d4557f458a2cDavid Blaikie Tok.setKind(tok::annot_decltype); 878a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith setExprAnnotation(Tok, 879a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith DS.getTypeSpecType() == TST_decltype ? DS.getRepAsExpr() : 880a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith DS.getTypeSpecType() == TST_decltype_auto ? ExprResult() : 881a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith ExprError()); 88242d6d0c91ab089cb252ab2f91c16d4557f458a2cDavid Blaikie Tok.setAnnotationEndLoc(EndLoc); 88342d6d0c91ab089cb252ab2f91c16d4557f458a2cDavid Blaikie Tok.setLocation(StartLoc); 88442d6d0c91ab089cb252ab2f91c16d4557f458a2cDavid Blaikie PP.AnnotateCachedTokens(Tok); 8856fd634f4ac59f5923cffadadb99d19f23c18707aAnders Carlsson} 8866fd634f4ac59f5923cffadadb99d19f23c18707aAnders Carlsson 887db5d44b775c60166074acd184ca9f1981c10c2a7Sean Huntvoid Parser::ParseUnderlyingTypeSpecifier(DeclSpec &DS) { 888db5d44b775c60166074acd184ca9f1981c10c2a7Sean Hunt assert(Tok.is(tok::kw___underlying_type) && 889db5d44b775c60166074acd184ca9f1981c10c2a7Sean Hunt "Not an underlying type specifier"); 890db5d44b775c60166074acd184ca9f1981c10c2a7Sean Hunt 891db5d44b775c60166074acd184ca9f1981c10c2a7Sean Hunt SourceLocation StartLoc = ConsumeToken(); 8924a8dfb511e8f84b2e38b7a86d8ddf05ac1e1a41bDouglas Gregor BalancedDelimiterTracker T(*this, tok::l_paren); 8934a8dfb511e8f84b2e38b7a86d8ddf05ac1e1a41bDouglas Gregor if (T.expectAndConsume(diag::err_expected_lparen_after, 8944a8dfb511e8f84b2e38b7a86d8ddf05ac1e1a41bDouglas Gregor "__underlying_type", tok::r_paren)) { 895db5d44b775c60166074acd184ca9f1981c10c2a7Sean Hunt return; 896db5d44b775c60166074acd184ca9f1981c10c2a7Sean Hunt } 897db5d44b775c60166074acd184ca9f1981c10c2a7Sean Hunt 898db5d44b775c60166074acd184ca9f1981c10c2a7Sean Hunt TypeResult Result = ParseTypeName(); 899db5d44b775c60166074acd184ca9f1981c10c2a7Sean Hunt if (Result.isInvalid()) { 9008fe2475a4b4c00475709c13d43eb9a57cce87cbcAlexey Bataev SkipUntil(tok::r_paren, StopAtSemi); 901db5d44b775c60166074acd184ca9f1981c10c2a7Sean Hunt return; 902db5d44b775c60166074acd184ca9f1981c10c2a7Sean Hunt } 903db5d44b775c60166074acd184ca9f1981c10c2a7Sean Hunt 904db5d44b775c60166074acd184ca9f1981c10c2a7Sean Hunt // Match the ')' 9054a8dfb511e8f84b2e38b7a86d8ddf05ac1e1a41bDouglas Gregor T.consumeClose(); 9064a8dfb511e8f84b2e38b7a86d8ddf05ac1e1a41bDouglas Gregor if (T.getCloseLocation().isInvalid()) 907db5d44b775c60166074acd184ca9f1981c10c2a7Sean Hunt return; 908db5d44b775c60166074acd184ca9f1981c10c2a7Sean Hunt 9096bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines const char *PrevSpec = nullptr; 910db5d44b775c60166074acd184ca9f1981c10c2a7Sean Hunt unsigned DiagID; 911ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt if (DS.SetTypeSpecType(DeclSpec::TST_underlyingType, StartLoc, PrevSpec, 912c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines DiagID, Result.get(), 913651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Actions.getASTContext().getPrintingPolicy())) 914db5d44b775c60166074acd184ca9f1981c10c2a7Sean Hunt Diag(StartLoc, DiagID) << PrevSpec; 9152d77634e839880704d51656bebd1d2daff661d4eEnea Zaffanella DS.setTypeofParensRange(T.getRange()); 916db5d44b775c60166074acd184ca9f1981c10c2a7Sean Hunt} 917db5d44b775c60166074acd184ca9f1981c10c2a7Sean Hunt 91809048df0b3f472091b2204e531d6b6019244884bDavid Blaikie/// ParseBaseTypeSpecifier - Parse a C++ base-type-specifier which is either a 91909048df0b3f472091b2204e531d6b6019244884bDavid Blaikie/// class name or decltype-specifier. Note that we only check that the result 92009048df0b3f472091b2204e531d6b6019244884bDavid Blaikie/// names a type; semantic analysis will need to verify that the type names a 92109048df0b3f472091b2204e531d6b6019244884bDavid Blaikie/// class. The result is either a type or null, depending on whether a type 92209048df0b3f472091b2204e531d6b6019244884bDavid Blaikie/// name was found. 92342a552f8200ba5948661aee0106fce0c04e39818Douglas Gregor/// 924053214013990ad8ec096dafc64aa7c0ad2b05bc0Richard Smith/// base-type-specifier: [C++11 class.derived] 92509048df0b3f472091b2204e531d6b6019244884bDavid Blaikie/// class-or-decltype 926053214013990ad8ec096dafc64aa7c0ad2b05bc0Richard Smith/// class-or-decltype: [C++11 class.derived] 92709048df0b3f472091b2204e531d6b6019244884bDavid Blaikie/// nested-name-specifier[opt] class-name 92809048df0b3f472091b2204e531d6b6019244884bDavid Blaikie/// decltype-specifier 929053214013990ad8ec096dafc64aa7c0ad2b05bc0Richard Smith/// class-name: [C++ class.name] 93042a552f8200ba5948661aee0106fce0c04e39818Douglas Gregor/// identifier 9317f43d6764797ab21216421aeb00f4ec314d503d1Douglas Gregor/// simple-template-id 9321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// 933053214013990ad8ec096dafc64aa7c0ad2b05bc0Richard Smith/// In C++98, instead of base-type-specifier, we have: 934053214013990ad8ec096dafc64aa7c0ad2b05bc0Richard Smith/// 935053214013990ad8ec096dafc64aa7c0ad2b05bc0Richard Smith/// ::[opt] nested-name-specifier[opt] class-name 936176edba5311f6eff0cad2631449885ddf4fbc9eaStephen HinesTypeResult Parser::ParseBaseTypeSpecifier(SourceLocation &BaseLoc, 937176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines SourceLocation &EndLocation) { 9387fe3878a36750515fb9772414ecb2489cf149d19David Blaikie // Ignore attempts to use typename 9397fe3878a36750515fb9772414ecb2489cf149d19David Blaikie if (Tok.is(tok::kw_typename)) { 9407fe3878a36750515fb9772414ecb2489cf149d19David Blaikie Diag(Tok, diag::err_expected_class_name_not_template) 9417fe3878a36750515fb9772414ecb2489cf149d19David Blaikie << FixItHint::CreateRemoval(Tok.getLocation()); 9427fe3878a36750515fb9772414ecb2489cf149d19David Blaikie ConsumeToken(); 9437fe3878a36750515fb9772414ecb2489cf149d19David Blaikie } 9447fe3878a36750515fb9772414ecb2489cf149d19David Blaikie 945152aa4b87633754801598ee282e1a17c3ec49257David Blaikie // Parse optional nested-name-specifier 946152aa4b87633754801598ee282e1a17c3ec49257David Blaikie CXXScopeSpec SS; 9474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ParseOptionalCXXScopeSpecifier(SS, nullptr, /*EnteringContext=*/false); 948152aa4b87633754801598ee282e1a17c3ec49257David Blaikie 949152aa4b87633754801598ee282e1a17c3ec49257David Blaikie BaseLoc = Tok.getLocation(); 950152aa4b87633754801598ee282e1a17c3ec49257David Blaikie 95122216eb4fb0936d2488fc03abd285d135c36ff01David Blaikie // Parse decltype-specifier 95242d6d0c91ab089cb252ab2f91c16d4557f458a2cDavid Blaikie // tok == kw_decltype is just error recovery, it can only happen when SS 95342d6d0c91ab089cb252ab2f91c16d4557f458a2cDavid Blaikie // isn't empty 95487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (Tok.isOneOf(tok::kw_decltype, tok::annot_decltype)) { 955152aa4b87633754801598ee282e1a17c3ec49257David Blaikie if (SS.isNotEmpty()) 956152aa4b87633754801598ee282e1a17c3ec49257David Blaikie Diag(SS.getBeginLoc(), diag::err_unexpected_scope_on_base_decltype) 957152aa4b87633754801598ee282e1a17c3ec49257David Blaikie << FixItHint::CreateRemoval(SS.getRange()); 95822216eb4fb0936d2488fc03abd285d135c36ff01David Blaikie // Fake up a Declarator to use with ActOnTypeName. 95922216eb4fb0936d2488fc03abd285d135c36ff01David Blaikie DeclSpec DS(AttrFactory); 96022216eb4fb0936d2488fc03abd285d135c36ff01David Blaikie 961b57775709666e50cd925f9fc589d0fd895fc79a6David Blaikie EndLocation = ParseDecltypeSpecifier(DS); 96222216eb4fb0936d2488fc03abd285d135c36ff01David Blaikie 96322216eb4fb0936d2488fc03abd285d135c36ff01David Blaikie Declarator DeclaratorInfo(DS, Declarator::TypeNameContext); 96422216eb4fb0936d2488fc03abd285d135c36ff01David Blaikie return Actions.ActOnTypeName(getCurScope(), DeclaratorInfo); 96522216eb4fb0936d2488fc03abd285d135c36ff01David Blaikie } 96622216eb4fb0936d2488fc03abd285d135c36ff01David Blaikie 9677f43d6764797ab21216421aeb00f4ec314d503d1Douglas Gregor // Check whether we have a template-id that names a type. 9687f43d6764797ab21216421aeb00f4ec314d503d1Douglas Gregor if (Tok.is(tok::annot_template_id)) { 96925a767651d14db87aa03dd5fe3e011d877dd4100Argyrios Kyrtzidis TemplateIdAnnotation *TemplateId = takeTemplateIdAnnotation(Tok); 970d9b600c1a589200be905c53e2e10fceb57efa18dDouglas Gregor if (TemplateId->Kind == TNK_Type_template || 971d9b600c1a589200be905c53e2e10fceb57efa18dDouglas Gregor TemplateId->Kind == TNK_Dependent_template_name) { 972059101f922de6eb765601459925f4c8914420b23Douglas Gregor AnnotateTemplateIdTokenAsType(); 9737f43d6764797ab21216421aeb00f4ec314d503d1Douglas Gregor 9747f43d6764797ab21216421aeb00f4ec314d503d1Douglas Gregor assert(Tok.is(tok::annot_typename) && "template-id -> type failed"); 975b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall ParsedType Type = getTypeAnnotation(Tok); 9767f43d6764797ab21216421aeb00f4ec314d503d1Douglas Gregor EndLocation = Tok.getAnnotationEndLoc(); 9777f43d6764797ab21216421aeb00f4ec314d503d1Douglas Gregor ConsumeToken(); 97831a19b6989bbf326d2de5ae12e712e2a65ca9c34Douglas Gregor 97931a19b6989bbf326d2de5ae12e712e2a65ca9c34Douglas Gregor if (Type) 98031a19b6989bbf326d2de5ae12e712e2a65ca9c34Douglas Gregor return Type; 98131a19b6989bbf326d2de5ae12e712e2a65ca9c34Douglas Gregor return true; 9827f43d6764797ab21216421aeb00f4ec314d503d1Douglas Gregor } 9837f43d6764797ab21216421aeb00f4ec314d503d1Douglas Gregor 9847f43d6764797ab21216421aeb00f4ec314d503d1Douglas Gregor // Fall through to produce an error below. 9857f43d6764797ab21216421aeb00f4ec314d503d1Douglas Gregor } 9867f43d6764797ab21216421aeb00f4ec314d503d1Douglas Gregor 98742a552f8200ba5948661aee0106fce0c04e39818Douglas Gregor if (Tok.isNot(tok::identifier)) { 9881ab3b96de160e4fbffec2a776e284a48a3bb543dChris Lattner Diag(Tok, diag::err_expected_class_name); 98931a19b6989bbf326d2de5ae12e712e2a65ca9c34Douglas Gregor return true; 99042a552f8200ba5948661aee0106fce0c04e39818Douglas Gregor } 99142a552f8200ba5948661aee0106fce0c04e39818Douglas Gregor 99284d0a19828599e8623223632d59447fd498999cfDouglas Gregor IdentifierInfo *Id = Tok.getIdentifierInfo(); 99384d0a19828599e8623223632d59447fd498999cfDouglas Gregor SourceLocation IdLoc = ConsumeToken(); 99484d0a19828599e8623223632d59447fd498999cfDouglas Gregor 99584d0a19828599e8623223632d59447fd498999cfDouglas Gregor if (Tok.is(tok::less)) { 99684d0a19828599e8623223632d59447fd498999cfDouglas Gregor // It looks the user intended to write a template-id here, but the 99784d0a19828599e8623223632d59447fd498999cfDouglas Gregor // template-name was wrong. Try to fix that. 99884d0a19828599e8623223632d59447fd498999cfDouglas Gregor TemplateNameKind TNK = TNK_Type_template; 99984d0a19828599e8623223632d59447fd498999cfDouglas Gregor TemplateTy Template; 100023c94dbb6631fecdb55ba401aa93722803d980c6Douglas Gregor if (!Actions.DiagnoseUnknownTemplateName(*Id, IdLoc, getCurScope(), 1001059101f922de6eb765601459925f4c8914420b23Douglas Gregor &SS, Template, TNK)) { 100284d0a19828599e8623223632d59447fd498999cfDouglas Gregor Diag(IdLoc, diag::err_unknown_template_name) 100384d0a19828599e8623223632d59447fd498999cfDouglas Gregor << Id; 100484d0a19828599e8623223632d59447fd498999cfDouglas Gregor } 1005193575455e00eca03fd7177f60e3f2e6263cb661Kovarththanan Rajaratnam 100662f675cf69ca52c163fd9c0564d84356bb7ffca1Serge Pavlov if (!Template) { 100762f675cf69ca52c163fd9c0564d84356bb7ffca1Serge Pavlov TemplateArgList TemplateArgs; 100862f675cf69ca52c163fd9c0564d84356bb7ffca1Serge Pavlov SourceLocation LAngleLoc, RAngleLoc; 10094967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ParseTemplateIdAfterTemplateName(nullptr, IdLoc, SS, true, LAngleLoc, 10104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar TemplateArgs, RAngleLoc); 101184d0a19828599e8623223632d59447fd498999cfDouglas Gregor return true; 101262f675cf69ca52c163fd9c0564d84356bb7ffca1Serge Pavlov } 101384d0a19828599e8623223632d59447fd498999cfDouglas Gregor 1014193575455e00eca03fd7177f60e3f2e6263cb661Kovarththanan Rajaratnam // Form the template name 101584d0a19828599e8623223632d59447fd498999cfDouglas Gregor UnqualifiedId TemplateName; 101684d0a19828599e8623223632d59447fd498999cfDouglas Gregor TemplateName.setIdentifier(Id, IdLoc); 1017193575455e00eca03fd7177f60e3f2e6263cb661Kovarththanan Rajaratnam 101884d0a19828599e8623223632d59447fd498999cfDouglas Gregor // Parse the full template-id, then turn it into a type. 1019e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara if (AnnotateTemplateIdToken(Template, TNK, SS, SourceLocation(), 1020e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara TemplateName, true)) 102184d0a19828599e8623223632d59447fd498999cfDouglas Gregor return true; 102284d0a19828599e8623223632d59447fd498999cfDouglas Gregor if (TNK == TNK_Dependent_template_name) 1023059101f922de6eb765601459925f4c8914420b23Douglas Gregor AnnotateTemplateIdTokenAsType(); 1024193575455e00eca03fd7177f60e3f2e6263cb661Kovarththanan Rajaratnam 102584d0a19828599e8623223632d59447fd498999cfDouglas Gregor // If we didn't end up with a typename token, there's nothing more we 102684d0a19828599e8623223632d59447fd498999cfDouglas Gregor // can do. 102784d0a19828599e8623223632d59447fd498999cfDouglas Gregor if (Tok.isNot(tok::annot_typename)) 102884d0a19828599e8623223632d59447fd498999cfDouglas Gregor return true; 1029193575455e00eca03fd7177f60e3f2e6263cb661Kovarththanan Rajaratnam 103084d0a19828599e8623223632d59447fd498999cfDouglas Gregor // Retrieve the type from the annotation token, consume that token, and 103184d0a19828599e8623223632d59447fd498999cfDouglas Gregor // return. 103284d0a19828599e8623223632d59447fd498999cfDouglas Gregor EndLocation = Tok.getAnnotationEndLoc(); 1033b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall ParsedType Type = getTypeAnnotation(Tok); 103484d0a19828599e8623223632d59447fd498999cfDouglas Gregor ConsumeToken(); 103584d0a19828599e8623223632d59447fd498999cfDouglas Gregor return Type; 103684d0a19828599e8623223632d59447fd498999cfDouglas Gregor } 103784d0a19828599e8623223632d59447fd498999cfDouglas Gregor 103842a552f8200ba5948661aee0106fce0c04e39818Douglas Gregor // We have an identifier; check whether it is actually a type. 10396bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines IdentifierInfo *CorrectedII = nullptr; 10404967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ParsedType Type = 10414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Actions.getTypeName(*Id, IdLoc, getCurScope(), &SS, true, false, nullptr, 10424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar /*IsCtorOrDtorName=*/false, 10434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar /*NonTrivialTypeSourceInfo=*/true, &CorrectedII); 1044193575455e00eca03fd7177f60e3f2e6263cb661Kovarththanan Rajaratnam if (!Type) { 1045124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor Diag(IdLoc, diag::err_expected_class_name); 104631a19b6989bbf326d2de5ae12e712e2a65ca9c34Douglas Gregor return true; 104742a552f8200ba5948661aee0106fce0c04e39818Douglas Gregor } 104842a552f8200ba5948661aee0106fce0c04e39818Douglas Gregor 104942a552f8200ba5948661aee0106fce0c04e39818Douglas Gregor // Consume the identifier. 105084d0a19828599e8623223632d59447fd498999cfDouglas Gregor EndLocation = IdLoc; 10515606220447c7901ba8d80147ddab893bb7949dd5Nick Lewycky 10525606220447c7901ba8d80147ddab893bb7949dd5Nick Lewycky // Fake up a Declarator to use with ActOnTypeName. 10530b7e678a11ece4288dc01aebb5b17e5eef8f8d2dJohn McCall DeclSpec DS(AttrFactory); 10545606220447c7901ba8d80147ddab893bb7949dd5Nick Lewycky DS.SetRangeStart(IdLoc); 10555606220447c7901ba8d80147ddab893bb7949dd5Nick Lewycky DS.SetRangeEnd(EndLocation); 1056059101f922de6eb765601459925f4c8914420b23Douglas Gregor DS.getTypeSpecScope() = SS; 10575606220447c7901ba8d80147ddab893bb7949dd5Nick Lewycky 10586bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines const char *PrevSpec = nullptr; 10595606220447c7901ba8d80147ddab893bb7949dd5Nick Lewycky unsigned DiagID; 1060651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines DS.SetTypeSpecType(TST_typename, IdLoc, PrevSpec, DiagID, Type, 1061651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Actions.getASTContext().getPrintingPolicy()); 10625606220447c7901ba8d80147ddab893bb7949dd5Nick Lewycky 10635606220447c7901ba8d80147ddab893bb7949dd5Nick Lewycky Declarator DeclaratorInfo(DS, Declarator::TypeNameContext); 10645606220447c7901ba8d80147ddab893bb7949dd5Nick Lewycky return Actions.ActOnTypeName(getCurScope(), DeclaratorInfo); 106542a552f8200ba5948661aee0106fce0c04e39818Douglas Gregor} 106642a552f8200ba5948661aee0106fce0c04e39818Douglas Gregor 1067c052dbb2d8fe0e23e90d81236aab0f864f712b45John McCallvoid Parser::ParseMicrosoftInheritanceClassAttributes(ParsedAttributes &attrs) { 106887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar while (Tok.isOneOf(tok::kw___single_inheritance, 106987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar tok::kw___multiple_inheritance, 107087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar tok::kw___virtual_inheritance)) { 1071c052dbb2d8fe0e23e90d81236aab0f864f712b45John McCall IdentifierInfo *AttrName = Tok.getIdentifierInfo(); 1072c052dbb2d8fe0e23e90d81236aab0f864f712b45John McCall SourceLocation AttrNameLoc = ConsumeToken(); 10736bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines attrs.addNew(AttrName, AttrNameLoc, nullptr, AttrNameLoc, nullptr, 0, 1074651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines AttributeList::AS_Keyword); 1075c052dbb2d8fe0e23e90d81236aab0f864f712b45John McCall } 1076c052dbb2d8fe0e23e90d81236aab0f864f712b45John McCall} 1077c052dbb2d8fe0e23e90d81236aab0f864f712b45John McCall 1078c9f351700721150a985f21844fbfec55b04e861dRichard Smith/// Determine whether the following tokens are valid after a type-specifier 1079c9f351700721150a985f21844fbfec55b04e861dRichard Smith/// which could be a standalone declaration. This will conservatively return 1080c9f351700721150a985f21844fbfec55b04e861dRichard Smith/// true if there's any doubt, and is appropriate for insert-';' fixits. 1081139be7007eba3bd491ca50297888be507753a95dRichard Smithbool Parser::isValidAfterTypeSpecifier(bool CouldBeBitfield) { 1082c9f351700721150a985f21844fbfec55b04e861dRichard Smith // This switch enumerates the valid "follow" set for type-specifiers. 1083c9f351700721150a985f21844fbfec55b04e861dRichard Smith switch (Tok.getKind()) { 1084c9f351700721150a985f21844fbfec55b04e861dRichard Smith default: break; 1085c9f351700721150a985f21844fbfec55b04e861dRichard Smith case tok::semi: // struct foo {...} ; 1086c9f351700721150a985f21844fbfec55b04e861dRichard Smith case tok::star: // struct foo {...} * P; 1087c9f351700721150a985f21844fbfec55b04e861dRichard Smith case tok::amp: // struct foo {...} & R = ... 1088ba65f505b7cc2551571b299d05d767e0a892aaaeRichard Smith case tok::ampamp: // struct foo {...} && R = ... 1089c9f351700721150a985f21844fbfec55b04e861dRichard Smith case tok::identifier: // struct foo {...} V ; 1090c9f351700721150a985f21844fbfec55b04e861dRichard Smith case tok::r_paren: //(struct foo {...} ) {4} 1091c9f351700721150a985f21844fbfec55b04e861dRichard Smith case tok::annot_cxxscope: // struct foo {...} a:: b; 1092c9f351700721150a985f21844fbfec55b04e861dRichard Smith case tok::annot_typename: // struct foo {...} a ::b; 1093c9f351700721150a985f21844fbfec55b04e861dRichard Smith case tok::annot_template_id: // struct foo {...} a<int> ::b; 1094c9f351700721150a985f21844fbfec55b04e861dRichard Smith case tok::l_paren: // struct foo {...} ( x); 1095c9f351700721150a985f21844fbfec55b04e861dRichard Smith case tok::comma: // __builtin_offsetof(struct foo{...} , 1096ba65f505b7cc2551571b299d05d767e0a892aaaeRichard Smith case tok::kw_operator: // struct foo operator ++() {...} 1097651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines case tok::kw___declspec: // struct foo {...} __declspec(...) 1098176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines case tok::l_square: // void f(struct f [ 3]) 1099176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines case tok::ellipsis: // void f(struct f ... [Ns]) 1100176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // FIXME: we should emit semantic diagnostic when declaration 1101176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // attribute is in type attribute position. 1102176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines case tok::kw___attribute: // struct foo __attribute__((used)) x; 11034967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar case tok::annot_pragma_pack: // struct foo {...} _Pragma(pack(pop)); 11044967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // struct foo {...} _Pragma(section(...)); 11054967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar case tok::annot_pragma_ms_pragma: 11064967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // struct foo {...} _Pragma(vtordisp(pop)); 11074967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar case tok::annot_pragma_ms_vtordisp: 11084967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // struct foo {...} _Pragma(pointers_to_members(...)); 11094967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar case tok::annot_pragma_ms_pointers_to_members: 1110c9f351700721150a985f21844fbfec55b04e861dRichard Smith return true; 1111139be7007eba3bd491ca50297888be507753a95dRichard Smith case tok::colon: 1112139be7007eba3bd491ca50297888be507753a95dRichard Smith return CouldBeBitfield; // enum E { ... } : 2; 11134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // Microsoft compatibility 11144967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar case tok::kw___cdecl: // struct foo {...} __cdecl x; 11154967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar case tok::kw___fastcall: // struct foo {...} __fastcall x; 11164967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar case tok::kw___stdcall: // struct foo {...} __stdcall x; 11174967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar case tok::kw___thiscall: // struct foo {...} __thiscall x; 11184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar case tok::kw___vectorcall: // struct foo {...} __vectorcall x; 11194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // We will diagnose these calling-convention specifiers on non-function 11204967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // declarations later, so claim they are valid after a type specifier. 11214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return getLangOpts().MicrosoftExt; 1122c9f351700721150a985f21844fbfec55b04e861dRichard Smith // Type qualifiers 1123c9f351700721150a985f21844fbfec55b04e861dRichard Smith case tok::kw_const: // struct foo {...} const x; 1124c9f351700721150a985f21844fbfec55b04e861dRichard Smith case tok::kw_volatile: // struct foo {...} volatile x; 1125c9f351700721150a985f21844fbfec55b04e861dRichard Smith case tok::kw_restrict: // struct foo {...} restrict x; 1126176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines case tok::kw__Atomic: // struct foo {...} _Atomic x; 11270e2c34f92f00628d48968dfea096d36381f494cbStephen Hines case tok::kw___unaligned: // struct foo {...} __unaligned *x; 1128ba65f505b7cc2551571b299d05d767e0a892aaaeRichard Smith // Function specifiers 1129ba65f505b7cc2551571b299d05d767e0a892aaaeRichard Smith // Note, no 'explicit'. An explicit function must be either a conversion 1130ba65f505b7cc2551571b299d05d767e0a892aaaeRichard Smith // operator or a constructor. Either way, it can't have a return type. 1131ba65f505b7cc2551571b299d05d767e0a892aaaeRichard Smith case tok::kw_inline: // struct foo inline f(); 1132ba65f505b7cc2551571b299d05d767e0a892aaaeRichard Smith case tok::kw_virtual: // struct foo virtual f(); 1133ba65f505b7cc2551571b299d05d767e0a892aaaeRichard Smith case tok::kw_friend: // struct foo friend f(); 1134c9f351700721150a985f21844fbfec55b04e861dRichard Smith // Storage-class specifiers 1135c9f351700721150a985f21844fbfec55b04e861dRichard Smith case tok::kw_static: // struct foo {...} static x; 1136c9f351700721150a985f21844fbfec55b04e861dRichard Smith case tok::kw_extern: // struct foo {...} extern x; 1137c9f351700721150a985f21844fbfec55b04e861dRichard Smith case tok::kw_typedef: // struct foo {...} typedef x; 1138c9f351700721150a985f21844fbfec55b04e861dRichard Smith case tok::kw_register: // struct foo {...} register x; 1139c9f351700721150a985f21844fbfec55b04e861dRichard Smith case tok::kw_auto: // struct foo {...} auto x; 1140c9f351700721150a985f21844fbfec55b04e861dRichard Smith case tok::kw_mutable: // struct foo {...} mutable x; 1141ba65f505b7cc2551571b299d05d767e0a892aaaeRichard Smith case tok::kw_thread_local: // struct foo {...} thread_local x; 1142c9f351700721150a985f21844fbfec55b04e861dRichard Smith case tok::kw_constexpr: // struct foo {...} constexpr x; 1143c9f351700721150a985f21844fbfec55b04e861dRichard Smith // As shown above, type qualifiers and storage class specifiers absolutely 1144c9f351700721150a985f21844fbfec55b04e861dRichard Smith // can occur after class specifiers according to the grammar. However, 1145c9f351700721150a985f21844fbfec55b04e861dRichard Smith // almost no one actually writes code like this. If we see one of these, 1146c9f351700721150a985f21844fbfec55b04e861dRichard Smith // it is much more likely that someone missed a semi colon and the 1147c9f351700721150a985f21844fbfec55b04e861dRichard Smith // type/storage class specifier we're seeing is part of the *next* 1148c9f351700721150a985f21844fbfec55b04e861dRichard Smith // intended declaration, as in: 1149c9f351700721150a985f21844fbfec55b04e861dRichard Smith // 1150c9f351700721150a985f21844fbfec55b04e861dRichard Smith // struct foo { ... } 1151c9f351700721150a985f21844fbfec55b04e861dRichard Smith // typedef int X; 1152c9f351700721150a985f21844fbfec55b04e861dRichard Smith // 1153c9f351700721150a985f21844fbfec55b04e861dRichard Smith // We'd really like to emit a missing semicolon error instead of emitting 1154c9f351700721150a985f21844fbfec55b04e861dRichard Smith // an error on the 'int' saying that you can't have two type specifiers in 1155c9f351700721150a985f21844fbfec55b04e861dRichard Smith // the same declaration of X. Because of this, we look ahead past this 1156c9f351700721150a985f21844fbfec55b04e861dRichard Smith // token to see if it's a type specifier. If so, we know the code is 1157c9f351700721150a985f21844fbfec55b04e861dRichard Smith // otherwise invalid, so we can produce the expected semi error. 1158c9f351700721150a985f21844fbfec55b04e861dRichard Smith if (!isKnownToBeTypeSpecifier(NextToken())) 1159c9f351700721150a985f21844fbfec55b04e861dRichard Smith return true; 1160c9f351700721150a985f21844fbfec55b04e861dRichard Smith break; 1161c9f351700721150a985f21844fbfec55b04e861dRichard Smith case tok::r_brace: // struct bar { struct foo {...} } 1162c9f351700721150a985f21844fbfec55b04e861dRichard Smith // Missing ';' at end of struct is accepted as an extension in C mode. 1163c9f351700721150a985f21844fbfec55b04e861dRichard Smith if (!getLangOpts().CPlusPlus) 1164c9f351700721150a985f21844fbfec55b04e861dRichard Smith return true; 1165c9f351700721150a985f21844fbfec55b04e861dRichard Smith break; 11668338a9d28c4a9d06b19b1c5df51e70182914e2dfRichard Smith case tok::greater: 11678338a9d28c4a9d06b19b1c5df51e70182914e2dfRichard Smith // template<class T = class X> 11688338a9d28c4a9d06b19b1c5df51e70182914e2dfRichard Smith return getLangOpts().CPlusPlus; 1169c9f351700721150a985f21844fbfec55b04e861dRichard Smith } 1170c9f351700721150a985f21844fbfec55b04e861dRichard Smith return false; 1171c9f351700721150a985f21844fbfec55b04e861dRichard Smith} 1172c9f351700721150a985f21844fbfec55b04e861dRichard Smith 1173e37ac4ff1620ed2d7026f52baccbfa022d79ced1Douglas Gregor/// ParseClassSpecifier - Parse a C++ class-specifier [C++ class] or 1174e37ac4ff1620ed2d7026f52baccbfa022d79ced1Douglas Gregor/// elaborated-type-specifier [C++ dcl.type.elab]; we can't tell which 1175e37ac4ff1620ed2d7026f52baccbfa022d79ced1Douglas Gregor/// until we reach the start of a definition or see a token that 117669730c115c2d0fec2f20609d905d920a5a41b29bRichard Smith/// cannot start a definition. 1177e37ac4ff1620ed2d7026f52baccbfa022d79ced1Douglas Gregor/// 1178e37ac4ff1620ed2d7026f52baccbfa022d79ced1Douglas Gregor/// class-specifier: [C++ class] 1179e37ac4ff1620ed2d7026f52baccbfa022d79ced1Douglas Gregor/// class-head '{' member-specification[opt] '}' 1180e37ac4ff1620ed2d7026f52baccbfa022d79ced1Douglas Gregor/// class-head '{' member-specification[opt] '}' attributes[opt] 1181e37ac4ff1620ed2d7026f52baccbfa022d79ced1Douglas Gregor/// class-head: 1182e37ac4ff1620ed2d7026f52baccbfa022d79ced1Douglas Gregor/// class-key identifier[opt] base-clause[opt] 1183e37ac4ff1620ed2d7026f52baccbfa022d79ced1Douglas Gregor/// class-key nested-name-specifier identifier base-clause[opt] 1184e37ac4ff1620ed2d7026f52baccbfa022d79ced1Douglas Gregor/// class-key nested-name-specifier[opt] simple-template-id 1185e37ac4ff1620ed2d7026f52baccbfa022d79ced1Douglas Gregor/// base-clause[opt] 1186e37ac4ff1620ed2d7026f52baccbfa022d79ced1Douglas Gregor/// [GNU] class-key attributes[opt] identifier[opt] base-clause[opt] 11871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// [GNU] class-key attributes[opt] nested-name-specifier 1188e37ac4ff1620ed2d7026f52baccbfa022d79ced1Douglas Gregor/// identifier base-clause[opt] 11891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// [GNU] class-key attributes[opt] nested-name-specifier[opt] 1190e37ac4ff1620ed2d7026f52baccbfa022d79ced1Douglas Gregor/// simple-template-id base-clause[opt] 1191e37ac4ff1620ed2d7026f52baccbfa022d79ced1Douglas Gregor/// class-key: 1192e37ac4ff1620ed2d7026f52baccbfa022d79ced1Douglas Gregor/// 'class' 1193e37ac4ff1620ed2d7026f52baccbfa022d79ced1Douglas Gregor/// 'struct' 1194e37ac4ff1620ed2d7026f52baccbfa022d79ced1Douglas Gregor/// 'union' 1195e37ac4ff1620ed2d7026f52baccbfa022d79ced1Douglas Gregor/// 1196e37ac4ff1620ed2d7026f52baccbfa022d79ced1Douglas Gregor/// elaborated-type-specifier: [C++ dcl.type.elab] 11971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// class-key ::[opt] nested-name-specifier[opt] identifier 11981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// class-key ::[opt] nested-name-specifier[opt] 'template'[opt] 11991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// simple-template-id 1200e37ac4ff1620ed2d7026f52baccbfa022d79ced1Douglas Gregor/// 1201e37ac4ff1620ed2d7026f52baccbfa022d79ced1Douglas Gregor/// Note that the C++ class-specifier and elaborated-type-specifier, 1202e37ac4ff1620ed2d7026f52baccbfa022d79ced1Douglas Gregor/// together, subsume the C99 struct-or-union-specifier: 1203e37ac4ff1620ed2d7026f52baccbfa022d79ced1Douglas Gregor/// 1204e37ac4ff1620ed2d7026f52baccbfa022d79ced1Douglas Gregor/// struct-or-union-specifier: [C99 6.7.2.1] 1205e37ac4ff1620ed2d7026f52baccbfa022d79ced1Douglas Gregor/// struct-or-union identifier[opt] '{' struct-contents '}' 1206e37ac4ff1620ed2d7026f52baccbfa022d79ced1Douglas Gregor/// struct-or-union identifier 1207e37ac4ff1620ed2d7026f52baccbfa022d79ced1Douglas Gregor/// [GNU] struct-or-union attributes[opt] identifier[opt] '{' struct-contents 1208e37ac4ff1620ed2d7026f52baccbfa022d79ced1Douglas Gregor/// '}' attributes[opt] 1209e37ac4ff1620ed2d7026f52baccbfa022d79ced1Douglas Gregor/// [GNU] struct-or-union attributes[opt] identifier 1210e37ac4ff1620ed2d7026f52baccbfa022d79ced1Douglas Gregor/// struct-or-union: 1211e37ac4ff1620ed2d7026f52baccbfa022d79ced1Douglas Gregor/// 'struct' 1212e37ac4ff1620ed2d7026f52baccbfa022d79ced1Douglas Gregor/// 'union' 12134c97d762d8c5a84f6554e5bfb31d28c90df64158Chris Lattnervoid Parser::ParseClassSpecifier(tok::TokenKind TagTokKind, 12144c97d762d8c5a84f6554e5bfb31d28c90df64158Chris Lattner SourceLocation StartLoc, DeclSpec &DS, 12154d9a16f36d3b768672d50e6d02000f982ae448d7Douglas Gregor const ParsedTemplateInfo &TemplateInfo, 1216efaa93aaa2653f4eb40e6a22e504a448da94aaf8Douglas Gregor AccessSpecifier AS, 12172e39713a3d72c243a2bcd13cc8f5036ba6b487d9Michael Han bool EnteringContext, DeclSpecContext DSC, 1218ad017fa7a4df7389d245d02a49b3c79ed70bedb9Bill Wendling ParsedAttributesWithRange &Attributes) { 121917d35c36fbae764fcd68fa8b31624078a033aabcJoao Matos DeclSpec::TST TagType; 122017d35c36fbae764fcd68fa8b31624078a033aabcJoao Matos if (TagTokKind == tok::kw_struct) 122117d35c36fbae764fcd68fa8b31624078a033aabcJoao Matos TagType = DeclSpec::TST_struct; 122217d35c36fbae764fcd68fa8b31624078a033aabcJoao Matos else if (TagTokKind == tok::kw___interface) 122317d35c36fbae764fcd68fa8b31624078a033aabcJoao Matos TagType = DeclSpec::TST_interface; 122417d35c36fbae764fcd68fa8b31624078a033aabcJoao Matos else if (TagTokKind == tok::kw_class) 122517d35c36fbae764fcd68fa8b31624078a033aabcJoao Matos TagType = DeclSpec::TST_class; 122617d35c36fbae764fcd68fa8b31624078a033aabcJoao Matos else { 12274c97d762d8c5a84f6554e5bfb31d28c90df64158Chris Lattner assert(TagTokKind == tok::kw_union && "Not a class specifier"); 12284c97d762d8c5a84f6554e5bfb31d28c90df64158Chris Lattner TagType = DeclSpec::TST_union; 12294c97d762d8c5a84f6554e5bfb31d28c90df64158Chris Lattner } 1230e37ac4ff1620ed2d7026f52baccbfa022d79ced1Douglas Gregor 1231374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor if (Tok.is(tok::code_completion)) { 1232374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor // Code completion for a struct, class, or union name. 123323c94dbb6631fecdb55ba401aa93722803d980c6Douglas Gregor Actions.CodeCompleteTag(getCurScope(), TagType); 12347d100872341f233c81e1d7b72b40457e62c36862Argyrios Kyrtzidis return cutOffParsing(); 1235374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor } 1236193575455e00eca03fd7177f60e3f2e6263cb661Kovarththanan Rajaratnam 1237926c4b486a08f698cd3a367fd6f1a3a07604358dChandler Carruth // C++03 [temp.explicit] 14.7.2/8: 1238926c4b486a08f698cd3a367fd6f1a3a07604358dChandler Carruth // The usual access checking rules do not apply to names used to specify 1239926c4b486a08f698cd3a367fd6f1a3a07604358dChandler Carruth // explicit instantiations. 1240926c4b486a08f698cd3a367fd6f1a3a07604358dChandler Carruth // 1241926c4b486a08f698cd3a367fd6f1a3a07604358dChandler Carruth // As an extension we do not perform access checking on the names used to 1242926c4b486a08f698cd3a367fd6f1a3a07604358dChandler Carruth // specify explicit specializations either. This is important to allow 1243926c4b486a08f698cd3a367fd6f1a3a07604358dChandler Carruth // specializing traits classes for private types. 124413489673b84fafaaf49cf5ae4e3bb9a945524dcbJohn McCall // 124513489673b84fafaaf49cf5ae4e3bb9a945524dcbJohn McCall // Note that we don't suppress if this turns out to be an elaborated 124613489673b84fafaaf49cf5ae4e3bb9a945524dcbJohn McCall // type specifier. 124713489673b84fafaaf49cf5ae4e3bb9a945524dcbJohn McCall bool shouldDelayDiagsInTag = 124813489673b84fafaaf49cf5ae4e3bb9a945524dcbJohn McCall (TemplateInfo.Kind == ParsedTemplateInfo::ExplicitInstantiation || 124913489673b84fafaaf49cf5ae4e3bb9a945524dcbJohn McCall TemplateInfo.Kind == ParsedTemplateInfo::ExplicitSpecialization); 125013489673b84fafaaf49cf5ae4e3bb9a945524dcbJohn McCall SuppressAccessChecks diagsFromTag(*this, shouldDelayDiagsInTag); 1251926c4b486a08f698cd3a367fd6f1a3a07604358dChandler Carruth 12522edf0a2520313cde900799b1eb9bd11c9c776afeSean Hunt ParsedAttributesWithRange attrs(AttrFactory); 1253e37ac4ff1620ed2d7026f52baccbfa022d79ced1Douglas Gregor // If attributes exist after tag, parse them. 1254df1cce5bcd367ee47f4a7579c3a1cb4618248514Richard Smith MaybeParseGNUAttributes(attrs); 1255b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar MaybeParseMicrosoftDeclSpecs(attrs); 1256193575455e00eca03fd7177f60e3f2e6263cb661Kovarththanan Rajaratnam 1257c052dbb2d8fe0e23e90d81236aab0f864f712b45John McCall // Parse inheritance specifiers. 125887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (Tok.isOneOf(tok::kw___single_inheritance, 125987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar tok::kw___multiple_inheritance, 126087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar tok::kw___virtual_inheritance)) 1261df1cce5bcd367ee47f4a7579c3a1cb4618248514Richard Smith ParseMicrosoftInheritanceClassAttributes(attrs); 1262c052dbb2d8fe0e23e90d81236aab0f864f712b45John McCall 1263bbd37c62e34db3f5a95c899723484a76c71d7757Sean Hunt // If C++0x attributes exist here, parse them. 1264bbd37c62e34db3f5a95c899723484a76c71d7757Sean Hunt // FIXME: Are we consistent with the ordering of parsing of different 1265bbd37c62e34db3f5a95c899723484a76c71d7757Sean Hunt // styles of attributes? 12664e24f0f711e2c9fde79f19fa1c80deaab3f3b356Richard Smith MaybeParseCXX11Attributes(attrs); 12671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 126807fc1ba7553f2f5bf26984091197311decd9028eMichael Han // Source location used by FIXIT to insert misplaced 126907fc1ba7553f2f5bf26984091197311decd9028eMichael Han // C++11 attributes 127007fc1ba7553f2f5bf26984091197311decd9028eMichael Han SourceLocation AttrFixitLoc = Tok.getLocation(); 127107fc1ba7553f2f5bf26984091197311decd9028eMichael Han 1272176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (TagType == DeclSpec::TST_struct && 12730e2c34f92f00628d48968dfea096d36381f494cbStephen Hines Tok.isNot(tok::identifier) && 12740e2c34f92f00628d48968dfea096d36381f494cbStephen Hines !Tok.isAnnotation() && 1275176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Tok.getIdentifierInfo() && 127687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Tok.isOneOf(tok::kw___is_abstract, 127787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar tok::kw___is_arithmetic, 127887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar tok::kw___is_array, 12794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar tok::kw___is_assignable, 128087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar tok::kw___is_base_of, 128187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar tok::kw___is_class, 128287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar tok::kw___is_complete_type, 128387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar tok::kw___is_compound, 128487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar tok::kw___is_const, 128587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar tok::kw___is_constructible, 128687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar tok::kw___is_convertible, 128787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar tok::kw___is_convertible_to, 128887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar tok::kw___is_destructible, 128987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar tok::kw___is_empty, 129087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar tok::kw___is_enum, 129187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar tok::kw___is_floating_point, 129287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar tok::kw___is_final, 129387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar tok::kw___is_function, 129487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar tok::kw___is_fundamental, 129587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar tok::kw___is_integral, 129687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar tok::kw___is_interface_class, 129787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar tok::kw___is_literal, 129887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar tok::kw___is_lvalue_expr, 129987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar tok::kw___is_lvalue_reference, 130087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar tok::kw___is_member_function_pointer, 130187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar tok::kw___is_member_object_pointer, 130287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar tok::kw___is_member_pointer, 130387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar tok::kw___is_nothrow_assignable, 130487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar tok::kw___is_nothrow_constructible, 130587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar tok::kw___is_nothrow_destructible, 130687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar tok::kw___is_object, 130787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar tok::kw___is_pod, 130887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar tok::kw___is_pointer, 130987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar tok::kw___is_polymorphic, 131087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar tok::kw___is_reference, 131187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar tok::kw___is_rvalue_expr, 131287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar tok::kw___is_rvalue_reference, 131387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar tok::kw___is_same, 131487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar tok::kw___is_scalar, 131587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar tok::kw___is_sealed, 131687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar tok::kw___is_signed, 131787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar tok::kw___is_standard_layout, 131887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar tok::kw___is_trivial, 131987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar tok::kw___is_trivially_assignable, 132087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar tok::kw___is_trivially_constructible, 132187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar tok::kw___is_trivially_copyable, 132287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar tok::kw___is_union, 132387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar tok::kw___is_unsigned, 132487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar tok::kw___is_void, 132587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar tok::kw___is_volatile)) 1326176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // GNU libstdc++ 4.2 and libc++ use certain intrinsic names as the 1327176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // name of struct templates, but some are keywords in GCC >= 4.3 1328176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // and Clang. Therefore, when we see the token sequence "struct 1329176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // X", make X into a normal identifier rather than a keyword, to 1330176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // allow libstdc++ 4.2 and libc++ to work properly. 1331176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines TryKeywordIdentFallback(true); 13321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 133387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar struct PreserveAtomicIdentifierInfoRAII { 133487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar PreserveAtomicIdentifierInfoRAII(Token &Tok, bool Enabled) 133587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar : AtomicII(nullptr) { 133687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (!Enabled) 133787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return; 133887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar assert(Tok.is(tok::kw__Atomic)); 133987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar AtomicII = Tok.getIdentifierInfo(); 134087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar AtomicII->revertTokenIDToIdentifier(); 134187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Tok.setKind(tok::identifier); 134287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 134387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar ~PreserveAtomicIdentifierInfoRAII() { 134487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (!AtomicII) 134587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return; 134687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar AtomicII->revertIdentifierToTokenID(tok::kw__Atomic); 134787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 134887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar IdentifierInfo *AtomicII; 134987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar }; 135087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 135187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // HACK: MSVC doesn't consider _Atomic to be a keyword and its STL 135287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // implementation for VS2013 uses _Atomic as an identifier for one of the 135387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // classes in <atomic>. When we are parsing 'struct _Atomic', don't consider 135487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // '_Atomic' to be a keyword. We are careful to undo this so that clang can 135587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // use '_Atomic' in its own header files. 135687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar bool ShouldChangeAtomicToIdentifier = getLangOpts().MSVCCompat && 135787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Tok.is(tok::kw__Atomic) && 135887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar TagType == DeclSpec::TST_struct; 135987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar PreserveAtomicIdentifierInfoRAII AtomicTokenGuard( 136087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Tok, ShouldChangeAtomicToIdentifier); 136187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 1362eb83ecde1a822b1c38cd060a85a08c1ac9f82cf8Argyrios Kyrtzidis // Parse the (optional) nested-name-specifier. 1363aa87d33309f505b68c3bfc17486c93e4d224b24fJohn McCall CXXScopeSpec &SS = DS.getTypeSpecScope(); 13644e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (getLangOpts().CPlusPlus) { 1365176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // "FOO : BAR" is not a potential typo for "FOO::BAR". In this context it 1366176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // is a base-specifier-list. 136708d92ecf6e5b1fd23177a08c2312b58d63d863dbChris Lattner ColonProtectionRAIIObject X(*this); 1368193575455e00eca03fd7177f60e3f2e6263cb661Kovarththanan Rajaratnam 13690e2c34f92f00628d48968dfea096d36381f494cbStephen Hines CXXScopeSpec Spec; 13700e2c34f92f00628d48968dfea096d36381f494cbStephen Hines bool HasValidSpec = true; 13714967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (ParseOptionalCXXScopeSpecifier(Spec, nullptr, EnteringContext)) { 1372207014eb2b372aa33721e86d90a8a586ba8dc8aeJohn McCall DS.SetTypeSpecError(); 13730e2c34f92f00628d48968dfea096d36381f494cbStephen Hines HasValidSpec = false; 13740e2c34f92f00628d48968dfea096d36381f494cbStephen Hines } 13750e2c34f92f00628d48968dfea096d36381f494cbStephen Hines if (Spec.isSet()) 13760e2c34f92f00628d48968dfea096d36381f494cbStephen Hines if (Tok.isNot(tok::identifier) && Tok.isNot(tok::annot_template_id)) { 1377651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Diag(Tok, diag::err_expected) << tok::identifier; 13780e2c34f92f00628d48968dfea096d36381f494cbStephen Hines HasValidSpec = false; 13790e2c34f92f00628d48968dfea096d36381f494cbStephen Hines } 13800e2c34f92f00628d48968dfea096d36381f494cbStephen Hines if (HasValidSpec) 13810e2c34f92f00628d48968dfea096d36381f494cbStephen Hines SS = Spec; 138208d92ecf6e5b1fd23177a08c2312b58d63d863dbChris Lattner } 1383cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor 13842cc782f7932f1069d9fa8bb5c518165802aad68dDouglas Gregor TemplateParameterLists *TemplateParams = TemplateInfo.TemplateParams; 13852cc782f7932f1069d9fa8bb5c518165802aad68dDouglas Gregor 1386cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor // Parse the (optional) class name or simple-template-id. 13876bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines IdentifierInfo *Name = nullptr; 1388e37ac4ff1620ed2d7026f52baccbfa022d79ced1Douglas Gregor SourceLocation NameLoc; 13896bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines TemplateIdAnnotation *TemplateId = nullptr; 1390e37ac4ff1620ed2d7026f52baccbfa022d79ced1Douglas Gregor if (Tok.is(tok::identifier)) { 1391e37ac4ff1620ed2d7026f52baccbfa022d79ced1Douglas Gregor Name = Tok.getIdentifierInfo(); 1392e37ac4ff1620ed2d7026f52baccbfa022d79ced1Douglas Gregor NameLoc = ConsumeToken(); 1393193575455e00eca03fd7177f60e3f2e6263cb661Kovarththanan Rajaratnam 13944e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (Tok.is(tok::less) && getLangOpts().CPlusPlus) { 1395193575455e00eca03fd7177f60e3f2e6263cb661Kovarththanan Rajaratnam // The name was supposed to refer to a template, but didn't. 13962cc782f7932f1069d9fa8bb5c518165802aad68dDouglas Gregor // Eat the template argument list and try to continue parsing this as 13972cc782f7932f1069d9fa8bb5c518165802aad68dDouglas Gregor // a class (or template thereof). 13982cc782f7932f1069d9fa8bb5c518165802aad68dDouglas Gregor TemplateArgList TemplateArgs; 13992cc782f7932f1069d9fa8bb5c518165802aad68dDouglas Gregor SourceLocation LAngleLoc, RAngleLoc; 14004967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (ParseTemplateIdAfterTemplateName( 14014967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar nullptr, NameLoc, SS, true, LAngleLoc, TemplateArgs, RAngleLoc)) { 14022cc782f7932f1069d9fa8bb5c518165802aad68dDouglas Gregor // We couldn't parse the template argument list at all, so don't 14032cc782f7932f1069d9fa8bb5c518165802aad68dDouglas Gregor // try to give any location information for the list. 14042cc782f7932f1069d9fa8bb5c518165802aad68dDouglas Gregor LAngleLoc = RAngleLoc = SourceLocation(); 14052cc782f7932f1069d9fa8bb5c518165802aad68dDouglas Gregor } 1406193575455e00eca03fd7177f60e3f2e6263cb661Kovarththanan Rajaratnam 14072cc782f7932f1069d9fa8bb5c518165802aad68dDouglas Gregor Diag(NameLoc, diag::err_explicit_spec_non_template) 1408651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines << (TemplateInfo.Kind == ParsedTemplateInfo::ExplicitInstantiation) 1409651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines << TagTokKind << Name << SourceRange(LAngleLoc, RAngleLoc); 141017d35c36fbae764fcd68fa8b31624078a033aabcJoao Matos 1411193575455e00eca03fd7177f60e3f2e6263cb661Kovarththanan Rajaratnam // Strip off the last template parameter list if it was empty, since 1412c78c06d81f9838aea4198e4965cc1b26bb0bf838Douglas Gregor // we've removed its template argument list. 1413c78c06d81f9838aea4198e4965cc1b26bb0bf838Douglas Gregor if (TemplateParams && TemplateInfo.LastParameterListWasEmpty) { 14144967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (TemplateParams->size() > 1) { 1415c78c06d81f9838aea4198e4965cc1b26bb0bf838Douglas Gregor TemplateParams->pop_back(); 1416c78c06d81f9838aea4198e4965cc1b26bb0bf838Douglas Gregor } else { 14176bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines TemplateParams = nullptr; 1418193575455e00eca03fd7177f60e3f2e6263cb661Kovarththanan Rajaratnam const_cast<ParsedTemplateInfo&>(TemplateInfo).Kind 1419c78c06d81f9838aea4198e4965cc1b26bb0bf838Douglas Gregor = ParsedTemplateInfo::NonTemplate; 1420c78c06d81f9838aea4198e4965cc1b26bb0bf838Douglas Gregor } 1421c78c06d81f9838aea4198e4965cc1b26bb0bf838Douglas Gregor } else if (TemplateInfo.Kind 1422c78c06d81f9838aea4198e4965cc1b26bb0bf838Douglas Gregor == ParsedTemplateInfo::ExplicitInstantiation) { 1423c78c06d81f9838aea4198e4965cc1b26bb0bf838Douglas Gregor // Pretend this is just a forward declaration. 14246bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines TemplateParams = nullptr; 1425193575455e00eca03fd7177f60e3f2e6263cb661Kovarththanan Rajaratnam const_cast<ParsedTemplateInfo&>(TemplateInfo).Kind 14262cc782f7932f1069d9fa8bb5c518165802aad68dDouglas Gregor = ParsedTemplateInfo::NonTemplate; 1427193575455e00eca03fd7177f60e3f2e6263cb661Kovarththanan Rajaratnam const_cast<ParsedTemplateInfo&>(TemplateInfo).TemplateLoc 1428c78c06d81f9838aea4198e4965cc1b26bb0bf838Douglas Gregor = SourceLocation(); 1429c78c06d81f9838aea4198e4965cc1b26bb0bf838Douglas Gregor const_cast<ParsedTemplateInfo&>(TemplateInfo).ExternLoc 1430c78c06d81f9838aea4198e4965cc1b26bb0bf838Douglas Gregor = SourceLocation(); 14312cc782f7932f1069d9fa8bb5c518165802aad68dDouglas Gregor } 14322cc782f7932f1069d9fa8bb5c518165802aad68dDouglas Gregor } 143339a8de10c18365bde7062d8959b7ed525449c561Douglas Gregor } else if (Tok.is(tok::annot_template_id)) { 143425a767651d14db87aa03dd5fe3e011d877dd4100Argyrios Kyrtzidis TemplateId = takeTemplateIdAnnotation(Tok); 143539a8de10c18365bde7062d8959b7ed525449c561Douglas Gregor NameLoc = ConsumeToken(); 1436cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor 1437059101f922de6eb765601459925f4c8914420b23Douglas Gregor if (TemplateId->Kind != TNK_Type_template && 1438059101f922de6eb765601459925f4c8914420b23Douglas Gregor TemplateId->Kind != TNK_Dependent_template_name) { 143939a8de10c18365bde7062d8959b7ed525449c561Douglas Gregor // The template-name in the simple-template-id refers to 144039a8de10c18365bde7062d8959b7ed525449c561Douglas Gregor // something other than a class template. Give an appropriate 144139a8de10c18365bde7062d8959b7ed525449c561Douglas Gregor // error message and skip to the ';'. 144239a8de10c18365bde7062d8959b7ed525449c561Douglas Gregor SourceRange Range(NameLoc); 144339a8de10c18365bde7062d8959b7ed525449c561Douglas Gregor if (SS.isNotEmpty()) 144439a8de10c18365bde7062d8959b7ed525449c561Douglas Gregor Range.setBegin(SS.getBeginLoc()); 144539a8de10c18365bde7062d8959b7ed525449c561Douglas Gregor 1446651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // FIXME: Name may be null here. 144739a8de10c18365bde7062d8959b7ed525449c561Douglas Gregor Diag(TemplateId->LAngleLoc, diag::err_template_spec_syntax_non_template) 14486e91f4bd9a05ca2c58ba11d541d8f9dab5514b76Richard Trieu << TemplateId->Name << static_cast<int>(TemplateId->Kind) << Range; 14491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 145039a8de10c18365bde7062d8959b7ed525449c561Douglas Gregor DS.SetTypeSpecError(); 14518fe2475a4b4c00475709c13d43eb9a57cce87cbcAlexey Bataev SkipUntil(tok::semi, StopBeforeMatch); 145239a8de10c18365bde7062d8959b7ed525449c561Douglas Gregor return; 1453cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor } 1454e37ac4ff1620ed2d7026f52baccbfa022d79ced1Douglas Gregor } 1455e37ac4ff1620ed2d7026f52baccbfa022d79ced1Douglas Gregor 14567796eb5643244f3134834253ce5ea89107ac21c1Richard Smith // There are four options here. 14577796eb5643244f3134834253ce5ea89107ac21c1Richard Smith // - If we are in a trailing return type, this is always just a reference, 14587796eb5643244f3134834253ce5ea89107ac21c1Richard Smith // and we must not try to parse a definition. For instance, 14597796eb5643244f3134834253ce5ea89107ac21c1Richard Smith // [] () -> struct S { }; 14607796eb5643244f3134834253ce5ea89107ac21c1Richard Smith // does not define a type. 14617796eb5643244f3134834253ce5ea89107ac21c1Richard Smith // - If we have 'struct foo {...', 'struct foo :...', 14627796eb5643244f3134834253ce5ea89107ac21c1Richard Smith // 'struct foo final :' or 'struct foo final {', then this is a definition. 14637796eb5643244f3134834253ce5ea89107ac21c1Richard Smith // - If we have 'struct foo;', then this is either a forward declaration 14647796eb5643244f3134834253ce5ea89107ac21c1Richard Smith // or a friend declaration, which have to be treated differently. 14657796eb5643244f3134834253ce5ea89107ac21c1Richard Smith // - Otherwise we have something like 'struct foo xyz', a reference. 14662e39713a3d72c243a2bcd13cc8f5036ba6b487d9Michael Han // 14672e39713a3d72c243a2bcd13cc8f5036ba6b487d9Michael Han // We also detect these erroneous cases to provide better diagnostic for 14682e39713a3d72c243a2bcd13cc8f5036ba6b487d9Michael Han // C++11 attributes parsing. 14692e39713a3d72c243a2bcd13cc8f5036ba6b487d9Michael Han // - attributes follow class name: 14702e39713a3d72c243a2bcd13cc8f5036ba6b487d9Michael Han // struct foo [[]] {}; 14712e39713a3d72c243a2bcd13cc8f5036ba6b487d9Michael Han // - attributes appear before or after 'final': 14722e39713a3d72c243a2bcd13cc8f5036ba6b487d9Michael Han // struct foo [[]] final [[]] {}; 14732e39713a3d72c243a2bcd13cc8f5036ba6b487d9Michael Han // 147469730c115c2d0fec2f20609d905d920a5a41b29bRichard Smith // However, in type-specifier-seq's, things look like declarations but are 147569730c115c2d0fec2f20609d905d920a5a41b29bRichard Smith // just references, e.g. 147669730c115c2d0fec2f20609d905d920a5a41b29bRichard Smith // new struct s; 1477d9bafa76f8d6eb9e4f4974ed322217f8df6bb82eSebastian Redl // or 147869730c115c2d0fec2f20609d905d920a5a41b29bRichard Smith // &T::operator struct s; 1479651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // For these, DSC is DSC_type_specifier or DSC_alias_declaration. 14802e39713a3d72c243a2bcd13cc8f5036ba6b487d9Michael Han 14812e39713a3d72c243a2bcd13cc8f5036ba6b487d9Michael Han // If there are attributes after class name, parse them. 14824e24f0f711e2c9fde79f19fa1c80deaab3f3b356Richard Smith MaybeParseCXX11Attributes(Attributes); 14832e39713a3d72c243a2bcd13cc8f5036ba6b487d9Michael Han 1484651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines const PrintingPolicy &Policy = Actions.getASTContext().getPrintingPolicy(); 1485f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall Sema::TagUseKind TUK; 14867796eb5643244f3134834253ce5ea89107ac21c1Richard Smith if (DSC == DSC_trailing) 14877796eb5643244f3134834253ce5ea89107ac21c1Richard Smith TUK = Sema::TUK_Reference; 14887796eb5643244f3134834253ce5ea89107ac21c1Richard Smith else if (Tok.is(tok::l_brace) || 14897796eb5643244f3134834253ce5ea89107ac21c1Richard Smith (getLangOpts().CPlusPlus && Tok.is(tok::colon)) || 14904e24f0f711e2c9fde79f19fa1c80deaab3f3b356Richard Smith (isCXX11FinalKeyword() && 14916f42669b7c0b81b07a15a0483aa5e897ce57cb45David Blaikie (NextToken().is(tok::l_brace) || NextToken().is(tok::colon)))) { 1492d85bea2affdd59d83d1be7d24b97f436484c3625Douglas Gregor if (DS.isFriendSpecified()) { 1493d85bea2affdd59d83d1be7d24b97f436484c3625Douglas Gregor // C++ [class.friend]p2: 1494d85bea2affdd59d83d1be7d24b97f436484c3625Douglas Gregor // A class shall not be defined in a friend declaration. 1495bdad7a2e21686296b78dac6190b78d11c996f6d7Richard Smith Diag(Tok.getLocation(), diag::err_friend_decl_defines_type) 1496d85bea2affdd59d83d1be7d24b97f436484c3625Douglas Gregor << SourceRange(DS.getFriendSpecLoc()); 1497d85bea2affdd59d83d1be7d24b97f436484c3625Douglas Gregor 1498d85bea2affdd59d83d1be7d24b97f436484c3625Douglas Gregor // Skip everything up to the semicolon, so that this looks like a proper 1499d85bea2affdd59d83d1be7d24b97f436484c3625Douglas Gregor // friend class (or template thereof) declaration. 15008fe2475a4b4c00475709c13d43eb9a57cce87cbcAlexey Bataev SkipUntil(tok::semi, StopBeforeMatch); 1501f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall TUK = Sema::TUK_Friend; 1502d85bea2affdd59d83d1be7d24b97f436484c3625Douglas Gregor } else { 1503d85bea2affdd59d83d1be7d24b97f436484c3625Douglas Gregor // Okay, this is a class definition. 1504f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall TUK = Sema::TUK_Definition; 1505d85bea2affdd59d83d1be7d24b97f436484c3625Douglas Gregor } 1506150d853343758281f7b0c44e058ea81da45b79beRichard Smith } else if (isCXX11FinalKeyword() && (NextToken().is(tok::l_square) || 1507150d853343758281f7b0c44e058ea81da45b79beRichard Smith NextToken().is(tok::kw_alignas))) { 15082e39713a3d72c243a2bcd13cc8f5036ba6b487d9Michael Han // We can't tell if this is a definition or reference 15092e39713a3d72c243a2bcd13cc8f5036ba6b487d9Michael Han // until we skipped the 'final' and C++11 attribute specifiers. 15102e39713a3d72c243a2bcd13cc8f5036ba6b487d9Michael Han TentativeParsingAction PA(*this); 15112e39713a3d72c243a2bcd13cc8f5036ba6b487d9Michael Han 15122e39713a3d72c243a2bcd13cc8f5036ba6b487d9Michael Han // Skip the 'final' keyword. 15132e39713a3d72c243a2bcd13cc8f5036ba6b487d9Michael Han ConsumeToken(); 15142e39713a3d72c243a2bcd13cc8f5036ba6b487d9Michael Han 15152e39713a3d72c243a2bcd13cc8f5036ba6b487d9Michael Han // Skip C++11 attribute specifiers. 15162e39713a3d72c243a2bcd13cc8f5036ba6b487d9Michael Han while (true) { 15172e39713a3d72c243a2bcd13cc8f5036ba6b487d9Michael Han if (Tok.is(tok::l_square) && NextToken().is(tok::l_square)) { 15182e39713a3d72c243a2bcd13cc8f5036ba6b487d9Michael Han ConsumeBracket(); 15198fe2475a4b4c00475709c13d43eb9a57cce87cbcAlexey Bataev if (!SkipUntil(tok::r_square, StopAtSemi)) 15202e39713a3d72c243a2bcd13cc8f5036ba6b487d9Michael Han break; 1521150d853343758281f7b0c44e058ea81da45b79beRichard Smith } else if (Tok.is(tok::kw_alignas) && NextToken().is(tok::l_paren)) { 15222e39713a3d72c243a2bcd13cc8f5036ba6b487d9Michael Han ConsumeToken(); 15232e39713a3d72c243a2bcd13cc8f5036ba6b487d9Michael Han ConsumeParen(); 15248fe2475a4b4c00475709c13d43eb9a57cce87cbcAlexey Bataev if (!SkipUntil(tok::r_paren, StopAtSemi)) 15252e39713a3d72c243a2bcd13cc8f5036ba6b487d9Michael Han break; 15262e39713a3d72c243a2bcd13cc8f5036ba6b487d9Michael Han } else { 15272e39713a3d72c243a2bcd13cc8f5036ba6b487d9Michael Han break; 15282e39713a3d72c243a2bcd13cc8f5036ba6b487d9Michael Han } 15292e39713a3d72c243a2bcd13cc8f5036ba6b487d9Michael Han } 15302e39713a3d72c243a2bcd13cc8f5036ba6b487d9Michael Han 153187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (Tok.isOneOf(tok::l_brace, tok::colon)) 15322e39713a3d72c243a2bcd13cc8f5036ba6b487d9Michael Han TUK = Sema::TUK_Definition; 15332e39713a3d72c243a2bcd13cc8f5036ba6b487d9Michael Han else 15342e39713a3d72c243a2bcd13cc8f5036ba6b487d9Michael Han TUK = Sema::TUK_Reference; 15352e39713a3d72c243a2bcd13cc8f5036ba6b487d9Michael Han 15362e39713a3d72c243a2bcd13cc8f5036ba6b487d9Michael Han PA.Revert(); 1537651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } else if (!isTypeSpecifier(DSC) && 1538c9f351700721150a985f21844fbfec55b04e861dRichard Smith (Tok.is(tok::semi) || 1539139be7007eba3bd491ca50297888be507753a95dRichard Smith (Tok.isAtStartOfLine() && !isValidAfterTypeSpecifier(false)))) { 1540f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall TUK = DS.isFriendSpecified() ? Sema::TUK_Friend : Sema::TUK_Declaration; 154117d35c36fbae764fcd68fa8b31624078a033aabcJoao Matos if (Tok.isNot(tok::semi)) { 1542651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines const PrintingPolicy &PPol = Actions.getASTContext().getPrintingPolicy(); 154317d35c36fbae764fcd68fa8b31624078a033aabcJoao Matos // A semicolon was missing after this declaration. Diagnose and recover. 1544651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines ExpectAndConsume(tok::semi, diag::err_expected_after, 1545651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines DeclSpec::getSpecifierName(TagType, PPol)); 154617d35c36fbae764fcd68fa8b31624078a033aabcJoao Matos PP.EnterToken(Tok); 154717d35c36fbae764fcd68fa8b31624078a033aabcJoao Matos Tok.setKind(tok::semi); 154817d35c36fbae764fcd68fa8b31624078a033aabcJoao Matos } 1549c9f351700721150a985f21844fbfec55b04e861dRichard Smith } else 1550f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall TUK = Sema::TUK_Reference; 1551e37ac4ff1620ed2d7026f52baccbfa022d79ced1Douglas Gregor 15522e39713a3d72c243a2bcd13cc8f5036ba6b487d9Michael Han // Forbid misplaced attributes. In cases of a reference, we pass attributes 15532e39713a3d72c243a2bcd13cc8f5036ba6b487d9Michael Han // to caller to handle. 155407fc1ba7553f2f5bf26984091197311decd9028eMichael Han if (TUK != Sema::TUK_Reference) { 155507fc1ba7553f2f5bf26984091197311decd9028eMichael Han // If this is not a reference, then the only possible 155607fc1ba7553f2f5bf26984091197311decd9028eMichael Han // valid place for C++11 attributes to appear here 155707fc1ba7553f2f5bf26984091197311decd9028eMichael Han // is between class-key and class-name. If there are 155807fc1ba7553f2f5bf26984091197311decd9028eMichael Han // any attributes after class-name, we try a fixit to move 155907fc1ba7553f2f5bf26984091197311decd9028eMichael Han // them to the right place. 156007fc1ba7553f2f5bf26984091197311decd9028eMichael Han SourceRange AttrRange = Attributes.Range; 156107fc1ba7553f2f5bf26984091197311decd9028eMichael Han if (AttrRange.isValid()) { 156207fc1ba7553f2f5bf26984091197311decd9028eMichael Han Diag(AttrRange.getBegin(), diag::err_attributes_not_allowed) 156307fc1ba7553f2f5bf26984091197311decd9028eMichael Han << AttrRange 156407fc1ba7553f2f5bf26984091197311decd9028eMichael Han << FixItHint::CreateInsertionFromRange(AttrFixitLoc, 156507fc1ba7553f2f5bf26984091197311decd9028eMichael Han CharSourceRange(AttrRange, true)) 156607fc1ba7553f2f5bf26984091197311decd9028eMichael Han << FixItHint::CreateRemoval(AttrRange); 156707fc1ba7553f2f5bf26984091197311decd9028eMichael Han 156807fc1ba7553f2f5bf26984091197311decd9028eMichael Han // Recover by adding misplaced attributes to the attribute list 156907fc1ba7553f2f5bf26984091197311decd9028eMichael Han // of the class so they can be applied on the class later. 157007fc1ba7553f2f5bf26984091197311decd9028eMichael Han attrs.takeAllFrom(Attributes); 157107fc1ba7553f2f5bf26984091197311decd9028eMichael Han } 157207fc1ba7553f2f5bf26984091197311decd9028eMichael Han } 15732e39713a3d72c243a2bcd13cc8f5036ba6b487d9Michael Han 157413489673b84fafaaf49cf5ae4e3bb9a945524dcbJohn McCall // If this is an elaborated type specifier, and we delayed 157513489673b84fafaaf49cf5ae4e3bb9a945524dcbJohn McCall // diagnostics before, just merge them into the current pool. 157613489673b84fafaaf49cf5ae4e3bb9a945524dcbJohn McCall if (shouldDelayDiagsInTag) { 157713489673b84fafaaf49cf5ae4e3bb9a945524dcbJohn McCall diagsFromTag.done(); 157813489673b84fafaaf49cf5ae4e3bb9a945524dcbJohn McCall if (TUK == Sema::TUK_Reference) 157913489673b84fafaaf49cf5ae4e3bb9a945524dcbJohn McCall diagsFromTag.redelay(); 158013489673b84fafaaf49cf5ae4e3bb9a945524dcbJohn McCall } 158113489673b84fafaaf49cf5ae4e3bb9a945524dcbJohn McCall 1582207014eb2b372aa33721e86d90a8a586ba8dc8aeJohn McCall if (!Name && !TemplateId && (DS.getTypeSpecType() == DeclSpec::TST_error || 1583f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall TUK != Sema::TUK_Definition)) { 1584207014eb2b372aa33721e86d90a8a586ba8dc8aeJohn McCall if (DS.getTypeSpecType() != DeclSpec::TST_error) { 1585207014eb2b372aa33721e86d90a8a586ba8dc8aeJohn McCall // We have a declaration or reference to an anonymous class. 1586207014eb2b372aa33721e86d90a8a586ba8dc8aeJohn McCall Diag(StartLoc, diag::err_anon_type_definition) 1587651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines << DeclSpec::getSpecifierName(TagType, Policy); 1588207014eb2b372aa33721e86d90a8a586ba8dc8aeJohn McCall } 1589e37ac4ff1620ed2d7026f52baccbfa022d79ced1Douglas Gregor 1590e78e8fc27140309092fb56d77a72f31fa085f9daBill Wendling // If we are parsing a definition and stop at a base-clause, continue on 1591e78e8fc27140309092fb56d77a72f31fa085f9daBill Wendling // until the semicolon. Continuing from the comma will just trick us into 1592e78e8fc27140309092fb56d77a72f31fa085f9daBill Wendling // thinking we are seeing a variable declaration. 1593e78e8fc27140309092fb56d77a72f31fa085f9daBill Wendling if (TUK == Sema::TUK_Definition && Tok.is(tok::colon)) 1594e78e8fc27140309092fb56d77a72f31fa085f9daBill Wendling SkipUntil(tok::semi, StopBeforeMatch); 1595e78e8fc27140309092fb56d77a72f31fa085f9daBill Wendling else 1596e78e8fc27140309092fb56d77a72f31fa085f9daBill Wendling SkipUntil(tok::comma, StopAtSemi); 1597e37ac4ff1620ed2d7026f52baccbfa022d79ced1Douglas Gregor return; 1598e37ac4ff1620ed2d7026f52baccbfa022d79ced1Douglas Gregor } 1599e37ac4ff1620ed2d7026f52baccbfa022d79ced1Douglas Gregor 1600ddc29e116db3c3f4144355e67a0137b38b6bb6d1Douglas Gregor // Create the tag portion of the class or class template. 1601d226f65006733ed7f709c3174f22ce33391cb58fJohn McCall DeclResult TagOrTempResult = true; // invalid 1602d226f65006733ed7f709c3174f22ce33391cb58fJohn McCall TypeResult TypeResult = true; // invalid 16034d9a16f36d3b768672d50e6d02000f982ae448d7Douglas Gregor 1604402abb55fc2e0cdda5fb1ac90009b1f5f6774906Douglas Gregor bool Owned = false; 1605b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Sema::SkipBodyInfo SkipBody; 1606f1bbbb49f06a7462476cd88166fccda5feb15cabJohn McCall if (TemplateId) { 16074d9a16f36d3b768672d50e6d02000f982ae448d7Douglas Gregor // Explicit specialization, class template partial specialization, 16084d9a16f36d3b768672d50e6d02000f982ae448d7Douglas Gregor // or explicit instantiation. 16095354e77e60e82828c7c2361f5c688c2667ab59ccBenjamin Kramer ASTTemplateArgsPtr TemplateArgsPtr(TemplateId->getTemplateArgs(), 161039a8de10c18365bde7062d8959b7ed525449c561Douglas Gregor TemplateId->NumArgs); 16114d9a16f36d3b768672d50e6d02000f982ae448d7Douglas Gregor if (TemplateInfo.Kind == ParsedTemplateInfo::ExplicitInstantiation && 1612f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall TUK == Sema::TUK_Declaration) { 16134d9a16f36d3b768672d50e6d02000f982ae448d7Douglas Gregor // This is an explicit instantiation of a class template. 16142edf0a2520313cde900799b1eb9bd11c9c776afeSean Hunt ProhibitAttributes(attrs); 16152edf0a2520313cde900799b1eb9bd11c9c776afeSean Hunt 16164d9a16f36d3b768672d50e6d02000f982ae448d7Douglas Gregor TagOrTempResult 161723c94dbb6631fecdb55ba401aa93722803d980c6Douglas Gregor = Actions.ActOnExplicitInstantiation(getCurScope(), 161845f965581935791a018df829a14dff53c1dd8f47Douglas Gregor TemplateInfo.ExternLoc, 16191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump TemplateInfo.TemplateLoc, 16204d9a16f36d3b768672d50e6d02000f982ae448d7Douglas Gregor TagType, 16211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump StartLoc, 16224d9a16f36d3b768672d50e6d02000f982ae448d7Douglas Gregor SS, 16232b5289b6fd7e3d9899868410a498c081c9595662John McCall TemplateId->Template, 16241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump TemplateId->TemplateNameLoc, 16251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump TemplateId->LAngleLoc, 16264d9a16f36d3b768672d50e6d02000f982ae448d7Douglas Gregor TemplateArgsPtr, 16271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump TemplateId->RAngleLoc, 16287f040a9d817cd1c72b565e92abff473510bf9e1dJohn McCall attrs.getList()); 162974256f5ea6950c9fd34595aa124eb4740372f15cJohn McCall 163074256f5ea6950c9fd34595aa124eb4740372f15cJohn McCall // Friend template-ids are treated as references unless 163174256f5ea6950c9fd34595aa124eb4740372f15cJohn McCall // they have template headers, in which case they're ill-formed 163274256f5ea6950c9fd34595aa124eb4740372f15cJohn McCall // (FIXME: "template <class T> friend class A<T>::B<int>;"). 163374256f5ea6950c9fd34595aa124eb4740372f15cJohn McCall // We diagnose this error in ActOnClassTemplateSpecialization. 1634f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall } else if (TUK == Sema::TUK_Reference || 1635f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall (TUK == Sema::TUK_Friend && 163674256f5ea6950c9fd34595aa124eb4740372f15cJohn McCall TemplateInfo.Kind == ParsedTemplateInfo::NonTemplate)) { 16372edf0a2520313cde900799b1eb9bd11c9c776afeSean Hunt ProhibitAttributes(attrs); 163855d23c925b058be29b792008ddb7d68f6c4fa9a0Abramo Bagnara TypeResult = Actions.ActOnTagTemplateIdType(TUK, TagType, StartLoc, 1639059101f922de6eb765601459925f4c8914420b23Douglas Gregor TemplateId->SS, 164055d23c925b058be29b792008ddb7d68f6c4fa9a0Abramo Bagnara TemplateId->TemplateKWLoc, 1641059101f922de6eb765601459925f4c8914420b23Douglas Gregor TemplateId->Template, 1642059101f922de6eb765601459925f4c8914420b23Douglas Gregor TemplateId->TemplateNameLoc, 1643059101f922de6eb765601459925f4c8914420b23Douglas Gregor TemplateId->LAngleLoc, 1644059101f922de6eb765601459925f4c8914420b23Douglas Gregor TemplateArgsPtr, 164555d23c925b058be29b792008ddb7d68f6c4fa9a0Abramo Bagnara TemplateId->RAngleLoc); 16464d9a16f36d3b768672d50e6d02000f982ae448d7Douglas Gregor } else { 16474d9a16f36d3b768672d50e6d02000f982ae448d7Douglas Gregor // This is an explicit specialization or a class template 16484d9a16f36d3b768672d50e6d02000f982ae448d7Douglas Gregor // partial specialization. 16494d9a16f36d3b768672d50e6d02000f982ae448d7Douglas Gregor TemplateParameterLists FakedParamLists; 16504d9a16f36d3b768672d50e6d02000f982ae448d7Douglas Gregor if (TemplateInfo.Kind == ParsedTemplateInfo::ExplicitInstantiation) { 16514d9a16f36d3b768672d50e6d02000f982ae448d7Douglas Gregor // This looks like an explicit instantiation, because we have 16524d9a16f36d3b768672d50e6d02000f982ae448d7Douglas Gregor // something like 16534d9a16f36d3b768672d50e6d02000f982ae448d7Douglas Gregor // 16544d9a16f36d3b768672d50e6d02000f982ae448d7Douglas Gregor // template class Foo<X> 16554d9a16f36d3b768672d50e6d02000f982ae448d7Douglas Gregor // 16563f5b61c394f4f205bcb4d316eb2a7a0a68b8af86Douglas Gregor // but it actually has a definition. Most likely, this was 16574d9a16f36d3b768672d50e6d02000f982ae448d7Douglas Gregor // meant to be an explicit specialization, but the user forgot 16584d9a16f36d3b768672d50e6d02000f982ae448d7Douglas Gregor // the '<>' after 'template'. 165961dfea9d34aaf7ea1ba6c28d8dd44a1d7cf40f78Richard Smith // It this is friend declaration however, since it cannot have a 166061dfea9d34aaf7ea1ba6c28d8dd44a1d7cf40f78Richard Smith // template header, it is most likely that the user meant to 166161dfea9d34aaf7ea1ba6c28d8dd44a1d7cf40f78Richard Smith // remove the 'template' keyword. 16624985429d6f0dddbe168ec0ed4de029d56294e644Larisse Voufo assert((TUK == Sema::TUK_Definition || TUK == Sema::TUK_Friend) && 166361dfea9d34aaf7ea1ba6c28d8dd44a1d7cf40f78Richard Smith "Expected a definition here"); 166461dfea9d34aaf7ea1ba6c28d8dd44a1d7cf40f78Richard Smith 166561dfea9d34aaf7ea1ba6c28d8dd44a1d7cf40f78Richard Smith if (TUK == Sema::TUK_Friend) { 166661dfea9d34aaf7ea1ba6c28d8dd44a1d7cf40f78Richard Smith Diag(DS.getFriendSpecLoc(), diag::err_friend_explicit_instantiation); 16676bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines TemplateParams = nullptr; 166861dfea9d34aaf7ea1ba6c28d8dd44a1d7cf40f78Richard Smith } else { 166961dfea9d34aaf7ea1ba6c28d8dd44a1d7cf40f78Richard Smith SourceLocation LAngleLoc = 167061dfea9d34aaf7ea1ba6c28d8dd44a1d7cf40f78Richard Smith PP.getLocForEndOfToken(TemplateInfo.TemplateLoc); 167161dfea9d34aaf7ea1ba6c28d8dd44a1d7cf40f78Richard Smith Diag(TemplateId->TemplateNameLoc, 167261dfea9d34aaf7ea1ba6c28d8dd44a1d7cf40f78Richard Smith diag::err_explicit_instantiation_with_definition) 167361dfea9d34aaf7ea1ba6c28d8dd44a1d7cf40f78Richard Smith << SourceRange(TemplateInfo.TemplateLoc) 167461dfea9d34aaf7ea1ba6c28d8dd44a1d7cf40f78Richard Smith << FixItHint::CreateInsertion(LAngleLoc, "<>"); 167561dfea9d34aaf7ea1ba6c28d8dd44a1d7cf40f78Richard Smith 167661dfea9d34aaf7ea1ba6c28d8dd44a1d7cf40f78Richard Smith // Create a fake template parameter list that contains only 167761dfea9d34aaf7ea1ba6c28d8dd44a1d7cf40f78Richard Smith // "template<>", so that we treat this construct as a class 167861dfea9d34aaf7ea1ba6c28d8dd44a1d7cf40f78Richard Smith // template specialization. 167961dfea9d34aaf7ea1ba6c28d8dd44a1d7cf40f78Richard Smith FakedParamLists.push_back(Actions.ActOnTemplateParameterList( 16804967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 0, SourceLocation(), TemplateInfo.TemplateLoc, LAngleLoc, None, 16814967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar LAngleLoc, nullptr)); 168261dfea9d34aaf7ea1ba6c28d8dd44a1d7cf40f78Richard Smith TemplateParams = &FakedParamLists; 168361dfea9d34aaf7ea1ba6c28d8dd44a1d7cf40f78Richard Smith } 16844d9a16f36d3b768672d50e6d02000f982ae448d7Douglas Gregor } 16854d9a16f36d3b768672d50e6d02000f982ae448d7Douglas Gregor 16864d9a16f36d3b768672d50e6d02000f982ae448d7Douglas Gregor // Build the class template specialization. 16876bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines TagOrTempResult = Actions.ActOnClassTemplateSpecialization( 16886bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines getCurScope(), TagType, TUK, StartLoc, DS.getModulePrivateSpecLoc(), 16896bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines *TemplateId, attrs.getList(), 16906bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines MultiTemplateParamsArg(TemplateParams ? &(*TemplateParams)[0] 16916bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines : nullptr, 1692b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar TemplateParams ? TemplateParams->size() : 0), 1693b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar &SkipBody); 16944d9a16f36d3b768672d50e6d02000f982ae448d7Douglas Gregor } 16953f5b61c394f4f205bcb4d316eb2a7a0a68b8af86Douglas Gregor } else if (TemplateInfo.Kind == ParsedTemplateInfo::ExplicitInstantiation && 1696f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall TUK == Sema::TUK_Declaration) { 16973f5b61c394f4f205bcb4d316eb2a7a0a68b8af86Douglas Gregor // Explicit instantiation of a member of a class template 16983f5b61c394f4f205bcb4d316eb2a7a0a68b8af86Douglas Gregor // specialization, e.g., 16993f5b61c394f4f205bcb4d316eb2a7a0a68b8af86Douglas Gregor // 17003f5b61c394f4f205bcb4d316eb2a7a0a68b8af86Douglas Gregor // template struct Outer<int>::Inner; 17013f5b61c394f4f205bcb4d316eb2a7a0a68b8af86Douglas Gregor // 17022edf0a2520313cde900799b1eb9bd11c9c776afeSean Hunt ProhibitAttributes(attrs); 17032edf0a2520313cde900799b1eb9bd11c9c776afeSean Hunt 17043f5b61c394f4f205bcb4d316eb2a7a0a68b8af86Douglas Gregor TagOrTempResult 170523c94dbb6631fecdb55ba401aa93722803d980c6Douglas Gregor = Actions.ActOnExplicitInstantiation(getCurScope(), 170645f965581935791a018df829a14dff53c1dd8f47Douglas Gregor TemplateInfo.ExternLoc, 17071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump TemplateInfo.TemplateLoc, 17081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump TagType, StartLoc, SS, Name, 17097f040a9d817cd1c72b565e92abff473510bf9e1dJohn McCall NameLoc, attrs.getList()); 17109a34edb710917798aa30263374f624f13b594605John McCall } else if (TUK == Sema::TUK_Friend && 17119a34edb710917798aa30263374f624f13b594605John McCall TemplateInfo.Kind != ParsedTemplateInfo::NonTemplate) { 17122edf0a2520313cde900799b1eb9bd11c9c776afeSean Hunt ProhibitAttributes(attrs); 17132edf0a2520313cde900799b1eb9bd11c9c776afeSean Hunt 17149a34edb710917798aa30263374f624f13b594605John McCall TagOrTempResult = 17159a34edb710917798aa30263374f624f13b594605John McCall Actions.ActOnTemplatedFriendTag(getCurScope(), DS.getFriendSpecLoc(), 17169a34edb710917798aa30263374f624f13b594605John McCall TagType, StartLoc, SS, 17177f040a9d817cd1c72b565e92abff473510bf9e1dJohn McCall Name, NameLoc, attrs.getList(), 17185354e77e60e82828c7c2361f5c688c2667ab59ccBenjamin Kramer MultiTemplateParamsArg( 17196bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines TemplateParams? &(*TemplateParams)[0] 17206bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines : nullptr, 17219a34edb710917798aa30263374f624f13b594605John McCall TemplateParams? TemplateParams->size() : 0)); 17223f5b61c394f4f205bcb4d316eb2a7a0a68b8af86Douglas Gregor } else { 17232edf0a2520313cde900799b1eb9bd11c9c776afeSean Hunt if (TUK != Sema::TUK_Declaration && TUK != Sema::TUK_Definition) 17242edf0a2520313cde900799b1eb9bd11c9c776afeSean Hunt ProhibitAttributes(attrs); 172561dfea9d34aaf7ea1ba6c28d8dd44a1d7cf40f78Richard Smith 17267c64ef05e179d29646030e9d453081844ecc537aLarisse Voufo if (TUK == Sema::TUK_Definition && 17277c64ef05e179d29646030e9d453081844ecc537aLarisse Voufo TemplateInfo.Kind == ParsedTemplateInfo::ExplicitInstantiation) { 17287c64ef05e179d29646030e9d453081844ecc537aLarisse Voufo // If the declarator-id is not a template-id, issue a diagnostic and 17297c64ef05e179d29646030e9d453081844ecc537aLarisse Voufo // recover by ignoring the 'template' keyword. 17307c64ef05e179d29646030e9d453081844ecc537aLarisse Voufo Diag(Tok, diag::err_template_defn_explicit_instantiation) 17317c64ef05e179d29646030e9d453081844ecc537aLarisse Voufo << 1 << FixItHint::CreateRemoval(TemplateInfo.TemplateLoc); 17326bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines TemplateParams = nullptr; 17337c64ef05e179d29646030e9d453081844ecc537aLarisse Voufo } 17342edf0a2520313cde900799b1eb9bd11c9c776afeSean Hunt 1735c4e7019d5c9034a2d84ee4695f8e98dc025ac131John McCall bool IsDependent = false; 1736c4e7019d5c9034a2d84ee4695f8e98dc025ac131John McCall 1737a25c4080a490ea2bab6f54094dd75b19eae83770John McCall // Don't pass down template parameter lists if this is just a tag 1738a25c4080a490ea2bab6f54094dd75b19eae83770John McCall // reference. For example, we don't need the template parameters here: 1739a25c4080a490ea2bab6f54094dd75b19eae83770John McCall // template <class T> class A *makeA(T t); 1740a25c4080a490ea2bab6f54094dd75b19eae83770John McCall MultiTemplateParamsArg TParams; 1741a25c4080a490ea2bab6f54094dd75b19eae83770John McCall if (TUK != Sema::TUK_Reference && TemplateParams) 1742a25c4080a490ea2bab6f54094dd75b19eae83770John McCall TParams = 1743a25c4080a490ea2bab6f54094dd75b19eae83770John McCall MultiTemplateParamsArg(&(*TemplateParams)[0], TemplateParams->size()); 1744a25c4080a490ea2bab6f54094dd75b19eae83770John McCall 1745b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar handleDeclspecAlignBeforeClassKey(attrs, DS, TUK); 1746b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar 17473f5b61c394f4f205bcb4d316eb2a7a0a68b8af86Douglas Gregor // Declaration or definition of a class type 17489a34edb710917798aa30263374f624f13b594605John McCall TagOrTempResult = Actions.ActOnTag(getCurScope(), TagType, TUK, StartLoc, 17497f040a9d817cd1c72b565e92abff473510bf9e1dJohn McCall SS, Name, NameLoc, attrs.getList(), AS, 1750e761230ae3751b525cadd8066c74ec278ee4ef57Douglas Gregor DS.getModulePrivateSpecLoc(), 1751bdad7a2e21686296b78dac6190b78d11c996f6d7Richard Smith TParams, Owned, IsDependent, 1752bdad7a2e21686296b78dac6190b78d11c996f6d7Richard Smith SourceLocation(), false, 1753651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines clang::TypeResult(), 17543ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar DSC == DSC_type_specifier, 17553ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar &SkipBody); 1756c4e7019d5c9034a2d84ee4695f8e98dc025ac131John McCall 1757c4e7019d5c9034a2d84ee4695f8e98dc025ac131John McCall // If ActOnTag said the type was dependent, try again with the 1758c4e7019d5c9034a2d84ee4695f8e98dc025ac131John McCall // less common call. 17599a34edb710917798aa30263374f624f13b594605John McCall if (IsDependent) { 17609a34edb710917798aa30263374f624f13b594605John McCall assert(TUK == Sema::TUK_Reference || TUK == Sema::TUK_Friend); 176123c94dbb6631fecdb55ba401aa93722803d980c6Douglas Gregor TypeResult = Actions.ActOnDependentTag(getCurScope(), TagType, TUK, 1762193575455e00eca03fd7177f60e3f2e6263cb661Kovarththanan Rajaratnam SS, Name, StartLoc, NameLoc); 17639a34edb710917798aa30263374f624f13b594605John McCall } 17643f5b61c394f4f205bcb4d316eb2a7a0a68b8af86Douglas Gregor } 1765e37ac4ff1620ed2d7026f52baccbfa022d79ced1Douglas Gregor 1766e37ac4ff1620ed2d7026f52baccbfa022d79ced1Douglas Gregor // If there is a body, parse it and inform the actions module. 1767f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall if (TUK == Sema::TUK_Definition) { 1768bd0dfa5c37d422427080a0ae3af9b63e70e6e854John McCall assert(Tok.is(tok::l_brace) || 17694e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie (getLangOpts().CPlusPlus && Tok.is(tok::colon)) || 17704e24f0f711e2c9fde79f19fa1c80deaab3f3b356Richard Smith isCXX11FinalKeyword()); 1771b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (SkipBody.ShouldSkip) 17723ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar SkipCXXMemberSpecification(StartLoc, AttrFixitLoc, TagType, 17733ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar TagOrTempResult.get()); 17743ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar else if (getLangOpts().CPlusPlus) 177507fc1ba7553f2f5bf26984091197311decd9028eMichael Han ParseCXXMemberSpecification(StartLoc, AttrFixitLoc, attrs, TagType, 177607fc1ba7553f2f5bf26984091197311decd9028eMichael Han TagOrTempResult.get()); 177707952324dda0e758c17f8bc3015793c65c51c48cArgyrios Kyrtzidis else 1778212e81cc5151b3c42346e43cfd42499a53ffd39aDouglas Gregor ParseStructUnionBody(StartLoc, TagType, TagOrTempResult.get()); 1779e37ac4ff1620ed2d7026f52baccbfa022d79ced1Douglas Gregor } 1780e37ac4ff1620ed2d7026f52baccbfa022d79ced1Douglas Gregor 17816bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines const char *PrevSpec = nullptr; 1782b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall unsigned DiagID; 1783b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall bool Result; 1784c4e7019d5c9034a2d84ee4695f8e98dc025ac131John McCall if (!TypeResult.isInvalid()) { 17850daaf32723ac78549c507c2a68a5300502703673Abramo Bagnara Result = DS.SetTypeSpecType(DeclSpec::TST_typename, StartLoc, 17860daaf32723ac78549c507c2a68a5300502703673Abramo Bagnara NameLoc.isValid() ? NameLoc : StartLoc, 1787651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines PrevSpec, DiagID, TypeResult.get(), Policy); 1788c4e7019d5c9034a2d84ee4695f8e98dc025ac131John McCall } else if (!TagOrTempResult.isInvalid()) { 17890daaf32723ac78549c507c2a68a5300502703673Abramo Bagnara Result = DS.SetTypeSpecType(TagType, StartLoc, 17900daaf32723ac78549c507c2a68a5300502703673Abramo Bagnara NameLoc.isValid() ? NameLoc : StartLoc, 1791651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines PrevSpec, DiagID, TagOrTempResult.get(), Owned, 1792651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Policy); 1793c4e7019d5c9034a2d84ee4695f8e98dc025ac131John McCall } else { 1794ddc29e116db3c3f4144355e67a0137b38b6bb6d1Douglas Gregor DS.SetTypeSpecError(); 179566e9977ddd6b197317d149213b76a9af0d3df4deAnders Carlsson return; 179666e9977ddd6b197317d149213b76a9af0d3df4deAnders Carlsson } 17971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1798b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall if (Result) 1799fec54013fcd0eb72642741584ca04c1bc292bef8John McCall Diag(StartLoc, DiagID) << PrevSpec; 1800193575455e00eca03fd7177f60e3f2e6263cb661Kovarththanan Rajaratnam 18014ed5d91db256f7dbe6bf716da0b801004c197254Chris Lattner // At this point, we've successfully parsed a class-specifier in 'definition' 18024ed5d91db256f7dbe6bf716da0b801004c197254Chris Lattner // form (e.g. "struct foo { int x; }". While we could just return here, we're 18034ed5d91db256f7dbe6bf716da0b801004c197254Chris Lattner // going to look at what comes after it to improve error recovery. If an 18044ed5d91db256f7dbe6bf716da0b801004c197254Chris Lattner // impossible token occurs next, we assume that the programmer forgot a ; at 18054ed5d91db256f7dbe6bf716da0b801004c197254Chris Lattner // the end of the declaration and recover that way. 18064ed5d91db256f7dbe6bf716da0b801004c197254Chris Lattner // 1807c9f351700721150a985f21844fbfec55b04e861dRichard Smith // Also enforce C++ [temp]p3: 1808c9f351700721150a985f21844fbfec55b04e861dRichard Smith // In a template-declaration which defines a class, no declarator 1809c9f351700721150a985f21844fbfec55b04e861dRichard Smith // is permitted. 1810176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // 1811176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // After a type-specifier, we don't expect a semicolon. This only happens in 1812176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // C, since definitions are not permitted in this context in C++. 181317d35c36fbae764fcd68fa8b31624078a033aabcJoao Matos if (TUK == Sema::TUK_Definition && 1814176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines (getLangOpts().CPlusPlus || !isTypeSpecifier(DSC)) && 181517d35c36fbae764fcd68fa8b31624078a033aabcJoao Matos (TemplateInfo.Kind || !isValidAfterTypeSpecifier(false))) { 18167d033b209e87d1964ee2f8de668934bb1a77bde0Argyrios Kyrtzidis if (Tok.isNot(tok::semi)) { 1817651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines const PrintingPolicy &PPol = Actions.getASTContext().getPrintingPolicy(); 1818651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines ExpectAndConsume(tok::semi, diag::err_expected_after, 1819651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines DeclSpec::getSpecifierName(TagType, PPol)); 18207d033b209e87d1964ee2f8de668934bb1a77bde0Argyrios Kyrtzidis // Push this token back into the preprocessor and change our current token 18217d033b209e87d1964ee2f8de668934bb1a77bde0Argyrios Kyrtzidis // to ';' so that the rest of the code recovers as though there were an 18227d033b209e87d1964ee2f8de668934bb1a77bde0Argyrios Kyrtzidis // ';' after the definition. 18237d033b209e87d1964ee2f8de668934bb1a77bde0Argyrios Kyrtzidis PP.EnterToken(Tok); 18247d033b209e87d1964ee2f8de668934bb1a77bde0Argyrios Kyrtzidis Tok.setKind(tok::semi); 18257d033b209e87d1964ee2f8de668934bb1a77bde0Argyrios Kyrtzidis } 18264ed5d91db256f7dbe6bf716da0b801004c197254Chris Lattner } 1827e37ac4ff1620ed2d7026f52baccbfa022d79ced1Douglas Gregor} 1828e37ac4ff1620ed2d7026f52baccbfa022d79ced1Douglas Gregor 18291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// ParseBaseClause - Parse the base-clause of a C++ class [C++ class.derived]. 1830e37ac4ff1620ed2d7026f52baccbfa022d79ced1Douglas Gregor/// 1831e37ac4ff1620ed2d7026f52baccbfa022d79ced1Douglas Gregor/// base-clause : [C++ class.derived] 1832e37ac4ff1620ed2d7026f52baccbfa022d79ced1Douglas Gregor/// ':' base-specifier-list 1833e37ac4ff1620ed2d7026f52baccbfa022d79ced1Douglas Gregor/// base-specifier-list: 1834e37ac4ff1620ed2d7026f52baccbfa022d79ced1Douglas Gregor/// base-specifier '...'[opt] 1835e37ac4ff1620ed2d7026f52baccbfa022d79ced1Douglas Gregor/// base-specifier-list ',' base-specifier '...'[opt] 1836d226f65006733ed7f709c3174f22ce33391cb58fJohn McCallvoid Parser::ParseBaseClause(Decl *ClassDecl) { 1837e37ac4ff1620ed2d7026f52baccbfa022d79ced1Douglas Gregor assert(Tok.is(tok::colon) && "Not a base clause"); 1838e37ac4ff1620ed2d7026f52baccbfa022d79ced1Douglas Gregor ConsumeToken(); 1839e37ac4ff1620ed2d7026f52baccbfa022d79ced1Douglas Gregor 1840f8268ae3196002bbab6adb830302e79b0f368f13Douglas Gregor // Build up an array of parsed base specifiers. 18415f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<CXXBaseSpecifier *, 8> BaseInfo; 1842f8268ae3196002bbab6adb830302e79b0f368f13Douglas Gregor 1843e37ac4ff1620ed2d7026f52baccbfa022d79ced1Douglas Gregor while (true) { 1844e37ac4ff1620ed2d7026f52baccbfa022d79ced1Douglas Gregor // Parse a base-specifier. 1845f8268ae3196002bbab6adb830302e79b0f368f13Douglas Gregor BaseResult Result = ParseBaseSpecifier(ClassDecl); 18465ac8aff3d7431dc7e4d64d960574a10c9f7e0078Douglas Gregor if (Result.isInvalid()) { 1847e37ac4ff1620ed2d7026f52baccbfa022d79ced1Douglas Gregor // Skip the rest of this base specifier, up until the comma or 1848e37ac4ff1620ed2d7026f52baccbfa022d79ced1Douglas Gregor // opening brace. 18498fe2475a4b4c00475709c13d43eb9a57cce87cbcAlexey Bataev SkipUntil(tok::comma, tok::l_brace, StopAtSemi | StopBeforeMatch); 1850f8268ae3196002bbab6adb830302e79b0f368f13Douglas Gregor } else { 1851f8268ae3196002bbab6adb830302e79b0f368f13Douglas Gregor // Add this to our array of base specifiers. 18525ac8aff3d7431dc7e4d64d960574a10c9f7e0078Douglas Gregor BaseInfo.push_back(Result.get()); 1853e37ac4ff1620ed2d7026f52baccbfa022d79ced1Douglas Gregor } 1854e37ac4ff1620ed2d7026f52baccbfa022d79ced1Douglas Gregor 1855e37ac4ff1620ed2d7026f52baccbfa022d79ced1Douglas Gregor // If the next token is a comma, consume it and keep reading 1856e37ac4ff1620ed2d7026f52baccbfa022d79ced1Douglas Gregor // base-specifiers. 1857651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (!TryConsumeToken(tok::comma)) 1858651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines break; 1859e37ac4ff1620ed2d7026f52baccbfa022d79ced1Douglas Gregor } 1860f8268ae3196002bbab6adb830302e79b0f368f13Douglas Gregor 1861f8268ae3196002bbab6adb830302e79b0f368f13Douglas Gregor // Attach the base specifiers 18624967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Actions.ActOnBaseSpecifiers(ClassDecl, BaseInfo); 1863e37ac4ff1620ed2d7026f52baccbfa022d79ced1Douglas Gregor} 1864e37ac4ff1620ed2d7026f52baccbfa022d79ced1Douglas Gregor 1865e37ac4ff1620ed2d7026f52baccbfa022d79ced1Douglas Gregor/// ParseBaseSpecifier - Parse a C++ base-specifier. A base-specifier is 1866e37ac4ff1620ed2d7026f52baccbfa022d79ced1Douglas Gregor/// one entry in the base class list of a class specifier, for example: 1867e37ac4ff1620ed2d7026f52baccbfa022d79ced1Douglas Gregor/// class foo : public bar, virtual private baz { 1868e37ac4ff1620ed2d7026f52baccbfa022d79ced1Douglas Gregor/// 'public bar' and 'virtual private baz' are each base-specifiers. 1869e37ac4ff1620ed2d7026f52baccbfa022d79ced1Douglas Gregor/// 1870e37ac4ff1620ed2d7026f52baccbfa022d79ced1Douglas Gregor/// base-specifier: [C++ class.derived] 1871053214013990ad8ec096dafc64aa7c0ad2b05bc0Richard Smith/// attribute-specifier-seq[opt] base-type-specifier 1872053214013990ad8ec096dafc64aa7c0ad2b05bc0Richard Smith/// attribute-specifier-seq[opt] 'virtual' access-specifier[opt] 1873053214013990ad8ec096dafc64aa7c0ad2b05bc0Richard Smith/// base-type-specifier 1874053214013990ad8ec096dafc64aa7c0ad2b05bc0Richard Smith/// attribute-specifier-seq[opt] access-specifier 'virtual'[opt] 1875053214013990ad8ec096dafc64aa7c0ad2b05bc0Richard Smith/// base-type-specifier 1876176edba5311f6eff0cad2631449885ddf4fbc9eaStephen HinesBaseResult Parser::ParseBaseSpecifier(Decl *ClassDecl) { 1877e37ac4ff1620ed2d7026f52baccbfa022d79ced1Douglas Gregor bool IsVirtual = false; 1878e37ac4ff1620ed2d7026f52baccbfa022d79ced1Douglas Gregor SourceLocation StartLoc = Tok.getLocation(); 1879e37ac4ff1620ed2d7026f52baccbfa022d79ced1Douglas Gregor 1880053214013990ad8ec096dafc64aa7c0ad2b05bc0Richard Smith ParsedAttributesWithRange Attributes(AttrFactory); 1881053214013990ad8ec096dafc64aa7c0ad2b05bc0Richard Smith MaybeParseCXX11Attributes(Attributes); 1882053214013990ad8ec096dafc64aa7c0ad2b05bc0Richard Smith 1883e37ac4ff1620ed2d7026f52baccbfa022d79ced1Douglas Gregor // Parse the 'virtual' keyword. 1884651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (TryConsumeToken(tok::kw_virtual)) 1885e37ac4ff1620ed2d7026f52baccbfa022d79ced1Douglas Gregor IsVirtual = true; 1886e37ac4ff1620ed2d7026f52baccbfa022d79ced1Douglas Gregor 1887053214013990ad8ec096dafc64aa7c0ad2b05bc0Richard Smith CheckMisplacedCXX11Attribute(Attributes, StartLoc); 1888053214013990ad8ec096dafc64aa7c0ad2b05bc0Richard Smith 1889e37ac4ff1620ed2d7026f52baccbfa022d79ced1Douglas Gregor // Parse an (optional) access specifier. 1890e37ac4ff1620ed2d7026f52baccbfa022d79ced1Douglas Gregor AccessSpecifier Access = getAccessSpecifierIfPresent(); 189192f883177b162928a8e632e4e3b93fafd2b26072John McCall if (Access != AS_none) 1892e37ac4ff1620ed2d7026f52baccbfa022d79ced1Douglas Gregor ConsumeToken(); 18931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1894053214013990ad8ec096dafc64aa7c0ad2b05bc0Richard Smith CheckMisplacedCXX11Attribute(Attributes, StartLoc); 1895053214013990ad8ec096dafc64aa7c0ad2b05bc0Richard Smith 1896e37ac4ff1620ed2d7026f52baccbfa022d79ced1Douglas Gregor // Parse the 'virtual' keyword (again!), in case it came after the 1897e37ac4ff1620ed2d7026f52baccbfa022d79ced1Douglas Gregor // access specifier. 1898e37ac4ff1620ed2d7026f52baccbfa022d79ced1Douglas Gregor if (Tok.is(tok::kw_virtual)) { 1899e37ac4ff1620ed2d7026f52baccbfa022d79ced1Douglas Gregor SourceLocation VirtualLoc = ConsumeToken(); 1900e37ac4ff1620ed2d7026f52baccbfa022d79ced1Douglas Gregor if (IsVirtual) { 1901e37ac4ff1620ed2d7026f52baccbfa022d79ced1Douglas Gregor // Complain about duplicate 'virtual' 19021ab3b96de160e4fbffec2a776e284a48a3bb543dChris Lattner Diag(VirtualLoc, diag::err_dup_virtual) 1903849b243d4065f56742a4677d6dc8277609a151f8Douglas Gregor << FixItHint::CreateRemoval(VirtualLoc); 1904e37ac4ff1620ed2d7026f52baccbfa022d79ced1Douglas Gregor } 1905e37ac4ff1620ed2d7026f52baccbfa022d79ced1Douglas Gregor 1906e37ac4ff1620ed2d7026f52baccbfa022d79ced1Douglas Gregor IsVirtual = true; 1907e37ac4ff1620ed2d7026f52baccbfa022d79ced1Douglas Gregor } 1908e37ac4ff1620ed2d7026f52baccbfa022d79ced1Douglas Gregor 1909053214013990ad8ec096dafc64aa7c0ad2b05bc0Richard Smith CheckMisplacedCXX11Attribute(Attributes, StartLoc); 1910053214013990ad8ec096dafc64aa7c0ad2b05bc0Richard Smith 191142a552f8200ba5948661aee0106fce0c04e39818Douglas Gregor // Parse the class-name. 191287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 191387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // HACK: MSVC doesn't consider _Atomic to be a keyword and its STL 191487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // implementation for VS2013 uses _Atomic as an identifier for one of the 191587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // classes in <atomic>. Treat '_Atomic' to be an identifier when we are 191687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // parsing the class-name for a base specifier. 191787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (getLangOpts().MSVCCompat && Tok.is(tok::kw__Atomic) && 191887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar NextToken().is(tok::less)) 191987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Tok.setKind(tok::identifier); 192087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 19217f43d6764797ab21216421aeb00f4ec314d503d1Douglas Gregor SourceLocation EndLocation; 192222216eb4fb0936d2488fc03abd285d135c36ff01David Blaikie SourceLocation BaseLoc; 192322216eb4fb0936d2488fc03abd285d135c36ff01David Blaikie TypeResult BaseType = ParseBaseTypeSpecifier(BaseLoc, EndLocation); 192431a19b6989bbf326d2de5ae12e712e2a65ca9c34Douglas Gregor if (BaseType.isInvalid()) 192542a552f8200ba5948661aee0106fce0c04e39818Douglas Gregor return true; 19261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1927f90b27ad077c3339b62befc892382845339f9490Douglas Gregor // Parse the optional ellipsis (for a pack expansion). The ellipsis is 1928f90b27ad077c3339b62befc892382845339f9490Douglas Gregor // actually part of the base-specifier-list grammar productions, but we 1929f90b27ad077c3339b62befc892382845339f9490Douglas Gregor // parse it here for convenience. 1930f90b27ad077c3339b62befc892382845339f9490Douglas Gregor SourceLocation EllipsisLoc; 1931651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines TryConsumeToken(tok::ellipsis, EllipsisLoc); 1932651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 19331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // Find the complete source range for the base-specifier. 19347f43d6764797ab21216421aeb00f4ec314d503d1Douglas Gregor SourceRange Range(StartLoc, EndLocation); 19351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1936e37ac4ff1620ed2d7026f52baccbfa022d79ced1Douglas Gregor // Notify semantic analysis that we have parsed a complete 1937e37ac4ff1620ed2d7026f52baccbfa022d79ced1Douglas Gregor // base-specifier. 1938053214013990ad8ec096dafc64aa7c0ad2b05bc0Richard Smith return Actions.ActOnBaseSpecifier(ClassDecl, Range, Attributes, IsVirtual, 1939053214013990ad8ec096dafc64aa7c0ad2b05bc0Richard Smith Access, BaseType.get(), BaseLoc, 1940053214013990ad8ec096dafc64aa7c0ad2b05bc0Richard Smith EllipsisLoc); 1941e37ac4ff1620ed2d7026f52baccbfa022d79ced1Douglas Gregor} 1942e37ac4ff1620ed2d7026f52baccbfa022d79ced1Douglas Gregor 1943e37ac4ff1620ed2d7026f52baccbfa022d79ced1Douglas Gregor/// getAccessSpecifierIfPresent - Determine whether the next token is 1944e37ac4ff1620ed2d7026f52baccbfa022d79ced1Douglas Gregor/// a C++ access-specifier. 1945e37ac4ff1620ed2d7026f52baccbfa022d79ced1Douglas Gregor/// 1946e37ac4ff1620ed2d7026f52baccbfa022d79ced1Douglas Gregor/// access-specifier: [C++ class.derived] 1947e37ac4ff1620ed2d7026f52baccbfa022d79ced1Douglas Gregor/// 'private' 1948e37ac4ff1620ed2d7026f52baccbfa022d79ced1Douglas Gregor/// 'protected' 1949e37ac4ff1620ed2d7026f52baccbfa022d79ced1Douglas Gregor/// 'public' 19501eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpAccessSpecifier Parser::getAccessSpecifierIfPresent() const { 1951e37ac4ff1620ed2d7026f52baccbfa022d79ced1Douglas Gregor switch (Tok.getKind()) { 1952e37ac4ff1620ed2d7026f52baccbfa022d79ced1Douglas Gregor default: return AS_none; 1953e37ac4ff1620ed2d7026f52baccbfa022d79ced1Douglas Gregor case tok::kw_private: return AS_private; 1954e37ac4ff1620ed2d7026f52baccbfa022d79ced1Douglas Gregor case tok::kw_protected: return AS_protected; 1955e37ac4ff1620ed2d7026f52baccbfa022d79ced1Douglas Gregor case tok::kw_public: return AS_public; 1956e37ac4ff1620ed2d7026f52baccbfa022d79ced1Douglas Gregor } 1957e37ac4ff1620ed2d7026f52baccbfa022d79ced1Douglas Gregor} 19584cc18a4d5222e04bd568b1e3e4d86127dbbcdf3fArgyrios Kyrtzidis 195974e2fc332e07c76d4e69ccbd0e9e47a0bafd3908Douglas Gregor/// \brief If the given declarator has any parts for which parsing has to be 1960176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines/// delayed, e.g., default arguments or an exception-specification, create a 1961176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines/// late-parsed method declaration record to handle the parsing at the end of 1962176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines/// the class definition. 196374e2fc332e07c76d4e69ccbd0e9e47a0bafd3908Douglas Gregorvoid Parser::HandleMemberFunctionDeclDelays(Declarator& DeclaratorInfo, 196474e2fc332e07c76d4e69ccbd0e9e47a0bafd3908Douglas Gregor Decl *ThisDecl) { 19651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump DeclaratorChunk::FunctionTypeInfo &FTI 1966075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara = DeclaratorInfo.getFunctionTypeInfo(); 19670e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // If there was a late-parsed exception-specification, we'll need a 19680e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // late parse 19690e2c34f92f00628d48968dfea096d36381f494cbStephen Hines bool NeedLateParse = FTI.getExceptionSpecType() == EST_Unparsed; 19700e2c34f92f00628d48968dfea096d36381f494cbStephen Hines 19710e2c34f92f00628d48968dfea096d36381f494cbStephen Hines if (!NeedLateParse) { 19720e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // Look ahead to see if there are any default args 19730e2c34f92f00628d48968dfea096d36381f494cbStephen Hines for (unsigned ParamIdx = 0; ParamIdx < FTI.NumParams; ++ParamIdx) { 19740e2c34f92f00628d48968dfea096d36381f494cbStephen Hines auto Param = cast<ParmVarDecl>(FTI.Params[ParamIdx].Param); 19750e2c34f92f00628d48968dfea096d36381f494cbStephen Hines if (Param->hasUnparsedDefaultArg()) { 19760e2c34f92f00628d48968dfea096d36381f494cbStephen Hines NeedLateParse = true; 19770e2c34f92f00628d48968dfea096d36381f494cbStephen Hines break; 19780e2c34f92f00628d48968dfea096d36381f494cbStephen Hines } 19790e2c34f92f00628d48968dfea096d36381f494cbStephen Hines } 19800e2c34f92f00628d48968dfea096d36381f494cbStephen Hines } 198174e2fc332e07c76d4e69ccbd0e9e47a0bafd3908Douglas Gregor 19820e2c34f92f00628d48968dfea096d36381f494cbStephen Hines if (NeedLateParse) { 1983176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // Push this method onto the stack of late-parsed method 1984176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // declarations. 19850e2c34f92f00628d48968dfea096d36381f494cbStephen Hines auto LateMethod = new LateParsedMethodDeclaration(this, ThisDecl); 1986176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines getCurrentClass().LateParsedDeclarations.push_back(LateMethod); 1987176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines LateMethod->TemplateScope = getCurScope()->isTemplateParamScope(); 1988176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 19890e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // Stash the exception-specification tokens in the late-pased method. 1990176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines LateMethod->ExceptionSpecTokens = FTI.ExceptionSpecTokens; 199187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar FTI.ExceptionSpecTokens = nullptr; 1992176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 19930e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // Push tokens for each parameter. Those that do not have 19940e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // defaults will be NULL. 1995176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines LateMethod->DefaultArgs.reserve(FTI.NumParams); 19960e2c34f92f00628d48968dfea096d36381f494cbStephen Hines for (unsigned ParamIdx = 0; ParamIdx < FTI.NumParams; ++ParamIdx) 1997651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines LateMethod->DefaultArgs.push_back(LateParsedDefaultArgument( 19980e2c34f92f00628d48968dfea096d36381f494cbStephen Hines FTI.Params[ParamIdx].Param, FTI.Params[ParamIdx].DefaultArgTokens)); 1999d33133cdc1af466f9c276249b2621be03867888bEli Friedman } 2000d33133cdc1af466f9c276249b2621be03867888bEli Friedman} 2001d33133cdc1af466f9c276249b2621be03867888bEli Friedman 20024e24f0f711e2c9fde79f19fa1c80deaab3f3b356Richard Smith/// isCXX11VirtSpecifier - Determine whether the given token is a C++11 20031f3b6fdabbb10779a473d6315154d7325ce20aeaAnders Carlsson/// virt-specifier. 20041f3b6fdabbb10779a473d6315154d7325ce20aeaAnders Carlsson/// 20051f3b6fdabbb10779a473d6315154d7325ce20aeaAnders Carlsson/// virt-specifier: 20061f3b6fdabbb10779a473d6315154d7325ce20aeaAnders Carlsson/// override 20071f3b6fdabbb10779a473d6315154d7325ce20aeaAnders Carlsson/// final 20084e24f0f711e2c9fde79f19fa1c80deaab3f3b356Richard SmithVirtSpecifiers::Specifier Parser::isCXX11VirtSpecifier(const Token &Tok) const { 2009651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (!getLangOpts().CPlusPlus || Tok.isNot(tok::identifier)) 2010cc54d594d4f6509c0e3a8e349e481d9b5d899df6Anders Carlsson return VirtSpecifiers::VS_None; 2011cc54d594d4f6509c0e3a8e349e481d9b5d899df6Anders Carlsson 2012651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines IdentifierInfo *II = Tok.getIdentifierInfo(); 20137eeb4ec11043d4860361348f2b19299d957d47a9Anders Carlsson 2014651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // Initialize the contextual keywords. 2015651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (!Ident_final) { 2016651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Ident_final = &PP.getIdentifierTable().get("final"); 2017651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (getLangOpts().MicrosoftExt) 2018651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Ident_sealed = &PP.getIdentifierTable().get("sealed"); 2019651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Ident_override = &PP.getIdentifierTable().get("override"); 2020651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 20211f3b6fdabbb10779a473d6315154d7325ce20aeaAnders Carlsson 2022651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (II == Ident_override) 2023651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return VirtSpecifiers::VS_Override; 20247121bdb91b86f6053765bda18dd0a8a118929aceDavid Majnemer 2025651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (II == Ident_sealed) 2026651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return VirtSpecifiers::VS_Sealed; 2027651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 2028651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (II == Ident_final) 2029651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return VirtSpecifiers::VS_Final; 2030b971dbdb65149a7cf0c046380186d0204e5b411eAnders Carlsson 2031b971dbdb65149a7cf0c046380186d0204e5b411eAnders Carlsson return VirtSpecifiers::VS_None; 20321f3b6fdabbb10779a473d6315154d7325ce20aeaAnders Carlsson} 20331f3b6fdabbb10779a473d6315154d7325ce20aeaAnders Carlsson 20344e24f0f711e2c9fde79f19fa1c80deaab3f3b356Richard Smith/// ParseOptionalCXX11VirtSpecifierSeq - Parse a virt-specifier-seq. 20351f3b6fdabbb10779a473d6315154d7325ce20aeaAnders Carlsson/// 20361f3b6fdabbb10779a473d6315154d7325ce20aeaAnders Carlsson/// virt-specifier-seq: 20371f3b6fdabbb10779a473d6315154d7325ce20aeaAnders Carlsson/// virt-specifier 20381f3b6fdabbb10779a473d6315154d7325ce20aeaAnders Carlsson/// virt-specifier-seq virt-specifier 20394e24f0f711e2c9fde79f19fa1c80deaab3f3b356Richard Smithvoid Parser::ParseOptionalCXX11VirtSpecifierSeq(VirtSpecifiers &VS, 2040176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines bool IsInterface, 2041176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines SourceLocation FriendLoc) { 2042b971dbdb65149a7cf0c046380186d0204e5b411eAnders Carlsson while (true) { 20434e24f0f711e2c9fde79f19fa1c80deaab3f3b356Richard Smith VirtSpecifiers::Specifier Specifier = isCXX11VirtSpecifier(); 2044b971dbdb65149a7cf0c046380186d0204e5b411eAnders Carlsson if (Specifier == VirtSpecifiers::VS_None) 2045b971dbdb65149a7cf0c046380186d0204e5b411eAnders Carlsson return; 2046b971dbdb65149a7cf0c046380186d0204e5b411eAnders Carlsson 2047176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (FriendLoc.isValid()) { 2048176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Diag(Tok.getLocation(), diag::err_friend_decl_spec) 2049176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines << VirtSpecifiers::getSpecifierName(Specifier) 2050176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines << FixItHint::CreateRemoval(Tok.getLocation()) 2051176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines << SourceRange(FriendLoc, FriendLoc); 2052176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines ConsumeToken(); 2053176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines continue; 2054176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 2055176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 2056b971dbdb65149a7cf0c046380186d0204e5b411eAnders Carlsson // C++ [class.mem]p8: 2057b971dbdb65149a7cf0c046380186d0204e5b411eAnders Carlsson // A virt-specifier-seq shall contain at most one of each virt-specifier. 20586bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines const char *PrevSpec = nullptr; 205946127a96b6dd6b93aa18d5f7a55bc2db8b52a2c9Anders Carlsson if (VS.SetSpecifier(Specifier, Tok.getLocation(), PrevSpec)) 2060b971dbdb65149a7cf0c046380186d0204e5b411eAnders Carlsson Diag(Tok.getLocation(), diag::err_duplicate_virt_specifier) 2061b971dbdb65149a7cf0c046380186d0204e5b411eAnders Carlsson << PrevSpec 2062b971dbdb65149a7cf0c046380186d0204e5b411eAnders Carlsson << FixItHint::CreateRemoval(Tok.getLocation()); 2063b971dbdb65149a7cf0c046380186d0204e5b411eAnders Carlsson 20647121bdb91b86f6053765bda18dd0a8a118929aceDavid Majnemer if (IsInterface && (Specifier == VirtSpecifiers::VS_Final || 20657121bdb91b86f6053765bda18dd0a8a118929aceDavid Majnemer Specifier == VirtSpecifiers::VS_Sealed)) { 2066e402e72273cde2a64fa6097c1fe93f500038675dJohn McCall Diag(Tok.getLocation(), diag::err_override_control_interface) 2067e402e72273cde2a64fa6097c1fe93f500038675dJohn McCall << VirtSpecifiers::getSpecifierName(Specifier); 20687121bdb91b86f6053765bda18dd0a8a118929aceDavid Majnemer } else if (Specifier == VirtSpecifiers::VS_Sealed) { 20697121bdb91b86f6053765bda18dd0a8a118929aceDavid Majnemer Diag(Tok.getLocation(), diag::ext_ms_sealed_keyword); 2070e402e72273cde2a64fa6097c1fe93f500038675dJohn McCall } else { 20717121bdb91b86f6053765bda18dd0a8a118929aceDavid Majnemer Diag(Tok.getLocation(), 20727121bdb91b86f6053765bda18dd0a8a118929aceDavid Majnemer getLangOpts().CPlusPlus11 20737121bdb91b86f6053765bda18dd0a8a118929aceDavid Majnemer ? diag::warn_cxx98_compat_override_control_keyword 20747121bdb91b86f6053765bda18dd0a8a118929aceDavid Majnemer : diag::ext_override_control_keyword) 20757121bdb91b86f6053765bda18dd0a8a118929aceDavid Majnemer << VirtSpecifiers::getSpecifierName(Specifier); 2076e402e72273cde2a64fa6097c1fe93f500038675dJohn McCall } 2077b971dbdb65149a7cf0c046380186d0204e5b411eAnders Carlsson ConsumeToken(); 2078b971dbdb65149a7cf0c046380186d0204e5b411eAnders Carlsson } 20791f3b6fdabbb10779a473d6315154d7325ce20aeaAnders Carlsson} 20801f3b6fdabbb10779a473d6315154d7325ce20aeaAnders Carlsson 20814e24f0f711e2c9fde79f19fa1c80deaab3f3b356Richard Smith/// isCXX11FinalKeyword - Determine whether the next token is a C++11 2082651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines/// 'final' or Microsoft 'sealed' contextual keyword. 20834e24f0f711e2c9fde79f19fa1c80deaab3f3b356Richard Smithbool Parser::isCXX11FinalKeyword() const { 2084651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines VirtSpecifiers::Specifier Specifier = isCXX11VirtSpecifier(); 2085651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return Specifier == VirtSpecifiers::VS_Final || 2086651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Specifier == VirtSpecifiers::VS_Sealed; 2087651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 2088cc54d594d4f6509c0e3a8e349e481d9b5d899df6Anders Carlsson 2089651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines/// \brief Parse a C++ member-declarator up to, but not including, the optional 2090651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines/// brace-or-equal-initializer or pure-specifier. 20910e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesbool Parser::ParseCXXMemberDeclaratorBeforeInitializer( 2092651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Declarator &DeclaratorInfo, VirtSpecifiers &VS, ExprResult &BitfieldSize, 2093651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines LateParsedAttrList &LateParsedAttrs) { 2094651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // member-declarator: 2095651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // declarator pure-specifier[opt] 2096651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // declarator brace-or-equal-initializer[opt] 2097651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // identifier[opt] ':' constant-expression 2098176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (Tok.isNot(tok::colon)) 2099651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines ParseDeclarator(DeclaratorInfo); 2100176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines else 2101176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines DeclaratorInfo.SetIdentifier(nullptr, Tok.getLocation()); 2102cc54d594d4f6509c0e3a8e349e481d9b5d899df6Anders Carlsson 2103651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (!DeclaratorInfo.isFunctionDeclarator() && TryConsumeToken(tok::colon)) { 2104176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines assert(DeclaratorInfo.isPastIdentifier() && 2105176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines "don't know where identifier would go yet?"); 2106651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines BitfieldSize = ParseConstantExpression(); 2107651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (BitfieldSize.isInvalid()) 2108651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines SkipUntil(tok::comma, StopAtSemi | StopBeforeMatch); 21093ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar } else { 2110176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines ParseOptionalCXX11VirtSpecifierSeq( 2111176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines VS, getCurrentClass().IsInterface, 2112176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines DeclaratorInfo.getDeclSpec().getFriendSpecLoc()); 21133ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar if (!VS.isUnset()) 21143ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar MaybeParseAndDiagnoseDeclSpecAfterCXX11VirtSpecifierSeq(DeclaratorInfo, VS); 21153ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar } 2116651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 2117651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // If a simple-asm-expr is present, parse it. 2118651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (Tok.is(tok::kw_asm)) { 2119651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines SourceLocation Loc; 2120651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines ExprResult AsmLabel(ParseSimpleAsm(&Loc)); 2121651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (AsmLabel.isInvalid()) 2122651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines SkipUntil(tok::comma, StopAtSemi | StopBeforeMatch); 2123651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 2124c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines DeclaratorInfo.setAsmLabel(AsmLabel.get()); 2125651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines DeclaratorInfo.SetRangeEnd(Loc); 2126cc54d594d4f6509c0e3a8e349e481d9b5d899df6Anders Carlsson } 21277121bdb91b86f6053765bda18dd0a8a118929aceDavid Majnemer 2128651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // If attributes exist after the declarator, but before an '{', parse them. 2129651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines MaybeParseGNUAttributes(DeclaratorInfo, &LateParsedAttrs); 2130651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 2131651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // For compatibility with code written to older Clang, also accept a 2132651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // virt-specifier *after* the GNU attributes. 2133176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (BitfieldSize.isUnset() && VS.isUnset()) { 2134176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines ParseOptionalCXX11VirtSpecifierSeq( 2135176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines VS, getCurrentClass().IsInterface, 2136176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines DeclaratorInfo.getDeclSpec().getFriendSpecLoc()); 2137176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (!VS.isUnset()) { 2138176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // If we saw any GNU-style attributes that are known to GCC followed by a 2139176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // virt-specifier, issue a GCC-compat warning. 2140176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines const AttributeList *Attr = DeclaratorInfo.getAttributes(); 2141176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines while (Attr) { 2142176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (Attr->isKnownToGCC() && !Attr->isCXX11Attribute()) 2143176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Diag(Attr->getLoc(), diag::warn_gcc_attribute_location); 2144176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Attr = Attr->getNext(); 2145176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 21463ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar MaybeParseAndDiagnoseDeclSpecAfterCXX11VirtSpecifierSeq(DeclaratorInfo, VS); 2147176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 2148176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 21490e2c34f92f00628d48968dfea096d36381f494cbStephen Hines 21500e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // If this has neither a name nor a bit width, something has gone seriously 21510e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // wrong. Skip until the semi-colon or }. 21520e2c34f92f00628d48968dfea096d36381f494cbStephen Hines if (!DeclaratorInfo.hasName() && BitfieldSize.isUnset()) { 21530e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // If so, skip until the semi-colon or a }. 21540e2c34f92f00628d48968dfea096d36381f494cbStephen Hines SkipUntil(tok::r_brace, StopAtSemi | StopBeforeMatch); 21550e2c34f92f00628d48968dfea096d36381f494cbStephen Hines return true; 21560e2c34f92f00628d48968dfea096d36381f494cbStephen Hines } 21570e2c34f92f00628d48968dfea096d36381f494cbStephen Hines return false; 2158cc54d594d4f6509c0e3a8e349e481d9b5d899df6Anders Carlsson} 2159cc54d594d4f6509c0e3a8e349e481d9b5d899df6Anders Carlsson 21603ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar/// \brief Look for declaration specifiers possibly occurring after C++11 21613ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar/// virt-specifier-seq and diagnose them. 21623ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainarvoid Parser::MaybeParseAndDiagnoseDeclSpecAfterCXX11VirtSpecifierSeq( 21633ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar Declarator &D, 21643ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar VirtSpecifiers &VS) { 21653ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar DeclSpec DS(AttrFactory); 21663ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar 21673ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // GNU-style and C++11 attributes are not allowed here, but they will be 21683ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // handled by the caller. Diagnose everything else. 21693ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar ParseTypeQualifierListOpt(DS, AR_NoAttributesParsed, false); 21703ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar D.ExtendWithDeclSpec(DS); 21713ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar 21723ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar if (D.isFunctionDeclarator()) { 21733ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar auto &Function = D.getFunctionTypeInfo(); 21743ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar if (DS.getTypeQualifiers() != DeclSpec::TQ_unspecified) { 21753ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar auto DeclSpecCheck = [&] (DeclSpec::TQ TypeQual, 21763ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar const char *FixItName, 21773ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar SourceLocation SpecLoc, 21783ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar unsigned* QualifierLoc) { 21793ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar FixItHint Insertion; 21803ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar if (DS.getTypeQualifiers() & TypeQual) { 21813ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar if (!(Function.TypeQuals & TypeQual)) { 21823ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar std::string Name(FixItName); 21833ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar Name += " "; 21843ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar Insertion = FixItHint::CreateInsertion(VS.getFirstLocation(), Name.c_str()); 21853ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar Function.TypeQuals |= TypeQual; 21863ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar *QualifierLoc = SpecLoc.getRawEncoding(); 21873ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar } 21883ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar Diag(SpecLoc, diag::err_declspec_after_virtspec) 21893ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar << FixItName 21903ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar << VirtSpecifiers::getSpecifierName(VS.getLastSpecifier()) 21913ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar << FixItHint::CreateRemoval(SpecLoc) 21923ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar << Insertion; 21933ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar } 21943ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar }; 21953ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar DeclSpecCheck(DeclSpec::TQ_const, "const", DS.getConstSpecLoc(), 21963ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar &Function.ConstQualifierLoc); 21973ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar DeclSpecCheck(DeclSpec::TQ_volatile, "volatile", DS.getVolatileSpecLoc(), 21983ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar &Function.VolatileQualifierLoc); 21993ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar DeclSpecCheck(DeclSpec::TQ_restrict, "restrict", DS.getRestrictSpecLoc(), 22003ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar &Function.RestrictQualifierLoc); 22013ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar } 22023ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar 22033ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // Parse ref-qualifiers. 22043ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar bool RefQualifierIsLValueRef = true; 22053ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar SourceLocation RefQualifierLoc; 22063ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar if (ParseRefQualifier(RefQualifierIsLValueRef, RefQualifierLoc)) { 22073ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar const char *Name = (RefQualifierIsLValueRef ? "& " : "&& "); 22083ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar FixItHint Insertion = FixItHint::CreateInsertion(VS.getFirstLocation(), Name); 22093ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar Function.RefQualifierIsLValueRef = RefQualifierIsLValueRef; 22103ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar Function.RefQualifierLoc = RefQualifierLoc.getRawEncoding(); 22113ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar 22123ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar Diag(RefQualifierLoc, diag::err_declspec_after_virtspec) 22133ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar << (RefQualifierIsLValueRef ? "&" : "&&") 22143ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar << VirtSpecifiers::getSpecifierName(VS.getLastSpecifier()) 22153ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar << FixItHint::CreateRemoval(RefQualifierLoc) 22163ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar << Insertion; 22173ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar D.SetRangeEnd(RefQualifierLoc); 22183ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar } 22193ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar } 22203ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar} 22213ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar 22224cc18a4d5222e04bd568b1e3e4d86127dbbcdf3fArgyrios Kyrtzidis/// ParseCXXClassMemberDeclaration - Parse a C++ class member declaration. 22234cc18a4d5222e04bd568b1e3e4d86127dbbcdf3fArgyrios Kyrtzidis/// 22244cc18a4d5222e04bd568b1e3e4d86127dbbcdf3fArgyrios Kyrtzidis/// member-declaration: 22254cc18a4d5222e04bd568b1e3e4d86127dbbcdf3fArgyrios Kyrtzidis/// decl-specifier-seq[opt] member-declarator-list[opt] ';' 22264cc18a4d5222e04bd568b1e3e4d86127dbbcdf3fArgyrios Kyrtzidis/// function-definition ';'[opt] 22274cc18a4d5222e04bd568b1e3e4d86127dbbcdf3fArgyrios Kyrtzidis/// ::[opt] nested-name-specifier template[opt] unqualified-id ';'[TODO] 22284cc18a4d5222e04bd568b1e3e4d86127dbbcdf3fArgyrios Kyrtzidis/// using-declaration [TODO] 2229511d7aba3b12853fdb88729a0313b80a60eab8adAnders Carlsson/// [C++0x] static_assert-declaration 22305aeccdbb4bdc94e48c04cacc59fa812af32109b2Anders Carlsson/// template-declaration 2231bc8d56496a6ecdba14769df03d75c001184f8c54Chris Lattner/// [GNU] '__extension__' member-declaration 22324cc18a4d5222e04bd568b1e3e4d86127dbbcdf3fArgyrios Kyrtzidis/// 22334cc18a4d5222e04bd568b1e3e4d86127dbbcdf3fArgyrios Kyrtzidis/// member-declarator-list: 22344cc18a4d5222e04bd568b1e3e4d86127dbbcdf3fArgyrios Kyrtzidis/// member-declarator 22354cc18a4d5222e04bd568b1e3e4d86127dbbcdf3fArgyrios Kyrtzidis/// member-declarator-list ',' member-declarator 22364cc18a4d5222e04bd568b1e3e4d86127dbbcdf3fArgyrios Kyrtzidis/// 22374cc18a4d5222e04bd568b1e3e4d86127dbbcdf3fArgyrios Kyrtzidis/// member-declarator: 22381f3b6fdabbb10779a473d6315154d7325ce20aeaAnders Carlsson/// declarator virt-specifier-seq[opt] pure-specifier[opt] 22394cc18a4d5222e04bd568b1e3e4d86127dbbcdf3fArgyrios Kyrtzidis/// declarator constant-initializer[opt] 22407a614d8380297fcd2bc23986241905d97222948cRichard Smith/// [C++11] declarator brace-or-equal-initializer[opt] 22414cc18a4d5222e04bd568b1e3e4d86127dbbcdf3fArgyrios Kyrtzidis/// identifier[opt] ':' constant-expression 22424cc18a4d5222e04bd568b1e3e4d86127dbbcdf3fArgyrios Kyrtzidis/// 22431f3b6fdabbb10779a473d6315154d7325ce20aeaAnders Carlsson/// virt-specifier-seq: 22441f3b6fdabbb10779a473d6315154d7325ce20aeaAnders Carlsson/// virt-specifier 22451f3b6fdabbb10779a473d6315154d7325ce20aeaAnders Carlsson/// virt-specifier-seq virt-specifier 22461f3b6fdabbb10779a473d6315154d7325ce20aeaAnders Carlsson/// 22471f3b6fdabbb10779a473d6315154d7325ce20aeaAnders Carlsson/// virt-specifier: 22481f3b6fdabbb10779a473d6315154d7325ce20aeaAnders Carlsson/// override 22491f3b6fdabbb10779a473d6315154d7325ce20aeaAnders Carlsson/// final 22507121bdb91b86f6053765bda18dd0a8a118929aceDavid Majnemer/// [MS] sealed 22511f3b6fdabbb10779a473d6315154d7325ce20aeaAnders Carlsson/// 2252e2b6833d445c7a4ce64f1816c05f176ba1740acaSebastian Redl/// pure-specifier: 22534cc18a4d5222e04bd568b1e3e4d86127dbbcdf3fArgyrios Kyrtzidis/// '= 0' 22544cc18a4d5222e04bd568b1e3e4d86127dbbcdf3fArgyrios Kyrtzidis/// 22554cc18a4d5222e04bd568b1e3e4d86127dbbcdf3fArgyrios Kyrtzidis/// constant-initializer: 22564cc18a4d5222e04bd568b1e3e4d86127dbbcdf3fArgyrios Kyrtzidis/// '=' constant-expression 22574cc18a4d5222e04bd568b1e3e4d86127dbbcdf3fArgyrios Kyrtzidis/// 225887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga NainarParser::DeclGroupPtrTy 225987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga NainarParser::ParseCXXClassMemberDeclaration(AccessSpecifier AS, 226087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar AttributeList *AccessAttrs, 2261c9068d7dd94d439cec66c421115d15303e481025John McCall const ParsedTemplateInfo &TemplateInfo, 2262c9068d7dd94d439cec66c421115d15303e481025John McCall ParsingDeclRAIIObject *TemplateDiags) { 22638a9013d24864272cf5b18c908a267bd7a2bda4c4Douglas Gregor if (Tok.is(tok::at)) { 22644e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (getLangOpts().ObjC1 && NextToken().isObjCAtKeyword(tok::objc_defs)) 22658a9013d24864272cf5b18c908a267bd7a2bda4c4Douglas Gregor Diag(Tok, diag::err_at_defs_cxx); 22668a9013d24864272cf5b18c908a267bd7a2bda4c4Douglas Gregor else 22678a9013d24864272cf5b18c908a267bd7a2bda4c4Douglas Gregor Diag(Tok, diag::err_at_in_class); 2268b310439121c875937d78cc49cc969bc1197fc025Richard Smith 22698a9013d24864272cf5b18c908a267bd7a2bda4c4Douglas Gregor ConsumeToken(); 22708fe2475a4b4c00475709c13d43eb9a57cce87cbcAlexey Bataev SkipUntil(tok::r_brace, StopAtSemi); 22714967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return nullptr; 22728a9013d24864272cf5b18c908a267bd7a2bda4c4Douglas Gregor } 2273b310439121c875937d78cc49cc969bc1197fc025Richard Smith 2274176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // Turn on colon protection early, while parsing declspec, although there is 2275176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // nothing to protect there. It prevents from false errors if error recovery 2276176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // incorrectly determines where the declspec ends, as in the example: 2277176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // struct A { enum class B { C }; }; 2278176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // const int C = 4; 2279176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // struct D { A::B : C; }; 2280176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines ColonProtectionRAIIObject X(*this); 2281176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 228260fa3cfd7aa63c29f9fc2d593bac56a3646337ccJohn McCall // Access declarations. 228383a22ecbf52c06b4ee364f3fadcdb0abaf2dabf6Richard Smith bool MalformedTypeSpec = false; 228460fa3cfd7aa63c29f9fc2d593bac56a3646337ccJohn McCall if (!TemplateInfo.Kind && 228587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Tok.isOneOf(tok::identifier, tok::coloncolon, tok::kw___super)) { 228683a22ecbf52c06b4ee364f3fadcdb0abaf2dabf6Richard Smith if (TryAnnotateCXXScopeToken()) 228783a22ecbf52c06b4ee364f3fadcdb0abaf2dabf6Richard Smith MalformedTypeSpec = true; 228883a22ecbf52c06b4ee364f3fadcdb0abaf2dabf6Richard Smith 228983a22ecbf52c06b4ee364f3fadcdb0abaf2dabf6Richard Smith bool isAccessDecl; 229083a22ecbf52c06b4ee364f3fadcdb0abaf2dabf6Richard Smith if (Tok.isNot(tok::annot_cxxscope)) 229183a22ecbf52c06b4ee364f3fadcdb0abaf2dabf6Richard Smith isAccessDecl = false; 229283a22ecbf52c06b4ee364f3fadcdb0abaf2dabf6Richard Smith else if (NextToken().is(tok::identifier)) 229360fa3cfd7aa63c29f9fc2d593bac56a3646337ccJohn McCall isAccessDecl = GetLookAheadToken(2).is(tok::semi); 229460fa3cfd7aa63c29f9fc2d593bac56a3646337ccJohn McCall else 229560fa3cfd7aa63c29f9fc2d593bac56a3646337ccJohn McCall isAccessDecl = NextToken().is(tok::kw_operator); 229660fa3cfd7aa63c29f9fc2d593bac56a3646337ccJohn McCall 229760fa3cfd7aa63c29f9fc2d593bac56a3646337ccJohn McCall if (isAccessDecl) { 229860fa3cfd7aa63c29f9fc2d593bac56a3646337ccJohn McCall // Collect the scope specifier token we annotated earlier. 229960fa3cfd7aa63c29f9fc2d593bac56a3646337ccJohn McCall CXXScopeSpec SS; 23004967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ParseOptionalCXXScopeSpecifier(SS, nullptr, 2301efaa93aaa2653f4eb40e6a22e504a448da94aaf8Douglas Gregor /*EnteringContext=*/false); 230260fa3cfd7aa63c29f9fc2d593bac56a3646337ccJohn McCall 2303176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (SS.isInvalid()) { 2304176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines SkipUntil(tok::semi); 23054967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return nullptr; 2306176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 2307176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 230860fa3cfd7aa63c29f9fc2d593bac56a3646337ccJohn McCall // Try to parse an unqualified-id. 2309e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara SourceLocation TemplateKWLoc; 231060fa3cfd7aa63c29f9fc2d593bac56a3646337ccJohn McCall UnqualifiedId Name; 23114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (ParseUnqualifiedId(SS, false, true, true, nullptr, TemplateKWLoc, 23124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Name)) { 231360fa3cfd7aa63c29f9fc2d593bac56a3646337ccJohn McCall SkipUntil(tok::semi); 23144967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return nullptr; 231560fa3cfd7aa63c29f9fc2d593bac56a3646337ccJohn McCall } 231660fa3cfd7aa63c29f9fc2d593bac56a3646337ccJohn McCall 231760fa3cfd7aa63c29f9fc2d593bac56a3646337ccJohn McCall // TODO: recover from mistakenly-qualified operator declarations. 2318651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (ExpectAndConsume(tok::semi, diag::err_expected_after, 2319651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines "access declaration")) { 2320651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines SkipUntil(tok::semi); 23214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return nullptr; 2322651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 232360fa3cfd7aa63c29f9fc2d593bac56a3646337ccJohn McCall 232487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return DeclGroupPtrTy::make(DeclGroupRef(Actions.ActOnUsingDeclaration( 232587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar getCurScope(), AS, 232687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar /* HasUsingKeyword */ false, SourceLocation(), SS, Name, 232787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar /* AttrList */ nullptr, 232887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar /* HasTypenameKeyword */ false, SourceLocation()))); 232960fa3cfd7aa63c29f9fc2d593bac56a3646337ccJohn McCall } 233060fa3cfd7aa63c29f9fc2d593bac56a3646337ccJohn McCall } 233160fa3cfd7aa63c29f9fc2d593bac56a3646337ccJohn McCall 2332176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // static_assert-declaration. A templated static_assert declaration is 2333176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // diagnosed in Parser::ParseSingleDeclarationAfterTemplate. 2334176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (!TemplateInfo.Kind && 233587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Tok.isOneOf(tok::kw_static_assert, tok::kw__Static_assert)) { 233697144fc41a9419bf6d74fc9450e8ef3f6e11f7e0Chris Lattner SourceLocation DeclEnd; 233787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return DeclGroupPtrTy::make( 233887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar DeclGroupRef(ParseStaticAssertDeclaration(DeclEnd))); 2339682bf92db408a6cbc3d37b5496a99b6ef85041ecChris Lattner } 23401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2341682bf92db408a6cbc3d37b5496a99b6ef85041ecChris Lattner if (Tok.is(tok::kw_template)) { 23421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump assert(!TemplateInfo.TemplateParams && 234337b372b76a3fafe77186d7e6079e5642e2017478Douglas Gregor "Nested template improperly parsed?"); 234497144fc41a9419bf6d74fc9450e8ef3f6e11f7e0Chris Lattner SourceLocation DeclEnd; 234587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return DeclGroupPtrTy::make( 234687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar DeclGroupRef(ParseDeclarationStartingWithTemplate( 234787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Declarator::MemberContext, DeclEnd, AS, AccessAttrs))); 2348682bf92db408a6cbc3d37b5496a99b6ef85041ecChris Lattner } 23495aeccdbb4bdc94e48c04cacc59fa812af32109b2Anders Carlsson 2350bc8d56496a6ecdba14769df03d75c001184f8c54Chris Lattner // Handle: member-declaration ::= '__extension__' member-declaration 2351bc8d56496a6ecdba14769df03d75c001184f8c54Chris Lattner if (Tok.is(tok::kw___extension__)) { 2352bc8d56496a6ecdba14769df03d75c001184f8c54Chris Lattner // __extension__ silences extension warnings in the subexpression. 2353bc8d56496a6ecdba14769df03d75c001184f8c54Chris Lattner ExtensionRAIIObject O(Diags); // Use RAII to do this. 2354bc8d56496a6ecdba14769df03d75c001184f8c54Chris Lattner ConsumeToken(); 23555f1c822def3efffe1d8f7299fbbbc3b1cdd4833dErik Verbruggen return ParseCXXClassMemberDeclaration(AS, AccessAttrs, 23565f1c822def3efffe1d8f7299fbbbc3b1cdd4833dErik Verbruggen TemplateInfo, TemplateDiags); 2357bc8d56496a6ecdba14769df03d75c001184f8c54Chris Lattner } 23589cfbe48a7a20a217fdb2920b29b67ae7941cb116Douglas Gregor 23590b7e678a11ece4288dc01aebb5b17e5eef8f8d2dJohn McCall ParsedAttributesWithRange attrs(AttrFactory); 236052b501cd723d56efe3ad2ab708c2b75530fe6caaMichael Han ParsedAttributesWithRange FnAttrs(AttrFactory); 23614e24f0f711e2c9fde79f19fa1c80deaab3f3b356Richard Smith // Optional C++11 attribute-specifier 23624e24f0f711e2c9fde79f19fa1c80deaab3f3b356Richard Smith MaybeParseCXX11Attributes(attrs); 236352b501cd723d56efe3ad2ab708c2b75530fe6caaMichael Han // We need to keep these attributes for future diagnostic 236452b501cd723d56efe3ad2ab708c2b75530fe6caaMichael Han // before they are taken over by declaration specifier. 236552b501cd723d56efe3ad2ab708c2b75530fe6caaMichael Han FnAttrs.addAll(attrs.getList()); 236652b501cd723d56efe3ad2ab708c2b75530fe6caaMichael Han FnAttrs.Range = attrs.Range; 236752b501cd723d56efe3ad2ab708c2b75530fe6caaMichael Han 23687f040a9d817cd1c72b565e92abff473510bf9e1dJohn McCall MaybeParseMicrosoftAttributes(attrs); 2369bbd37c62e34db3f5a95c899723484a76c71d7757Sean Hunt 23709cfbe48a7a20a217fdb2920b29b67ae7941cb116Douglas Gregor if (Tok.is(tok::kw_using)) { 23717f040a9d817cd1c72b565e92abff473510bf9e1dJohn McCall ProhibitAttributes(attrs); 23721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 23739cfbe48a7a20a217fdb2920b29b67ae7941cb116Douglas Gregor // Eat 'using'. 23749cfbe48a7a20a217fdb2920b29b67ae7941cb116Douglas Gregor SourceLocation UsingLoc = ConsumeToken(); 23759cfbe48a7a20a217fdb2920b29b67ae7941cb116Douglas Gregor 23769cfbe48a7a20a217fdb2920b29b67ae7941cb116Douglas Gregor if (Tok.is(tok::kw_namespace)) { 23779cfbe48a7a20a217fdb2920b29b67ae7941cb116Douglas Gregor Diag(UsingLoc, diag::err_using_namespace_in_class); 23788fe2475a4b4c00475709c13d43eb9a57cce87cbcAlexey Bataev SkipUntil(tok::semi, StopBeforeMatch); 23794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return nullptr; 23809cfbe48a7a20a217fdb2920b29b67ae7941cb116Douglas Gregor } 238187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar SourceLocation DeclEnd; 238287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // Otherwise, it must be a using-declaration or an alias-declaration. 238387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return DeclGroupPtrTy::make(DeclGroupRef(ParseUsingDeclaration( 238487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Declarator::MemberContext, TemplateInfo, UsingLoc, DeclEnd, AS))); 23859cfbe48a7a20a217fdb2920b29b67ae7941cb116Douglas Gregor } 23869cfbe48a7a20a217fdb2920b29b67ae7941cb116Douglas Gregor 23872287c5e2352fc51cd74e8a9a7725cbf87e41c007DeLesley Hutchins // Hold late-parsed attributes so we can attach a Decl to them later. 23882287c5e2352fc51cd74e8a9a7725cbf87e41c007DeLesley Hutchins LateParsedAttrList CommonLateParsedAttrs; 23892287c5e2352fc51cd74e8a9a7725cbf87e41c007DeLesley Hutchins 23904cc18a4d5222e04bd568b1e3e4d86127dbbcdf3fArgyrios Kyrtzidis // decl-specifier-seq: 23914cc18a4d5222e04bd568b1e3e4d86127dbbcdf3fArgyrios Kyrtzidis // Parse the common declaration-specifiers piece. 2392c9068d7dd94d439cec66c421115d15303e481025John McCall ParsingDeclSpec DS(*this, TemplateDiags); 23937f040a9d817cd1c72b565e92abff473510bf9e1dJohn McCall DS.takeAttributesFrom(attrs); 239483a22ecbf52c06b4ee364f3fadcdb0abaf2dabf6Richard Smith if (MalformedTypeSpec) 239583a22ecbf52c06b4ee364f3fadcdb0abaf2dabf6Richard Smith DS.SetTypeSpecError(); 2396651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 2397176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines ParseDeclarationSpecifiers(DS, TemplateInfo, AS, DSC_class, 2398176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines &CommonLateParsedAttrs); 2399176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 2400176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // Turn off colon protection that was set for declspec. 2401176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines X.restore(); 24024cc18a4d5222e04bd568b1e3e4d86127dbbcdf3fArgyrios Kyrtzidis 2403f0cc19f43d5e05dbd22d00faca8c093b7005be3fBill Wendling // If we had a free-standing type definition with a missing semicolon, we 2404f0cc19f43d5e05dbd22d00faca8c093b7005be3fBill Wendling // may get this far before the problem becomes obvious. 2405f0cc19f43d5e05dbd22d00faca8c093b7005be3fBill Wendling if (DS.hasTagDefinition() && 2406f0cc19f43d5e05dbd22d00faca8c093b7005be3fBill Wendling TemplateInfo.Kind == ParsedTemplateInfo::NonTemplate && 2407f0cc19f43d5e05dbd22d00faca8c093b7005be3fBill Wendling DiagnoseMissingSemiAfterTagDefinition(DS, AS, DSC_class, 2408f0cc19f43d5e05dbd22d00faca8c093b7005be3fBill Wendling &CommonLateParsedAttrs)) 24094967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return nullptr; 2410f0cc19f43d5e05dbd22d00faca8c093b7005be3fBill Wendling 24115354e77e60e82828c7c2361f5c688c2667ab59ccBenjamin Kramer MultiTemplateParamsArg TemplateParams( 24126bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines TemplateInfo.TemplateParams? TemplateInfo.TemplateParams->data() 24136bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines : nullptr, 2414dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall TemplateInfo.TemplateParams? TemplateInfo.TemplateParams->size() : 0); 2415dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall 2416651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (TryConsumeToken(tok::semi)) { 241752b501cd723d56efe3ad2ab708c2b75530fe6caaMichael Han if (DS.isFriendSpecified()) 241852b501cd723d56efe3ad2ab708c2b75530fe6caaMichael Han ProhibitAttributes(FnAttrs); 241952b501cd723d56efe3ad2ab708c2b75530fe6caaMichael Han 24204967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar RecordDecl *AnonRecord = nullptr; 24214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Decl *TheDecl = Actions.ParsedFreeStandingDeclSpec( 24224967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar getCurScope(), AS, DS, TemplateParams, false, AnonRecord); 2423c9068d7dd94d439cec66c421115d15303e481025John McCall DS.complete(TheDecl); 24244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (AnonRecord) { 24254967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Decl* decls[] = {AnonRecord, TheDecl}; 24264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return Actions.BuildDeclaratorGroup(decls, /*TypeMayContainAuto=*/false); 24274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } 24284967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return Actions.ConvertDeclToDeclGroup(TheDecl); 24294cc18a4d5222e04bd568b1e3e4d86127dbbcdf3fArgyrios Kyrtzidis } 243007952324dda0e758c17f8bc3015793c65c51c48cArgyrios Kyrtzidis 243154abf7d4fa3123b8324c09d2a4dfb789fd818403John McCall ParsingDeclarator DeclaratorInfo(*this, DS, Declarator::MemberContext); 24324867347e82648d3baf09524b98b09c297a5a198fNico Weber VirtSpecifiers VS; 24334cc18a4d5222e04bd568b1e3e4d86127dbbcdf3fArgyrios Kyrtzidis 2434eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski // Hold late-parsed attributes so we can attach a Decl to them later. 2435eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski LateParsedAttrList LateParsedAttrs; 2436eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski 2437a2b4e5d9292688bc67b583592918dbeecae31ea3Douglas Gregor SourceLocation EqualLoc; 243887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar SourceLocation PureSpecLoc; 243987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 244087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar auto TryConsumePureSpecifier = [&] (bool AllowDefinition) { 244187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (Tok.isNot(tok::equal)) 244287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return false; 244387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 244487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar auto &Zero = NextToken(); 244587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar SmallString<8> Buffer; 244687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (Zero.isNot(tok::numeric_constant) || Zero.getLength() != 1 || 244787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar PP.getSpelling(Zero, Buffer) != "0") 244887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return false; 244987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 245087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar auto &After = GetLookAheadToken(2); 245187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (!After.isOneOf(tok::semi, tok::comma) && 245287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar !(AllowDefinition && 245387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar After.isOneOf(tok::l_brace, tok::colon, tok::kw_try))) 245487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return false; 245587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 245687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar EqualLoc = ConsumeToken(); 245787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar PureSpecLoc = ConsumeToken(); 245887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return true; 245987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar }; 2460a1efc8c8c6460d860d6509b05b341e77ed9bfe87Chris Lattner 2461651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines SmallVector<Decl *, 8> DeclsInGroup; 2462651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines ExprResult BitfieldSize; 2463651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool ExpectSemi = true; 24644cc18a4d5222e04bd568b1e3e4d86127dbbcdf3fArgyrios Kyrtzidis 2465651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // Parse the first declarator. 24660e2c34f92f00628d48968dfea096d36381f494cbStephen Hines if (ParseCXXMemberDeclaratorBeforeInitializer( 24670e2c34f92f00628d48968dfea096d36381f494cbStephen Hines DeclaratorInfo, VS, BitfieldSize, LateParsedAttrs)) { 2468651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines TryConsumeToken(tok::semi); 24694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return nullptr; 2470651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 24711b2fc0f3e181d99fb34f60e711066fb11628ecd0John Thompson 2472651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // Check for a member function definition. 2473651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (BitfieldSize.isUnset()) { 2474651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // MSVC permits pure specifier on inline functions defined at class scope. 24756a24747beed797b2f1184c66ca45beb4db20eb08Francois Pichet // Hence check for =0 before checking for function definition. 247687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (getLangOpts().MicrosoftExt && DeclaratorInfo.isDeclarationOfFunction()) 247787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar TryConsumePureSpecifier(/*AllowDefinition*/ true); 24786a24747beed797b2f1184c66ca45beb4db20eb08Francois Pichet 247945fa560c72441069d9e4eb1e66efd87349caa552Douglas Gregor FunctionDefinitionKind DefinitionKind = FDK_Declaration; 24803a9fdb4742b21c0a3c27f18c5e4e94bab6f9e64cArgyrios Kyrtzidis // function-definition: 24817a614d8380297fcd2bc23986241905d97222948cRichard Smith // 24827a614d8380297fcd2bc23986241905d97222948cRichard Smith // In C++11, a non-function declarator followed by an open brace is a 24837a614d8380297fcd2bc23986241905d97222948cRichard Smith // braced-init-list for an in-class member initialization, not an 24847a614d8380297fcd2bc23986241905d97222948cRichard Smith // erroneous function definition. 248580ad52f327b532bded5c5b0ee38779d841c6cd35Richard Smith if (Tok.is(tok::l_brace) && !getLangOpts().CPlusPlus11) { 248645fa560c72441069d9e4eb1e66efd87349caa552Douglas Gregor DefinitionKind = FDK_Definition; 2487e4246a633b13197634225971b25df0cbdcec0c5dSean Hunt } else if (DeclaratorInfo.isFunctionDeclarator()) { 248887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (Tok.isOneOf(tok::l_brace, tok::colon, tok::kw_try)) { 248945fa560c72441069d9e4eb1e66efd87349caa552Douglas Gregor DefinitionKind = FDK_Definition; 2490e4246a633b13197634225971b25df0cbdcec0c5dSean Hunt } else if (Tok.is(tok::equal)) { 2491e4246a633b13197634225971b25df0cbdcec0c5dSean Hunt const Token &KW = NextToken(); 249245fa560c72441069d9e4eb1e66efd87349caa552Douglas Gregor if (KW.is(tok::kw_default)) 249345fa560c72441069d9e4eb1e66efd87349caa552Douglas Gregor DefinitionKind = FDK_Defaulted; 249445fa560c72441069d9e4eb1e66efd87349caa552Douglas Gregor else if (KW.is(tok::kw_delete)) 249545fa560c72441069d9e4eb1e66efd87349caa552Douglas Gregor DefinitionKind = FDK_Deleted; 2496e4246a633b13197634225971b25df0cbdcec0c5dSean Hunt } 2497e4246a633b13197634225971b25df0cbdcec0c5dSean Hunt } 24983ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar DeclaratorInfo.setFunctionDefinitionKind(DefinitionKind); 2499e4246a633b13197634225971b25df0cbdcec0c5dSean Hunt 250052b501cd723d56efe3ad2ab708c2b75530fe6caaMichael Han // C++11 [dcl.attr.grammar] p4: If an attribute-specifier-seq appertains 250152b501cd723d56efe3ad2ab708c2b75530fe6caaMichael Han // to a friend declaration, that declaration shall be a definition. 250252b501cd723d56efe3ad2ab708c2b75530fe6caaMichael Han if (DeclaratorInfo.isFunctionDeclarator() && 250352b501cd723d56efe3ad2ab708c2b75530fe6caaMichael Han DefinitionKind != FDK_Definition && DS.isFriendSpecified()) { 250452b501cd723d56efe3ad2ab708c2b75530fe6caaMichael Han // Diagnose attributes that appear before decl specifier: 250552b501cd723d56efe3ad2ab708c2b75530fe6caaMichael Han // [[]] friend int foo(); 250652b501cd723d56efe3ad2ab708c2b75530fe6caaMichael Han ProhibitAttributes(FnAttrs); 250752b501cd723d56efe3ad2ab708c2b75530fe6caaMichael Han } 250852b501cd723d56efe3ad2ab708c2b75530fe6caaMichael Han 25090e2c34f92f00628d48968dfea096d36381f494cbStephen Hines if (DefinitionKind != FDK_Declaration) { 25103a9fdb4742b21c0a3c27f18c5e4e94bab6f9e64cArgyrios Kyrtzidis if (!DeclaratorInfo.isFunctionDeclarator()) { 251165ba94814f667e6ea1fcbf0896ad496bb7010335Richard Trieu Diag(DeclaratorInfo.getIdentifierLoc(), diag::err_func_def_no_params); 25123a9fdb4742b21c0a3c27f18c5e4e94bab6f9e64cArgyrios Kyrtzidis ConsumeBrace(); 25138fe2475a4b4c00475709c13d43eb9a57cce87cbcAlexey Bataev SkipUntil(tok::r_brace); 251452b501cd723d56efe3ad2ab708c2b75530fe6caaMichael Han 25159ea416e598fa3cb09d67d514c4519c99abb81321Douglas Gregor // Consume the optional ';' 2516651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines TryConsumeToken(tok::semi); 2517651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 25184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return nullptr; 25193a9fdb4742b21c0a3c27f18c5e4e94bab6f9e64cArgyrios Kyrtzidis } 25203a9fdb4742b21c0a3c27f18c5e4e94bab6f9e64cArgyrios Kyrtzidis 25213a9fdb4742b21c0a3c27f18c5e4e94bab6f9e64cArgyrios Kyrtzidis if (DS.getStorageClassSpec() == DeclSpec::SCS_typedef) { 252265ba94814f667e6ea1fcbf0896ad496bb7010335Richard Trieu Diag(DeclaratorInfo.getIdentifierLoc(), 252365ba94814f667e6ea1fcbf0896ad496bb7010335Richard Trieu diag::err_function_declared_typedef); 25249ea416e598fa3cb09d67d514c4519c99abb81321Douglas Gregor 25256f9a445760992a6fbff2c0b08becf35ae9eafa71Richard Smith // Recover by treating the 'typedef' as spurious. 25266f9a445760992a6fbff2c0b08becf35ae9eafa71Richard Smith DS.ClearStorageClassSpecs(); 25273a9fdb4742b21c0a3c27f18c5e4e94bab6f9e64cArgyrios Kyrtzidis } 25284cc18a4d5222e04bd568b1e3e4d86127dbbcdf3fArgyrios Kyrtzidis 2529eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski Decl *FunDecl = 25305f1c822def3efffe1d8f7299fbbbc3b1cdd4833dErik Verbruggen ParseCXXInlineMethodDef(AS, AccessAttrs, DeclaratorInfo, TemplateInfo, 253187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar VS, PureSpecLoc); 2532eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski 2533fcbe20811e3848869054ad13352cbb431bd423ebDavid Majnemer if (FunDecl) { 2534fcbe20811e3848869054ad13352cbb431bd423ebDavid Majnemer for (unsigned i = 0, ni = CommonLateParsedAttrs.size(); i < ni; ++i) { 2535fcbe20811e3848869054ad13352cbb431bd423ebDavid Majnemer CommonLateParsedAttrs[i]->addDecl(FunDecl); 2536fcbe20811e3848869054ad13352cbb431bd423ebDavid Majnemer } 2537fcbe20811e3848869054ad13352cbb431bd423ebDavid Majnemer for (unsigned i = 0, ni = LateParsedAttrs.size(); i < ni; ++i) { 2538fcbe20811e3848869054ad13352cbb431bd423ebDavid Majnemer LateParsedAttrs[i]->addDecl(FunDecl); 2539fcbe20811e3848869054ad13352cbb431bd423ebDavid Majnemer } 2540eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski } 2541eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski LateParsedAttrs.clear(); 2542e4246a633b13197634225971b25df0cbdcec0c5dSean Hunt 2543e4246a633b13197634225971b25df0cbdcec0c5dSean Hunt // Consume the ';' - it's optional unless we have a delete or default 25444b0e6f1da341510c1ad83eaf4c836f3134d0156aRichard Trieu if (Tok.is(tok::semi)) 2545eab9d6f9065b042d39fbaf9842c9d8cc968dd6d0Richard Smith ConsumeExtraSemi(AfterMemberFunctionDefinition); 25469ea416e598fa3cb09d67d514c4519c99abb81321Douglas Gregor 254787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return DeclGroupPtrTy::make(DeclGroupRef(FunDecl)); 25483a9fdb4742b21c0a3c27f18c5e4e94bab6f9e64cArgyrios Kyrtzidis } 25494cc18a4d5222e04bd568b1e3e4d86127dbbcdf3fArgyrios Kyrtzidis } 25504cc18a4d5222e04bd568b1e3e4d86127dbbcdf3fArgyrios Kyrtzidis 25514cc18a4d5222e04bd568b1e3e4d86127dbbcdf3fArgyrios Kyrtzidis // member-declarator-list: 25524cc18a4d5222e04bd568b1e3e4d86127dbbcdf3fArgyrios Kyrtzidis // member-declarator 25534cc18a4d5222e04bd568b1e3e4d86127dbbcdf3fArgyrios Kyrtzidis // member-declarator-list ',' member-declarator 25544cc18a4d5222e04bd568b1e3e4d86127dbbcdf3fArgyrios Kyrtzidis 25554cc18a4d5222e04bd568b1e3e4d86127dbbcdf3fArgyrios Kyrtzidis while (1) { 2556ca5233044ef679840d1ad1c46a36b16e2ee8a6e1Richard Smith InClassInitStyle HasInClassInit = ICIS_NoInit; 255787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar bool HasStaticInitializer = false; 255887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (Tok.isOneOf(tok::equal, tok::l_brace) && PureSpecLoc.isInvalid()) { 25597a614d8380297fcd2bc23986241905d97222948cRichard Smith if (BitfieldSize.get()) { 25607a614d8380297fcd2bc23986241905d97222948cRichard Smith Diag(Tok, diag::err_bitfield_member_init); 25618fe2475a4b4c00475709c13d43eb9a57cce87cbcAlexey Bataev SkipUntil(tok::comma, StopAtSemi | StopBeforeMatch); 256287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } else if (DeclaratorInfo.isDeclarationOfFunction()) { 256387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // It's a pure-specifier. 256487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (!TryConsumePureSpecifier(/*AllowFunctionDefinition*/ false)) 256587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // Parse it as an expression so that Sema can diagnose it. 256687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar HasStaticInitializer = true; 256787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } else if (DeclaratorInfo.getDeclSpec().getStorageClassSpec() != 256887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar DeclSpec::SCS_static && 256987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar DeclaratorInfo.getDeclSpec().getStorageClassSpec() != 257087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar DeclSpec::SCS_typedef && 257187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar !DS.isFriendSpecified()) { 257287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // It's a default member initializer. 257387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar HasInClassInit = Tok.is(tok::equal) ? ICIS_CopyInit : ICIS_ListInit; 25747a614d8380297fcd2bc23986241905d97222948cRichard Smith } else { 257587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar HasStaticInitializer = true; 25767a614d8380297fcd2bc23986241905d97222948cRichard Smith } 25777a614d8380297fcd2bc23986241905d97222948cRichard Smith } 25787a614d8380297fcd2bc23986241905d97222948cRichard Smith 257907952324dda0e758c17f8bc3015793c65c51c48cArgyrios Kyrtzidis // NOTE: If Sema is the Action module and declarator is an instance field, 2580682bf92db408a6cbc3d37b5496a99b6ef85041ecChris Lattner // this call will *not* return the created decl; It will return null. 258107952324dda0e758c17f8bc3015793c65c51c48cArgyrios Kyrtzidis // See Sema::ActOnCXXMemberDeclarator for details. 258267d1a67f3db2f1aa69083c5c94164d6e0ee05b32John McCall 25836bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines NamedDecl *ThisDecl = nullptr; 258467d1a67f3db2f1aa69083c5c94164d6e0ee05b32John McCall if (DS.isFriendSpecified()) { 2585651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // C++11 [dcl.attr.grammar] p4: If an attribute-specifier-seq appertains 258652b501cd723d56efe3ad2ab708c2b75530fe6caaMichael Han // to a friend declaration, that declaration shall be a definition. 258752b501cd723d56efe3ad2ab708c2b75530fe6caaMichael Han // 2588651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // Diagnose attributes that appear in a friend member function declarator: 2589651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // friend int foo [[]] (); 259052b501cd723d56efe3ad2ab708c2b75530fe6caaMichael Han SmallVector<SourceRange, 4> Ranges; 259152b501cd723d56efe3ad2ab708c2b75530fe6caaMichael Han DeclaratorInfo.getCXX11AttributeRanges(Ranges); 2592651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines for (SmallVectorImpl<SourceRange>::iterator I = Ranges.begin(), 2593651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines E = Ranges.end(); I != E; ++I) 2594651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Diag((*I).getBegin(), diag::err_attributes_not_allowed) << *I; 259552b501cd723d56efe3ad2ab708c2b75530fe6caaMichael Han 259623c94dbb6631fecdb55ba401aa93722803d980c6Douglas Gregor ThisDecl = Actions.ActOnFriendFunctionDecl(getCurScope(), DeclaratorInfo, 25973fe198bf0d6118c7b080c17c3bb28d7c84e458b9Benjamin Kramer TemplateParams); 259837b372b76a3fafe77186d7e6079e5642e2017478Douglas Gregor } else { 259923c94dbb6631fecdb55ba401aa93722803d980c6Douglas Gregor ThisDecl = Actions.ActOnCXXMemberDeclarator(getCurScope(), AS, 260067d1a67f3db2f1aa69083c5c94164d6e0ee05b32John McCall DeclaratorInfo, 26013fe198bf0d6118c7b080c17c3bb28d7c84e458b9Benjamin Kramer TemplateParams, 2602c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines BitfieldSize.get(), 2603ca5233044ef679840d1ad1c46a36b16e2ee8a6e1Richard Smith VS, HasInClassInit); 2604ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo 2605ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo if (VarTemplateDecl *VT = 26066bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines ThisDecl ? dyn_cast<VarTemplateDecl>(ThisDecl) : nullptr) 2607ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo // Re-direct this decl to refer to the templated decl so that we can 2608ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo // initialize it. 2609ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo ThisDecl = VT->getTemplatedDecl(); 2610ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo 2611fcbe20811e3848869054ad13352cbb431bd423ebDavid Majnemer if (ThisDecl && AccessAttrs) 26124a97b8e75f5dccf5a9537cf7358297437f55326dRichard Smith Actions.ProcessDeclAttributeList(getCurScope(), ThisDecl, AccessAttrs); 261337b372b76a3fafe77186d7e6079e5642e2017478Douglas Gregor } 2614eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski 261587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // Error recovery might have converted a non-static member into a static 261687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // member. 26171d87fbaeea4a9fbbd73b3a53641f59f1673098e5David Blaikie if (HasInClassInit != ICIS_NoInit && 261887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar DeclaratorInfo.getDeclSpec().getStorageClassSpec() == 261987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar DeclSpec::SCS_static) { 262087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar HasInClassInit = ICIS_NoInit; 262187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar HasStaticInitializer = true; 262287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 262387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 262487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (ThisDecl && PureSpecLoc.isValid()) 262587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Actions.ActOnPureSpecifier(ThisDecl, PureSpecLoc); 262687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 262787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // Handle the initializer. 262887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (HasInClassInit != ICIS_NoInit) { 2629147545d698972cfd34ece30a5d55e8180784161eDouglas Gregor // The initializer was deferred; parse it and cache the tokens. 2630fcbe20811e3848869054ad13352cbb431bd423ebDavid Majnemer Diag(Tok, getLangOpts().CPlusPlus11 2631fcbe20811e3848869054ad13352cbb431bd423ebDavid Majnemer ? diag::warn_cxx98_compat_nonstatic_member_init 2632fcbe20811e3848869054ad13352cbb431bd423ebDavid Majnemer : diag::ext_nonstatic_member_init); 26337fe6208c3fa91f835813bb78236ef5c2bbf81053Richard Smith 26347a614d8380297fcd2bc23986241905d97222948cRichard Smith if (DeclaratorInfo.isArrayOfUnknownBound()) { 2635ca5233044ef679840d1ad1c46a36b16e2ee8a6e1Richard Smith // C++11 [dcl.array]p3: An array bound may also be omitted when the 2636ca5233044ef679840d1ad1c46a36b16e2ee8a6e1Richard Smith // declarator is followed by an initializer. 26377a614d8380297fcd2bc23986241905d97222948cRichard Smith // 26387a614d8380297fcd2bc23986241905d97222948cRichard Smith // A brace-or-equal-initializer for a member-declarator is not an 26393164c14cadbb09a05ba811602221e9156077cf44David Blaikie // initializer in the grammar, so this is ill-formed. 26407a614d8380297fcd2bc23986241905d97222948cRichard Smith Diag(Tok, diag::err_incomplete_array_member_init); 26418fe2475a4b4c00475709c13d43eb9a57cce87cbcAlexey Bataev SkipUntil(tok::comma, StopAtSemi | StopBeforeMatch); 2642fcbe20811e3848869054ad13352cbb431bd423ebDavid Majnemer 2643fcbe20811e3848869054ad13352cbb431bd423ebDavid Majnemer // Avoid later warnings about a class member of incomplete type. 26443164c14cadbb09a05ba811602221e9156077cf44David Blaikie if (ThisDecl) 26453164c14cadbb09a05ba811602221e9156077cf44David Blaikie ThisDecl->setInvalidDecl(); 26467a614d8380297fcd2bc23986241905d97222948cRichard Smith } else 26477a614d8380297fcd2bc23986241905d97222948cRichard Smith ParseCXXNonStaticMemberInitializer(ThisDecl); 264887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } else if (HasStaticInitializer) { 2649147545d698972cfd34ece30a5d55e8180784161eDouglas Gregor // Normal initializer. 265087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar ExprResult Init = ParseCXXMemberInitializer( 265187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar ThisDecl, DeclaratorInfo.isDeclarationOfFunction(), EqualLoc); 2652fcbe20811e3848869054ad13352cbb431bd423ebDavid Majnemer 2653147545d698972cfd34ece30a5d55e8180784161eDouglas Gregor if (Init.isInvalid()) 26548fe2475a4b4c00475709c13d43eb9a57cce87cbcAlexey Bataev SkipUntil(tok::comma, StopAtSemi | StopBeforeMatch); 2655147545d698972cfd34ece30a5d55e8180784161eDouglas Gregor else if (ThisDecl) 265633deb35535aebe81bed0eaf5c14f3032276a086eSebastian Redl Actions.AddInitializerToDecl(ThisDecl, Init.get(), EqualLoc.isInvalid(), 2657a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith DS.containsPlaceholderType()); 2658fcbe20811e3848869054ad13352cbb431bd423ebDavid Majnemer } else if (ThisDecl && DS.getStorageClassSpec() == DeclSpec::SCS_static) 2659147545d698972cfd34ece30a5d55e8180784161eDouglas Gregor // No initializer. 2660a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith Actions.ActOnUninitializedDecl(ThisDecl, DS.containsPlaceholderType()); 2661fcbe20811e3848869054ad13352cbb431bd423ebDavid Majnemer 2662147545d698972cfd34ece30a5d55e8180784161eDouglas Gregor if (ThisDecl) { 2663fcbe20811e3848869054ad13352cbb431bd423ebDavid Majnemer if (!ThisDecl->isInvalidDecl()) { 2664fcbe20811e3848869054ad13352cbb431bd423ebDavid Majnemer // Set the Decl for any late parsed attributes 2665fcbe20811e3848869054ad13352cbb431bd423ebDavid Majnemer for (unsigned i = 0, ni = CommonLateParsedAttrs.size(); i < ni; ++i) 2666fcbe20811e3848869054ad13352cbb431bd423ebDavid Majnemer CommonLateParsedAttrs[i]->addDecl(ThisDecl); 2667fcbe20811e3848869054ad13352cbb431bd423ebDavid Majnemer 2668fcbe20811e3848869054ad13352cbb431bd423ebDavid Majnemer for (unsigned i = 0, ni = LateParsedAttrs.size(); i < ni; ++i) 2669fcbe20811e3848869054ad13352cbb431bd423ebDavid Majnemer LateParsedAttrs[i]->addDecl(ThisDecl); 2670fcbe20811e3848869054ad13352cbb431bd423ebDavid Majnemer } 2671147545d698972cfd34ece30a5d55e8180784161eDouglas Gregor Actions.FinalizeDeclaration(ThisDecl); 2672147545d698972cfd34ece30a5d55e8180784161eDouglas Gregor DeclsInGroup.push_back(ThisDecl); 2673fcbe20811e3848869054ad13352cbb431bd423ebDavid Majnemer 2674fcbe20811e3848869054ad13352cbb431bd423ebDavid Majnemer if (DeclaratorInfo.isFunctionDeclarator() && 2675fcbe20811e3848869054ad13352cbb431bd423ebDavid Majnemer DeclaratorInfo.getDeclSpec().getStorageClassSpec() != 2676fcbe20811e3848869054ad13352cbb431bd423ebDavid Majnemer DeclSpec::SCS_typedef) 2677fcbe20811e3848869054ad13352cbb431bd423ebDavid Majnemer HandleMemberFunctionDeclDelays(DeclaratorInfo, ThisDecl); 2678147545d698972cfd34ece30a5d55e8180784161eDouglas Gregor } 2679fcbe20811e3848869054ad13352cbb431bd423ebDavid Majnemer LateParsedAttrs.clear(); 2680147545d698972cfd34ece30a5d55e8180784161eDouglas Gregor 2681147545d698972cfd34ece30a5d55e8180784161eDouglas Gregor DeclaratorInfo.complete(ThisDecl); 26827a614d8380297fcd2bc23986241905d97222948cRichard Smith 26834cc18a4d5222e04bd568b1e3e4d86127dbbcdf3fArgyrios Kyrtzidis // If we don't have a comma, it is either the end of the list (a ';') 26844cc18a4d5222e04bd568b1e3e4d86127dbbcdf3fArgyrios Kyrtzidis // or an error, bail out. 2685651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines SourceLocation CommaLoc; 2686651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (!TryConsumeToken(tok::comma, CommaLoc)) 26874cc18a4d5222e04bd568b1e3e4d86127dbbcdf3fArgyrios Kyrtzidis break; 26881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 26891c94c16317c1a35c1549e022958188eea2567089Richard Smith if (Tok.isAtStartOfLine() && 26901c94c16317c1a35c1549e022958188eea2567089Richard Smith !MightBeDeclarator(Declarator::MemberContext)) { 26911c94c16317c1a35c1549e022958188eea2567089Richard Smith // This comma was followed by a line-break and something which can't be 26921c94c16317c1a35c1549e022958188eea2567089Richard Smith // the start of a declarator. The comma was probably a typo for a 26931c94c16317c1a35c1549e022958188eea2567089Richard Smith // semicolon. 26941c94c16317c1a35c1549e022958188eea2567089Richard Smith Diag(CommaLoc, diag::err_expected_semi_declaration) 26951c94c16317c1a35c1549e022958188eea2567089Richard Smith << FixItHint::CreateReplacement(CommaLoc, ";"); 26961c94c16317c1a35c1549e022958188eea2567089Richard Smith ExpectSemi = false; 26971c94c16317c1a35c1549e022958188eea2567089Richard Smith break; 26981c94c16317c1a35c1549e022958188eea2567089Richard Smith } 26991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 27004cc18a4d5222e04bd568b1e3e4d86127dbbcdf3fArgyrios Kyrtzidis // Parse the next declarator. 27014cc18a4d5222e04bd568b1e3e4d86127dbbcdf3fArgyrios Kyrtzidis DeclaratorInfo.clear(); 27024867347e82648d3baf09524b98b09c297a5a198fNico Weber VS.clear(); 27030e2c34f92f00628d48968dfea096d36381f494cbStephen Hines BitfieldSize = ExprResult(/*Invalid=*/false); 270487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar EqualLoc = PureSpecLoc = SourceLocation(); 27057984de35644701c0d94336da7f2215d4c26d9f5bRichard Smith DeclaratorInfo.setCommaLoc(CommaLoc); 27061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2707651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // GNU attributes are allowed before the second and subsequent declarator. 27087f040a9d817cd1c72b565e92abff473510bf9e1dJohn McCall MaybeParseGNUAttributes(DeclaratorInfo); 27094cc18a4d5222e04bd568b1e3e4d86127dbbcdf3fArgyrios Kyrtzidis 27100e2c34f92f00628d48968dfea096d36381f494cbStephen Hines if (ParseCXXMemberDeclaratorBeforeInitializer( 27110e2c34f92f00628d48968dfea096d36381f494cbStephen Hines DeclaratorInfo, VS, BitfieldSize, LateParsedAttrs)) 27120e2c34f92f00628d48968dfea096d36381f494cbStephen Hines break; 27134cc18a4d5222e04bd568b1e3e4d86127dbbcdf3fArgyrios Kyrtzidis } 27144cc18a4d5222e04bd568b1e3e4d86127dbbcdf3fArgyrios Kyrtzidis 27151c94c16317c1a35c1549e022958188eea2567089Richard Smith if (ExpectSemi && 27161c94c16317c1a35c1549e022958188eea2567089Richard Smith ExpectAndConsume(tok::semi, diag::err_expected_semi_decl_list)) { 2717ae50d501f463d7032320ec31840f60ae68df3a55Chris Lattner // Skip to end of block or statement. 27188fe2475a4b4c00475709c13d43eb9a57cce87cbcAlexey Bataev SkipUntil(tok::r_brace, StopAtSemi | StopBeforeMatch); 2719ae50d501f463d7032320ec31840f60ae68df3a55Chris Lattner // If we stopped at a ';', eat it. 2720651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines TryConsumeToken(tok::semi); 27214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return nullptr; 27224cc18a4d5222e04bd568b1e3e4d86127dbbcdf3fArgyrios Kyrtzidis } 27234cc18a4d5222e04bd568b1e3e4d86127dbbcdf3fArgyrios Kyrtzidis 272487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return Actions.FinalizeDeclaratorGroup(getCurScope(), DS, DeclsInGroup); 27254cc18a4d5222e04bd568b1e3e4d86127dbbcdf3fArgyrios Kyrtzidis} 27264cc18a4d5222e04bd568b1e3e4d86127dbbcdf3fArgyrios Kyrtzidis 272787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// ParseCXXMemberInitializer - Parse the brace-or-equal-initializer. 272887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// Also detect and reject any attempted defaulted/deleted function definition. 272987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// The location of the '=', if any, will be placed in EqualLoc. 27307a614d8380297fcd2bc23986241905d97222948cRichard Smith/// 273187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// This does not check for a pure-specifier; that's handled elsewhere. 273233deb35535aebe81bed0eaf5c14f3032276a086eSebastian Redl/// 27337a614d8380297fcd2bc23986241905d97222948cRichard Smith/// brace-or-equal-initializer: 27347a614d8380297fcd2bc23986241905d97222948cRichard Smith/// '=' initializer-expression 273533deb35535aebe81bed0eaf5c14f3032276a086eSebastian Redl/// braced-init-list 273633deb35535aebe81bed0eaf5c14f3032276a086eSebastian Redl/// 27377a614d8380297fcd2bc23986241905d97222948cRichard Smith/// initializer-clause: 27387a614d8380297fcd2bc23986241905d97222948cRichard Smith/// assignment-expression 273933deb35535aebe81bed0eaf5c14f3032276a086eSebastian Redl/// braced-init-list 274033deb35535aebe81bed0eaf5c14f3032276a086eSebastian Redl/// 2741b310439121c875937d78cc49cc969bc1197fc025Richard Smith/// defaulted/deleted function-definition: 27427a614d8380297fcd2bc23986241905d97222948cRichard Smith/// '=' 'default' 27437a614d8380297fcd2bc23986241905d97222948cRichard Smith/// '=' 'delete' 27447a614d8380297fcd2bc23986241905d97222948cRichard Smith/// 27457a614d8380297fcd2bc23986241905d97222948cRichard Smith/// Prior to C++0x, the assignment-expression in an initializer-clause must 27467a614d8380297fcd2bc23986241905d97222948cRichard Smith/// be a constant-expression. 2747552e29985a710f4ced62b39d70557501bd31ca9bDouglas GregorExprResult Parser::ParseCXXMemberInitializer(Decl *D, bool IsFunction, 27487a614d8380297fcd2bc23986241905d97222948cRichard Smith SourceLocation &EqualLoc) { 274987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar assert(Tok.isOneOf(tok::equal, tok::l_brace) 27507a614d8380297fcd2bc23986241905d97222948cRichard Smith && "Data member initializer not starting with '=' or '{'"); 27517a614d8380297fcd2bc23986241905d97222948cRichard Smith 2752552e29985a710f4ced62b39d70557501bd31ca9bDouglas Gregor EnterExpressionEvaluationContext Context(Actions, 2753552e29985a710f4ced62b39d70557501bd31ca9bDouglas Gregor Sema::PotentiallyEvaluated, 2754552e29985a710f4ced62b39d70557501bd31ca9bDouglas Gregor D); 2755651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (TryConsumeToken(tok::equal, EqualLoc)) { 27567a614d8380297fcd2bc23986241905d97222948cRichard Smith if (Tok.is(tok::kw_delete)) { 27577a614d8380297fcd2bc23986241905d97222948cRichard Smith // In principle, an initializer of '= delete p;' is legal, but it will 27587a614d8380297fcd2bc23986241905d97222948cRichard Smith // never type-check. It's better to diagnose it as an ill-formed expression 27597a614d8380297fcd2bc23986241905d97222948cRichard Smith // than as an ill-formed deleted non-function member. 27607a614d8380297fcd2bc23986241905d97222948cRichard Smith // An initializer of '= delete p, foo' will never be parsed, because 27617a614d8380297fcd2bc23986241905d97222948cRichard Smith // a top-level comma always ends the initializer expression. 27627a614d8380297fcd2bc23986241905d97222948cRichard Smith const Token &Next = NextToken(); 276387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (IsFunction || Next.isOneOf(tok::semi, tok::comma, tok::eof)) { 27647a614d8380297fcd2bc23986241905d97222948cRichard Smith if (IsFunction) 27657a614d8380297fcd2bc23986241905d97222948cRichard Smith Diag(ConsumeToken(), diag::err_default_delete_in_multiple_declaration) 27667a614d8380297fcd2bc23986241905d97222948cRichard Smith << 1 /* delete */; 27677a614d8380297fcd2bc23986241905d97222948cRichard Smith else 27687a614d8380297fcd2bc23986241905d97222948cRichard Smith Diag(ConsumeToken(), diag::err_deleted_non_function); 2769c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines return ExprError(); 27707a614d8380297fcd2bc23986241905d97222948cRichard Smith } 27717a614d8380297fcd2bc23986241905d97222948cRichard Smith } else if (Tok.is(tok::kw_default)) { 27727a614d8380297fcd2bc23986241905d97222948cRichard Smith if (IsFunction) 27737a614d8380297fcd2bc23986241905d97222948cRichard Smith Diag(Tok, diag::err_default_delete_in_multiple_declaration) 27747a614d8380297fcd2bc23986241905d97222948cRichard Smith << 0 /* default */; 27757a614d8380297fcd2bc23986241905d97222948cRichard Smith else 27767a614d8380297fcd2bc23986241905d97222948cRichard Smith Diag(ConsumeToken(), diag::err_default_special_members); 2777c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines return ExprError(); 27787a614d8380297fcd2bc23986241905d97222948cRichard Smith } 27790e2c34f92f00628d48968dfea096d36381f494cbStephen Hines } 27800e2c34f92f00628d48968dfea096d36381f494cbStephen Hines if (const auto *PD = dyn_cast_or_null<MSPropertyDecl>(D)) { 27810e2c34f92f00628d48968dfea096d36381f494cbStephen Hines Diag(Tok, diag::err_ms_property_initializer) << PD; 27820e2c34f92f00628d48968dfea096d36381f494cbStephen Hines return ExprError(); 278333deb35535aebe81bed0eaf5c14f3032276a086eSebastian Redl } 278433deb35535aebe81bed0eaf5c14f3032276a086eSebastian Redl return ParseInitializer(); 27857a614d8380297fcd2bc23986241905d97222948cRichard Smith} 27867a614d8380297fcd2bc23986241905d97222948cRichard Smith 27873ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainarvoid Parser::SkipCXXMemberSpecification(SourceLocation RecordLoc, 27883ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar SourceLocation AttrFixitLoc, 27893ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar unsigned TagType, Decl *TagDecl) { 27903ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // Skip the optional 'final' keyword. 27913ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar if (getLangOpts().CPlusPlus && Tok.is(tok::identifier)) { 27923ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar assert(isCXX11FinalKeyword() && "not a class definition"); 27933ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar ConsumeToken(); 27943ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar 27953ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // Diagnose any C++11 attributes after 'final' keyword. 27963ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // We deliberately discard these attributes. 27973ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar ParsedAttributesWithRange Attrs(AttrFactory); 27983ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar CheckMisplacedCXX11Attribute(Attrs, AttrFixitLoc); 27993ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar 28003ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // This can only happen if we had malformed misplaced attributes; 28013ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // we only get called if there is a colon or left-brace after the 28023ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // attributes. 28033ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar if (Tok.isNot(tok::colon) && Tok.isNot(tok::l_brace)) 28043ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar return; 28053ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar } 28063ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar 28073ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // Skip the base clauses. This requires actually parsing them, because 28083ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // otherwise we can't be sure where they end (a left brace may appear 28093ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // within a template argument). 28103ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar if (Tok.is(tok::colon)) { 28113ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // Enter the scope of the class so that we can correctly parse its bases. 28123ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar ParseScope ClassScope(this, Scope::ClassScope|Scope::DeclScope); 28133ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar ParsingClassDefinition ParsingDef(*this, TagDecl, /*NonNestedClass*/ true, 28143ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar TagType == DeclSpec::TST_interface); 2815b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar auto OldContext = 2816b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Actions.ActOnTagStartSkippedDefinition(getCurScope(), TagDecl); 28173ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar 28183ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // Parse the bases but don't attach them to the class. 28193ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar ParseBaseClause(nullptr); 28203ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar 2821b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Actions.ActOnTagFinishSkippedDefinition(OldContext); 28223ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar 28233ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar if (!Tok.is(tok::l_brace)) { 28243ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar Diag(PP.getLocForEndOfToken(PrevTokLocation), 28253ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar diag::err_expected_lbrace_after_base_specifiers); 28263ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar return; 28273ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar } 28283ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar } 28293ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar 28303ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // Skip the body. 28313ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar assert(Tok.is(tok::l_brace)); 28323ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar BalancedDelimiterTracker T(*this, tok::l_brace); 28333ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar T.consumeOpen(); 28343ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar T.skipToEnd(); 283587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 283687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // Parse and discard any trailing attributes. 283787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar ParsedAttributes Attrs(AttrFactory); 283887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (Tok.is(tok::kw___attribute)) 283987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar MaybeParseGNUAttributes(Attrs); 284087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar} 284187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 284287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga NainarParser::DeclGroupPtrTy Parser::ParseCXXClassMemberDeclarationWithPragmas( 284387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar AccessSpecifier &AS, ParsedAttributesWithRange &AccessAttrs, 284487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar DeclSpec::TST TagType, Decl *TagDecl) { 284587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (getLangOpts().MicrosoftExt && 284687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Tok.isOneOf(tok::kw___if_exists, tok::kw___if_not_exists)) { 284787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar ParseMicrosoftIfExistsClassDeclaration(TagType, AS); 28484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return nullptr; 284987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 285087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 285187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // Check for extraneous top-level semicolon. 285287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (Tok.is(tok::semi)) { 285387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar ConsumeExtraSemi(InsideStruct, TagType); 28544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return nullptr; 285587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 285687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 285787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (Tok.is(tok::annot_pragma_vis)) { 285887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar HandlePragmaVisibility(); 28594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return nullptr; 286087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 286187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 286287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (Tok.is(tok::annot_pragma_pack)) { 286387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar HandlePragmaPack(); 28644967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return nullptr; 286587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 286687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 286787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (Tok.is(tok::annot_pragma_align)) { 286887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar HandlePragmaAlign(); 28694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return nullptr; 287087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 287187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 287287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (Tok.is(tok::annot_pragma_ms_pointers_to_members)) { 287387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar HandlePragmaMSPointersToMembers(); 28744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return nullptr; 287587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 287687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 287787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (Tok.is(tok::annot_pragma_ms_pragma)) { 287887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar HandlePragmaMSPragma(); 28794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return nullptr; 288087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 288187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 288287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (Tok.is(tok::annot_pragma_ms_vtordisp)) { 288387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar HandlePragmaMSVtorDisp(); 28844967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return nullptr; 288587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 288687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 288787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // If we see a namespace here, a close brace was missing somewhere. 288887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (Tok.is(tok::kw_namespace)) { 288987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar DiagnoseUnexpectedNamespace(cast<NamedDecl>(TagDecl)); 28904967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return nullptr; 289187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 289287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 289387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar AccessSpecifier NewAS = getAccessSpecifierIfPresent(); 289487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (NewAS != AS_none) { 289587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // Current token is a C++ access specifier. 289687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar AS = NewAS; 289787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar SourceLocation ASLoc = Tok.getLocation(); 289887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar unsigned TokLength = Tok.getLength(); 289987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar ConsumeToken(); 290087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar AccessAttrs.clear(); 290187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar MaybeParseGNUAttributes(AccessAttrs); 290287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 290387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar SourceLocation EndLoc; 290487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (TryConsumeToken(tok::colon, EndLoc)) { 290587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } else if (TryConsumeToken(tok::semi, EndLoc)) { 290687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Diag(EndLoc, diag::err_expected) 290787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar << tok::colon << FixItHint::CreateReplacement(EndLoc, ":"); 290887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } else { 290987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar EndLoc = ASLoc.getLocWithOffset(TokLength); 291087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Diag(EndLoc, diag::err_expected) 291187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar << tok::colon << FixItHint::CreateInsertion(EndLoc, ":"); 291287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 291387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 291487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // The Microsoft extension __interface does not permit non-public 291587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // access specifiers. 291687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (TagType == DeclSpec::TST_interface && AS != AS_public) { 291787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Diag(ASLoc, diag::err_access_specifier_interface) << (AS == AS_protected); 291887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 291987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 292087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (Actions.ActOnAccessSpecifier(NewAS, ASLoc, EndLoc, 292187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar AccessAttrs.getList())) { 292287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // found another attribute than only annotations 292387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar AccessAttrs.clear(); 292487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 292587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 29264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return nullptr; 292787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 292887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 292987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (Tok.is(tok::annot_pragma_openmp)) 29304967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return ParseOpenMPDeclarativeDirectiveWithExtDecl(AS, AccessAttrs, TagType, 29314967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar TagDecl); 293287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 293387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // Parse all the comma separated declarators. 293487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return ParseCXXClassMemberDeclaration(AS, AccessAttrs.getList()); 29353ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar} 29363ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar 29374cc18a4d5222e04bd568b1e3e4d86127dbbcdf3fArgyrios Kyrtzidis/// ParseCXXMemberSpecification - Parse the class definition. 29384cc18a4d5222e04bd568b1e3e4d86127dbbcdf3fArgyrios Kyrtzidis/// 29394cc18a4d5222e04bd568b1e3e4d86127dbbcdf3fArgyrios Kyrtzidis/// member-specification: 29404cc18a4d5222e04bd568b1e3e4d86127dbbcdf3fArgyrios Kyrtzidis/// member-declaration member-specification[opt] 29414cc18a4d5222e04bd568b1e3e4d86127dbbcdf3fArgyrios Kyrtzidis/// access-specifier ':' member-specification[opt] 29424cc18a4d5222e04bd568b1e3e4d86127dbbcdf3fArgyrios Kyrtzidis/// 294317d35c36fbae764fcd68fa8b31624078a033aabcJoao Matosvoid Parser::ParseCXXMemberSpecification(SourceLocation RecordLoc, 294407fc1ba7553f2f5bf26984091197311decd9028eMichael Han SourceLocation AttrFixitLoc, 2945053214013990ad8ec096dafc64aa7c0ad2b05bc0Richard Smith ParsedAttributesWithRange &Attrs, 294617d35c36fbae764fcd68fa8b31624078a033aabcJoao Matos unsigned TagType, Decl *TagDecl) { 294717d35c36fbae764fcd68fa8b31624078a033aabcJoao Matos assert((TagType == DeclSpec::TST_struct || 294817d35c36fbae764fcd68fa8b31624078a033aabcJoao Matos TagType == DeclSpec::TST_interface || 294917d35c36fbae764fcd68fa8b31624078a033aabcJoao Matos TagType == DeclSpec::TST_union || 295017d35c36fbae764fcd68fa8b31624078a033aabcJoao Matos TagType == DeclSpec::TST_class) && "Invalid TagType!"); 295117d35c36fbae764fcd68fa8b31624078a033aabcJoao Matos 2952f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall PrettyDeclStackTraceEntry CrashInfo(Actions, TagDecl, RecordLoc, 2953f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall "parsing struct/union/class body"); 29541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 295526997fd58c9560584edd154618f2f2c15ee68af4Douglas Gregor // Determine whether this is a non-nested class. Note that local 295626997fd58c9560584edd154618f2f2c15ee68af4Douglas Gregor // classes are *not* considered to be nested classes. 295726997fd58c9560584edd154618f2f2c15ee68af4Douglas Gregor bool NonNestedClass = true; 295826997fd58c9560584edd154618f2f2c15ee68af4Douglas Gregor if (!ClassStack.empty()) { 295923c94dbb6631fecdb55ba401aa93722803d980c6Douglas Gregor for (const Scope *S = getCurScope(); S; S = S->getParent()) { 296026997fd58c9560584edd154618f2f2c15ee68af4Douglas Gregor if (S->isClassScope()) { 296126997fd58c9560584edd154618f2f2c15ee68af4Douglas Gregor // We're inside a class scope, so this is a nested class. 296226997fd58c9560584edd154618f2f2c15ee68af4Douglas Gregor NonNestedClass = false; 2963e402e72273cde2a64fa6097c1fe93f500038675dJohn McCall 2964e402e72273cde2a64fa6097c1fe93f500038675dJohn McCall // The Microsoft extension __interface does not permit nested classes. 2965e402e72273cde2a64fa6097c1fe93f500038675dJohn McCall if (getCurrentClass().IsInterface) { 2966e402e72273cde2a64fa6097c1fe93f500038675dJohn McCall Diag(RecordLoc, diag::err_invalid_member_in_interface) 2967e402e72273cde2a64fa6097c1fe93f500038675dJohn McCall << /*ErrorType=*/6 2968e402e72273cde2a64fa6097c1fe93f500038675dJohn McCall << (isa<NamedDecl>(TagDecl) 2969e402e72273cde2a64fa6097c1fe93f500038675dJohn McCall ? cast<NamedDecl>(TagDecl)->getQualifiedNameAsString() 2970651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines : "(anonymous)"); 2971e402e72273cde2a64fa6097c1fe93f500038675dJohn McCall } 297226997fd58c9560584edd154618f2f2c15ee68af4Douglas Gregor break; 297326997fd58c9560584edd154618f2f2c15ee68af4Douglas Gregor } 297426997fd58c9560584edd154618f2f2c15ee68af4Douglas Gregor 297587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if ((S->getFlags() & Scope::FnScope)) 297687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // If we're in a function or function template then this is a local 297787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // class rather than a nested class. 297887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar break; 297926997fd58c9560584edd154618f2f2c15ee68af4Douglas Gregor } 298026997fd58c9560584edd154618f2f2c15ee68af4Douglas Gregor } 29814cc18a4d5222e04bd568b1e3e4d86127dbbcdf3fArgyrios Kyrtzidis 29824cc18a4d5222e04bd568b1e3e4d86127dbbcdf3fArgyrios Kyrtzidis // Enter a scope for the class. 29833218c4bb3b5d7250f12420de6db7ef3e3f805a75Douglas Gregor ParseScope ClassScope(this, Scope::ClassScope|Scope::DeclScope); 29844cc18a4d5222e04bd568b1e3e4d86127dbbcdf3fArgyrios Kyrtzidis 29856569d68745c8213709740337d2be52b031384f58Douglas Gregor // Note that we are parsing a new (potentially-nested) class definition. 2986e402e72273cde2a64fa6097c1fe93f500038675dJohn McCall ParsingClassDefinition ParsingDef(*this, TagDecl, NonNestedClass, 2987e402e72273cde2a64fa6097c1fe93f500038675dJohn McCall TagType == DeclSpec::TST_interface); 29886569d68745c8213709740337d2be52b031384f58Douglas Gregor 2989ddc29e116db3c3f4144355e67a0137b38b6bb6d1Douglas Gregor if (TagDecl) 299023c94dbb6631fecdb55ba401aa93722803d980c6Douglas Gregor Actions.ActOnTagStartDefinition(getCurScope(), TagDecl); 2991bd0dfa5c37d422427080a0ae3af9b63e70e6e854John McCall 2992b184a18a0a52e4bec33ef70f13bfcc29aafa14f2Anders Carlsson SourceLocation FinalLoc; 29937121bdb91b86f6053765bda18dd0a8a118929aceDavid Majnemer bool IsFinalSpelledSealed = false; 2994b184a18a0a52e4bec33ef70f13bfcc29aafa14f2Anders Carlsson 2995b184a18a0a52e4bec33ef70f13bfcc29aafa14f2Anders Carlsson // Parse the optional 'final' keyword. 29964e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (getLangOpts().CPlusPlus && Tok.is(tok::identifier)) { 29977121bdb91b86f6053765bda18dd0a8a118929aceDavid Majnemer VirtSpecifiers::Specifier Specifier = isCXX11VirtSpecifier(Tok); 29987121bdb91b86f6053765bda18dd0a8a118929aceDavid Majnemer assert((Specifier == VirtSpecifiers::VS_Final || 29997121bdb91b86f6053765bda18dd0a8a118929aceDavid Majnemer Specifier == VirtSpecifiers::VS_Sealed) && 30007121bdb91b86f6053765bda18dd0a8a118929aceDavid Majnemer "not a class definition"); 30018b11b5e6ce086fcaa7344bf84cffefcf4b53f9f6Richard Smith FinalLoc = ConsumeToken(); 30027121bdb91b86f6053765bda18dd0a8a118929aceDavid Majnemer IsFinalSpelledSealed = Specifier == VirtSpecifiers::VS_Sealed; 3003b184a18a0a52e4bec33ef70f13bfcc29aafa14f2Anders Carlsson 30047121bdb91b86f6053765bda18dd0a8a118929aceDavid Majnemer if (TagType == DeclSpec::TST_interface) 3005e402e72273cde2a64fa6097c1fe93f500038675dJohn McCall Diag(FinalLoc, diag::err_override_control_interface) 30067121bdb91b86f6053765bda18dd0a8a118929aceDavid Majnemer << VirtSpecifiers::getSpecifierName(Specifier); 30077121bdb91b86f6053765bda18dd0a8a118929aceDavid Majnemer else if (Specifier == VirtSpecifiers::VS_Final) 30087121bdb91b86f6053765bda18dd0a8a118929aceDavid Majnemer Diag(FinalLoc, getLangOpts().CPlusPlus11 30097121bdb91b86f6053765bda18dd0a8a118929aceDavid Majnemer ? diag::warn_cxx98_compat_override_control_keyword 30107121bdb91b86f6053765bda18dd0a8a118929aceDavid Majnemer : diag::ext_override_control_keyword) 30117121bdb91b86f6053765bda18dd0a8a118929aceDavid Majnemer << VirtSpecifiers::getSpecifierName(Specifier); 30127121bdb91b86f6053765bda18dd0a8a118929aceDavid Majnemer else if (Specifier == VirtSpecifiers::VS_Sealed) 30137121bdb91b86f6053765bda18dd0a8a118929aceDavid Majnemer Diag(FinalLoc, diag::ext_ms_sealed_keyword); 30142e39713a3d72c243a2bcd13cc8f5036ba6b487d9Michael Han 301507fc1ba7553f2f5bf26984091197311decd9028eMichael Han // Parse any C++11 attributes after 'final' keyword. 301607fc1ba7553f2f5bf26984091197311decd9028eMichael Han // These attributes are not allowed to appear here, 301707fc1ba7553f2f5bf26984091197311decd9028eMichael Han // and the only possible place for them to appertain 301807fc1ba7553f2f5bf26984091197311decd9028eMichael Han // to the class would be between class-key and class-name. 3019053214013990ad8ec096dafc64aa7c0ad2b05bc0Richard Smith CheckMisplacedCXX11Attribute(Attrs, AttrFixitLoc); 30200e2c34f92f00628d48968dfea096d36381f494cbStephen Hines 30210e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // ParseClassSpecifier() does only a superficial check for attributes before 30220e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // deciding to call this method. For example, for 30230e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // `class C final alignas ([l) {` it will decide that this looks like a 30240e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // misplaced attribute since it sees `alignas '(' ')'`. But the actual 30250e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // attribute parsing code will try to parse the '[' as a constexpr lambda 30260e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // and consume enough tokens that the alignas parsing code will eat the 30270e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // opening '{'. So bail out if the next token isn't one we expect. 30280e2c34f92f00628d48968dfea096d36381f494cbStephen Hines if (!Tok.is(tok::colon) && !Tok.is(tok::l_brace)) { 30290e2c34f92f00628d48968dfea096d36381f494cbStephen Hines if (TagDecl) 30300e2c34f92f00628d48968dfea096d36381f494cbStephen Hines Actions.ActOnTagDefinitionError(getCurScope(), TagDecl); 30310e2c34f92f00628d48968dfea096d36381f494cbStephen Hines return; 30320e2c34f92f00628d48968dfea096d36381f494cbStephen Hines } 3033b184a18a0a52e4bec33ef70f13bfcc29aafa14f2Anders Carlsson } 3034cc54d594d4f6509c0e3a8e349e481d9b5d899df6Anders Carlsson 3035bd0dfa5c37d422427080a0ae3af9b63e70e6e854John McCall if (Tok.is(tok::colon)) { 3036bd0dfa5c37d422427080a0ae3af9b63e70e6e854John McCall ParseBaseClause(TagDecl); 3037bd0dfa5c37d422427080a0ae3af9b63e70e6e854John McCall if (!Tok.is(tok::l_brace)) { 3038176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines bool SuggestFixIt = false; 3039176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines SourceLocation BraceLoc = PP.getLocForEndOfToken(PrevTokLocation); 3040176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (Tok.isAtStartOfLine()) { 3041176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines switch (Tok.getKind()) { 3042176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines case tok::kw_private: 3043176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines case tok::kw_protected: 3044176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines case tok::kw_public: 3045176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines SuggestFixIt = NextToken().getKind() == tok::colon; 3046176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines break; 3047176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines case tok::kw_static_assert: 3048176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines case tok::r_brace: 3049176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines case tok::kw_using: 3050176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // base-clause can have simple-template-id; 'template' can't be there 3051176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines case tok::kw_template: 3052176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines SuggestFixIt = true; 3053176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines break; 3054176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines case tok::identifier: 3055176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines SuggestFixIt = isConstructorDeclarator(true); 3056176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines break; 3057176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines default: 3058176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines SuggestFixIt = isCXXSimpleDeclaration(/*AllowForRangeDecl=*/false); 3059176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines break; 3060176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 3061176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 3062176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines DiagnosticBuilder LBraceDiag = 3063176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Diag(BraceLoc, diag::err_expected_lbrace_after_base_specifiers); 3064176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (SuggestFixIt) { 3065176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines LBraceDiag << FixItHint::CreateInsertion(BraceLoc, " {"); 3066176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // Try recovering from missing { after base-clause. 3067176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines PP.EnterToken(Tok); 3068176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Tok.setKind(tok::l_brace); 3069176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } else { 3070176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (TagDecl) 3071176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Actions.ActOnTagDefinitionError(getCurScope(), TagDecl); 3072176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines return; 3073176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 3074bd0dfa5c37d422427080a0ae3af9b63e70e6e854John McCall } 3075bd0dfa5c37d422427080a0ae3af9b63e70e6e854John McCall } 3076bd0dfa5c37d422427080a0ae3af9b63e70e6e854John McCall 3077bd0dfa5c37d422427080a0ae3af9b63e70e6e854John McCall assert(Tok.is(tok::l_brace)); 30784a8dfb511e8f84b2e38b7a86d8ddf05ac1e1a41bDouglas Gregor BalancedDelimiterTracker T(*this, tok::l_brace); 30794a8dfb511e8f84b2e38b7a86d8ddf05ac1e1a41bDouglas Gregor T.consumeOpen(); 3080bd0dfa5c37d422427080a0ae3af9b63e70e6e854John McCall 308142a4f66ffeb26e69b2f0ec873a5d41b0e39e634cJohn McCall if (TagDecl) 30822c3ee54e51d835a35bbf781c69e17f39e2ba0480Anders Carlsson Actions.ActOnStartCXXMemberDeclarations(getCurScope(), TagDecl, FinalLoc, 30837121bdb91b86f6053765bda18dd0a8a118929aceDavid Majnemer IsFinalSpelledSealed, 30844a8dfb511e8f84b2e38b7a86d8ddf05ac1e1a41bDouglas Gregor T.getOpenLocation()); 3085f9368159334ff86ea5fa367225c1a580977f3b03John McCall 30864cc18a4d5222e04bd568b1e3e4d86127dbbcdf3fArgyrios Kyrtzidis // C++ 11p3: Members of a class defined with the keyword class are private 30874cc18a4d5222e04bd568b1e3e4d86127dbbcdf3fArgyrios Kyrtzidis // by default. Members of a class defined with the keywords struct or union 30884cc18a4d5222e04bd568b1e3e4d86127dbbcdf3fArgyrios Kyrtzidis // are public by default. 30894cc18a4d5222e04bd568b1e3e4d86127dbbcdf3fArgyrios Kyrtzidis AccessSpecifier CurAS; 30904cc18a4d5222e04bd568b1e3e4d86127dbbcdf3fArgyrios Kyrtzidis if (TagType == DeclSpec::TST_class) 30914cc18a4d5222e04bd568b1e3e4d86127dbbcdf3fArgyrios Kyrtzidis CurAS = AS_private; 30924cc18a4d5222e04bd568b1e3e4d86127dbbcdf3fArgyrios Kyrtzidis else 30934cc18a4d5222e04bd568b1e3e4d86127dbbcdf3fArgyrios Kyrtzidis CurAS = AS_public; 309487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar ParsedAttributesWithRange AccessAttrs(AttrFactory); 30954cc18a4d5222e04bd568b1e3e4d86127dbbcdf3fArgyrios Kyrtzidis 309607976d25eda0fed2734518be022ee84fab898cc6Douglas Gregor if (TagDecl) { 309707976d25eda0fed2734518be022ee84fab898cc6Douglas Gregor // While we still have something to read, read the member-declarations. 309887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar while (!tryParseMisplacedModuleImport() && Tok.isNot(tok::r_brace) && 309987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Tok.isNot(tok::eof)) { 310007976d25eda0fed2734518be022ee84fab898cc6Douglas Gregor // Each iteration of this loop reads one member-declaration. 310187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar ParseCXXClassMemberDeclarationWithPragmas( 310287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar CurAS, AccessAttrs, static_cast<DeclSpec::TST>(TagType), TagDecl); 310307976d25eda0fed2734518be022ee84fab898cc6Douglas Gregor } 31044a8dfb511e8f84b2e38b7a86d8ddf05ac1e1a41bDouglas Gregor T.consumeClose(); 310507976d25eda0fed2734518be022ee84fab898cc6Douglas Gregor } else { 31068fe2475a4b4c00475709c13d43eb9a57cce87cbcAlexey Bataev SkipUntil(tok::r_brace); 31074cc18a4d5222e04bd568b1e3e4d86127dbbcdf3fArgyrios Kyrtzidis } 31081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 31094cc18a4d5222e04bd568b1e3e4d86127dbbcdf3fArgyrios Kyrtzidis // If attributes exist after class contents, parse them. 31100b7e678a11ece4288dc01aebb5b17e5eef8f8d2dJohn McCall ParsedAttributes attrs(AttrFactory); 31117f040a9d817cd1c72b565e92abff473510bf9e1dJohn McCall MaybeParseGNUAttributes(attrs); 31124cc18a4d5222e04bd568b1e3e4d86127dbbcdf3fArgyrios Kyrtzidis 311342a4f66ffeb26e69b2f0ec873a5d41b0e39e634cJohn McCall if (TagDecl) 311423c94dbb6631fecdb55ba401aa93722803d980c6Douglas Gregor Actions.ActOnFinishCXXMemberSpecification(getCurScope(), RecordLoc, TagDecl, 31154a8dfb511e8f84b2e38b7a86d8ddf05ac1e1a41bDouglas Gregor T.getOpenLocation(), 31164a8dfb511e8f84b2e38b7a86d8ddf05ac1e1a41bDouglas Gregor T.getCloseLocation(), 31177f040a9d817cd1c72b565e92abff473510bf9e1dJohn McCall attrs.getList()); 31184cc18a4d5222e04bd568b1e3e4d86127dbbcdf3fArgyrios Kyrtzidis 311974e2fc332e07c76d4e69ccbd0e9e47a0bafd3908Douglas Gregor // C++11 [class.mem]p2: 312074e2fc332e07c76d4e69ccbd0e9e47a0bafd3908Douglas Gregor // Within the class member-specification, the class is regarded as complete 3121176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // within function bodies, default arguments, exception-specifications, and 312274e2fc332e07c76d4e69ccbd0e9e47a0bafd3908Douglas Gregor // brace-or-equal-initializers for non-static data members (including such 312374e2fc332e07c76d4e69ccbd0e9e47a0bafd3908Douglas Gregor // things in nested classes). 312407976d25eda0fed2734518be022ee84fab898cc6Douglas Gregor if (TagDecl && NonNestedClass) { 31254cc18a4d5222e04bd568b1e3e4d86127dbbcdf3fArgyrios Kyrtzidis // We are not inside a nested class. This class and its nested classes 312672b505b7904b3c9320a1312998800ba76e4f5841Douglas Gregor // are complete and we can parse the delayed portions of method 3127eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski // declarations and the lexed inline method definitions, along with any 3128eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski // delayed attributes. 3129e0cc047b1984fc301bbe6e98b6d197bed39ad562Douglas Gregor SourceLocation SavedPrevTokLocation = PrevTokLocation; 3130eff98fc3561f6b717f6348f04b3f4fe03e934466Caitlin Sadowski ParseLexedAttributes(getCurrentClass()); 31316569d68745c8213709740337d2be52b031384f58Douglas Gregor ParseLexedMethodDeclarations(getCurrentClass()); 3132a4156b8574666aa69a2b0ad35dc9e9603433e4aeRichard Smith 3133a4156b8574666aa69a2b0ad35dc9e9603433e4aeRichard Smith // We've finished with all pending member declarations. 3134a4156b8574666aa69a2b0ad35dc9e9603433e4aeRichard Smith Actions.ActOnFinishCXXMemberDecls(); 3135a4156b8574666aa69a2b0ad35dc9e9603433e4aeRichard Smith 31367a614d8380297fcd2bc23986241905d97222948cRichard Smith ParseLexedMemberInitializers(getCurrentClass()); 31376569d68745c8213709740337d2be52b031384f58Douglas Gregor ParseLexedMethodDefs(getCurrentClass()); 3138e0cc047b1984fc301bbe6e98b6d197bed39ad562Douglas Gregor PrevTokLocation = SavedPrevTokLocation; 31393ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar 31403ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // We've finished parsing everything, including default argument 31413ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // initializers. 314287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Actions.ActOnFinishCXXNonNestedClass(TagDecl); 31434cc18a4d5222e04bd568b1e3e4d86127dbbcdf3fArgyrios Kyrtzidis } 31444cc18a4d5222e04bd568b1e3e4d86127dbbcdf3fArgyrios Kyrtzidis 314542a4f66ffeb26e69b2f0ec873a5d41b0e39e634cJohn McCall if (TagDecl) 31464a8dfb511e8f84b2e38b7a86d8ddf05ac1e1a41bDouglas Gregor Actions.ActOnTagFinishDefinition(getCurScope(), TagDecl, 31474a8dfb511e8f84b2e38b7a86d8ddf05ac1e1a41bDouglas Gregor T.getCloseLocation()); 3148db7bb4a4e7d9744cbc994c90932e6f056228e1ffJohn McCall 31494cc18a4d5222e04bd568b1e3e4d86127dbbcdf3fArgyrios Kyrtzidis // Leave the class scope. 31506569d68745c8213709740337d2be52b031384f58Douglas Gregor ParsingDef.Pop(); 31518935b8b49053122ddd3ab4cd59af0fe5eb9c23cfDouglas Gregor ClassScope.Exit(); 31524cc18a4d5222e04bd568b1e3e4d86127dbbcdf3fArgyrios Kyrtzidis} 31537ad8390f7992ab7f19b1460c5f0b9d96f165c4e9Douglas Gregor 31547faf81ff1dc8f8dc724e928ba90ccbfad0fdc2bcRichard Smithvoid Parser::DiagnoseUnexpectedNamespace(NamedDecl *D) { 3155b310439121c875937d78cc49cc969bc1197fc025Richard Smith assert(Tok.is(tok::kw_namespace)); 3156b310439121c875937d78cc49cc969bc1197fc025Richard Smith 3157b310439121c875937d78cc49cc969bc1197fc025Richard Smith // FIXME: Suggest where the close brace should have gone by looking 3158b310439121c875937d78cc49cc969bc1197fc025Richard Smith // at indentation changes within the definition body. 31597faf81ff1dc8f8dc724e928ba90ccbfad0fdc2bcRichard Smith Diag(D->getLocation(), 31607faf81ff1dc8f8dc724e928ba90ccbfad0fdc2bcRichard Smith diag::err_missing_end_of_definition) << D; 3161b310439121c875937d78cc49cc969bc1197fc025Richard Smith Diag(Tok.getLocation(), 31627faf81ff1dc8f8dc724e928ba90ccbfad0fdc2bcRichard Smith diag::note_missing_end_of_definition_before) << D; 3163b310439121c875937d78cc49cc969bc1197fc025Richard Smith 3164b310439121c875937d78cc49cc969bc1197fc025Richard Smith // Push '};' onto the token stream to recover. 3165b310439121c875937d78cc49cc969bc1197fc025Richard Smith PP.EnterToken(Tok); 3166b310439121c875937d78cc49cc969bc1197fc025Richard Smith 3167b310439121c875937d78cc49cc969bc1197fc025Richard Smith Tok.startToken(); 3168b310439121c875937d78cc49cc969bc1197fc025Richard Smith Tok.setLocation(PP.getLocForEndOfToken(PrevTokLocation)); 3169b310439121c875937d78cc49cc969bc1197fc025Richard Smith Tok.setKind(tok::semi); 3170b310439121c875937d78cc49cc969bc1197fc025Richard Smith PP.EnterToken(Tok); 3171b310439121c875937d78cc49cc969bc1197fc025Richard Smith 3172b310439121c875937d78cc49cc969bc1197fc025Richard Smith Tok.setKind(tok::r_brace); 3173b310439121c875937d78cc49cc969bc1197fc025Richard Smith} 3174b310439121c875937d78cc49cc969bc1197fc025Richard Smith 31757ad8390f7992ab7f19b1460c5f0b9d96f165c4e9Douglas Gregor/// ParseConstructorInitializer - Parse a C++ constructor initializer, 31767ad8390f7992ab7f19b1460c5f0b9d96f165c4e9Douglas Gregor/// which explicitly initializes the members or base classes of a 31777ad8390f7992ab7f19b1460c5f0b9d96f165c4e9Douglas Gregor/// class (C++ [class.base.init]). For example, the three initializers 31787ad8390f7992ab7f19b1460c5f0b9d96f165c4e9Douglas Gregor/// after the ':' in the Derived constructor below: 31797ad8390f7992ab7f19b1460c5f0b9d96f165c4e9Douglas Gregor/// 31807ad8390f7992ab7f19b1460c5f0b9d96f165c4e9Douglas Gregor/// @code 31817ad8390f7992ab7f19b1460c5f0b9d96f165c4e9Douglas Gregor/// class Base { }; 31827ad8390f7992ab7f19b1460c5f0b9d96f165c4e9Douglas Gregor/// class Derived : Base { 31837ad8390f7992ab7f19b1460c5f0b9d96f165c4e9Douglas Gregor/// int x; 31847ad8390f7992ab7f19b1460c5f0b9d96f165c4e9Douglas Gregor/// float f; 31857ad8390f7992ab7f19b1460c5f0b9d96f165c4e9Douglas Gregor/// public: 31867ad8390f7992ab7f19b1460c5f0b9d96f165c4e9Douglas Gregor/// Derived(float f) : Base(), x(17), f(f) { } 31877ad8390f7992ab7f19b1460c5f0b9d96f165c4e9Douglas Gregor/// }; 31887ad8390f7992ab7f19b1460c5f0b9d96f165c4e9Douglas Gregor/// @endcode 31897ad8390f7992ab7f19b1460c5f0b9d96f165c4e9Douglas Gregor/// 31901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// [C++] ctor-initializer: 31911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// ':' mem-initializer-list 31927ad8390f7992ab7f19b1460c5f0b9d96f165c4e9Douglas Gregor/// 31931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// [C++] mem-initializer-list: 31943fb9e4b89f72823f162096086f0f964e6dcf66d6Douglas Gregor/// mem-initializer ...[opt] 31953fb9e4b89f72823f162096086f0f964e6dcf66d6Douglas Gregor/// mem-initializer ...[opt] , mem-initializer-list 3196d226f65006733ed7f709c3174f22ce33391cb58fJohn McCallvoid Parser::ParseConstructorInitializer(Decl *ConstructorDecl) { 31973ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar assert(Tok.is(tok::colon) && 31983ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar "Constructor initializer always starts with ':'"); 31997ad8390f7992ab7f19b1460c5f0b9d96f165c4e9Douglas Gregor 32003ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // Poison the SEH identifiers so they are flagged as illegal in constructor 32013ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // initializers. 320228bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley PoisonSEHIdentifiersRAIIObject PoisonSEHIdentifiers(*this, true); 32037ad8390f7992ab7f19b1460c5f0b9d96f165c4e9Douglas Gregor SourceLocation ColonLoc = ConsumeToken(); 32041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 32055f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<CXXCtorInitializer*, 4> MemInitializers; 32069db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor bool AnyErrors = false; 3207193575455e00eca03fd7177f60e3f2e6263cb661Kovarththanan Rajaratnam 32087ad8390f7992ab7f19b1460c5f0b9d96f165c4e9Douglas Gregor do { 32090133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor if (Tok.is(tok::code_completion)) { 3210572cf585da655522651b589101784c58902f8690Dmitri Gribenko Actions.CodeCompleteConstructorInitializer(ConstructorDecl, 3211572cf585da655522651b589101784c58902f8690Dmitri Gribenko MemInitializers); 32127d100872341f233c81e1d7b72b40457e62c36862Argyrios Kyrtzidis return cutOffParsing(); 32130133f525a23e18dd444880f7554f25fbcbd834e5Douglas Gregor } 32144967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 32154967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar MemInitResult MemInit = ParseMemInitializer(ConstructorDecl); 32164967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (!MemInit.isInvalid()) 32174967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar MemInitializers.push_back(MemInit.get()); 32184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar else 32194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar AnyErrors = true; 32204967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 32217ad8390f7992ab7f19b1460c5f0b9d96f165c4e9Douglas Gregor if (Tok.is(tok::comma)) 32227ad8390f7992ab7f19b1460c5f0b9d96f165c4e9Douglas Gregor ConsumeToken(); 32237ad8390f7992ab7f19b1460c5f0b9d96f165c4e9Douglas Gregor else if (Tok.is(tok::l_brace)) 32247ad8390f7992ab7f19b1460c5f0b9d96f165c4e9Douglas Gregor break; 32254967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // If the previous initializer was valid and the next token looks like a 32264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // base or member initializer, assume that we're just missing a comma. 32274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar else if (!MemInit.isInvalid() && 32284967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Tok.isOneOf(tok::identifier, tok::coloncolon)) { 3229751f6922376dfe9432795b65a3649179e4ef5cf5Douglas Gregor SourceLocation Loc = PP.getLocForEndOfToken(PrevTokLocation); 3230751f6922376dfe9432795b65a3649179e4ef5cf5Douglas Gregor Diag(Loc, diag::err_ctor_init_missing_comma) 3231751f6922376dfe9432795b65a3649179e4ef5cf5Douglas Gregor << FixItHint::CreateInsertion(Loc, ", "); 3232751f6922376dfe9432795b65a3649179e4ef5cf5Douglas Gregor } else { 32337ad8390f7992ab7f19b1460c5f0b9d96f165c4e9Douglas Gregor // Skip over garbage, until we get to '{'. Don't eat the '{'. 32344967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (!MemInit.isInvalid()) 32354967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Diag(Tok.getLocation(), diag::err_expected_either) << tok::l_brace 32364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar << tok::comma; 32378fe2475a4b4c00475709c13d43eb9a57cce87cbcAlexey Bataev SkipUntil(tok::l_brace, StopAtSemi | StopBeforeMatch); 32387ad8390f7992ab7f19b1460c5f0b9d96f165c4e9Douglas Gregor break; 32397ad8390f7992ab7f19b1460c5f0b9d96f165c4e9Douglas Gregor } 32407ad8390f7992ab7f19b1460c5f0b9d96f165c4e9Douglas Gregor } while (true); 32417ad8390f7992ab7f19b1460c5f0b9d96f165c4e9Douglas Gregor 324293c8617bec98aeb769ee9f569d7ed439eec03249David Blaikie Actions.ActOnMemInitializers(ConstructorDecl, ColonLoc, MemInitializers, 32439db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor AnyErrors); 32447ad8390f7992ab7f19b1460c5f0b9d96f165c4e9Douglas Gregor} 32457ad8390f7992ab7f19b1460c5f0b9d96f165c4e9Douglas Gregor 32467ad8390f7992ab7f19b1460c5f0b9d96f165c4e9Douglas Gregor/// ParseMemInitializer - Parse a C++ member initializer, which is 32477ad8390f7992ab7f19b1460c5f0b9d96f165c4e9Douglas Gregor/// part of a constructor initializer that explicitly initializes one 32487ad8390f7992ab7f19b1460c5f0b9d96f165c4e9Douglas Gregor/// member or base class (C++ [class.base.init]). See 32497ad8390f7992ab7f19b1460c5f0b9d96f165c4e9Douglas Gregor/// ParseConstructorInitializer for an example. 32507ad8390f7992ab7f19b1460c5f0b9d96f165c4e9Douglas Gregor/// 32517ad8390f7992ab7f19b1460c5f0b9d96f165c4e9Douglas Gregor/// [C++] mem-initializer: 32527ad8390f7992ab7f19b1460c5f0b9d96f165c4e9Douglas Gregor/// mem-initializer-id '(' expression-list[opt] ')' 3253dbef1bb8a8118b7b73e184e08fccfe0eaf914ddaSebastian Redl/// [C++0x] mem-initializer-id braced-init-list 32541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// 32557ad8390f7992ab7f19b1460c5f0b9d96f165c4e9Douglas Gregor/// [C++] mem-initializer-id: 32567ad8390f7992ab7f19b1460c5f0b9d96f165c4e9Douglas Gregor/// '::'[opt] nested-name-specifier[opt] class-name 32577ad8390f7992ab7f19b1460c5f0b9d96f165c4e9Douglas Gregor/// identifier 3258176edba5311f6eff0cad2631449885ddf4fbc9eaStephen HinesMemInitResult Parser::ParseMemInitializer(Decl *ConstructorDecl) { 3259bcfad54a43e5570e09daddd976bd4545933e75b1Fariborz Jahanian // parse '::'[opt] nested-name-specifier[opt] 3260bcfad54a43e5570e09daddd976bd4545933e75b1Fariborz Jahanian CXXScopeSpec SS; 32614967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ParseOptionalCXXScopeSpecifier(SS, nullptr, /*EnteringContext=*/false); 3262b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall ParsedType TemplateTypeTy; 3263961743326fd18776f897bf4461345dba680ef637Fariborz Jahanian if (Tok.is(tok::annot_template_id)) { 326425a767651d14db87aa03dd5fe3e011d877dd4100Argyrios Kyrtzidis TemplateIdAnnotation *TemplateId = takeTemplateIdAnnotation(Tok); 3265d9b600c1a589200be905c53e2e10fceb57efa18dDouglas Gregor if (TemplateId->Kind == TNK_Type_template || 3266d9b600c1a589200be905c53e2e10fceb57efa18dDouglas Gregor TemplateId->Kind == TNK_Dependent_template_name) { 3267059101f922de6eb765601459925f4c8914420b23Douglas Gregor AnnotateTemplateIdTokenAsType(); 3268961743326fd18776f897bf4461345dba680ef637Fariborz Jahanian assert(Tok.is(tok::annot_typename) && "template-id -> type failed"); 3269b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall TemplateTypeTy = getTypeAnnotation(Tok); 3270961743326fd18776f897bf4461345dba680ef637Fariborz Jahanian } 3271961743326fd18776f897bf4461345dba680ef637Fariborz Jahanian } 3272f211662199c87461f3b1475a549ab439c63ca83bDavid Blaikie // Uses of decltype will already have been converted to annot_decltype by 3273f211662199c87461f3b1475a549ab439c63ca83bDavid Blaikie // ParseOptionalCXXScopeSpecifier at this point. 3274f211662199c87461f3b1475a549ab439c63ca83bDavid Blaikie if (!TemplateTypeTy && Tok.isNot(tok::identifier) 3275f211662199c87461f3b1475a549ab439c63ca83bDavid Blaikie && Tok.isNot(tok::annot_decltype)) { 32761ab3b96de160e4fbffec2a776e284a48a3bb543dChris Lattner Diag(Tok, diag::err_expected_member_or_base_name); 32777ad8390f7992ab7f19b1460c5f0b9d96f165c4e9Douglas Gregor return true; 32787ad8390f7992ab7f19b1460c5f0b9d96f165c4e9Douglas Gregor } 32791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 32806bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines IdentifierInfo *II = nullptr; 3281f211662199c87461f3b1475a549ab439c63ca83bDavid Blaikie DeclSpec DS(AttrFactory); 3282f211662199c87461f3b1475a549ab439c63ca83bDavid Blaikie SourceLocation IdLoc = Tok.getLocation(); 3283f211662199c87461f3b1475a549ab439c63ca83bDavid Blaikie if (Tok.is(tok::annot_decltype)) { 3284f211662199c87461f3b1475a549ab439c63ca83bDavid Blaikie // Get the decltype expression, if there is one. 3285f211662199c87461f3b1475a549ab439c63ca83bDavid Blaikie ParseDecltypeSpecifier(DS); 3286f211662199c87461f3b1475a549ab439c63ca83bDavid Blaikie } else { 3287f211662199c87461f3b1475a549ab439c63ca83bDavid Blaikie if (Tok.is(tok::identifier)) 3288f211662199c87461f3b1475a549ab439c63ca83bDavid Blaikie // Get the identifier. This may be a member name or a class name, 3289f211662199c87461f3b1475a549ab439c63ca83bDavid Blaikie // but we'll let the semantic analysis determine which it is. 3290f211662199c87461f3b1475a549ab439c63ca83bDavid Blaikie II = Tok.getIdentifierInfo(); 3291f211662199c87461f3b1475a549ab439c63ca83bDavid Blaikie ConsumeToken(); 3292f211662199c87461f3b1475a549ab439c63ca83bDavid Blaikie } 3293f211662199c87461f3b1475a549ab439c63ca83bDavid Blaikie 32947ad8390f7992ab7f19b1460c5f0b9d96f165c4e9Douglas Gregor 32957ad8390f7992ab7f19b1460c5f0b9d96f165c4e9Douglas Gregor // Parse the '('. 329680ad52f327b532bded5c5b0ee38779d841c6cd35Richard Smith if (getLangOpts().CPlusPlus11 && Tok.is(tok::l_brace)) { 32977fe6208c3fa91f835813bb78236ef5c2bbf81053Richard Smith Diag(Tok, diag::warn_cxx98_compat_generalized_initializer_lists); 32987fe6208c3fa91f835813bb78236ef5c2bbf81053Richard Smith 32996df6548e44a61c444bd85dccd0398cba047c79b1Sebastian Redl ExprResult InitList = ParseBraceInitializer(); 33006df6548e44a61c444bd85dccd0398cba047c79b1Sebastian Redl if (InitList.isInvalid()) 33016df6548e44a61c444bd85dccd0398cba047c79b1Sebastian Redl return true; 33026df6548e44a61c444bd85dccd0398cba047c79b1Sebastian Redl 33036df6548e44a61c444bd85dccd0398cba047c79b1Sebastian Redl SourceLocation EllipsisLoc; 3304651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines TryConsumeToken(tok::ellipsis, EllipsisLoc); 33056df6548e44a61c444bd85dccd0398cba047c79b1Sebastian Redl 33066df6548e44a61c444bd85dccd0398cba047c79b1Sebastian Redl return Actions.ActOnMemInitializer(ConstructorDecl, getCurScope(), SS, II, 3307f211662199c87461f3b1475a549ab439c63ca83bDavid Blaikie TemplateTypeTy, DS, IdLoc, 3308c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines InitList.get(), EllipsisLoc); 3309dbef1bb8a8118b7b73e184e08fccfe0eaf914ddaSebastian Redl } else if(Tok.is(tok::l_paren)) { 33104a8dfb511e8f84b2e38b7a86d8ddf05ac1e1a41bDouglas Gregor BalancedDelimiterTracker T(*this, tok::l_paren); 33114a8dfb511e8f84b2e38b7a86d8ddf05ac1e1a41bDouglas Gregor T.consumeOpen(); 3312dbef1bb8a8118b7b73e184e08fccfe0eaf914ddaSebastian Redl 3313dbef1bb8a8118b7b73e184e08fccfe0eaf914ddaSebastian Redl // Parse the optional expression-list. 33144e28d9e2ba9ce237549b45cfd4136ec6536d1325Benjamin Kramer ExprVector ArgExprs; 3315dbef1bb8a8118b7b73e184e08fccfe0eaf914ddaSebastian Redl CommaLocsTy CommaLocs; 3316dbef1bb8a8118b7b73e184e08fccfe0eaf914ddaSebastian Redl if (Tok.isNot(tok::r_paren) && ParseExpressionList(ArgExprs, CommaLocs)) { 33178fe2475a4b4c00475709c13d43eb9a57cce87cbcAlexey Bataev SkipUntil(tok::r_paren, StopAtSemi); 3318dbef1bb8a8118b7b73e184e08fccfe0eaf914ddaSebastian Redl return true; 3319dbef1bb8a8118b7b73e184e08fccfe0eaf914ddaSebastian Redl } 33207ad8390f7992ab7f19b1460c5f0b9d96f165c4e9Douglas Gregor 33214a8dfb511e8f84b2e38b7a86d8ddf05ac1e1a41bDouglas Gregor T.consumeClose(); 33227ad8390f7992ab7f19b1460c5f0b9d96f165c4e9Douglas Gregor 3323dbef1bb8a8118b7b73e184e08fccfe0eaf914ddaSebastian Redl SourceLocation EllipsisLoc; 3324651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines TryConsumeToken(tok::ellipsis, EllipsisLoc); 33257ad8390f7992ab7f19b1460c5f0b9d96f165c4e9Douglas Gregor 3326dbef1bb8a8118b7b73e184e08fccfe0eaf914ddaSebastian Redl return Actions.ActOnMemInitializer(ConstructorDecl, getCurScope(), SS, II, 3327f211662199c87461f3b1475a549ab439c63ca83bDavid Blaikie TemplateTypeTy, DS, IdLoc, 3328a36bbac10f7b74ef198ec2fb0eb52dbd8a50e7f0Dmitri Gribenko T.getOpenLocation(), ArgExprs, 3329a36bbac10f7b74ef198ec2fb0eb52dbd8a50e7f0Dmitri Gribenko T.getCloseLocation(), EllipsisLoc); 3330dbef1bb8a8118b7b73e184e08fccfe0eaf914ddaSebastian Redl } 3331dbef1bb8a8118b7b73e184e08fccfe0eaf914ddaSebastian Redl 3332651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (getLangOpts().CPlusPlus11) 3333651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return Diag(Tok, diag::err_expected_either) << tok::l_paren << tok::l_brace; 3334651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines else 3335651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return Diag(Tok, diag::err_expected) << tok::l_paren; 33367ad8390f7992ab7f19b1460c5f0b9d96f165c4e9Douglas Gregor} 33370fe7bea6fca9737c6c145aaa4a2ad3abe595782aDouglas Gregor 33387acafd032e145dbdbbed9274ca57ec2c86b912bcSebastian Redl/// \brief Parse a C++ exception-specification if present (C++0x [except.spec]). 33390fe7bea6fca9737c6c145aaa4a2ad3abe595782aDouglas Gregor/// 3340a4745616ebe36ba7699f18618382e764aa8183a1Douglas Gregor/// exception-specification: 33417acafd032e145dbdbbed9274ca57ec2c86b912bcSebastian Redl/// dynamic-exception-specification 33427acafd032e145dbdbbed9274ca57ec2c86b912bcSebastian Redl/// noexcept-specification 33437acafd032e145dbdbbed9274ca57ec2c86b912bcSebastian Redl/// 33447acafd032e145dbdbbed9274ca57ec2c86b912bcSebastian Redl/// noexcept-specification: 33457acafd032e145dbdbbed9274ca57ec2c86b912bcSebastian Redl/// 'noexcept' 33467acafd032e145dbdbbed9274ca57ec2c86b912bcSebastian Redl/// 'noexcept' '(' constant-expression ')' 33477acafd032e145dbdbbed9274ca57ec2c86b912bcSebastian RedlExceptionSpecificationType 3348176edba5311f6eff0cad2631449885ddf4fbc9eaStephen HinesParser::tryParseExceptionSpecification(bool Delayed, 334974e2fc332e07c76d4e69ccbd0e9e47a0bafd3908Douglas Gregor SourceRange &SpecificationRange, 33505f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVectorImpl<ParsedType> &DynamicExceptions, 33515f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVectorImpl<SourceRange> &DynamicExceptionRanges, 3352176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines ExprResult &NoexceptExpr, 3353176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines CachedTokens *&ExceptionSpecTokens) { 33547acafd032e145dbdbbed9274ca57ec2c86b912bcSebastian Redl ExceptionSpecificationType Result = EST_None; 335587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar ExceptionSpecTokens = nullptr; 3356176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 3357176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // Handle delayed parsing of exception-specifications. 3358176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (Delayed) { 3359176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (Tok.isNot(tok::kw_throw) && Tok.isNot(tok::kw_noexcept)) 3360176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines return EST_None; 3361176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 3362176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // Consume and cache the starting token. 3363176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines bool IsNoexcept = Tok.is(tok::kw_noexcept); 3364176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Token StartTok = Tok; 3365176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines SpecificationRange = SourceRange(ConsumeToken()); 3366176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 3367176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // Check for a '('. 3368176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (!Tok.is(tok::l_paren)) { 3369176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // If this is a bare 'noexcept', we're done. 3370176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (IsNoexcept) { 3371176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Diag(Tok, diag::warn_cxx98_compat_noexcept_decl); 337287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar NoexceptExpr = nullptr; 3373176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines return EST_BasicNoexcept; 3374176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 3375176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 3376176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Diag(Tok, diag::err_expected_lparen_after) << "throw"; 3377176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines return EST_DynamicNone; 3378176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 3379176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 3380176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // Cache the tokens for the exception-specification. 3381176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines ExceptionSpecTokens = new CachedTokens; 3382176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines ExceptionSpecTokens->push_back(StartTok); // 'throw' or 'noexcept' 3383176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines ExceptionSpecTokens->push_back(Tok); // '(' 3384176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines SpecificationRange.setEnd(ConsumeParen()); // '(' 33850e2c34f92f00628d48968dfea096d36381f494cbStephen Hines 33860e2c34f92f00628d48968dfea096d36381f494cbStephen Hines ConsumeAndStoreUntil(tok::r_paren, *ExceptionSpecTokens, 33870e2c34f92f00628d48968dfea096d36381f494cbStephen Hines /*StopAtSemi=*/true, 33880e2c34f92f00628d48968dfea096d36381f494cbStephen Hines /*ConsumeFinalToken=*/true); 33894967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar SpecificationRange.setEnd(ExceptionSpecTokens->back().getLocation()); 33904967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 3391176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines return EST_Unparsed; 3392176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 3393176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 33947acafd032e145dbdbbed9274ca57ec2c86b912bcSebastian Redl // See if there's a dynamic specification. 33957acafd032e145dbdbbed9274ca57ec2c86b912bcSebastian Redl if (Tok.is(tok::kw_throw)) { 33967acafd032e145dbdbbed9274ca57ec2c86b912bcSebastian Redl Result = ParseDynamicExceptionSpecification(SpecificationRange, 33977acafd032e145dbdbbed9274ca57ec2c86b912bcSebastian Redl DynamicExceptions, 33987acafd032e145dbdbbed9274ca57ec2c86b912bcSebastian Redl DynamicExceptionRanges); 33997acafd032e145dbdbbed9274ca57ec2c86b912bcSebastian Redl assert(DynamicExceptions.size() == DynamicExceptionRanges.size() && 34007acafd032e145dbdbbed9274ca57ec2c86b912bcSebastian Redl "Produced different number of exception types and ranges."); 34017acafd032e145dbdbbed9274ca57ec2c86b912bcSebastian Redl } 34027acafd032e145dbdbbed9274ca57ec2c86b912bcSebastian Redl 34037acafd032e145dbdbbed9274ca57ec2c86b912bcSebastian Redl // If there's no noexcept specification, we're done. 34047acafd032e145dbdbbed9274ca57ec2c86b912bcSebastian Redl if (Tok.isNot(tok::kw_noexcept)) 34057acafd032e145dbdbbed9274ca57ec2c86b912bcSebastian Redl return Result; 34067acafd032e145dbdbbed9274ca57ec2c86b912bcSebastian Redl 3407841804baff6ea8ba1904a2ba81265aae1479e882Richard Smith Diag(Tok, diag::warn_cxx98_compat_noexcept_decl); 3408841804baff6ea8ba1904a2ba81265aae1479e882Richard Smith 34097acafd032e145dbdbbed9274ca57ec2c86b912bcSebastian Redl // If we already had a dynamic specification, parse the noexcept for, 34107acafd032e145dbdbbed9274ca57ec2c86b912bcSebastian Redl // recovery, but emit a diagnostic and don't store the results. 34117acafd032e145dbdbbed9274ca57ec2c86b912bcSebastian Redl SourceRange NoexceptRange; 34127acafd032e145dbdbbed9274ca57ec2c86b912bcSebastian Redl ExceptionSpecificationType NoexceptType = EST_None; 34137acafd032e145dbdbbed9274ca57ec2c86b912bcSebastian Redl 34147acafd032e145dbdbbed9274ca57ec2c86b912bcSebastian Redl SourceLocation KeywordLoc = ConsumeToken(); 34157acafd032e145dbdbbed9274ca57ec2c86b912bcSebastian Redl if (Tok.is(tok::l_paren)) { 34167acafd032e145dbdbbed9274ca57ec2c86b912bcSebastian Redl // There is an argument. 34174a8dfb511e8f84b2e38b7a86d8ddf05ac1e1a41bDouglas Gregor BalancedDelimiterTracker T(*this, tok::l_paren); 34184a8dfb511e8f84b2e38b7a86d8ddf05ac1e1a41bDouglas Gregor T.consumeOpen(); 34197acafd032e145dbdbbed9274ca57ec2c86b912bcSebastian Redl NoexceptType = EST_ComputedNoexcept; 34207acafd032e145dbdbbed9274ca57ec2c86b912bcSebastian Redl NoexceptExpr = ParseConstantExpression(); 342187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar T.consumeClose(); 342260618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl // The argument must be contextually convertible to bool. We use 34234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // CheckBooleanCondition for this purpose. 34244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // FIXME: Add a proper Sema entry point for this. 342587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (!NoexceptExpr.isInvalid()) { 34264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar NoexceptExpr = 34274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Actions.CheckBooleanCondition(KeywordLoc, NoexceptExpr.get()); 342887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar NoexceptRange = SourceRange(KeywordLoc, T.getCloseLocation()); 342987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } else { 343087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar NoexceptType = EST_None; 343187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 34327acafd032e145dbdbbed9274ca57ec2c86b912bcSebastian Redl } else { 34337acafd032e145dbdbbed9274ca57ec2c86b912bcSebastian Redl // There is no argument. 34347acafd032e145dbdbbed9274ca57ec2c86b912bcSebastian Redl NoexceptType = EST_BasicNoexcept; 34357acafd032e145dbdbbed9274ca57ec2c86b912bcSebastian Redl NoexceptRange = SourceRange(KeywordLoc, KeywordLoc); 34367acafd032e145dbdbbed9274ca57ec2c86b912bcSebastian Redl } 34377acafd032e145dbdbbed9274ca57ec2c86b912bcSebastian Redl 34387acafd032e145dbdbbed9274ca57ec2c86b912bcSebastian Redl if (Result == EST_None) { 34397acafd032e145dbdbbed9274ca57ec2c86b912bcSebastian Redl SpecificationRange = NoexceptRange; 34407acafd032e145dbdbbed9274ca57ec2c86b912bcSebastian Redl Result = NoexceptType; 34417acafd032e145dbdbbed9274ca57ec2c86b912bcSebastian Redl 34427acafd032e145dbdbbed9274ca57ec2c86b912bcSebastian Redl // If there's a dynamic specification after a noexcept specification, 34437acafd032e145dbdbbed9274ca57ec2c86b912bcSebastian Redl // parse that and ignore the results. 34447acafd032e145dbdbbed9274ca57ec2c86b912bcSebastian Redl if (Tok.is(tok::kw_throw)) { 34457acafd032e145dbdbbed9274ca57ec2c86b912bcSebastian Redl Diag(Tok.getLocation(), diag::err_dynamic_and_noexcept_specification); 34467acafd032e145dbdbbed9274ca57ec2c86b912bcSebastian Redl ParseDynamicExceptionSpecification(NoexceptRange, DynamicExceptions, 34477acafd032e145dbdbbed9274ca57ec2c86b912bcSebastian Redl DynamicExceptionRanges); 34487acafd032e145dbdbbed9274ca57ec2c86b912bcSebastian Redl } 34497acafd032e145dbdbbed9274ca57ec2c86b912bcSebastian Redl } else { 34507acafd032e145dbdbbed9274ca57ec2c86b912bcSebastian Redl Diag(Tok.getLocation(), diag::err_dynamic_and_noexcept_specification); 34517acafd032e145dbdbbed9274ca57ec2c86b912bcSebastian Redl } 34527acafd032e145dbdbbed9274ca57ec2c86b912bcSebastian Redl 34537acafd032e145dbdbbed9274ca57ec2c86b912bcSebastian Redl return Result; 34547acafd032e145dbdbbed9274ca57ec2c86b912bcSebastian Redl} 34557acafd032e145dbdbbed9274ca57ec2c86b912bcSebastian Redl 345679f4bb7aad1b7c53f8a3bc43d89de0efdef8286dRichard Smithstatic void diagnoseDynamicExceptionSpecification( 345787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Parser &P, SourceRange Range, bool IsNoexcept) { 345879f4bb7aad1b7c53f8a3bc43d89de0efdef8286dRichard Smith if (P.getLangOpts().CPlusPlus11) { 345979f4bb7aad1b7c53f8a3bc43d89de0efdef8286dRichard Smith const char *Replacement = IsNoexcept ? "noexcept" : "noexcept(false)"; 346079f4bb7aad1b7c53f8a3bc43d89de0efdef8286dRichard Smith P.Diag(Range.getBegin(), diag::warn_exception_spec_deprecated) << Range; 346179f4bb7aad1b7c53f8a3bc43d89de0efdef8286dRichard Smith P.Diag(Range.getBegin(), diag::note_exception_spec_deprecated) 346279f4bb7aad1b7c53f8a3bc43d89de0efdef8286dRichard Smith << Replacement << FixItHint::CreateReplacement(Range, Replacement); 346379f4bb7aad1b7c53f8a3bc43d89de0efdef8286dRichard Smith } 346479f4bb7aad1b7c53f8a3bc43d89de0efdef8286dRichard Smith} 346579f4bb7aad1b7c53f8a3bc43d89de0efdef8286dRichard Smith 34667acafd032e145dbdbbed9274ca57ec2c86b912bcSebastian Redl/// ParseDynamicExceptionSpecification - Parse a C++ 34677acafd032e145dbdbbed9274ca57ec2c86b912bcSebastian Redl/// dynamic-exception-specification (C++ [except.spec]). 34687acafd032e145dbdbbed9274ca57ec2c86b912bcSebastian Redl/// 34697acafd032e145dbdbbed9274ca57ec2c86b912bcSebastian Redl/// dynamic-exception-specification: 3470a4745616ebe36ba7699f18618382e764aa8183a1Douglas Gregor/// 'throw' '(' type-id-list [opt] ')' 3471a4745616ebe36ba7699f18618382e764aa8183a1Douglas Gregor/// [MS] 'throw' '(' '...' ')' 34721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// 3473a4745616ebe36ba7699f18618382e764aa8183a1Douglas Gregor/// type-id-list: 3474a04426c5416f22df1078f6b31c1619de73c40b59Douglas Gregor/// type-id ... [opt] 3475a04426c5416f22df1078f6b31c1619de73c40b59Douglas Gregor/// type-id-list ',' type-id ... [opt] 34760fe7bea6fca9737c6c145aaa4a2ad3abe595782aDouglas Gregor/// 34777acafd032e145dbdbbed9274ca57ec2c86b912bcSebastian RedlExceptionSpecificationType Parser::ParseDynamicExceptionSpecification( 34787acafd032e145dbdbbed9274ca57ec2c86b912bcSebastian Redl SourceRange &SpecificationRange, 34795f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVectorImpl<ParsedType> &Exceptions, 34805f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVectorImpl<SourceRange> &Ranges) { 34810fe7bea6fca9737c6c145aaa4a2ad3abe595782aDouglas Gregor assert(Tok.is(tok::kw_throw) && "expected throw"); 34821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 34837acafd032e145dbdbbed9274ca57ec2c86b912bcSebastian Redl SpecificationRange.setBegin(ConsumeToken()); 34844a8dfb511e8f84b2e38b7a86d8ddf05ac1e1a41bDouglas Gregor BalancedDelimiterTracker T(*this, tok::l_paren); 34854a8dfb511e8f84b2e38b7a86d8ddf05ac1e1a41bDouglas Gregor if (T.consumeOpen()) { 34867acafd032e145dbdbbed9274ca57ec2c86b912bcSebastian Redl Diag(Tok, diag::err_expected_lparen_after) << "throw"; 34877acafd032e145dbdbbed9274ca57ec2c86b912bcSebastian Redl SpecificationRange.setEnd(SpecificationRange.getBegin()); 348860618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl return EST_DynamicNone; 34890fe7bea6fca9737c6c145aaa4a2ad3abe595782aDouglas Gregor } 34900fe7bea6fca9737c6c145aaa4a2ad3abe595782aDouglas Gregor 3491a4745616ebe36ba7699f18618382e764aa8183a1Douglas Gregor // Parse throw(...), a Microsoft extension that means "this function 3492a4745616ebe36ba7699f18618382e764aa8183a1Douglas Gregor // can throw anything". 3493a4745616ebe36ba7699f18618382e764aa8183a1Douglas Gregor if (Tok.is(tok::ellipsis)) { 3494a4745616ebe36ba7699f18618382e764aa8183a1Douglas Gregor SourceLocation EllipsisLoc = ConsumeToken(); 34954e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (!getLangOpts().MicrosoftExt) 3496a4745616ebe36ba7699f18618382e764aa8183a1Douglas Gregor Diag(EllipsisLoc, diag::ext_ellipsis_exception_spec); 34974a8dfb511e8f84b2e38b7a86d8ddf05ac1e1a41bDouglas Gregor T.consumeClose(); 34984a8dfb511e8f84b2e38b7a86d8ddf05ac1e1a41bDouglas Gregor SpecificationRange.setEnd(T.getCloseLocation()); 349979f4bb7aad1b7c53f8a3bc43d89de0efdef8286dRichard Smith diagnoseDynamicExceptionSpecification(*this, SpecificationRange, false); 350060618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl return EST_MSAny; 3501a4745616ebe36ba7699f18618382e764aa8183a1Douglas Gregor } 3502a4745616ebe36ba7699f18618382e764aa8183a1Douglas Gregor 35030fe7bea6fca9737c6c145aaa4a2ad3abe595782aDouglas Gregor // Parse the sequence of type-ids. 3504ef65f06e8e440aec541442cfd73a8a836e9bc842Sebastian Redl SourceRange Range; 35050fe7bea6fca9737c6c145aaa4a2ad3abe595782aDouglas Gregor while (Tok.isNot(tok::r_paren)) { 3506ef65f06e8e440aec541442cfd73a8a836e9bc842Sebastian Redl TypeResult Res(ParseTypeName(&Range)); 35077acafd032e145dbdbbed9274ca57ec2c86b912bcSebastian Redl 3508a04426c5416f22df1078f6b31c1619de73c40b59Douglas Gregor if (Tok.is(tok::ellipsis)) { 3509a04426c5416f22df1078f6b31c1619de73c40b59Douglas Gregor // C++0x [temp.variadic]p5: 3510a04426c5416f22df1078f6b31c1619de73c40b59Douglas Gregor // - In a dynamic-exception-specification (15.4); the pattern is a 3511a04426c5416f22df1078f6b31c1619de73c40b59Douglas Gregor // type-id. 3512a04426c5416f22df1078f6b31c1619de73c40b59Douglas Gregor SourceLocation Ellipsis = ConsumeToken(); 35137acafd032e145dbdbbed9274ca57ec2c86b912bcSebastian Redl Range.setEnd(Ellipsis); 3514a04426c5416f22df1078f6b31c1619de73c40b59Douglas Gregor if (!Res.isInvalid()) 3515a04426c5416f22df1078f6b31c1619de73c40b59Douglas Gregor Res = Actions.ActOnPackExpansion(Res.get(), Ellipsis); 3516a04426c5416f22df1078f6b31c1619de73c40b59Douglas Gregor } 35177acafd032e145dbdbbed9274ca57ec2c86b912bcSebastian Redl 3518ef65f06e8e440aec541442cfd73a8a836e9bc842Sebastian Redl if (!Res.isInvalid()) { 35197dc813462dd9fd3f6f4296f896a12de14264fef8Sebastian Redl Exceptions.push_back(Res.get()); 3520ef65f06e8e440aec541442cfd73a8a836e9bc842Sebastian Redl Ranges.push_back(Range); 3521ef65f06e8e440aec541442cfd73a8a836e9bc842Sebastian Redl } 3522651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 3523651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (!TryConsumeToken(tok::comma)) 35240fe7bea6fca9737c6c145aaa4a2ad3abe595782aDouglas Gregor break; 35250fe7bea6fca9737c6c145aaa4a2ad3abe595782aDouglas Gregor } 35260fe7bea6fca9737c6c145aaa4a2ad3abe595782aDouglas Gregor 35274a8dfb511e8f84b2e38b7a86d8ddf05ac1e1a41bDouglas Gregor T.consumeClose(); 35284a8dfb511e8f84b2e38b7a86d8ddf05ac1e1a41bDouglas Gregor SpecificationRange.setEnd(T.getCloseLocation()); 352979f4bb7aad1b7c53f8a3bc43d89de0efdef8286dRichard Smith diagnoseDynamicExceptionSpecification(*this, SpecificationRange, 353079f4bb7aad1b7c53f8a3bc43d89de0efdef8286dRichard Smith Exceptions.empty()); 353160618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl return Exceptions.empty() ? EST_DynamicNone : EST_Dynamic; 35320fe7bea6fca9737c6c145aaa4a2ad3abe595782aDouglas Gregor} 35336569d68745c8213709740337d2be52b031384f58Douglas Gregor 3534dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor/// ParseTrailingReturnType - Parse a trailing return type on a new-style 3535dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor/// function declaration. 3536ae7902c4293d9de8b9591759513f0d075f45022aDouglas GregorTypeResult Parser::ParseTrailingReturnType(SourceRange &Range) { 3537dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor assert(Tok.is(tok::arrow) && "expected arrow"); 3538dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor 3539dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor ConsumeToken(); 3540dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor 35417796eb5643244f3134834253ce5ea89107ac21c1Richard Smith return ParseTypeName(&Range, Declarator::TrailingReturnContext); 3542dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor} 3543dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor 35446569d68745c8213709740337d2be52b031384f58Douglas Gregor/// \brief We have just started parsing the definition of a new class, 35456569d68745c8213709740337d2be52b031384f58Douglas Gregor/// so push that class onto our stack of classes that is currently 35466569d68745c8213709740337d2be52b031384f58Douglas Gregor/// being parsed. 3547eee1d5434ebfa955ffc3c493aecd68bb7b3f4838John McCallSema::ParsingClassState 3548e402e72273cde2a64fa6097c1fe93f500038675dJohn McCallParser::PushParsingClass(Decl *ClassDecl, bool NonNestedClass, 3549e402e72273cde2a64fa6097c1fe93f500038675dJohn McCall bool IsInterface) { 355026997fd58c9560584edd154618f2f2c15ee68af4Douglas Gregor assert((NonNestedClass || !ClassStack.empty()) && 35516569d68745c8213709740337d2be52b031384f58Douglas Gregor "Nested class without outer class"); 3552e402e72273cde2a64fa6097c1fe93f500038675dJohn McCall ClassStack.push(new ParsingClass(ClassDecl, NonNestedClass, IsInterface)); 3553eee1d5434ebfa955ffc3c493aecd68bb7b3f4838John McCall return Actions.PushParsingClass(); 35546569d68745c8213709740337d2be52b031384f58Douglas Gregor} 35556569d68745c8213709740337d2be52b031384f58Douglas Gregor 35566569d68745c8213709740337d2be52b031384f58Douglas Gregor/// \brief Deallocate the given parsed class and all of its nested 35576569d68745c8213709740337d2be52b031384f58Douglas Gregor/// classes. 35586569d68745c8213709740337d2be52b031384f58Douglas Gregorvoid Parser::DeallocateParsedClasses(Parser::ParsingClass *Class) { 3559d54eb4410330383f48d3cc22b2ad8d23f120836bDouglas Gregor for (unsigned I = 0, N = Class->LateParsedDeclarations.size(); I != N; ++I) 3560d54eb4410330383f48d3cc22b2ad8d23f120836bDouglas Gregor delete Class->LateParsedDeclarations[I]; 35616569d68745c8213709740337d2be52b031384f58Douglas Gregor delete Class; 35626569d68745c8213709740337d2be52b031384f58Douglas Gregor} 35636569d68745c8213709740337d2be52b031384f58Douglas Gregor 35646569d68745c8213709740337d2be52b031384f58Douglas Gregor/// \brief Pop the top class of the stack of classes that are 35656569d68745c8213709740337d2be52b031384f58Douglas Gregor/// currently being parsed. 35666569d68745c8213709740337d2be52b031384f58Douglas Gregor/// 35676569d68745c8213709740337d2be52b031384f58Douglas Gregor/// This routine should be called when we have finished parsing the 35686569d68745c8213709740337d2be52b031384f58Douglas Gregor/// definition of a class, but have not yet popped the Scope 35696569d68745c8213709740337d2be52b031384f58Douglas Gregor/// associated with the class's definition. 3570eee1d5434ebfa955ffc3c493aecd68bb7b3f4838John McCallvoid Parser::PopParsingClass(Sema::ParsingClassState state) { 35716569d68745c8213709740337d2be52b031384f58Douglas Gregor assert(!ClassStack.empty() && "Mismatched push/pop for class parsing"); 35721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3573eee1d5434ebfa955ffc3c493aecd68bb7b3f4838John McCall Actions.PopParsingClass(state); 3574eee1d5434ebfa955ffc3c493aecd68bb7b3f4838John McCall 35756569d68745c8213709740337d2be52b031384f58Douglas Gregor ParsingClass *Victim = ClassStack.top(); 35766569d68745c8213709740337d2be52b031384f58Douglas Gregor ClassStack.pop(); 35776569d68745c8213709740337d2be52b031384f58Douglas Gregor if (Victim->TopLevelClass) { 35786569d68745c8213709740337d2be52b031384f58Douglas Gregor // Deallocate all of the nested classes of this class, 35796569d68745c8213709740337d2be52b031384f58Douglas Gregor // recursively: we don't need to keep any of this information. 35806569d68745c8213709740337d2be52b031384f58Douglas Gregor DeallocateParsedClasses(Victim); 35816569d68745c8213709740337d2be52b031384f58Douglas Gregor return; 35821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 35836569d68745c8213709740337d2be52b031384f58Douglas Gregor assert(!ClassStack.empty() && "Missing top-level class?"); 35846569d68745c8213709740337d2be52b031384f58Douglas Gregor 3585d54eb4410330383f48d3cc22b2ad8d23f120836bDouglas Gregor if (Victim->LateParsedDeclarations.empty()) { 35866569d68745c8213709740337d2be52b031384f58Douglas Gregor // The victim is a nested class, but we will not need to perform 35876569d68745c8213709740337d2be52b031384f58Douglas Gregor // any processing after the definition of this class since it has 35886569d68745c8213709740337d2be52b031384f58Douglas Gregor // no members whose handling was delayed. Therefore, we can just 35896569d68745c8213709740337d2be52b031384f58Douglas Gregor // remove this nested class. 3590d54eb4410330383f48d3cc22b2ad8d23f120836bDouglas Gregor DeallocateParsedClasses(Victim); 35916569d68745c8213709740337d2be52b031384f58Douglas Gregor return; 35926569d68745c8213709740337d2be52b031384f58Douglas Gregor } 35936569d68745c8213709740337d2be52b031384f58Douglas Gregor 35946569d68745c8213709740337d2be52b031384f58Douglas Gregor // This nested class has some members that will need to be processed 35956569d68745c8213709740337d2be52b031384f58Douglas Gregor // after the top-level class is completely defined. Therefore, add 35966569d68745c8213709740337d2be52b031384f58Douglas Gregor // it to the list of nested classes within its parent. 359723c94dbb6631fecdb55ba401aa93722803d980c6Douglas Gregor assert(getCurScope()->isClassScope() && "Nested class outside of class scope?"); 3598d54eb4410330383f48d3cc22b2ad8d23f120836bDouglas Gregor ClassStack.top()->LateParsedDeclarations.push_back(new LateParsedClass(this, Victim)); 359923c94dbb6631fecdb55ba401aa93722803d980c6Douglas Gregor Victim->TemplateScope = getCurScope()->getParent()->isTemplateParamScope(); 36006569d68745c8213709740337d2be52b031384f58Douglas Gregor} 3601bbd37c62e34db3f5a95c899723484a76c71d7757Sean Hunt 3602c56298d87a9df507805a548d7d515e8b511df2c0Richard Smith/// \brief Try to parse an 'identifier' which appears within an attribute-token. 3603c56298d87a9df507805a548d7d515e8b511df2c0Richard Smith/// 3604c56298d87a9df507805a548d7d515e8b511df2c0Richard Smith/// \return the parsed identifier on success, and 0 if the next token is not an 3605c56298d87a9df507805a548d7d515e8b511df2c0Richard Smith/// attribute-token. 3606c56298d87a9df507805a548d7d515e8b511df2c0Richard Smith/// 3607c56298d87a9df507805a548d7d515e8b511df2c0Richard Smith/// C++11 [dcl.attr.grammar]p3: 3608c56298d87a9df507805a548d7d515e8b511df2c0Richard Smith/// If a keyword or an alternative token that satisfies the syntactic 3609c56298d87a9df507805a548d7d515e8b511df2c0Richard Smith/// requirements of an identifier is contained in an attribute-token, 3610c56298d87a9df507805a548d7d515e8b511df2c0Richard Smith/// it is considered an identifier. 3611c56298d87a9df507805a548d7d515e8b511df2c0Richard SmithIdentifierInfo *Parser::TryParseCXX11AttributeIdentifier(SourceLocation &Loc) { 3612c56298d87a9df507805a548d7d515e8b511df2c0Richard Smith switch (Tok.getKind()) { 3613c56298d87a9df507805a548d7d515e8b511df2c0Richard Smith default: 3614c56298d87a9df507805a548d7d515e8b511df2c0Richard Smith // Identifiers and keywords have identifier info attached. 36150e2c34f92f00628d48968dfea096d36381f494cbStephen Hines if (!Tok.isAnnotation()) { 36160e2c34f92f00628d48968dfea096d36381f494cbStephen Hines if (IdentifierInfo *II = Tok.getIdentifierInfo()) { 36170e2c34f92f00628d48968dfea096d36381f494cbStephen Hines Loc = ConsumeToken(); 36180e2c34f92f00628d48968dfea096d36381f494cbStephen Hines return II; 36190e2c34f92f00628d48968dfea096d36381f494cbStephen Hines } 3620c56298d87a9df507805a548d7d515e8b511df2c0Richard Smith } 36216bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 3622c56298d87a9df507805a548d7d515e8b511df2c0Richard Smith 3623c56298d87a9df507805a548d7d515e8b511df2c0Richard Smith case tok::ampamp: // 'and' 3624c56298d87a9df507805a548d7d515e8b511df2c0Richard Smith case tok::pipe: // 'bitor' 3625c56298d87a9df507805a548d7d515e8b511df2c0Richard Smith case tok::pipepipe: // 'or' 3626c56298d87a9df507805a548d7d515e8b511df2c0Richard Smith case tok::caret: // 'xor' 3627c56298d87a9df507805a548d7d515e8b511df2c0Richard Smith case tok::tilde: // 'compl' 3628c56298d87a9df507805a548d7d515e8b511df2c0Richard Smith case tok::amp: // 'bitand' 3629c56298d87a9df507805a548d7d515e8b511df2c0Richard Smith case tok::ampequal: // 'and_eq' 3630c56298d87a9df507805a548d7d515e8b511df2c0Richard Smith case tok::pipeequal: // 'or_eq' 3631c56298d87a9df507805a548d7d515e8b511df2c0Richard Smith case tok::caretequal: // 'xor_eq' 3632c56298d87a9df507805a548d7d515e8b511df2c0Richard Smith case tok::exclaim: // 'not' 3633c56298d87a9df507805a548d7d515e8b511df2c0Richard Smith case tok::exclaimequal: // 'not_eq' 3634c56298d87a9df507805a548d7d515e8b511df2c0Richard Smith // Alternative tokens do not have identifier info, but their spelling 3635c56298d87a9df507805a548d7d515e8b511df2c0Richard Smith // starts with an alphabetical character. 3636cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko SmallString<8> SpellingBuf; 363758878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar SourceLocation SpellingLoc = 363858878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar PP.getSourceManager().getSpellingLoc(Tok.getLocation()); 363958878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar StringRef Spelling = PP.getSpelling(SpellingLoc, SpellingBuf); 36403f6f51e28231f65de9c2dd150a2d757b2162cfa3Jordan Rose if (isLetter(Spelling[0])) { 3641c56298d87a9df507805a548d7d515e8b511df2c0Richard Smith Loc = ConsumeToken(); 36420eb7526cd2524af78fb9a2a2522045fb25fc3d27Benjamin Kramer return &PP.getIdentifierTable().get(Spelling); 3643c56298d87a9df507805a548d7d515e8b511df2c0Richard Smith } 36446bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 3645c56298d87a9df507805a548d7d515e8b511df2c0Richard Smith } 3646c56298d87a9df507805a548d7d515e8b511df2c0Richard Smith} 3647c56298d87a9df507805a548d7d515e8b511df2c0Richard Smith 36486880f492365cc4fa4c941aa83688635003ee7498Michael Hanstatic bool IsBuiltInOrStandardCXX11Attribute(IdentifierInfo *AttrName, 36496880f492365cc4fa4c941aa83688635003ee7498Michael Han IdentifierInfo *ScopeName) { 36506880f492365cc4fa4c941aa83688635003ee7498Michael Han switch (AttributeList::getKind(AttrName, ScopeName, 36516880f492365cc4fa4c941aa83688635003ee7498Michael Han AttributeList::AS_CXX11)) { 36526880f492365cc4fa4c941aa83688635003ee7498Michael Han case AttributeList::AT_CarriesDependency: 36536bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines case AttributeList::AT_Deprecated: 36546880f492365cc4fa4c941aa83688635003ee7498Michael Han case AttributeList::AT_FallThrough: 365587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar case AttributeList::AT_CXX11NoReturn: 36566880f492365cc4fa4c941aa83688635003ee7498Michael Han return true; 36574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar case AttributeList::AT_WarnUnusedResult: 36584967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return !ScopeName && AttrName->getName().equals("nodiscard"); 36594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar case AttributeList::AT_Unused: 36604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return !ScopeName && AttrName->getName().equals("maybe_unused"); 36616880f492365cc4fa4c941aa83688635003ee7498Michael Han default: 36626880f492365cc4fa4c941aa83688635003ee7498Michael Han return false; 36636880f492365cc4fa4c941aa83688635003ee7498Michael Han } 36646880f492365cc4fa4c941aa83688635003ee7498Michael Han} 36656880f492365cc4fa4c941aa83688635003ee7498Michael Han 3666651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines/// ParseCXX11AttributeArgs -- Parse a C++11 attribute-argument-clause. 3667651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines/// 3668651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines/// [C++11] attribute-argument-clause: 3669651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines/// '(' balanced-token-seq ')' 3670651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines/// 3671651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines/// [C++11] balanced-token-seq: 3672651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines/// balanced-token 3673651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines/// balanced-token-seq balanced-token 3674651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines/// 3675651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines/// [C++11] balanced-token: 3676651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines/// '(' balanced-token-seq ')' 3677651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines/// '[' balanced-token-seq ']' 3678651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines/// '{' balanced-token-seq '}' 3679651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines/// any token but '(', ')', '[', ']', '{', or '}' 3680651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesbool Parser::ParseCXX11AttributeArgs(IdentifierInfo *AttrName, 3681651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines SourceLocation AttrNameLoc, 3682651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines ParsedAttributes &Attrs, 3683651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines SourceLocation *EndLoc, 3684651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines IdentifierInfo *ScopeName, 3685651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines SourceLocation ScopeLoc) { 3686651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines assert(Tok.is(tok::l_paren) && "Not a C++11 attribute argument list"); 36876bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines SourceLocation LParenLoc = Tok.getLocation(); 3688651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 3689651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // If the attribute isn't known, we will not attempt to parse any 3690651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // arguments. 3691651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (!hasAttribute(AttrSyntax::CXX, ScopeName, AttrName, 369287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar getTargetInfo(), getLangOpts())) { 3693651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // Eat the left paren, then skip to the ending right paren. 3694651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines ConsumeParen(); 3695651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines SkipUntil(tok::r_paren); 3696651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return false; 3697651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 3698651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 3699651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (ScopeName && ScopeName->getName() == "gnu") 3700651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // GNU-scoped attributes have some special cases to handle GNU-specific 3701651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // behaviors. 3702651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines ParseGNUAttributeArgs(AttrName, AttrNameLoc, Attrs, EndLoc, ScopeName, 37036bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines ScopeLoc, AttributeList::AS_CXX11, nullptr); 37046bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines else { 37056bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines unsigned NumArgs = 37066bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines ParseAttributeArgsCommon(AttrName, AttrNameLoc, Attrs, EndLoc, 37076bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines ScopeName, ScopeLoc, AttributeList::AS_CXX11); 37086bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 37096bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines const AttributeList *Attr = Attrs.getList(); 37106bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (Attr && IsBuiltInOrStandardCXX11Attribute(AttrName, ScopeName)) { 37116bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // If the attribute is a standard or built-in attribute and we are 37126bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // parsing an argument list, we need to determine whether this attribute 37136bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // was allowed to have an argument list (such as [[deprecated]]), and how 37146bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // many arguments were parsed (so we can diagnose on [[deprecated()]]). 3715c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines if (Attr->getMaxArgs() && !NumArgs) { 3716c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines // The attribute was allowed to have arguments, but none were provided 3717c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines // even though the attribute parsed successfully. This is an error. 3718c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines Diag(LParenLoc, diag::err_attribute_requires_arguments) << AttrName; 37194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Attr->setInvalid(true); 3720c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines } else if (!Attr->getMaxArgs()) { 3721c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines // The attribute parsed successfully, but was not allowed to have any 3722c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines // arguments. It doesn't matter whether any were provided -- the 37236bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // presence of the argument list (even if empty) is diagnosed. 37246bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Diag(LParenLoc, diag::err_cxx11_attribute_forbids_arguments) 37250e2c34f92f00628d48968dfea096d36381f494cbStephen Hines << AttrName 37260e2c34f92f00628d48968dfea096d36381f494cbStephen Hines << FixItHint::CreateRemoval(SourceRange(LParenLoc, *EndLoc)); 37274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Attr->setInvalid(true); 37286bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 37296bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 37306bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 3731651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return true; 3732651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 3733651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 3734651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines/// ParseCXX11AttributeSpecifier - Parse a C++11 attribute-specifier. 3735bbd37c62e34db3f5a95c899723484a76c71d7757Sean Hunt/// 37366ee326af4e77e6f05973486097884d7431f2108dRichard Smith/// [C++11] attribute-specifier: 3737bbd37c62e34db3f5a95c899723484a76c71d7757Sean Hunt/// '[' '[' attribute-list ']' ']' 373882d0b0aab9088e977c2a44c4a5a90479c63149fePeter Collingbourne/// alignment-specifier 3739bbd37c62e34db3f5a95c899723484a76c71d7757Sean Hunt/// 37406ee326af4e77e6f05973486097884d7431f2108dRichard Smith/// [C++11] attribute-list: 3741bbd37c62e34db3f5a95c899723484a76c71d7757Sean Hunt/// attribute[opt] 3742bbd37c62e34db3f5a95c899723484a76c71d7757Sean Hunt/// attribute-list ',' attribute[opt] 3743c56298d87a9df507805a548d7d515e8b511df2c0Richard Smith/// attribute '...' 3744c56298d87a9df507805a548d7d515e8b511df2c0Richard Smith/// attribute-list ',' attribute '...' 3745bbd37c62e34db3f5a95c899723484a76c71d7757Sean Hunt/// 37466ee326af4e77e6f05973486097884d7431f2108dRichard Smith/// [C++11] attribute: 3747bbd37c62e34db3f5a95c899723484a76c71d7757Sean Hunt/// attribute-token attribute-argument-clause[opt] 3748bbd37c62e34db3f5a95c899723484a76c71d7757Sean Hunt/// 37496ee326af4e77e6f05973486097884d7431f2108dRichard Smith/// [C++11] attribute-token: 3750bbd37c62e34db3f5a95c899723484a76c71d7757Sean Hunt/// identifier 3751bbd37c62e34db3f5a95c899723484a76c71d7757Sean Hunt/// attribute-scoped-token 3752bbd37c62e34db3f5a95c899723484a76c71d7757Sean Hunt/// 37536ee326af4e77e6f05973486097884d7431f2108dRichard Smith/// [C++11] attribute-scoped-token: 3754bbd37c62e34db3f5a95c899723484a76c71d7757Sean Hunt/// attribute-namespace '::' identifier 3755bbd37c62e34db3f5a95c899723484a76c71d7757Sean Hunt/// 37566ee326af4e77e6f05973486097884d7431f2108dRichard Smith/// [C++11] attribute-namespace: 3757bbd37c62e34db3f5a95c899723484a76c71d7757Sean Hunt/// identifier 3758c56298d87a9df507805a548d7d515e8b511df2c0Richard Smithvoid Parser::ParseCXX11AttributeSpecifier(ParsedAttributes &attrs, 37593497fdfdb742f55d7b7ec8e22779fb08962b8441Peter Collingbourne SourceLocation *endLoc) { 376082d0b0aab9088e977c2a44c4a5a90479c63149fePeter Collingbourne if (Tok.is(tok::kw_alignas)) { 376141be673e93ed225b45479557b20ff19b3082bae8Richard Smith Diag(Tok.getLocation(), diag::warn_cxx98_compat_alignas); 376282d0b0aab9088e977c2a44c4a5a90479c63149fePeter Collingbourne ParseAlignmentSpecifier(attrs, endLoc); 376382d0b0aab9088e977c2a44c4a5a90479c63149fePeter Collingbourne return; 376482d0b0aab9088e977c2a44c4a5a90479c63149fePeter Collingbourne } 376582d0b0aab9088e977c2a44c4a5a90479c63149fePeter Collingbourne 3766bbd37c62e34db3f5a95c899723484a76c71d7757Sean Hunt assert(Tok.is(tok::l_square) && NextToken().is(tok::l_square) 37676ee326af4e77e6f05973486097884d7431f2108dRichard Smith && "Not a C++11 attribute list"); 3768bbd37c62e34db3f5a95c899723484a76c71d7757Sean Hunt 376941be673e93ed225b45479557b20ff19b3082bae8Richard Smith Diag(Tok.getLocation(), diag::warn_cxx98_compat_attribute); 377041be673e93ed225b45479557b20ff19b3082bae8Richard Smith 3771bbd37c62e34db3f5a95c899723484a76c71d7757Sean Hunt ConsumeBracket(); 3772bbd37c62e34db3f5a95c899723484a76c71d7757Sean Hunt ConsumeBracket(); 3773193575455e00eca03fd7177f60e3f2e6263cb661Kovarththanan Rajaratnam 37744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar SourceLocation CommonScopeLoc; 37754967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar IdentifierInfo *CommonScopeName = nullptr; 37764967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (Tok.is(tok::kw_using)) { 37774967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Diag(Tok.getLocation(), getLangOpts().CPlusPlus1z 37784967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ? diag::warn_cxx14_compat_using_attribute_ns 37794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar : diag::ext_using_attribute_ns); 37804967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ConsumeToken(); 37814967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 37824967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar CommonScopeName = TryParseCXX11AttributeIdentifier(CommonScopeLoc); 37834967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (!CommonScopeName) { 37844967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Diag(Tok.getLocation(), diag::err_expected) << tok::identifier; 37854967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar SkipUntil(tok::r_square, tok::colon, StopBeforeMatch); 37864967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } 37874967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (!TryConsumeToken(tok::colon) && CommonScopeName) 37884967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Diag(Tok.getLocation(), diag::err_expected) << tok::colon; 37894967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } 37904967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 3791cd8ab51a44e80625d84126780b0d85a7732e25afRichard Smith llvm::SmallDenseMap<IdentifierInfo*, SourceLocation, 4> SeenAttrs; 3792cd8ab51a44e80625d84126780b0d85a7732e25afRichard Smith 3793c56298d87a9df507805a548d7d515e8b511df2c0Richard Smith while (Tok.isNot(tok::r_square)) { 3794bbd37c62e34db3f5a95c899723484a76c71d7757Sean Hunt // attribute not present 3795651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (TryConsumeToken(tok::comma)) 3796bbd37c62e34db3f5a95c899723484a76c71d7757Sean Hunt continue; 3797bbd37c62e34db3f5a95c899723484a76c71d7757Sean Hunt 3798c56298d87a9df507805a548d7d515e8b511df2c0Richard Smith SourceLocation ScopeLoc, AttrLoc; 37996bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines IdentifierInfo *ScopeName = nullptr, *AttrName = nullptr; 3800c56298d87a9df507805a548d7d515e8b511df2c0Richard Smith 3801c56298d87a9df507805a548d7d515e8b511df2c0Richard Smith AttrName = TryParseCXX11AttributeIdentifier(AttrLoc); 3802c56298d87a9df507805a548d7d515e8b511df2c0Richard Smith if (!AttrName) 3803c56298d87a9df507805a548d7d515e8b511df2c0Richard Smith // Break out to the "expected ']'" diagnostic. 3804c56298d87a9df507805a548d7d515e8b511df2c0Richard Smith break; 3805193575455e00eca03fd7177f60e3f2e6263cb661Kovarththanan Rajaratnam 3806bbd37c62e34db3f5a95c899723484a76c71d7757Sean Hunt // scoped attribute 3807651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (TryConsumeToken(tok::coloncolon)) { 3808c56298d87a9df507805a548d7d515e8b511df2c0Richard Smith ScopeName = AttrName; 3809c56298d87a9df507805a548d7d515e8b511df2c0Richard Smith ScopeLoc = AttrLoc; 3810c56298d87a9df507805a548d7d515e8b511df2c0Richard Smith 3811c56298d87a9df507805a548d7d515e8b511df2c0Richard Smith AttrName = TryParseCXX11AttributeIdentifier(AttrLoc); 3812c56298d87a9df507805a548d7d515e8b511df2c0Richard Smith if (!AttrName) { 3813651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Diag(Tok.getLocation(), diag::err_expected) << tok::identifier; 38148fe2475a4b4c00475709c13d43eb9a57cce87cbcAlexey Bataev SkipUntil(tok::r_square, tok::comma, StopAtSemi | StopBeforeMatch); 3815bbd37c62e34db3f5a95c899723484a76c71d7757Sean Hunt continue; 3816bbd37c62e34db3f5a95c899723484a76c71d7757Sean Hunt } 3817bbd37c62e34db3f5a95c899723484a76c71d7757Sean Hunt } 3818bbd37c62e34db3f5a95c899723484a76c71d7757Sean Hunt 38194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (CommonScopeName) { 38204967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (ScopeName) { 38214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Diag(ScopeLoc, diag::err_using_attribute_ns_conflict) 38224967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar << SourceRange(CommonScopeLoc); 38234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } else { 38244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ScopeName = CommonScopeName; 38254967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ScopeLoc = CommonScopeLoc; 38264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } 38274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } 38284967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 3829651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool StandardAttr = IsBuiltInOrStandardCXX11Attribute(AttrName, ScopeName); 3830bbd37c62e34db3f5a95c899723484a76c71d7757Sean Hunt bool AttrParsed = false; 38316880f492365cc4fa4c941aa83688635003ee7498Michael Han 3832cd8ab51a44e80625d84126780b0d85a7732e25afRichard Smith if (StandardAttr && 3833cd8ab51a44e80625d84126780b0d85a7732e25afRichard Smith !SeenAttrs.insert(std::make_pair(AttrName, AttrLoc)).second) 3834cd8ab51a44e80625d84126780b0d85a7732e25afRichard Smith Diag(AttrLoc, diag::err_cxx11_attribute_repeated) 3835651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines << AttrName << SourceRange(SeenAttrs[AttrName]); 3836cd8ab51a44e80625d84126780b0d85a7732e25afRichard Smith 38376880f492365cc4fa4c941aa83688635003ee7498Michael Han // Parse attribute arguments 38386bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (Tok.is(tok::l_paren)) 3839651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines AttrParsed = ParseCXX11AttributeArgs(AttrName, AttrLoc, attrs, endLoc, 3840651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines ScopeName, ScopeLoc); 3841bbd37c62e34db3f5a95c899723484a76c71d7757Sean Hunt 38426880f492365cc4fa4c941aa83688635003ee7498Michael Han if (!AttrParsed) 3843e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith attrs.addNew(AttrName, 3844e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith SourceRange(ScopeLoc.isValid() ? ScopeLoc : AttrLoc, 3845e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith AttrLoc), 38466bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines ScopeName, ScopeLoc, nullptr, 0, AttributeList::AS_CXX11); 38476ee326af4e77e6f05973486097884d7431f2108dRichard Smith 3848651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (TryConsumeToken(tok::ellipsis)) 38496880f492365cc4fa4c941aa83688635003ee7498Michael Han Diag(Tok, diag::err_cxx11_attribute_forbids_ellipsis) 38506880f492365cc4fa4c941aa83688635003ee7498Michael Han << AttrName->getName(); 3851bbd37c62e34db3f5a95c899723484a76c71d7757Sean Hunt } 3852bbd37c62e34db3f5a95c899723484a76c71d7757Sean Hunt 3853651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (ExpectAndConsume(tok::r_square)) 38548fe2475a4b4c00475709c13d43eb9a57cce87cbcAlexey Bataev SkipUntil(tok::r_square); 38553497fdfdb742f55d7b7ec8e22779fb08962b8441Peter Collingbourne if (endLoc) 38563497fdfdb742f55d7b7ec8e22779fb08962b8441Peter Collingbourne *endLoc = Tok.getLocation(); 3857651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (ExpectAndConsume(tok::r_square)) 38588fe2475a4b4c00475709c13d43eb9a57cce87cbcAlexey Bataev SkipUntil(tok::r_square); 38593497fdfdb742f55d7b7ec8e22779fb08962b8441Peter Collingbourne} 38603497fdfdb742f55d7b7ec8e22779fb08962b8441Peter Collingbourne 38612edf0a2520313cde900799b1eb9bd11c9c776afeSean Hunt/// ParseCXX11Attributes - Parse a C++11 attribute-specifier-seq. 38623497fdfdb742f55d7b7ec8e22779fb08962b8441Peter Collingbourne/// 38633497fdfdb742f55d7b7ec8e22779fb08962b8441Peter Collingbourne/// attribute-specifier-seq: 38643497fdfdb742f55d7b7ec8e22779fb08962b8441Peter Collingbourne/// attribute-specifier-seq[opt] attribute-specifier 3865c56298d87a9df507805a548d7d515e8b511df2c0Richard Smithvoid Parser::ParseCXX11Attributes(ParsedAttributesWithRange &attrs, 38663497fdfdb742f55d7b7ec8e22779fb08962b8441Peter Collingbourne SourceLocation *endLoc) { 3867672edb0a04a5273e3a501f3b196844c125290780Richard Smith assert(getLangOpts().CPlusPlus11); 3868672edb0a04a5273e3a501f3b196844c125290780Richard Smith 38693497fdfdb742f55d7b7ec8e22779fb08962b8441Peter Collingbourne SourceLocation StartLoc = Tok.getLocation(), Loc; 38703497fdfdb742f55d7b7ec8e22779fb08962b8441Peter Collingbourne if (!endLoc) 38713497fdfdb742f55d7b7ec8e22779fb08962b8441Peter Collingbourne endLoc = &Loc; 38723497fdfdb742f55d7b7ec8e22779fb08962b8441Peter Collingbourne 38738828ee7faa42f889ade3bb635dc5f1338be671b1Douglas Gregor do { 3874c56298d87a9df507805a548d7d515e8b511df2c0Richard Smith ParseCXX11AttributeSpecifier(attrs, endLoc); 38756ee326af4e77e6f05973486097884d7431f2108dRichard Smith } while (isCXX11AttributeSpecifier()); 3876bbd37c62e34db3f5a95c899723484a76c71d7757Sean Hunt 38773497fdfdb742f55d7b7ec8e22779fb08962b8441Peter Collingbourne attrs.Range = SourceRange(StartLoc, *endLoc); 3878bbd37c62e34db3f5a95c899723484a76c71d7757Sean Hunt} 3879bbd37c62e34db3f5a95c899723484a76c71d7757Sean Hunt 38805eed7e00b4ac8d589ca83e126dafa8767e8a0358Richard Smithvoid Parser::DiagnoseAndSkipCXX11Attributes() { 38815eed7e00b4ac8d589ca83e126dafa8767e8a0358Richard Smith // Start and end location of an attribute or an attribute list. 38825eed7e00b4ac8d589ca83e126dafa8767e8a0358Richard Smith SourceLocation StartLoc = Tok.getLocation(); 3883c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines SourceLocation EndLoc = SkipCXX11Attributes(); 3884c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines 3885c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines if (EndLoc.isValid()) { 3886c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines SourceRange Range(StartLoc, EndLoc); 3887c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines Diag(StartLoc, diag::err_attributes_not_allowed) 3888c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines << Range; 3889c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines } 3890c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines} 3891c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines 3892c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen HinesSourceLocation Parser::SkipCXX11Attributes() { 38935eed7e00b4ac8d589ca83e126dafa8767e8a0358Richard Smith SourceLocation EndLoc; 38945eed7e00b4ac8d589ca83e126dafa8767e8a0358Richard Smith 3895c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines if (!isCXX11AttributeSpecifier()) 3896c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines return EndLoc; 3897c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines 38985eed7e00b4ac8d589ca83e126dafa8767e8a0358Richard Smith do { 38995eed7e00b4ac8d589ca83e126dafa8767e8a0358Richard Smith if (Tok.is(tok::l_square)) { 39005eed7e00b4ac8d589ca83e126dafa8767e8a0358Richard Smith BalancedDelimiterTracker T(*this, tok::l_square); 39015eed7e00b4ac8d589ca83e126dafa8767e8a0358Richard Smith T.consumeOpen(); 39025eed7e00b4ac8d589ca83e126dafa8767e8a0358Richard Smith T.skipToEnd(); 39035eed7e00b4ac8d589ca83e126dafa8767e8a0358Richard Smith EndLoc = T.getCloseLocation(); 39045eed7e00b4ac8d589ca83e126dafa8767e8a0358Richard Smith } else { 39055eed7e00b4ac8d589ca83e126dafa8767e8a0358Richard Smith assert(Tok.is(tok::kw_alignas) && "not an attribute specifier"); 39065eed7e00b4ac8d589ca83e126dafa8767e8a0358Richard Smith ConsumeToken(); 39075eed7e00b4ac8d589ca83e126dafa8767e8a0358Richard Smith BalancedDelimiterTracker T(*this, tok::l_paren); 39085eed7e00b4ac8d589ca83e126dafa8767e8a0358Richard Smith if (!T.consumeOpen()) 39095eed7e00b4ac8d589ca83e126dafa8767e8a0358Richard Smith T.skipToEnd(); 39105eed7e00b4ac8d589ca83e126dafa8767e8a0358Richard Smith EndLoc = T.getCloseLocation(); 39115eed7e00b4ac8d589ca83e126dafa8767e8a0358Richard Smith } 39125eed7e00b4ac8d589ca83e126dafa8767e8a0358Richard Smith } while (isCXX11AttributeSpecifier()); 39135eed7e00b4ac8d589ca83e126dafa8767e8a0358Richard Smith 3914c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines return EndLoc; 39155eed7e00b4ac8d589ca83e126dafa8767e8a0358Richard Smith} 39165eed7e00b4ac8d589ca83e126dafa8767e8a0358Richard Smith 3917b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar/// ParseMicrosoftAttributes - Parse Microsoft attributes [Attr] 3918334d47e92e9f241576fdeb7477b69a03136ba854Francois Pichet/// 3919334d47e92e9f241576fdeb7477b69a03136ba854Francois Pichet/// [MS] ms-attribute: 3920334d47e92e9f241576fdeb7477b69a03136ba854Francois Pichet/// '[' token-seq ']' 3921334d47e92e9f241576fdeb7477b69a03136ba854Francois Pichet/// 3922334d47e92e9f241576fdeb7477b69a03136ba854Francois Pichet/// [MS] ms-attribute-seq: 3923334d47e92e9f241576fdeb7477b69a03136ba854Francois Pichet/// ms-attribute[opt] 3924334d47e92e9f241576fdeb7477b69a03136ba854Francois Pichet/// ms-attribute ms-attribute-seq 39257f040a9d817cd1c72b565e92abff473510bf9e1dJohn McCallvoid Parser::ParseMicrosoftAttributes(ParsedAttributes &attrs, 39267f040a9d817cd1c72b565e92abff473510bf9e1dJohn McCall SourceLocation *endLoc) { 3927334d47e92e9f241576fdeb7477b69a03136ba854Francois Pichet assert(Tok.is(tok::l_square) && "Not a Microsoft attribute list"); 3928334d47e92e9f241576fdeb7477b69a03136ba854Francois Pichet 3929b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar do { 39306ee326af4e77e6f05973486097884d7431f2108dRichard Smith // FIXME: If this is actually a C++11 attribute, parse it as one. 3931b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar BalancedDelimiterTracker T(*this, tok::l_square); 3932b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar T.consumeOpen(); 39338fe2475a4b4c00475709c13d43eb9a57cce87cbcAlexey Bataev SkipUntil(tok::r_square, StopAtSemi | StopBeforeMatch); 3934b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar T.consumeClose(); 3935b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (endLoc) 3936b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar *endLoc = T.getCloseLocation(); 3937b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar } while (Tok.is(tok::l_square)); 3938334d47e92e9f241576fdeb7477b69a03136ba854Francois Pichet} 3939563a645de82231a55e221fe655b7188bf8369662Francois Pichet 3940563a645de82231a55e221fe655b7188bf8369662Francois Pichetvoid Parser::ParseMicrosoftIfExistsClassDeclaration(DeclSpec::TST TagType, 3941563a645de82231a55e221fe655b7188bf8369662Francois Pichet AccessSpecifier& CurAS) { 39423896fc5d4daaf003e451e797e37de57dd8cf9cd5Douglas Gregor IfExistsCondition Result; 3943563a645de82231a55e221fe655b7188bf8369662Francois Pichet if (ParseMicrosoftIfExistsCondition(Result)) 3944563a645de82231a55e221fe655b7188bf8369662Francois Pichet return; 3945563a645de82231a55e221fe655b7188bf8369662Francois Pichet 39463896fc5d4daaf003e451e797e37de57dd8cf9cd5Douglas Gregor BalancedDelimiterTracker Braces(*this, tok::l_brace); 39473896fc5d4daaf003e451e797e37de57dd8cf9cd5Douglas Gregor if (Braces.consumeOpen()) { 3948651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Diag(Tok, diag::err_expected) << tok::l_brace; 3949563a645de82231a55e221fe655b7188bf8369662Francois Pichet return; 3950563a645de82231a55e221fe655b7188bf8369662Francois Pichet } 3951563a645de82231a55e221fe655b7188bf8369662Francois Pichet 39523896fc5d4daaf003e451e797e37de57dd8cf9cd5Douglas Gregor switch (Result.Behavior) { 39533896fc5d4daaf003e451e797e37de57dd8cf9cd5Douglas Gregor case IEB_Parse: 39543896fc5d4daaf003e451e797e37de57dd8cf9cd5Douglas Gregor // Parse the declarations below. 39553896fc5d4daaf003e451e797e37de57dd8cf9cd5Douglas Gregor break; 39563896fc5d4daaf003e451e797e37de57dd8cf9cd5Douglas Gregor 39573896fc5d4daaf003e451e797e37de57dd8cf9cd5Douglas Gregor case IEB_Dependent: 39583896fc5d4daaf003e451e797e37de57dd8cf9cd5Douglas Gregor Diag(Result.KeywordLoc, diag::warn_microsoft_dependent_exists) 39593896fc5d4daaf003e451e797e37de57dd8cf9cd5Douglas Gregor << Result.IsIfExists; 39603896fc5d4daaf003e451e797e37de57dd8cf9cd5Douglas Gregor // Fall through to skip. 39613896fc5d4daaf003e451e797e37de57dd8cf9cd5Douglas Gregor 39623896fc5d4daaf003e451e797e37de57dd8cf9cd5Douglas Gregor case IEB_Skip: 39633896fc5d4daaf003e451e797e37de57dd8cf9cd5Douglas Gregor Braces.skipToEnd(); 3964563a645de82231a55e221fe655b7188bf8369662Francois Pichet return; 3965563a645de82231a55e221fe655b7188bf8369662Francois Pichet } 3966563a645de82231a55e221fe655b7188bf8369662Francois Pichet 3967651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines while (Tok.isNot(tok::r_brace) && !isEofOrEom()) { 3968563a645de82231a55e221fe655b7188bf8369662Francois Pichet // __if_exists, __if_not_exists can nest. 396987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (Tok.isOneOf(tok::kw___if_exists, tok::kw___if_not_exists)) { 3970563a645de82231a55e221fe655b7188bf8369662Francois Pichet ParseMicrosoftIfExistsClassDeclaration((DeclSpec::TST)TagType, CurAS); 3971563a645de82231a55e221fe655b7188bf8369662Francois Pichet continue; 3972563a645de82231a55e221fe655b7188bf8369662Francois Pichet } 3973563a645de82231a55e221fe655b7188bf8369662Francois Pichet 3974563a645de82231a55e221fe655b7188bf8369662Francois Pichet // Check for extraneous top-level semicolon. 3975563a645de82231a55e221fe655b7188bf8369662Francois Pichet if (Tok.is(tok::semi)) { 3976eab9d6f9065b042d39fbaf9842c9d8cc968dd6d0Richard Smith ConsumeExtraSemi(InsideStruct, TagType); 3977563a645de82231a55e221fe655b7188bf8369662Francois Pichet continue; 3978563a645de82231a55e221fe655b7188bf8369662Francois Pichet } 3979563a645de82231a55e221fe655b7188bf8369662Francois Pichet 3980563a645de82231a55e221fe655b7188bf8369662Francois Pichet AccessSpecifier AS = getAccessSpecifierIfPresent(); 3981563a645de82231a55e221fe655b7188bf8369662Francois Pichet if (AS != AS_none) { 3982563a645de82231a55e221fe655b7188bf8369662Francois Pichet // Current token is a C++ access specifier. 3983563a645de82231a55e221fe655b7188bf8369662Francois Pichet CurAS = AS; 3984563a645de82231a55e221fe655b7188bf8369662Francois Pichet SourceLocation ASLoc = Tok.getLocation(); 3985563a645de82231a55e221fe655b7188bf8369662Francois Pichet ConsumeToken(); 3986563a645de82231a55e221fe655b7188bf8369662Francois Pichet if (Tok.is(tok::colon)) 3987563a645de82231a55e221fe655b7188bf8369662Francois Pichet Actions.ActOnAccessSpecifier(AS, ASLoc, Tok.getLocation()); 3988563a645de82231a55e221fe655b7188bf8369662Francois Pichet else 3989651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Diag(Tok, diag::err_expected) << tok::colon; 3990563a645de82231a55e221fe655b7188bf8369662Francois Pichet ConsumeToken(); 3991563a645de82231a55e221fe655b7188bf8369662Francois Pichet continue; 3992563a645de82231a55e221fe655b7188bf8369662Francois Pichet } 3993563a645de82231a55e221fe655b7188bf8369662Francois Pichet 3994563a645de82231a55e221fe655b7188bf8369662Francois Pichet // Parse all the comma separated declarators. 39956bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines ParseCXXClassMemberDeclaration(CurAS, nullptr); 3996563a645de82231a55e221fe655b7188bf8369662Francois Pichet } 39973896fc5d4daaf003e451e797e37de57dd8cf9cd5Douglas Gregor 39983896fc5d4daaf003e451e797e37de57dd8cf9cd5Douglas Gregor Braces.consumeClose(); 3999563a645de82231a55e221fe655b7188bf8369662Francois Pichet} 4000