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