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