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