]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/llvm/tools/clang/lib/Parse/ParseExprCXX.cpp
MFV: r329072
[FreeBSD/FreeBSD.git] / contrib / llvm / tools / clang / lib / Parse / ParseExprCXX.cpp
1 //===--- ParseExprCXX.cpp - C++ Expression Parsing ------------------------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This file implements the Expression parsing implementation for C++.
11 //
12 //===----------------------------------------------------------------------===//
13 #include "clang/Parse/Parser.h"
14 #include "clang/AST/ASTContext.h"
15 #include "clang/AST/DeclTemplate.h"
16 #include "clang/Basic/PrettyStackTrace.h"
17 #include "clang/Lex/LiteralSupport.h"
18 #include "clang/Parse/ParseDiagnostic.h"
19 #include "clang/Parse/RAIIObjectsForParser.h"
20 #include "clang/Sema/DeclSpec.h"
21 #include "clang/Sema/ParsedTemplate.h"
22 #include "clang/Sema/Scope.h"
23 #include "llvm/Support/ErrorHandling.h"
24
25
26 using namespace clang;
27
28 static int SelectDigraphErrorMessage(tok::TokenKind Kind) {
29   switch (Kind) {
30     // template name
31     case tok::unknown:             return 0;
32     // casts
33     case tok::kw_const_cast:       return 1;
34     case tok::kw_dynamic_cast:     return 2;
35     case tok::kw_reinterpret_cast: return 3;
36     case tok::kw_static_cast:      return 4;
37     default:
38       llvm_unreachable("Unknown type for digraph error message.");
39   }
40 }
41
42 // Are the two tokens adjacent in the same source file?
43 bool Parser::areTokensAdjacent(const Token &First, const Token &Second) {
44   SourceManager &SM = PP.getSourceManager();
45   SourceLocation FirstLoc = SM.getSpellingLoc(First.getLocation());
46   SourceLocation FirstEnd = FirstLoc.getLocWithOffset(First.getLength());
47   return FirstEnd == SM.getSpellingLoc(Second.getLocation());
48 }
49
50 // Suggest fixit for "<::" after a cast.
51 static void FixDigraph(Parser &P, Preprocessor &PP, Token &DigraphToken,
52                        Token &ColonToken, tok::TokenKind Kind, bool AtDigraph) {
53   // Pull '<:' and ':' off token stream.
54   if (!AtDigraph)
55     PP.Lex(DigraphToken);
56   PP.Lex(ColonToken);
57
58   SourceRange Range;
59   Range.setBegin(DigraphToken.getLocation());
60   Range.setEnd(ColonToken.getLocation());
61   P.Diag(DigraphToken.getLocation(), diag::err_missing_whitespace_digraph)
62       << SelectDigraphErrorMessage(Kind)
63       << FixItHint::CreateReplacement(Range, "< ::");
64
65   // Update token information to reflect their change in token type.
66   ColonToken.setKind(tok::coloncolon);
67   ColonToken.setLocation(ColonToken.getLocation().getLocWithOffset(-1));
68   ColonToken.setLength(2);
69   DigraphToken.setKind(tok::less);
70   DigraphToken.setLength(1);
71
72   // Push new tokens back to token stream.
73   PP.EnterToken(ColonToken);
74   if (!AtDigraph)
75     PP.EnterToken(DigraphToken);
76 }
77
78 // Check for '<::' which should be '< ::' instead of '[:' when following
79 // a template name.
80 void Parser::CheckForTemplateAndDigraph(Token &Next, ParsedType ObjectType,
81                                         bool EnteringContext,
82                                         IdentifierInfo &II, CXXScopeSpec &SS) {
83   if (!Next.is(tok::l_square) || Next.getLength() != 2)
84     return;
85
86   Token SecondToken = GetLookAheadToken(2);
87   if (!SecondToken.is(tok::colon) || !areTokensAdjacent(Next, SecondToken))
88     return;
89
90   TemplateTy Template;
91   UnqualifiedId TemplateName;
92   TemplateName.setIdentifier(&II, Tok.getLocation());
93   bool MemberOfUnknownSpecialization;
94   if (!Actions.isTemplateName(getCurScope(), SS, /*hasTemplateKeyword=*/false,
95                               TemplateName, ObjectType, EnteringContext,
96                               Template, MemberOfUnknownSpecialization))
97     return;
98
99   FixDigraph(*this, PP, Next, SecondToken, tok::unknown,
100              /*AtDigraph*/false);
101 }
102
103 /// \brief Parse global scope or nested-name-specifier if present.
104 ///
105 /// Parses a C++ global scope specifier ('::') or nested-name-specifier (which
106 /// may be preceded by '::'). Note that this routine will not parse ::new or
107 /// ::delete; it will just leave them in the token stream.
108 ///
109 ///       '::'[opt] nested-name-specifier
110 ///       '::'
111 ///
112 ///       nested-name-specifier:
113 ///         type-name '::'
114 ///         namespace-name '::'
115 ///         nested-name-specifier identifier '::'
116 ///         nested-name-specifier 'template'[opt] simple-template-id '::'
117 ///
118 ///
119 /// \param SS the scope specifier that will be set to the parsed
120 /// nested-name-specifier (or empty)
121 ///
122 /// \param ObjectType if this nested-name-specifier is being parsed following
123 /// the "." or "->" of a member access expression, this parameter provides the
124 /// type of the object whose members are being accessed.
125 ///
126 /// \param EnteringContext whether we will be entering into the context of
127 /// the nested-name-specifier after parsing it.
128 ///
129 /// \param MayBePseudoDestructor When non-NULL, points to a flag that
130 /// indicates whether this nested-name-specifier may be part of a
131 /// pseudo-destructor name. In this case, the flag will be set false
132 /// if we don't actually end up parsing a destructor name. Moreorover,
133 /// if we do end up determining that we are parsing a destructor name,
134 /// the last component of the nested-name-specifier is not parsed as
135 /// part of the scope specifier.
136 ///
137 /// \param IsTypename If \c true, this nested-name-specifier is known to be
138 /// part of a type name. This is used to improve error recovery.
139 ///
140 /// \param LastII When non-NULL, points to an IdentifierInfo* that will be
141 /// filled in with the leading identifier in the last component of the
142 /// nested-name-specifier, if any.
143 ///
144 /// \param OnlyNamespace If true, only considers namespaces in lookup.
145 ///
146 /// \returns true if there was an error parsing a scope specifier
147 bool Parser::ParseOptionalCXXScopeSpecifier(CXXScopeSpec &SS,
148                                             ParsedType ObjectType,
149                                             bool EnteringContext,
150                                             bool *MayBePseudoDestructor,
151                                             bool IsTypename,
152                                             IdentifierInfo **LastII,
153                                             bool OnlyNamespace) {
154   assert(getLangOpts().CPlusPlus &&
155          "Call sites of this function should be guarded by checking for C++");
156
157   if (Tok.is(tok::annot_cxxscope)) {
158     assert(!LastII && "want last identifier but have already annotated scope");
159     assert(!MayBePseudoDestructor && "unexpected annot_cxxscope");
160     Actions.RestoreNestedNameSpecifierAnnotation(Tok.getAnnotationValue(),
161                                                  Tok.getAnnotationRange(),
162                                                  SS);
163     ConsumeAnnotationToken();
164     return false;
165   }
166
167   if (Tok.is(tok::annot_template_id)) {
168     // If the current token is an annotated template id, it may already have
169     // a scope specifier. Restore it.
170     TemplateIdAnnotation *TemplateId = takeTemplateIdAnnotation(Tok);
171     SS = TemplateId->SS;
172   }
173
174   // Has to happen before any "return false"s in this function.
175   bool CheckForDestructor = false;
176   if (MayBePseudoDestructor && *MayBePseudoDestructor) {
177     CheckForDestructor = true;
178     *MayBePseudoDestructor = false;
179   }
180
181   if (LastII)
182     *LastII = nullptr;
183
184   bool HasScopeSpecifier = false;
185
186   if (Tok.is(tok::coloncolon)) {
187     // ::new and ::delete aren't nested-name-specifiers.
188     tok::TokenKind NextKind = NextToken().getKind();
189     if (NextKind == tok::kw_new || NextKind == tok::kw_delete)
190       return false;
191
192     if (NextKind == tok::l_brace) {
193       // It is invalid to have :: {, consume the scope qualifier and pretend
194       // like we never saw it.
195       Diag(ConsumeToken(), diag::err_expected) << tok::identifier;
196     } else {
197       // '::' - Global scope qualifier.
198       if (Actions.ActOnCXXGlobalScopeSpecifier(ConsumeToken(), SS))
199         return true;
200
201       HasScopeSpecifier = true;
202     }
203   }
204
205   if (Tok.is(tok::kw___super)) {
206     SourceLocation SuperLoc = ConsumeToken();
207     if (!Tok.is(tok::coloncolon)) {
208       Diag(Tok.getLocation(), diag::err_expected_coloncolon_after_super);
209       return true;
210     }
211
212     return Actions.ActOnSuperScopeSpecifier(SuperLoc, ConsumeToken(), SS);
213   }
214
215   if (!HasScopeSpecifier &&
216       Tok.isOneOf(tok::kw_decltype, tok::annot_decltype)) {
217     DeclSpec DS(AttrFactory);
218     SourceLocation DeclLoc = Tok.getLocation();
219     SourceLocation EndLoc  = ParseDecltypeSpecifier(DS);
220
221     SourceLocation CCLoc;
222     // Work around a standard defect: 'decltype(auto)::' is not a
223     // nested-name-specifier.
224     if (DS.getTypeSpecType() == DeclSpec::TST_decltype_auto ||
225         !TryConsumeToken(tok::coloncolon, CCLoc)) {
226       AnnotateExistingDecltypeSpecifier(DS, DeclLoc, EndLoc);
227       return false;
228     }
229
230     if (Actions.ActOnCXXNestedNameSpecifierDecltype(SS, DS, CCLoc))
231       SS.SetInvalid(SourceRange(DeclLoc, CCLoc));
232
233     HasScopeSpecifier = true;
234   }
235
236   while (true) {
237     if (HasScopeSpecifier) {
238       // C++ [basic.lookup.classref]p5:
239       //   If the qualified-id has the form
240       //
241       //       ::class-name-or-namespace-name::...
242       //
243       //   the class-name-or-namespace-name is looked up in global scope as a
244       //   class-name or namespace-name.
245       //
246       // To implement this, we clear out the object type as soon as we've
247       // seen a leading '::' or part of a nested-name-specifier.
248       ObjectType = nullptr;
249
250       if (Tok.is(tok::code_completion)) {
251         // Code completion for a nested-name-specifier, where the code
252         // completion token follows the '::'.
253         Actions.CodeCompleteQualifiedId(getCurScope(), SS, EnteringContext);
254         // Include code completion token into the range of the scope otherwise
255         // when we try to annotate the scope tokens the dangling code completion
256         // token will cause assertion in
257         // Preprocessor::AnnotatePreviousCachedTokens.
258         SS.setEndLoc(Tok.getLocation());
259         cutOffParsing();
260         return true;
261       }
262     }
263
264     // nested-name-specifier:
265     //   nested-name-specifier 'template'[opt] simple-template-id '::'
266
267     // Parse the optional 'template' keyword, then make sure we have
268     // 'identifier <' after it.
269     if (Tok.is(tok::kw_template)) {
270       // If we don't have a scope specifier or an object type, this isn't a
271       // nested-name-specifier, since they aren't allowed to start with
272       // 'template'.
273       if (!HasScopeSpecifier && !ObjectType)
274         break;
275
276       TentativeParsingAction TPA(*this);
277       SourceLocation TemplateKWLoc = ConsumeToken();
278
279       UnqualifiedId TemplateName;
280       if (Tok.is(tok::identifier)) {
281         // Consume the identifier.
282         TemplateName.setIdentifier(Tok.getIdentifierInfo(), Tok.getLocation());
283         ConsumeToken();
284       } else if (Tok.is(tok::kw_operator)) {
285         // We don't need to actually parse the unqualified-id in this case,
286         // because a simple-template-id cannot start with 'operator', but
287         // go ahead and parse it anyway for consistency with the case where
288         // we already annotated the template-id.
289         if (ParseUnqualifiedIdOperator(SS, EnteringContext, ObjectType,
290                                        TemplateName)) {
291           TPA.Commit();
292           break;
293         }
294
295         if (TemplateName.getKind() != UnqualifiedIdKind::IK_OperatorFunctionId &&
296             TemplateName.getKind() != UnqualifiedIdKind::IK_LiteralOperatorId) {
297           Diag(TemplateName.getSourceRange().getBegin(),
298                diag::err_id_after_template_in_nested_name_spec)
299             << TemplateName.getSourceRange();
300           TPA.Commit();
301           break;
302         }
303       } else {
304         TPA.Revert();
305         break;
306       }
307
308       // If the next token is not '<', we have a qualified-id that refers
309       // to a template name, such as T::template apply, but is not a 
310       // template-id.
311       if (Tok.isNot(tok::less)) {
312         TPA.Revert();
313         break;
314       }        
315       
316       // Commit to parsing the template-id.
317       TPA.Commit();
318       TemplateTy Template;
319       if (TemplateNameKind TNK = Actions.ActOnDependentTemplateName(
320               getCurScope(), SS, TemplateKWLoc, TemplateName, ObjectType,
321               EnteringContext, Template, /*AllowInjectedClassName*/ true)) {
322         if (AnnotateTemplateIdToken(Template, TNK, SS, TemplateKWLoc,
323                                     TemplateName, false))
324           return true;
325       } else
326         return true;
327
328       continue;
329     }
330
331     if (Tok.is(tok::annot_template_id) && NextToken().is(tok::coloncolon)) {
332       // We have
333       //
334       //   template-id '::'
335       //
336       // So we need to check whether the template-id is a simple-template-id of
337       // the right kind (it should name a type or be dependent), and then
338       // convert it into a type within the nested-name-specifier.
339       TemplateIdAnnotation *TemplateId = takeTemplateIdAnnotation(Tok);
340       if (CheckForDestructor && GetLookAheadToken(2).is(tok::tilde)) {
341         *MayBePseudoDestructor = true;
342         return false;
343       }
344
345       if (LastII)
346         *LastII = TemplateId->Name;
347
348       // Consume the template-id token.
349       ConsumeAnnotationToken();
350
351       assert(Tok.is(tok::coloncolon) && "NextToken() not working properly!");
352       SourceLocation CCLoc = ConsumeToken();
353
354       HasScopeSpecifier = true;
355
356       ASTTemplateArgsPtr TemplateArgsPtr(TemplateId->getTemplateArgs(),
357                                          TemplateId->NumArgs);
358
359       if (Actions.ActOnCXXNestedNameSpecifier(getCurScope(),
360                                               SS,
361                                               TemplateId->TemplateKWLoc,
362                                               TemplateId->Template,
363                                               TemplateId->TemplateNameLoc,
364                                               TemplateId->LAngleLoc,
365                                               TemplateArgsPtr,
366                                               TemplateId->RAngleLoc,
367                                               CCLoc,
368                                               EnteringContext)) {
369         SourceLocation StartLoc 
370           = SS.getBeginLoc().isValid()? SS.getBeginLoc()
371                                       : TemplateId->TemplateNameLoc;
372         SS.SetInvalid(SourceRange(StartLoc, CCLoc));
373       }
374
375       continue;
376     }
377
378     // The rest of the nested-name-specifier possibilities start with
379     // tok::identifier.
380     if (Tok.isNot(tok::identifier))
381       break;
382
383     IdentifierInfo &II = *Tok.getIdentifierInfo();
384
385     // nested-name-specifier:
386     //   type-name '::'
387     //   namespace-name '::'
388     //   nested-name-specifier identifier '::'
389     Token Next = NextToken();
390     Sema::NestedNameSpecInfo IdInfo(&II, Tok.getLocation(), Next.getLocation(),
391                                     ObjectType);
392
393     // If we get foo:bar, this is almost certainly a typo for foo::bar.  Recover
394     // and emit a fixit hint for it.
395     if (Next.is(tok::colon) && !ColonIsSacred) {
396       if (Actions.IsInvalidUnlessNestedName(getCurScope(), SS, IdInfo,
397                                             EnteringContext) &&
398           // If the token after the colon isn't an identifier, it's still an
399           // error, but they probably meant something else strange so don't
400           // recover like this.
401           PP.LookAhead(1).is(tok::identifier)) {
402         Diag(Next, diag::err_unexpected_colon_in_nested_name_spec)
403           << FixItHint::CreateReplacement(Next.getLocation(), "::");
404         // Recover as if the user wrote '::'.
405         Next.setKind(tok::coloncolon);
406       }
407     }
408
409     if (Next.is(tok::coloncolon) && GetLookAheadToken(2).is(tok::l_brace)) {
410       // It is invalid to have :: {, consume the scope qualifier and pretend
411       // like we never saw it.
412       Token Identifier = Tok; // Stash away the identifier.
413       ConsumeToken();         // Eat the identifier, current token is now '::'.
414       Diag(PP.getLocForEndOfToken(ConsumeToken()), diag::err_expected)
415           << tok::identifier;
416       UnconsumeToken(Identifier); // Stick the identifier back.
417       Next = NextToken();         // Point Next at the '{' token.
418     }
419
420     if (Next.is(tok::coloncolon)) {
421       if (CheckForDestructor && GetLookAheadToken(2).is(tok::tilde) &&
422           !Actions.isNonTypeNestedNameSpecifier(getCurScope(), SS, IdInfo)) {
423         *MayBePseudoDestructor = true;
424         return false;
425       }
426
427       if (ColonIsSacred) {
428         const Token &Next2 = GetLookAheadToken(2);
429         if (Next2.is(tok::kw_private) || Next2.is(tok::kw_protected) ||
430             Next2.is(tok::kw_public) || Next2.is(tok::kw_virtual)) {
431           Diag(Next2, diag::err_unexpected_token_in_nested_name_spec)
432               << Next2.getName()
433               << FixItHint::CreateReplacement(Next.getLocation(), ":");
434           Token ColonColon;
435           PP.Lex(ColonColon);
436           ColonColon.setKind(tok::colon);
437           PP.EnterToken(ColonColon);
438           break;
439         }
440       }
441
442       if (LastII)
443         *LastII = &II;
444
445       // We have an identifier followed by a '::'. Lookup this name
446       // as the name in a nested-name-specifier.
447       Token Identifier = Tok;
448       SourceLocation IdLoc = ConsumeToken();
449       assert(Tok.isOneOf(tok::coloncolon, tok::colon) &&
450              "NextToken() not working properly!");
451       Token ColonColon = Tok;
452       SourceLocation CCLoc = ConsumeToken();
453
454       bool IsCorrectedToColon = false;
455       bool *CorrectionFlagPtr = ColonIsSacred ? &IsCorrectedToColon : nullptr;
456       if (Actions.ActOnCXXNestedNameSpecifier(
457               getCurScope(), IdInfo, EnteringContext, SS, false,
458               CorrectionFlagPtr, OnlyNamespace)) {
459         // Identifier is not recognized as a nested name, but we can have
460         // mistyped '::' instead of ':'.
461         if (CorrectionFlagPtr && IsCorrectedToColon) {
462           ColonColon.setKind(tok::colon);
463           PP.EnterToken(Tok);
464           PP.EnterToken(ColonColon);
465           Tok = Identifier;
466           break;
467         }
468         SS.SetInvalid(SourceRange(IdLoc, CCLoc));
469       }
470       HasScopeSpecifier = true;
471       continue;
472     }
473
474     CheckForTemplateAndDigraph(Next, ObjectType, EnteringContext, II, SS);
475
476     // nested-name-specifier:
477     //   type-name '<'
478     if (Next.is(tok::less)) {
479       TemplateTy Template;
480       UnqualifiedId TemplateName;
481       TemplateName.setIdentifier(&II, Tok.getLocation());
482       bool MemberOfUnknownSpecialization;
483       if (TemplateNameKind TNK = Actions.isTemplateName(getCurScope(), SS, 
484                                               /*hasTemplateKeyword=*/false,
485                                                         TemplateName,
486                                                         ObjectType,
487                                                         EnteringContext,
488                                                         Template,
489                                               MemberOfUnknownSpecialization)) {
490         // We have found a template name, so annotate this token
491         // with a template-id annotation. We do not permit the
492         // template-id to be translated into a type annotation,
493         // because some clients (e.g., the parsing of class template
494         // specializations) still want to see the original template-id
495         // token.
496         ConsumeToken();
497         if (AnnotateTemplateIdToken(Template, TNK, SS, SourceLocation(),
498                                     TemplateName, false))
499           return true;
500         continue;
501       }
502
503       if (MemberOfUnknownSpecialization && (ObjectType || SS.isSet()) && 
504           (IsTypename || IsTemplateArgumentList(1))) {
505         // We have something like t::getAs<T>, where getAs is a 
506         // member of an unknown specialization. However, this will only
507         // parse correctly as a template, so suggest the keyword 'template'
508         // before 'getAs' and treat this as a dependent template name.
509         unsigned DiagID = diag::err_missing_dependent_template_keyword;
510         if (getLangOpts().MicrosoftExt)
511           DiagID = diag::warn_missing_dependent_template_keyword;
512         
513         Diag(Tok.getLocation(), DiagID)
514           << II.getName()
515           << FixItHint::CreateInsertion(Tok.getLocation(), "template ");
516
517         if (TemplateNameKind TNK = Actions.ActOnDependentTemplateName(
518                 getCurScope(), SS, SourceLocation(), TemplateName, ObjectType,
519                 EnteringContext, Template, /*AllowInjectedClassName*/ true)) {
520           // Consume the identifier.
521           ConsumeToken();
522           if (AnnotateTemplateIdToken(Template, TNK, SS, SourceLocation(),
523                                       TemplateName, false))
524             return true;
525         }
526         else
527           return true;     
528                 
529         continue;        
530       }
531     }
532
533     // We don't have any tokens that form the beginning of a
534     // nested-name-specifier, so we're done.
535     break;
536   }
537
538   // Even if we didn't see any pieces of a nested-name-specifier, we
539   // still check whether there is a tilde in this position, which
540   // indicates a potential pseudo-destructor.
541   if (CheckForDestructor && Tok.is(tok::tilde))
542     *MayBePseudoDestructor = true;
543
544   return false;
545 }
546
547 ExprResult Parser::tryParseCXXIdExpression(CXXScopeSpec &SS, bool isAddressOfOperand,
548                                            Token &Replacement) {
549   SourceLocation TemplateKWLoc;
550   UnqualifiedId Name;
551   if (ParseUnqualifiedId(SS,
552                          /*EnteringContext=*/false,
553                          /*AllowDestructorName=*/false,
554                          /*AllowConstructorName=*/false,
555                          /*AllowDeductionGuide=*/false,
556                          /*ObjectType=*/nullptr, TemplateKWLoc, Name))
557     return ExprError();
558
559   // This is only the direct operand of an & operator if it is not
560   // followed by a postfix-expression suffix.
561   if (isAddressOfOperand && isPostfixExpressionSuffixStart())
562     isAddressOfOperand = false;
563
564   return Actions.ActOnIdExpression(getCurScope(), SS, TemplateKWLoc, Name,
565                                    Tok.is(tok::l_paren), isAddressOfOperand,
566                                    nullptr, /*IsInlineAsmIdentifier=*/false,
567                                    &Replacement);
568 }
569
570 /// ParseCXXIdExpression - Handle id-expression.
571 ///
572 ///       id-expression:
573 ///         unqualified-id
574 ///         qualified-id
575 ///
576 ///       qualified-id:
577 ///         '::'[opt] nested-name-specifier 'template'[opt] unqualified-id
578 ///         '::' identifier
579 ///         '::' operator-function-id
580 ///         '::' template-id
581 ///
582 /// NOTE: The standard specifies that, for qualified-id, the parser does not
583 /// expect:
584 ///
585 ///   '::' conversion-function-id
586 ///   '::' '~' class-name
587 ///
588 /// This may cause a slight inconsistency on diagnostics:
589 ///
590 /// class C {};
591 /// namespace A {}
592 /// void f() {
593 ///   :: A :: ~ C(); // Some Sema error about using destructor with a
594 ///                  // namespace.
595 ///   :: ~ C(); // Some Parser error like 'unexpected ~'.
596 /// }
597 ///
598 /// We simplify the parser a bit and make it work like:
599 ///
600 ///       qualified-id:
601 ///         '::'[opt] nested-name-specifier 'template'[opt] unqualified-id
602 ///         '::' unqualified-id
603 ///
604 /// That way Sema can handle and report similar errors for namespaces and the
605 /// global scope.
606 ///
607 /// The isAddressOfOperand parameter indicates that this id-expression is a
608 /// direct operand of the address-of operator. This is, besides member contexts,
609 /// the only place where a qualified-id naming a non-static class member may
610 /// appear.
611 ///
612 ExprResult Parser::ParseCXXIdExpression(bool isAddressOfOperand) {
613   // qualified-id:
614   //   '::'[opt] nested-name-specifier 'template'[opt] unqualified-id
615   //   '::' unqualified-id
616   //
617   CXXScopeSpec SS;
618   ParseOptionalCXXScopeSpecifier(SS, nullptr, /*EnteringContext=*/false);
619
620   Token Replacement;
621   ExprResult Result =
622       tryParseCXXIdExpression(SS, isAddressOfOperand, Replacement);
623   if (Result.isUnset()) {
624     // If the ExprResult is valid but null, then typo correction suggested a
625     // keyword replacement that needs to be reparsed.
626     UnconsumeToken(Replacement);
627     Result = tryParseCXXIdExpression(SS, isAddressOfOperand, Replacement);
628   }
629   assert(!Result.isUnset() && "Typo correction suggested a keyword replacement "
630                               "for a previous keyword suggestion");
631   return Result;
632 }
633
634 /// ParseLambdaExpression - Parse a C++11 lambda expression.
635 ///
636 ///       lambda-expression:
637 ///         lambda-introducer lambda-declarator[opt] compound-statement
638 ///
639 ///       lambda-introducer:
640 ///         '[' lambda-capture[opt] ']'
641 ///
642 ///       lambda-capture:
643 ///         capture-default
644 ///         capture-list
645 ///         capture-default ',' capture-list
646 ///
647 ///       capture-default:
648 ///         '&'
649 ///         '='
650 ///
651 ///       capture-list:
652 ///         capture
653 ///         capture-list ',' capture
654 ///
655 ///       capture:
656 ///         simple-capture
657 ///         init-capture     [C++1y]
658 ///
659 ///       simple-capture:
660 ///         identifier
661 ///         '&' identifier
662 ///         'this'
663 ///
664 ///       init-capture:      [C++1y]
665 ///         identifier initializer
666 ///         '&' identifier initializer
667 ///
668 ///       lambda-declarator:
669 ///         '(' parameter-declaration-clause ')' attribute-specifier[opt]
670 ///           'mutable'[opt] exception-specification[opt]
671 ///           trailing-return-type[opt]
672 ///
673 ExprResult Parser::ParseLambdaExpression() {
674   // Parse lambda-introducer.
675   LambdaIntroducer Intro;
676   Optional<unsigned> DiagID = ParseLambdaIntroducer(Intro);
677   if (DiagID) {
678     Diag(Tok, DiagID.getValue());
679     SkipUntil(tok::r_square, StopAtSemi);
680     SkipUntil(tok::l_brace, StopAtSemi);
681     SkipUntil(tok::r_brace, StopAtSemi);
682     return ExprError();
683   }
684
685   return ParseLambdaExpressionAfterIntroducer(Intro);
686 }
687
688 /// TryParseLambdaExpression - Use lookahead and potentially tentative
689 /// parsing to determine if we are looking at a C++0x lambda expression, and parse
690 /// it if we are.
691 ///
692 /// If we are not looking at a lambda expression, returns ExprError().
693 ExprResult Parser::TryParseLambdaExpression() {
694   assert(getLangOpts().CPlusPlus11
695          && Tok.is(tok::l_square)
696          && "Not at the start of a possible lambda expression.");
697
698   const Token Next = NextToken();
699   if (Next.is(tok::eof)) // Nothing else to lookup here...
700     return ExprEmpty();
701
702   const Token After = GetLookAheadToken(2);
703   // If lookahead indicates this is a lambda...
704   if (Next.is(tok::r_square) ||     // []
705       Next.is(tok::equal) ||        // [=
706       (Next.is(tok::amp) &&         // [&] or [&,
707        (After.is(tok::r_square) ||
708         After.is(tok::comma))) ||
709       (Next.is(tok::identifier) &&  // [identifier]
710        After.is(tok::r_square))) {
711     return ParseLambdaExpression();
712   }
713
714   // If lookahead indicates an ObjC message send...
715   // [identifier identifier
716   if (Next.is(tok::identifier) && After.is(tok::identifier)) {
717     return ExprEmpty();
718   }
719  
720   // Here, we're stuck: lambda introducers and Objective-C message sends are
721   // unambiguous, but it requires arbitrary lookhead.  [a,b,c,d,e,f,g] is a
722   // lambda, and [a,b,c,d,e,f,g h] is a Objective-C message send.  Instead of
723   // writing two routines to parse a lambda introducer, just try to parse
724   // a lambda introducer first, and fall back if that fails.
725   // (TryParseLambdaIntroducer never produces any diagnostic output.)
726   LambdaIntroducer Intro;
727   if (TryParseLambdaIntroducer(Intro))
728     return ExprEmpty();
729
730   return ParseLambdaExpressionAfterIntroducer(Intro);
731 }
732
733 /// \brief Parse a lambda introducer.
734 /// \param Intro A LambdaIntroducer filled in with information about the
735 ///        contents of the lambda-introducer.
736 /// \param SkippedInits If non-null, we are disambiguating between an Obj-C
737 ///        message send and a lambda expression. In this mode, we will
738 ///        sometimes skip the initializers for init-captures and not fully
739 ///        populate \p Intro. This flag will be set to \c true if we do so.
740 /// \return A DiagnosticID if it hit something unexpected. The location for
741 ///         the diagnostic is that of the current token.
742 Optional<unsigned> Parser::ParseLambdaIntroducer(LambdaIntroducer &Intro,
743                                                  bool *SkippedInits) {
744   typedef Optional<unsigned> DiagResult;
745
746   assert(Tok.is(tok::l_square) && "Lambda expressions begin with '['.");
747   BalancedDelimiterTracker T(*this, tok::l_square);
748   T.consumeOpen();
749
750   Intro.Range.setBegin(T.getOpenLocation());
751
752   bool first = true;
753
754   // Parse capture-default.
755   if (Tok.is(tok::amp) &&
756       (NextToken().is(tok::comma) || NextToken().is(tok::r_square))) {
757     Intro.Default = LCD_ByRef;
758     Intro.DefaultLoc = ConsumeToken();
759     first = false;
760   } else if (Tok.is(tok::equal)) {
761     Intro.Default = LCD_ByCopy;
762     Intro.DefaultLoc = ConsumeToken();
763     first = false;
764   }
765
766   while (Tok.isNot(tok::r_square)) {
767     if (!first) {
768       if (Tok.isNot(tok::comma)) {
769         // Provide a completion for a lambda introducer here. Except
770         // in Objective-C, where this is Almost Surely meant to be a message
771         // send. In that case, fail here and let the ObjC message
772         // expression parser perform the completion.
773         if (Tok.is(tok::code_completion) &&
774             !(getLangOpts().ObjC1 && Intro.Default == LCD_None &&
775               !Intro.Captures.empty())) {
776           Actions.CodeCompleteLambdaIntroducer(getCurScope(), Intro, 
777                                                /*AfterAmpersand=*/false);
778           cutOffParsing();
779           break;
780         }
781
782         return DiagResult(diag::err_expected_comma_or_rsquare);
783       }
784       ConsumeToken();
785     }
786
787     if (Tok.is(tok::code_completion)) {
788       // If we're in Objective-C++ and we have a bare '[', then this is more
789       // likely to be a message receiver.
790       if (getLangOpts().ObjC1 && first)
791         Actions.CodeCompleteObjCMessageReceiver(getCurScope());
792       else
793         Actions.CodeCompleteLambdaIntroducer(getCurScope(), Intro, 
794                                              /*AfterAmpersand=*/false);
795       cutOffParsing();
796       break;
797     }
798
799     first = false;
800     
801     // Parse capture.
802     LambdaCaptureKind Kind = LCK_ByCopy;
803     LambdaCaptureInitKind InitKind = LambdaCaptureInitKind::NoInit;
804     SourceLocation Loc;
805     IdentifierInfo *Id = nullptr;
806     SourceLocation EllipsisLoc;
807     ExprResult Init;
808
809     if (Tok.is(tok::star)) {
810       Loc = ConsumeToken(); 
811       if (Tok.is(tok::kw_this)) {
812         ConsumeToken();     
813         Kind = LCK_StarThis;      
814       } else {
815         return DiagResult(diag::err_expected_star_this_capture);
816       }
817     } else if (Tok.is(tok::kw_this)) {
818       Kind = LCK_This;
819       Loc = ConsumeToken();
820     } else {
821       if (Tok.is(tok::amp)) {
822         Kind = LCK_ByRef;
823         ConsumeToken();
824
825         if (Tok.is(tok::code_completion)) {
826           Actions.CodeCompleteLambdaIntroducer(getCurScope(), Intro, 
827                                                /*AfterAmpersand=*/true);
828           cutOffParsing();
829           break;
830         }
831       }
832
833       if (Tok.is(tok::identifier)) {
834         Id = Tok.getIdentifierInfo();
835         Loc = ConsumeToken();
836       } else if (Tok.is(tok::kw_this)) {
837         // FIXME: If we want to suggest a fixit here, will need to return more
838         // than just DiagnosticID. Perhaps full DiagnosticBuilder that can be
839         // Clear()ed to prevent emission in case of tentative parsing?
840         return DiagResult(diag::err_this_captured_by_reference);
841       } else {
842         return DiagResult(diag::err_expected_capture);
843       }
844
845       if (Tok.is(tok::l_paren)) {
846         BalancedDelimiterTracker Parens(*this, tok::l_paren);
847         Parens.consumeOpen();
848
849         InitKind = LambdaCaptureInitKind::DirectInit;
850
851         ExprVector Exprs;
852         CommaLocsTy Commas;
853         if (SkippedInits) {
854           Parens.skipToEnd();
855           *SkippedInits = true;
856         } else if (ParseExpressionList(Exprs, Commas)) {
857           Parens.skipToEnd();
858           Init = ExprError();
859         } else {
860           Parens.consumeClose();
861           Init = Actions.ActOnParenListExpr(Parens.getOpenLocation(),
862                                             Parens.getCloseLocation(),
863                                             Exprs);
864         }
865       } else if (Tok.isOneOf(tok::l_brace, tok::equal)) {
866         // Each lambda init-capture forms its own full expression, which clears
867         // Actions.MaybeODRUseExprs. So create an expression evaluation context
868         // to save the necessary state, and restore it later.
869         EnterExpressionEvaluationContext EC(
870             Actions, Sema::ExpressionEvaluationContext::PotentiallyEvaluated);
871
872         if (TryConsumeToken(tok::equal))
873           InitKind = LambdaCaptureInitKind::CopyInit;
874         else
875           InitKind = LambdaCaptureInitKind::ListInit;
876
877         if (!SkippedInits) {
878           Init = ParseInitializer();
879         } else if (Tok.is(tok::l_brace)) {
880           BalancedDelimiterTracker Braces(*this, tok::l_brace);
881           Braces.consumeOpen();
882           Braces.skipToEnd();
883           *SkippedInits = true;
884         } else {
885           // We're disambiguating this:
886           //
887           //   [..., x = expr
888           //
889           // We need to find the end of the following expression in order to
890           // determine whether this is an Obj-C message send's receiver, a
891           // C99 designator, or a lambda init-capture.
892           //
893           // Parse the expression to find where it ends, and annotate it back
894           // onto the tokens. We would have parsed this expression the same way
895           // in either case: both the RHS of an init-capture and the RHS of an
896           // assignment expression are parsed as an initializer-clause, and in
897           // neither case can anything be added to the scope between the '[' and
898           // here.
899           //
900           // FIXME: This is horrible. Adding a mechanism to skip an expression
901           // would be much cleaner.
902           // FIXME: If there is a ',' before the next ']' or ':', we can skip to
903           // that instead. (And if we see a ':' with no matching '?', we can
904           // classify this as an Obj-C message send.)
905           SourceLocation StartLoc = Tok.getLocation();
906           InMessageExpressionRAIIObject MaybeInMessageExpression(*this, true);
907           Init = ParseInitializer();
908           if (!Init.isInvalid())
909             Init = Actions.CorrectDelayedTyposInExpr(Init.get());
910
911           if (Tok.getLocation() != StartLoc) {
912             // Back out the lexing of the token after the initializer.
913             PP.RevertCachedTokens(1);
914
915             // Replace the consumed tokens with an appropriate annotation.
916             Tok.setLocation(StartLoc);
917             Tok.setKind(tok::annot_primary_expr);
918             setExprAnnotation(Tok, Init);
919             Tok.setAnnotationEndLoc(PP.getLastCachedTokenLocation());
920             PP.AnnotateCachedTokens(Tok);
921
922             // Consume the annotated initializer.
923             ConsumeAnnotationToken();
924           }
925         }
926       } else
927         TryConsumeToken(tok::ellipsis, EllipsisLoc);
928     }
929     // If this is an init capture, process the initialization expression
930     // right away.  For lambda init-captures such as the following:
931     // const int x = 10;
932     //  auto L = [i = x+1](int a) {
933     //    return [j = x+2,
934     //           &k = x](char b) { };
935     //  };
936     // keep in mind that each lambda init-capture has to have:
937     //  - its initialization expression executed in the context
938     //    of the enclosing/parent decl-context.
939     //  - but the variable itself has to be 'injected' into the
940     //    decl-context of its lambda's call-operator (which has
941     //    not yet been created).
942     // Each init-expression is a full-expression that has to get
943     // Sema-analyzed (for capturing etc.) before its lambda's
944     // call-operator's decl-context, scope & scopeinfo are pushed on their
945     // respective stacks.  Thus if any variable is odr-used in the init-capture
946     // it will correctly get captured in the enclosing lambda, if one exists.
947     // The init-variables above are created later once the lambdascope and
948     // call-operators decl-context is pushed onto its respective stack.
949
950     // Since the lambda init-capture's initializer expression occurs in the
951     // context of the enclosing function or lambda, therefore we can not wait
952     // till a lambda scope has been pushed on before deciding whether the
953     // variable needs to be captured.  We also need to process all
954     // lvalue-to-rvalue conversions and discarded-value conversions,
955     // so that we can avoid capturing certain constant variables.
956     // For e.g.,
957     //  void test() {
958     //   const int x = 10;
959     //   auto L = [&z = x](char a) { <-- don't capture by the current lambda
960     //     return [y = x](int i) { <-- don't capture by enclosing lambda
961     //          return y;
962     //     }
963     //   };
964     // }
965     // If x was not const, the second use would require 'L' to capture, and
966     // that would be an error.
967
968     ParsedType InitCaptureType;
969     if (!Init.isInvalid())
970       Init = Actions.CorrectDelayedTyposInExpr(Init.get());
971     if (Init.isUsable()) {
972       // Get the pointer and store it in an lvalue, so we can use it as an
973       // out argument.
974       Expr *InitExpr = Init.get();
975       // This performs any lvalue-to-rvalue conversions if necessary, which
976       // can affect what gets captured in the containing decl-context.
977       InitCaptureType = Actions.actOnLambdaInitCaptureInitialization(
978           Loc, Kind == LCK_ByRef, Id, InitKind, InitExpr);
979       Init = InitExpr;
980     }
981     Intro.addCapture(Kind, Loc, Id, EllipsisLoc, InitKind, Init,
982                      InitCaptureType);
983   }
984
985   T.consumeClose();
986   Intro.Range.setEnd(T.getCloseLocation());
987   return DiagResult();
988 }
989
990 /// TryParseLambdaIntroducer - Tentatively parse a lambda introducer.
991 ///
992 /// Returns true if it hit something unexpected.
993 bool Parser::TryParseLambdaIntroducer(LambdaIntroducer &Intro) {
994   {
995     bool SkippedInits = false;
996     TentativeParsingAction PA1(*this);
997
998     if (ParseLambdaIntroducer(Intro, &SkippedInits)) {
999       PA1.Revert();
1000       return true;
1001     }
1002
1003     if (!SkippedInits) {
1004       PA1.Commit();
1005       return false;
1006     }
1007
1008     PA1.Revert();
1009   }
1010
1011   // Try to parse it again, but this time parse the init-captures too.
1012   Intro = LambdaIntroducer();
1013   TentativeParsingAction PA2(*this);
1014
1015   if (!ParseLambdaIntroducer(Intro)) {
1016     PA2.Commit();
1017     return false;
1018   }
1019
1020   PA2.Revert();
1021   return true;
1022 }
1023
1024 static void
1025 tryConsumeMutableOrConstexprToken(Parser &P, SourceLocation &MutableLoc,
1026                                   SourceLocation &ConstexprLoc,
1027                                   SourceLocation &DeclEndLoc) {
1028   assert(MutableLoc.isInvalid());
1029   assert(ConstexprLoc.isInvalid());
1030   // Consume constexpr-opt mutable-opt in any sequence, and set the DeclEndLoc
1031   // to the final of those locations. Emit an error if we have multiple
1032   // copies of those keywords and recover.
1033
1034   while (true) {
1035     switch (P.getCurToken().getKind()) {
1036     case tok::kw_mutable: {
1037       if (MutableLoc.isValid()) {
1038         P.Diag(P.getCurToken().getLocation(),
1039                diag::err_lambda_decl_specifier_repeated)
1040             << 0 << FixItHint::CreateRemoval(P.getCurToken().getLocation());
1041       }
1042       MutableLoc = P.ConsumeToken();
1043       DeclEndLoc = MutableLoc;
1044       break /*switch*/;
1045     }
1046     case tok::kw_constexpr:
1047       if (ConstexprLoc.isValid()) {
1048         P.Diag(P.getCurToken().getLocation(),
1049                diag::err_lambda_decl_specifier_repeated)
1050             << 1 << FixItHint::CreateRemoval(P.getCurToken().getLocation());
1051       }
1052       ConstexprLoc = P.ConsumeToken();
1053       DeclEndLoc = ConstexprLoc;
1054       break /*switch*/;
1055     default:
1056       return;
1057     }
1058   }
1059 }
1060
1061 static void
1062 addConstexprToLambdaDeclSpecifier(Parser &P, SourceLocation ConstexprLoc,
1063                                   DeclSpec &DS) {
1064   if (ConstexprLoc.isValid()) {
1065     P.Diag(ConstexprLoc, !P.getLangOpts().CPlusPlus17
1066                              ? diag::ext_constexpr_on_lambda_cxx17
1067                              : diag::warn_cxx14_compat_constexpr_on_lambda);
1068     const char *PrevSpec = nullptr;
1069     unsigned DiagID = 0;
1070     DS.SetConstexprSpec(ConstexprLoc, PrevSpec, DiagID);
1071     assert(PrevSpec == nullptr && DiagID == 0 &&
1072            "Constexpr cannot have been set previously!");
1073   }
1074 }
1075
1076 /// ParseLambdaExpressionAfterIntroducer - Parse the rest of a lambda
1077 /// expression.
1078 ExprResult Parser::ParseLambdaExpressionAfterIntroducer(
1079                      LambdaIntroducer &Intro) {
1080   SourceLocation LambdaBeginLoc = Intro.Range.getBegin();
1081   Diag(LambdaBeginLoc, diag::warn_cxx98_compat_lambda);
1082
1083   PrettyStackTraceLoc CrashInfo(PP.getSourceManager(), LambdaBeginLoc,
1084                                 "lambda expression parsing");
1085
1086  
1087
1088   // FIXME: Call into Actions to add any init-capture declarations to the
1089   // scope while parsing the lambda-declarator and compound-statement.
1090
1091   // Parse lambda-declarator[opt].
1092   DeclSpec DS(AttrFactory);
1093   Declarator D(DS, DeclaratorContext::LambdaExprContext);
1094   TemplateParameterDepthRAII CurTemplateDepthTracker(TemplateParameterDepth);
1095   Actions.PushLambdaScope();
1096
1097   ParsedAttributes Attr(AttrFactory);
1098   SourceLocation DeclLoc = Tok.getLocation();
1099   if (getLangOpts().CUDA) {
1100     // In CUDA code, GNU attributes are allowed to appear immediately after the
1101     // "[...]", even if there is no "(...)" before the lambda body.
1102     MaybeParseGNUAttributes(D);
1103   }
1104
1105   // Helper to emit a warning if we see a CUDA host/device/global attribute
1106   // after '(...)'. nvcc doesn't accept this.
1107   auto WarnIfHasCUDATargetAttr = [&] {
1108     if (getLangOpts().CUDA)
1109       for (auto *A = Attr.getList(); A != nullptr; A = A->getNext())
1110         if (A->getKind() == AttributeList::AT_CUDADevice ||
1111             A->getKind() == AttributeList::AT_CUDAHost ||
1112             A->getKind() == AttributeList::AT_CUDAGlobal)
1113           Diag(A->getLoc(), diag::warn_cuda_attr_lambda_position)
1114               << A->getName()->getName();
1115   };
1116
1117   TypeResult TrailingReturnType;
1118   if (Tok.is(tok::l_paren)) {
1119     ParseScope PrototypeScope(this,
1120                               Scope::FunctionPrototypeScope |
1121                               Scope::FunctionDeclarationScope |
1122                               Scope::DeclScope);
1123
1124     BalancedDelimiterTracker T(*this, tok::l_paren);
1125     T.consumeOpen();
1126     SourceLocation LParenLoc = T.getOpenLocation();
1127
1128     // Parse parameter-declaration-clause.
1129     SmallVector<DeclaratorChunk::ParamInfo, 16> ParamInfo;
1130     SourceLocation EllipsisLoc;
1131     
1132     if (Tok.isNot(tok::r_paren)) {
1133       Actions.RecordParsingTemplateParameterDepth(TemplateParameterDepth);
1134       ParseParameterDeclarationClause(D, Attr, ParamInfo, EllipsisLoc);
1135       // For a generic lambda, each 'auto' within the parameter declaration 
1136       // clause creates a template type parameter, so increment the depth.
1137       if (Actions.getCurGenericLambda()) 
1138         ++CurTemplateDepthTracker;
1139     }
1140     T.consumeClose();
1141     SourceLocation RParenLoc = T.getCloseLocation();
1142     SourceLocation DeclEndLoc = RParenLoc;
1143
1144     // GNU-style attributes must be parsed before the mutable specifier to be
1145     // compatible with GCC.
1146     MaybeParseGNUAttributes(Attr, &DeclEndLoc);
1147
1148     // MSVC-style attributes must be parsed before the mutable specifier to be
1149     // compatible with MSVC.
1150     MaybeParseMicrosoftDeclSpecs(Attr, &DeclEndLoc);
1151
1152     // Parse mutable-opt and/or constexpr-opt, and update the DeclEndLoc.
1153     SourceLocation MutableLoc;
1154     SourceLocation ConstexprLoc;
1155     tryConsumeMutableOrConstexprToken(*this, MutableLoc, ConstexprLoc,
1156                                       DeclEndLoc);
1157     
1158     addConstexprToLambdaDeclSpecifier(*this, ConstexprLoc, DS);
1159
1160     // Parse exception-specification[opt].
1161     ExceptionSpecificationType ESpecType = EST_None;
1162     SourceRange ESpecRange;
1163     SmallVector<ParsedType, 2> DynamicExceptions;
1164     SmallVector<SourceRange, 2> DynamicExceptionRanges;
1165     ExprResult NoexceptExpr;
1166     CachedTokens *ExceptionSpecTokens;
1167     ESpecType = tryParseExceptionSpecification(/*Delayed=*/false,
1168                                                ESpecRange,
1169                                                DynamicExceptions,
1170                                                DynamicExceptionRanges,
1171                                                NoexceptExpr,
1172                                                ExceptionSpecTokens);
1173
1174     if (ESpecType != EST_None)
1175       DeclEndLoc = ESpecRange.getEnd();
1176
1177     // Parse attribute-specifier[opt].
1178     MaybeParseCXX11Attributes(Attr, &DeclEndLoc);
1179
1180     SourceLocation FunLocalRangeEnd = DeclEndLoc;
1181
1182     // Parse trailing-return-type[opt].
1183     if (Tok.is(tok::arrow)) {
1184       FunLocalRangeEnd = Tok.getLocation();
1185       SourceRange Range;
1186       TrailingReturnType = ParseTrailingReturnType(Range);
1187       if (Range.getEnd().isValid())
1188         DeclEndLoc = Range.getEnd();
1189     }
1190
1191     PrototypeScope.Exit();
1192
1193     WarnIfHasCUDATargetAttr();
1194
1195     SourceLocation NoLoc;
1196     D.AddTypeInfo(DeclaratorChunk::getFunction(/*hasProto=*/true,
1197                                            /*isAmbiguous=*/false,
1198                                            LParenLoc,
1199                                            ParamInfo.data(), ParamInfo.size(),
1200                                            EllipsisLoc, RParenLoc,
1201                                            DS.getTypeQualifiers(),
1202                                            /*RefQualifierIsLValueRef=*/true,
1203                                            /*RefQualifierLoc=*/NoLoc,
1204                                            /*ConstQualifierLoc=*/NoLoc,
1205                                            /*VolatileQualifierLoc=*/NoLoc,
1206                                            /*RestrictQualifierLoc=*/NoLoc,
1207                                            MutableLoc,
1208                                            ESpecType, ESpecRange,
1209                                            DynamicExceptions.data(),
1210                                            DynamicExceptionRanges.data(),
1211                                            DynamicExceptions.size(),
1212                                            NoexceptExpr.isUsable() ?
1213                                              NoexceptExpr.get() : nullptr,
1214                                            /*ExceptionSpecTokens*/nullptr,
1215                                            /*DeclsInPrototype=*/None,
1216                                            LParenLoc, FunLocalRangeEnd, D,
1217                                            TrailingReturnType),
1218                   Attr, DeclEndLoc);
1219   } else if (Tok.isOneOf(tok::kw_mutable, tok::arrow, tok::kw___attribute,
1220                          tok::kw_constexpr) ||
1221              (Tok.is(tok::l_square) && NextToken().is(tok::l_square))) {
1222     // It's common to forget that one needs '()' before 'mutable', an attribute
1223     // specifier, or the result type. Deal with this.
1224     unsigned TokKind = 0;
1225     switch (Tok.getKind()) {
1226     case tok::kw_mutable: TokKind = 0; break;
1227     case tok::arrow: TokKind = 1; break;
1228     case tok::kw___attribute:
1229     case tok::l_square: TokKind = 2; break;
1230     case tok::kw_constexpr: TokKind = 3; break;
1231     default: llvm_unreachable("Unknown token kind");
1232     }
1233
1234     Diag(Tok, diag::err_lambda_missing_parens)
1235       << TokKind
1236       << FixItHint::CreateInsertion(Tok.getLocation(), "() ");
1237     SourceLocation DeclEndLoc = DeclLoc;
1238
1239     // GNU-style attributes must be parsed before the mutable specifier to be
1240     // compatible with GCC.
1241     MaybeParseGNUAttributes(Attr, &DeclEndLoc);
1242
1243     // Parse 'mutable', if it's there.
1244     SourceLocation MutableLoc;
1245     if (Tok.is(tok::kw_mutable)) {
1246       MutableLoc = ConsumeToken();
1247       DeclEndLoc = MutableLoc;
1248     }
1249
1250     // Parse attribute-specifier[opt].
1251     MaybeParseCXX11Attributes(Attr, &DeclEndLoc);
1252
1253     // Parse the return type, if there is one.
1254     if (Tok.is(tok::arrow)) {
1255       SourceRange Range;
1256       TrailingReturnType = ParseTrailingReturnType(Range);
1257       if (Range.getEnd().isValid())
1258         DeclEndLoc = Range.getEnd();
1259     }
1260
1261     WarnIfHasCUDATargetAttr();
1262
1263     SourceLocation NoLoc;
1264     D.AddTypeInfo(DeclaratorChunk::getFunction(/*hasProto=*/true,
1265                                                /*isAmbiguous=*/false,
1266                                                /*LParenLoc=*/NoLoc,
1267                                                /*Params=*/nullptr,
1268                                                /*NumParams=*/0,
1269                                                /*EllipsisLoc=*/NoLoc,
1270                                                /*RParenLoc=*/NoLoc,
1271                                                /*TypeQuals=*/0,
1272                                                /*RefQualifierIsLValueRef=*/true,
1273                                                /*RefQualifierLoc=*/NoLoc,
1274                                                /*ConstQualifierLoc=*/NoLoc,
1275                                                /*VolatileQualifierLoc=*/NoLoc,
1276                                                /*RestrictQualifierLoc=*/NoLoc,
1277                                                MutableLoc,
1278                                                EST_None,
1279                                                /*ESpecRange=*/SourceRange(),
1280                                                /*Exceptions=*/nullptr,
1281                                                /*ExceptionRanges=*/nullptr,
1282                                                /*NumExceptions=*/0,
1283                                                /*NoexceptExpr=*/nullptr,
1284                                                /*ExceptionSpecTokens=*/nullptr,
1285                                                /*DeclsInPrototype=*/None,
1286                                                DeclLoc, DeclEndLoc, D,
1287                                                TrailingReturnType),
1288                   Attr, DeclEndLoc);
1289   }
1290
1291   // FIXME: Rename BlockScope -> ClosureScope if we decide to continue using
1292   // it.
1293   unsigned ScopeFlags = Scope::BlockScope | Scope::FnScope | Scope::DeclScope |
1294                         Scope::CompoundStmtScope;
1295   ParseScope BodyScope(this, ScopeFlags);
1296
1297   Actions.ActOnStartOfLambdaDefinition(Intro, D, getCurScope());
1298
1299   // Parse compound-statement.
1300   if (!Tok.is(tok::l_brace)) {
1301     Diag(Tok, diag::err_expected_lambda_body);
1302     Actions.ActOnLambdaError(LambdaBeginLoc, getCurScope());
1303     return ExprError();
1304   }
1305
1306   StmtResult Stmt(ParseCompoundStatementBody());
1307   BodyScope.Exit();
1308
1309   if (!Stmt.isInvalid() && !TrailingReturnType.isInvalid())
1310     return Actions.ActOnLambdaExpr(LambdaBeginLoc, Stmt.get(), getCurScope());
1311
1312   Actions.ActOnLambdaError(LambdaBeginLoc, getCurScope());
1313   return ExprError();
1314 }
1315
1316 /// ParseCXXCasts - This handles the various ways to cast expressions to another
1317 /// type.
1318 ///
1319 ///       postfix-expression: [C++ 5.2p1]
1320 ///         'dynamic_cast' '<' type-name '>' '(' expression ')'
1321 ///         'static_cast' '<' type-name '>' '(' expression ')'
1322 ///         'reinterpret_cast' '<' type-name '>' '(' expression ')'
1323 ///         'const_cast' '<' type-name '>' '(' expression ')'
1324 ///
1325 ExprResult Parser::ParseCXXCasts() {
1326   tok::TokenKind Kind = Tok.getKind();
1327   const char *CastName = nullptr; // For error messages
1328
1329   switch (Kind) {
1330   default: llvm_unreachable("Unknown C++ cast!");
1331   case tok::kw_const_cast:       CastName = "const_cast";       break;
1332   case tok::kw_dynamic_cast:     CastName = "dynamic_cast";     break;
1333   case tok::kw_reinterpret_cast: CastName = "reinterpret_cast"; break;
1334   case tok::kw_static_cast:      CastName = "static_cast";      break;
1335   }
1336
1337   SourceLocation OpLoc = ConsumeToken();
1338   SourceLocation LAngleBracketLoc = Tok.getLocation();
1339
1340   // Check for "<::" which is parsed as "[:".  If found, fix token stream,
1341   // diagnose error, suggest fix, and recover parsing.
1342   if (Tok.is(tok::l_square) && Tok.getLength() == 2) {
1343     Token Next = NextToken();
1344     if (Next.is(tok::colon) && areTokensAdjacent(Tok, Next))
1345       FixDigraph(*this, PP, Tok, Next, Kind, /*AtDigraph*/true);
1346   }
1347
1348   if (ExpectAndConsume(tok::less, diag::err_expected_less_after, CastName))
1349     return ExprError();
1350
1351   // Parse the common declaration-specifiers piece.
1352   DeclSpec DS(AttrFactory);
1353   ParseSpecifierQualifierList(DS);
1354
1355   // Parse the abstract-declarator, if present.
1356   Declarator DeclaratorInfo(DS, DeclaratorContext::TypeNameContext);
1357   ParseDeclarator(DeclaratorInfo);
1358
1359   SourceLocation RAngleBracketLoc = Tok.getLocation();
1360
1361   if (ExpectAndConsume(tok::greater))
1362     return ExprError(Diag(LAngleBracketLoc, diag::note_matching) << tok::less);
1363
1364   BalancedDelimiterTracker T(*this, tok::l_paren);
1365
1366   if (T.expectAndConsume(diag::err_expected_lparen_after, CastName))
1367     return ExprError();
1368
1369   ExprResult Result = ParseExpression();
1370
1371   // Match the ')'.
1372   T.consumeClose();
1373
1374   if (!Result.isInvalid() && !DeclaratorInfo.isInvalidType())
1375     Result = Actions.ActOnCXXNamedCast(OpLoc, Kind,
1376                                        LAngleBracketLoc, DeclaratorInfo,
1377                                        RAngleBracketLoc,
1378                                        T.getOpenLocation(), Result.get(), 
1379                                        T.getCloseLocation());
1380
1381   return Result;
1382 }
1383
1384 /// ParseCXXTypeid - This handles the C++ typeid expression.
1385 ///
1386 ///       postfix-expression: [C++ 5.2p1]
1387 ///         'typeid' '(' expression ')'
1388 ///         'typeid' '(' type-id ')'
1389 ///
1390 ExprResult Parser::ParseCXXTypeid() {
1391   assert(Tok.is(tok::kw_typeid) && "Not 'typeid'!");
1392
1393   SourceLocation OpLoc = ConsumeToken();
1394   SourceLocation LParenLoc, RParenLoc;
1395   BalancedDelimiterTracker T(*this, tok::l_paren);
1396
1397   // typeid expressions are always parenthesized.
1398   if (T.expectAndConsume(diag::err_expected_lparen_after, "typeid"))
1399     return ExprError();
1400   LParenLoc = T.getOpenLocation();
1401
1402   ExprResult Result;
1403
1404   // C++0x [expr.typeid]p3:
1405   //   When typeid is applied to an expression other than an lvalue of a
1406   //   polymorphic class type [...] The expression is an unevaluated
1407   //   operand (Clause 5).
1408   //
1409   // Note that we can't tell whether the expression is an lvalue of a
1410   // polymorphic class type until after we've parsed the expression; we
1411   // speculatively assume the subexpression is unevaluated, and fix it up
1412   // later.
1413   //
1414   // We enter the unevaluated context before trying to determine whether we
1415   // have a type-id, because the tentative parse logic will try to resolve
1416   // names, and must treat them as unevaluated.
1417   EnterExpressionEvaluationContext Unevaluated(
1418       Actions, Sema::ExpressionEvaluationContext::Unevaluated,
1419       Sema::ReuseLambdaContextDecl);
1420
1421   if (isTypeIdInParens()) {
1422     TypeResult Ty = ParseTypeName();
1423
1424     // Match the ')'.
1425     T.consumeClose();
1426     RParenLoc = T.getCloseLocation();
1427     if (Ty.isInvalid() || RParenLoc.isInvalid())
1428       return ExprError();
1429
1430     Result = Actions.ActOnCXXTypeid(OpLoc, LParenLoc, /*isType=*/true,
1431                                     Ty.get().getAsOpaquePtr(), RParenLoc);
1432   } else {
1433     Result = ParseExpression();
1434
1435     // Match the ')'.
1436     if (Result.isInvalid())
1437       SkipUntil(tok::r_paren, StopAtSemi);
1438     else {
1439       T.consumeClose();
1440       RParenLoc = T.getCloseLocation();
1441       if (RParenLoc.isInvalid())
1442         return ExprError();
1443
1444       Result = Actions.ActOnCXXTypeid(OpLoc, LParenLoc, /*isType=*/false,
1445                                       Result.get(), RParenLoc);
1446     }
1447   }
1448
1449   return Result;
1450 }
1451
1452 /// ParseCXXUuidof - This handles the Microsoft C++ __uuidof expression.
1453 ///
1454 ///         '__uuidof' '(' expression ')'
1455 ///         '__uuidof' '(' type-id ')'
1456 ///
1457 ExprResult Parser::ParseCXXUuidof() {
1458   assert(Tok.is(tok::kw___uuidof) && "Not '__uuidof'!");
1459
1460   SourceLocation OpLoc = ConsumeToken();
1461   BalancedDelimiterTracker T(*this, tok::l_paren);
1462
1463   // __uuidof expressions are always parenthesized.
1464   if (T.expectAndConsume(diag::err_expected_lparen_after, "__uuidof"))
1465     return ExprError();
1466
1467   ExprResult Result;
1468
1469   if (isTypeIdInParens()) {
1470     TypeResult Ty = ParseTypeName();
1471
1472     // Match the ')'.
1473     T.consumeClose();
1474
1475     if (Ty.isInvalid())
1476       return ExprError();
1477
1478     Result = Actions.ActOnCXXUuidof(OpLoc, T.getOpenLocation(), /*isType=*/true,
1479                                     Ty.get().getAsOpaquePtr(), 
1480                                     T.getCloseLocation());
1481   } else {
1482     EnterExpressionEvaluationContext Unevaluated(
1483         Actions, Sema::ExpressionEvaluationContext::Unevaluated);
1484     Result = ParseExpression();
1485
1486     // Match the ')'.
1487     if (Result.isInvalid())
1488       SkipUntil(tok::r_paren, StopAtSemi);
1489     else {
1490       T.consumeClose();
1491
1492       Result = Actions.ActOnCXXUuidof(OpLoc, T.getOpenLocation(),
1493                                       /*isType=*/false,
1494                                       Result.get(), T.getCloseLocation());
1495     }
1496   }
1497
1498   return Result;
1499 }
1500
1501 /// \brief Parse a C++ pseudo-destructor expression after the base,
1502 /// . or -> operator, and nested-name-specifier have already been
1503 /// parsed.
1504 ///
1505 ///       postfix-expression: [C++ 5.2]
1506 ///         postfix-expression . pseudo-destructor-name
1507 ///         postfix-expression -> pseudo-destructor-name
1508 ///
1509 ///       pseudo-destructor-name: 
1510 ///         ::[opt] nested-name-specifier[opt] type-name :: ~type-name 
1511 ///         ::[opt] nested-name-specifier template simple-template-id :: 
1512 ///                 ~type-name 
1513 ///         ::[opt] nested-name-specifier[opt] ~type-name
1514 ///       
1515 ExprResult 
1516 Parser::ParseCXXPseudoDestructor(Expr *Base, SourceLocation OpLoc,
1517                                  tok::TokenKind OpKind,
1518                                  CXXScopeSpec &SS,
1519                                  ParsedType ObjectType) {
1520   // We're parsing either a pseudo-destructor-name or a dependent
1521   // member access that has the same form as a
1522   // pseudo-destructor-name. We parse both in the same way and let
1523   // the action model sort them out.
1524   //
1525   // Note that the ::[opt] nested-name-specifier[opt] has already
1526   // been parsed, and if there was a simple-template-id, it has
1527   // been coalesced into a template-id annotation token.
1528   UnqualifiedId FirstTypeName;
1529   SourceLocation CCLoc;
1530   if (Tok.is(tok::identifier)) {
1531     FirstTypeName.setIdentifier(Tok.getIdentifierInfo(), Tok.getLocation());
1532     ConsumeToken();
1533     assert(Tok.is(tok::coloncolon) &&"ParseOptionalCXXScopeSpecifier fail");
1534     CCLoc = ConsumeToken();
1535   } else if (Tok.is(tok::annot_template_id)) {
1536     // FIXME: retrieve TemplateKWLoc from template-id annotation and
1537     // store it in the pseudo-dtor node (to be used when instantiating it).
1538     FirstTypeName.setTemplateId(
1539                               (TemplateIdAnnotation *)Tok.getAnnotationValue());
1540     ConsumeAnnotationToken();
1541     assert(Tok.is(tok::coloncolon) &&"ParseOptionalCXXScopeSpecifier fail");
1542     CCLoc = ConsumeToken();
1543   } else {
1544     FirstTypeName.setIdentifier(nullptr, SourceLocation());
1545   }
1546
1547   // Parse the tilde.
1548   assert(Tok.is(tok::tilde) && "ParseOptionalCXXScopeSpecifier fail");
1549   SourceLocation TildeLoc = ConsumeToken();
1550
1551   if (Tok.is(tok::kw_decltype) && !FirstTypeName.isValid() && SS.isEmpty()) {
1552     DeclSpec DS(AttrFactory);
1553     ParseDecltypeSpecifier(DS);
1554     if (DS.getTypeSpecType() == TST_error)
1555       return ExprError();
1556     return Actions.ActOnPseudoDestructorExpr(getCurScope(), Base, OpLoc, OpKind,
1557                                              TildeLoc, DS);
1558   }
1559
1560   if (!Tok.is(tok::identifier)) {
1561     Diag(Tok, diag::err_destructor_tilde_identifier);
1562     return ExprError();
1563   }
1564   
1565   // Parse the second type.
1566   UnqualifiedId SecondTypeName;
1567   IdentifierInfo *Name = Tok.getIdentifierInfo();
1568   SourceLocation NameLoc = ConsumeToken();
1569   SecondTypeName.setIdentifier(Name, NameLoc);
1570   
1571   // If there is a '<', the second type name is a template-id. Parse
1572   // it as such.
1573   if (Tok.is(tok::less) &&
1574       ParseUnqualifiedIdTemplateId(SS, SourceLocation(),
1575                                    Name, NameLoc,
1576                                    false, ObjectType, SecondTypeName,
1577                                    /*AssumeTemplateName=*/true))
1578     return ExprError();
1579
1580   return Actions.ActOnPseudoDestructorExpr(getCurScope(), Base, OpLoc, OpKind,
1581                                            SS, FirstTypeName, CCLoc, TildeLoc,
1582                                            SecondTypeName);
1583 }
1584
1585 /// ParseCXXBoolLiteral - This handles the C++ Boolean literals.
1586 ///
1587 ///       boolean-literal: [C++ 2.13.5]
1588 ///         'true'
1589 ///         'false'
1590 ExprResult Parser::ParseCXXBoolLiteral() {
1591   tok::TokenKind Kind = Tok.getKind();
1592   return Actions.ActOnCXXBoolLiteral(ConsumeToken(), Kind);
1593 }
1594
1595 /// ParseThrowExpression - This handles the C++ throw expression.
1596 ///
1597 ///       throw-expression: [C++ 15]
1598 ///         'throw' assignment-expression[opt]
1599 ExprResult Parser::ParseThrowExpression() {
1600   assert(Tok.is(tok::kw_throw) && "Not throw!");
1601   SourceLocation ThrowLoc = ConsumeToken();           // Eat the throw token.
1602
1603   // If the current token isn't the start of an assignment-expression,
1604   // then the expression is not present.  This handles things like:
1605   //   "C ? throw : (void)42", which is crazy but legal.
1606   switch (Tok.getKind()) {  // FIXME: move this predicate somewhere common.
1607   case tok::semi:
1608   case tok::r_paren:
1609   case tok::r_square:
1610   case tok::r_brace:
1611   case tok::colon:
1612   case tok::comma:
1613     return Actions.ActOnCXXThrow(getCurScope(), ThrowLoc, nullptr);
1614
1615   default:
1616     ExprResult Expr(ParseAssignmentExpression());
1617     if (Expr.isInvalid()) return Expr;
1618     return Actions.ActOnCXXThrow(getCurScope(), ThrowLoc, Expr.get());
1619   }
1620 }
1621
1622 /// \brief Parse the C++ Coroutines co_yield expression.
1623 ///
1624 ///       co_yield-expression:
1625 ///         'co_yield' assignment-expression[opt]
1626 ExprResult Parser::ParseCoyieldExpression() {
1627   assert(Tok.is(tok::kw_co_yield) && "Not co_yield!");
1628
1629   SourceLocation Loc = ConsumeToken();
1630   ExprResult Expr = Tok.is(tok::l_brace) ? ParseBraceInitializer()
1631                                          : ParseAssignmentExpression();
1632   if (!Expr.isInvalid())
1633     Expr = Actions.ActOnCoyieldExpr(getCurScope(), Loc, Expr.get());
1634   return Expr;
1635 }
1636
1637 /// ParseCXXThis - This handles the C++ 'this' pointer.
1638 ///
1639 /// C++ 9.3.2: In the body of a non-static member function, the keyword this is
1640 /// a non-lvalue expression whose value is the address of the object for which
1641 /// the function is called.
1642 ExprResult Parser::ParseCXXThis() {
1643   assert(Tok.is(tok::kw_this) && "Not 'this'!");
1644   SourceLocation ThisLoc = ConsumeToken();
1645   return Actions.ActOnCXXThis(ThisLoc);
1646 }
1647
1648 /// ParseCXXTypeConstructExpression - Parse construction of a specified type.
1649 /// Can be interpreted either as function-style casting ("int(x)")
1650 /// or class type construction ("ClassType(x,y,z)")
1651 /// or creation of a value-initialized type ("int()").
1652 /// See [C++ 5.2.3].
1653 ///
1654 ///       postfix-expression: [C++ 5.2p1]
1655 ///         simple-type-specifier '(' expression-list[opt] ')'
1656 /// [C++0x] simple-type-specifier braced-init-list
1657 ///         typename-specifier '(' expression-list[opt] ')'
1658 /// [C++0x] typename-specifier braced-init-list
1659 ///
1660 /// In C++1z onwards, the type specifier can also be a template-name.
1661 ExprResult
1662 Parser::ParseCXXTypeConstructExpression(const DeclSpec &DS) {
1663   Declarator DeclaratorInfo(DS, DeclaratorContext::FunctionalCastContext);
1664   ParsedType TypeRep = Actions.ActOnTypeName(getCurScope(), DeclaratorInfo).get();
1665
1666   assert((Tok.is(tok::l_paren) ||
1667           (getLangOpts().CPlusPlus11 && Tok.is(tok::l_brace)))
1668          && "Expected '(' or '{'!");
1669
1670   if (Tok.is(tok::l_brace)) {
1671     ExprResult Init = ParseBraceInitializer();
1672     if (Init.isInvalid())
1673       return Init;
1674     Expr *InitList = Init.get();
1675     return Actions.ActOnCXXTypeConstructExpr(TypeRep, SourceLocation(),
1676                                              MultiExprArg(&InitList, 1),
1677                                              SourceLocation());
1678   } else {
1679     BalancedDelimiterTracker T(*this, tok::l_paren);
1680     T.consumeOpen();
1681
1682     ExprVector Exprs;
1683     CommaLocsTy CommaLocs;
1684
1685     if (Tok.isNot(tok::r_paren)) {
1686       if (ParseExpressionList(Exprs, CommaLocs, [&] {
1687             Actions.CodeCompleteConstructor(getCurScope(),
1688                                       TypeRep.get()->getCanonicalTypeInternal(),
1689                                             DS.getLocEnd(), Exprs);
1690          })) {
1691         SkipUntil(tok::r_paren, StopAtSemi);
1692         return ExprError();
1693       }
1694     }
1695
1696     // Match the ')'.
1697     T.consumeClose();
1698
1699     // TypeRep could be null, if it references an invalid typedef.
1700     if (!TypeRep)
1701       return ExprError();
1702
1703     assert((Exprs.size() == 0 || Exprs.size()-1 == CommaLocs.size())&&
1704            "Unexpected number of commas!");
1705     return Actions.ActOnCXXTypeConstructExpr(TypeRep, T.getOpenLocation(), 
1706                                              Exprs,
1707                                              T.getCloseLocation());
1708   }
1709 }
1710
1711 /// ParseCXXCondition - if/switch/while condition expression.
1712 ///
1713 ///       condition:
1714 ///         expression
1715 ///         type-specifier-seq declarator '=' assignment-expression
1716 /// [C++11] type-specifier-seq declarator '=' initializer-clause
1717 /// [C++11] type-specifier-seq declarator braced-init-list
1718 /// [Clang] type-specifier-seq ref-qualifier[opt] '[' identifier-list ']'
1719 ///             brace-or-equal-initializer
1720 /// [GNU]   type-specifier-seq declarator simple-asm-expr[opt] attributes[opt]
1721 ///             '=' assignment-expression
1722 ///
1723 /// In C++1z, a condition may in some contexts be preceded by an
1724 /// optional init-statement. This function will parse that too.
1725 ///
1726 /// \param InitStmt If non-null, an init-statement is permitted, and if present
1727 /// will be parsed and stored here.
1728 ///
1729 /// \param Loc The location of the start of the statement that requires this
1730 /// condition, e.g., the "for" in a for loop.
1731 ///
1732 /// \returns The parsed condition.
1733 Sema::ConditionResult Parser::ParseCXXCondition(StmtResult *InitStmt,
1734                                                 SourceLocation Loc,
1735                                                 Sema::ConditionKind CK) {
1736   if (Tok.is(tok::code_completion)) {
1737     Actions.CodeCompleteOrdinaryName(getCurScope(), Sema::PCC_Condition);
1738     cutOffParsing();
1739     return Sema::ConditionError();
1740   }
1741
1742   ParsedAttributesWithRange attrs(AttrFactory);
1743   MaybeParseCXX11Attributes(attrs);
1744
1745   // Determine what kind of thing we have.
1746   switch (isCXXConditionDeclarationOrInitStatement(InitStmt)) {
1747   case ConditionOrInitStatement::Expression: {
1748     ProhibitAttributes(attrs);
1749
1750     // Parse the expression.
1751     ExprResult Expr = ParseExpression(); // expression
1752     if (Expr.isInvalid())
1753       return Sema::ConditionError();
1754
1755     if (InitStmt && Tok.is(tok::semi)) {
1756       *InitStmt = Actions.ActOnExprStmt(Expr.get());
1757       ConsumeToken();
1758       return ParseCXXCondition(nullptr, Loc, CK);
1759     }
1760
1761     return Actions.ActOnCondition(getCurScope(), Loc, Expr.get(), CK);
1762   }
1763
1764   case ConditionOrInitStatement::InitStmtDecl: {
1765     Diag(Tok.getLocation(), getLangOpts().CPlusPlus17
1766                                 ? diag::warn_cxx14_compat_init_statement
1767                                 : diag::ext_init_statement)
1768         << (CK == Sema::ConditionKind::Switch);
1769     SourceLocation DeclStart = Tok.getLocation(), DeclEnd;
1770     DeclGroupPtrTy DG =
1771         ParseSimpleDeclaration(DeclaratorContext::InitStmtContext, DeclEnd,
1772                                attrs, /*RequireSemi=*/true);
1773     *InitStmt = Actions.ActOnDeclStmt(DG, DeclStart, DeclEnd);
1774     return ParseCXXCondition(nullptr, Loc, CK);
1775   }
1776
1777   case ConditionOrInitStatement::ConditionDecl:
1778   case ConditionOrInitStatement::Error:
1779     break;
1780   }
1781
1782   // type-specifier-seq
1783   DeclSpec DS(AttrFactory);
1784   DS.takeAttributesFrom(attrs);
1785   ParseSpecifierQualifierList(DS, AS_none, DeclSpecContext::DSC_condition);
1786
1787   // declarator
1788   Declarator DeclaratorInfo(DS, DeclaratorContext::ConditionContext);
1789   ParseDeclarator(DeclaratorInfo);
1790
1791   // simple-asm-expr[opt]
1792   if (Tok.is(tok::kw_asm)) {
1793     SourceLocation Loc;
1794     ExprResult AsmLabel(ParseSimpleAsm(&Loc));
1795     if (AsmLabel.isInvalid()) {
1796       SkipUntil(tok::semi, StopAtSemi);
1797       return Sema::ConditionError();
1798     }
1799     DeclaratorInfo.setAsmLabel(AsmLabel.get());
1800     DeclaratorInfo.SetRangeEnd(Loc);
1801   }
1802
1803   // If attributes are present, parse them.
1804   MaybeParseGNUAttributes(DeclaratorInfo);
1805
1806   // Type-check the declaration itself.
1807   DeclResult Dcl = Actions.ActOnCXXConditionDeclaration(getCurScope(), 
1808                                                         DeclaratorInfo);
1809   if (Dcl.isInvalid())
1810     return Sema::ConditionError();
1811   Decl *DeclOut = Dcl.get();
1812
1813   // '=' assignment-expression
1814   // If a '==' or '+=' is found, suggest a fixit to '='.
1815   bool CopyInitialization = isTokenEqualOrEqualTypo();
1816   if (CopyInitialization)
1817     ConsumeToken();
1818
1819   ExprResult InitExpr = ExprError();
1820   if (getLangOpts().CPlusPlus11 && Tok.is(tok::l_brace)) {
1821     Diag(Tok.getLocation(),
1822          diag::warn_cxx98_compat_generalized_initializer_lists);
1823     InitExpr = ParseBraceInitializer();
1824   } else if (CopyInitialization) {
1825     InitExpr = ParseAssignmentExpression();
1826   } else if (Tok.is(tok::l_paren)) {
1827     // This was probably an attempt to initialize the variable.
1828     SourceLocation LParen = ConsumeParen(), RParen = LParen;
1829     if (SkipUntil(tok::r_paren, StopAtSemi | StopBeforeMatch))
1830       RParen = ConsumeParen();
1831     Diag(DeclOut->getLocation(),
1832          diag::err_expected_init_in_condition_lparen)
1833       << SourceRange(LParen, RParen);
1834   } else {
1835     Diag(DeclOut->getLocation(), diag::err_expected_init_in_condition);
1836   }
1837
1838   if (!InitExpr.isInvalid())
1839     Actions.AddInitializerToDecl(DeclOut, InitExpr.get(), !CopyInitialization);
1840   else
1841     Actions.ActOnInitializerError(DeclOut);
1842
1843   Actions.FinalizeDeclaration(DeclOut);
1844   return Actions.ActOnConditionVariable(DeclOut, Loc, CK);
1845 }
1846
1847 /// ParseCXXSimpleTypeSpecifier - [C++ 7.1.5.2] Simple type specifiers.
1848 /// This should only be called when the current token is known to be part of
1849 /// simple-type-specifier.
1850 ///
1851 ///       simple-type-specifier:
1852 ///         '::'[opt] nested-name-specifier[opt] type-name
1853 ///         '::'[opt] nested-name-specifier 'template' simple-template-id [TODO]
1854 ///         char
1855 ///         wchar_t
1856 ///         bool
1857 ///         short
1858 ///         int
1859 ///         long
1860 ///         signed
1861 ///         unsigned
1862 ///         float
1863 ///         double
1864 ///         void
1865 /// [GNU]   typeof-specifier
1866 /// [C++0x] auto               [TODO]
1867 ///
1868 ///       type-name:
1869 ///         class-name
1870 ///         enum-name
1871 ///         typedef-name
1872 ///
1873 void Parser::ParseCXXSimpleTypeSpecifier(DeclSpec &DS) {
1874   DS.SetRangeStart(Tok.getLocation());
1875   const char *PrevSpec;
1876   unsigned DiagID;
1877   SourceLocation Loc = Tok.getLocation();
1878   const clang::PrintingPolicy &Policy =
1879       Actions.getASTContext().getPrintingPolicy();
1880
1881   switch (Tok.getKind()) {
1882   case tok::identifier:   // foo::bar
1883   case tok::coloncolon:   // ::foo::bar
1884     llvm_unreachable("Annotation token should already be formed!");
1885   default:
1886     llvm_unreachable("Not a simple-type-specifier token!");
1887
1888   // type-name
1889   case tok::annot_typename: {
1890     if (getTypeAnnotation(Tok))
1891       DS.SetTypeSpecType(DeclSpec::TST_typename, Loc, PrevSpec, DiagID,
1892                          getTypeAnnotation(Tok), Policy);
1893     else
1894       DS.SetTypeSpecError();
1895     
1896     DS.SetRangeEnd(Tok.getAnnotationEndLoc());
1897     ConsumeAnnotationToken();
1898     
1899     DS.Finish(Actions, Policy);
1900     return;
1901   }
1902
1903   // builtin types
1904   case tok::kw_short:
1905     DS.SetTypeSpecWidth(DeclSpec::TSW_short, Loc, PrevSpec, DiagID, Policy);
1906     break;
1907   case tok::kw_long:
1908     DS.SetTypeSpecWidth(DeclSpec::TSW_long, Loc, PrevSpec, DiagID, Policy);
1909     break;
1910   case tok::kw___int64:
1911     DS.SetTypeSpecWidth(DeclSpec::TSW_longlong, Loc, PrevSpec, DiagID, Policy);
1912     break;
1913   case tok::kw_signed:
1914     DS.SetTypeSpecSign(DeclSpec::TSS_signed, Loc, PrevSpec, DiagID);
1915     break;
1916   case tok::kw_unsigned:
1917     DS.SetTypeSpecSign(DeclSpec::TSS_unsigned, Loc, PrevSpec, DiagID);
1918     break;
1919   case tok::kw_void:
1920     DS.SetTypeSpecType(DeclSpec::TST_void, Loc, PrevSpec, DiagID, Policy);
1921     break;
1922   case tok::kw_char:
1923     DS.SetTypeSpecType(DeclSpec::TST_char, Loc, PrevSpec, DiagID, Policy);
1924     break;
1925   case tok::kw_int:
1926     DS.SetTypeSpecType(DeclSpec::TST_int, Loc, PrevSpec, DiagID, Policy);
1927     break;
1928   case tok::kw___int128:
1929     DS.SetTypeSpecType(DeclSpec::TST_int128, Loc, PrevSpec, DiagID, Policy);
1930     break;
1931   case tok::kw_half:
1932     DS.SetTypeSpecType(DeclSpec::TST_half, Loc, PrevSpec, DiagID, Policy);
1933     break;
1934   case tok::kw_float:
1935     DS.SetTypeSpecType(DeclSpec::TST_float, Loc, PrevSpec, DiagID, Policy);
1936     break;
1937   case tok::kw_double:
1938     DS.SetTypeSpecType(DeclSpec::TST_double, Loc, PrevSpec, DiagID, Policy);
1939     break;
1940   case tok::kw__Float16:
1941     DS.SetTypeSpecType(DeclSpec::TST_float16, Loc, PrevSpec, DiagID, Policy);
1942     break;
1943   case tok::kw___float128:
1944     DS.SetTypeSpecType(DeclSpec::TST_float128, Loc, PrevSpec, DiagID, Policy);
1945     break;
1946   case tok::kw_wchar_t:
1947     DS.SetTypeSpecType(DeclSpec::TST_wchar, Loc, PrevSpec, DiagID, Policy);
1948     break;
1949   case tok::kw_char16_t:
1950     DS.SetTypeSpecType(DeclSpec::TST_char16, Loc, PrevSpec, DiagID, Policy);
1951     break;
1952   case tok::kw_char32_t:
1953     DS.SetTypeSpecType(DeclSpec::TST_char32, Loc, PrevSpec, DiagID, Policy);
1954     break;
1955   case tok::kw_bool:
1956     DS.SetTypeSpecType(DeclSpec::TST_bool, Loc, PrevSpec, DiagID, Policy);
1957     break;
1958   case tok::annot_decltype:
1959   case tok::kw_decltype:
1960     DS.SetRangeEnd(ParseDecltypeSpecifier(DS));
1961     return DS.Finish(Actions, Policy);
1962
1963   // GNU typeof support.
1964   case tok::kw_typeof:
1965     ParseTypeofSpecifier(DS);
1966     DS.Finish(Actions, Policy);
1967     return;
1968   }
1969   ConsumeAnyToken();
1970   DS.SetRangeEnd(PrevTokLocation);
1971   DS.Finish(Actions, Policy);
1972 }
1973
1974 /// ParseCXXTypeSpecifierSeq - Parse a C++ type-specifier-seq (C++
1975 /// [dcl.name]), which is a non-empty sequence of type-specifiers,
1976 /// e.g., "const short int". Note that the DeclSpec is *not* finished
1977 /// by parsing the type-specifier-seq, because these sequences are
1978 /// typically followed by some form of declarator. Returns true and
1979 /// emits diagnostics if this is not a type-specifier-seq, false
1980 /// otherwise.
1981 ///
1982 ///   type-specifier-seq: [C++ 8.1]
1983 ///     type-specifier type-specifier-seq[opt]
1984 ///
1985 bool Parser::ParseCXXTypeSpecifierSeq(DeclSpec &DS) {
1986   ParseSpecifierQualifierList(DS, AS_none, DeclSpecContext::DSC_type_specifier);
1987   DS.Finish(Actions, Actions.getASTContext().getPrintingPolicy());
1988   return false;
1989 }
1990
1991 /// \brief Finish parsing a C++ unqualified-id that is a template-id of
1992 /// some form. 
1993 ///
1994 /// This routine is invoked when a '<' is encountered after an identifier or
1995 /// operator-function-id is parsed by \c ParseUnqualifiedId() to determine
1996 /// whether the unqualified-id is actually a template-id. This routine will
1997 /// then parse the template arguments and form the appropriate template-id to
1998 /// return to the caller.
1999 ///
2000 /// \param SS the nested-name-specifier that precedes this template-id, if
2001 /// we're actually parsing a qualified-id.
2002 ///
2003 /// \param Name for constructor and destructor names, this is the actual
2004 /// identifier that may be a template-name.
2005 ///
2006 /// \param NameLoc the location of the class-name in a constructor or 
2007 /// destructor.
2008 ///
2009 /// \param EnteringContext whether we're entering the scope of the 
2010 /// nested-name-specifier.
2011 ///
2012 /// \param ObjectType if this unqualified-id occurs within a member access
2013 /// expression, the type of the base object whose member is being accessed.
2014 ///
2015 /// \param Id as input, describes the template-name or operator-function-id
2016 /// that precedes the '<'. If template arguments were parsed successfully,
2017 /// will be updated with the template-id.
2018 /// 
2019 /// \param AssumeTemplateId When true, this routine will assume that the name
2020 /// refers to a template without performing name lookup to verify. 
2021 ///
2022 /// \returns true if a parse error occurred, false otherwise.
2023 bool Parser::ParseUnqualifiedIdTemplateId(CXXScopeSpec &SS,
2024                                           SourceLocation TemplateKWLoc,
2025                                           IdentifierInfo *Name,
2026                                           SourceLocation NameLoc,
2027                                           bool EnteringContext,
2028                                           ParsedType ObjectType,
2029                                           UnqualifiedId &Id,
2030                                           bool AssumeTemplateId) {
2031   assert((AssumeTemplateId || Tok.is(tok::less)) &&
2032          "Expected '<' to finish parsing a template-id");
2033   
2034   TemplateTy Template;
2035   TemplateNameKind TNK = TNK_Non_template;
2036   switch (Id.getKind()) {
2037   case UnqualifiedIdKind::IK_Identifier:
2038   case UnqualifiedIdKind::IK_OperatorFunctionId:
2039   case UnqualifiedIdKind::IK_LiteralOperatorId:
2040     if (AssumeTemplateId) {
2041       // We defer the injected-class-name checks until we've found whether
2042       // this template-id is used to form a nested-name-specifier or not.
2043       TNK = Actions.ActOnDependentTemplateName(
2044           getCurScope(), SS, TemplateKWLoc, Id, ObjectType, EnteringContext,
2045           Template, /*AllowInjectedClassName*/ true);
2046       if (TNK == TNK_Non_template)
2047         return true;
2048     } else {
2049       bool MemberOfUnknownSpecialization;
2050       TNK = Actions.isTemplateName(getCurScope(), SS,
2051                                    TemplateKWLoc.isValid(), Id,
2052                                    ObjectType, EnteringContext, Template,
2053                                    MemberOfUnknownSpecialization);
2054       
2055       if (TNK == TNK_Non_template && MemberOfUnknownSpecialization &&
2056           ObjectType && IsTemplateArgumentList()) {
2057         // We have something like t->getAs<T>(), where getAs is a 
2058         // member of an unknown specialization. However, this will only
2059         // parse correctly as a template, so suggest the keyword 'template'
2060         // before 'getAs' and treat this as a dependent template name.
2061         std::string Name;
2062         if (Id.getKind() == UnqualifiedIdKind::IK_Identifier)
2063           Name = Id.Identifier->getName();
2064         else {
2065           Name = "operator ";
2066           if (Id.getKind() == UnqualifiedIdKind::IK_OperatorFunctionId)
2067             Name += getOperatorSpelling(Id.OperatorFunctionId.Operator);
2068           else
2069             Name += Id.Identifier->getName();
2070         }
2071         Diag(Id.StartLocation, diag::err_missing_dependent_template_keyword)
2072           << Name
2073           << FixItHint::CreateInsertion(Id.StartLocation, "template ");
2074         TNK = Actions.ActOnDependentTemplateName(
2075             getCurScope(), SS, TemplateKWLoc, Id, ObjectType, EnteringContext,
2076             Template, /*AllowInjectedClassName*/ true);
2077         if (TNK == TNK_Non_template)
2078           return true;              
2079       }
2080     }
2081     break;
2082       
2083   case UnqualifiedIdKind::IK_ConstructorName: {
2084     UnqualifiedId TemplateName;
2085     bool MemberOfUnknownSpecialization;
2086     TemplateName.setIdentifier(Name, NameLoc);
2087     TNK = Actions.isTemplateName(getCurScope(), SS, TemplateKWLoc.isValid(),
2088                                  TemplateName, ObjectType, 
2089                                  EnteringContext, Template,
2090                                  MemberOfUnknownSpecialization);
2091     break;
2092   }
2093       
2094   case UnqualifiedIdKind::IK_DestructorName: {
2095     UnqualifiedId TemplateName;
2096     bool MemberOfUnknownSpecialization;
2097     TemplateName.setIdentifier(Name, NameLoc);
2098     if (ObjectType) {
2099       TNK = Actions.ActOnDependentTemplateName(
2100           getCurScope(), SS, TemplateKWLoc, TemplateName, ObjectType,
2101           EnteringContext, Template, /*AllowInjectedClassName*/ true);
2102       if (TNK == TNK_Non_template)
2103         return true;
2104     } else {
2105       TNK = Actions.isTemplateName(getCurScope(), SS, TemplateKWLoc.isValid(),
2106                                    TemplateName, ObjectType, 
2107                                    EnteringContext, Template,
2108                                    MemberOfUnknownSpecialization);
2109       
2110       if (TNK == TNK_Non_template && !Id.DestructorName.get()) {
2111         Diag(NameLoc, diag::err_destructor_template_id)
2112           << Name << SS.getRange();
2113         return true;        
2114       }
2115     }
2116     break;
2117   }
2118       
2119   default:
2120     return false;
2121   }
2122   
2123   if (TNK == TNK_Non_template)
2124     return false;
2125   
2126   // Parse the enclosed template argument list.
2127   SourceLocation LAngleLoc, RAngleLoc;
2128   TemplateArgList TemplateArgs;
2129   if (Tok.is(tok::less) && ParseTemplateIdAfterTemplateName(
2130                                true, LAngleLoc, TemplateArgs, RAngleLoc))
2131     return true;
2132   
2133   if (Id.getKind() == UnqualifiedIdKind::IK_Identifier ||
2134       Id.getKind() == UnqualifiedIdKind::IK_OperatorFunctionId ||
2135       Id.getKind() == UnqualifiedIdKind::IK_LiteralOperatorId) {
2136     // Form a parsed representation of the template-id to be stored in the
2137     // UnqualifiedId.
2138
2139     // FIXME: Store name for literal operator too.
2140     IdentifierInfo *TemplateII =
2141         Id.getKind() == UnqualifiedIdKind::IK_Identifier ? Id.Identifier
2142                                                          : nullptr;
2143     OverloadedOperatorKind OpKind =
2144         Id.getKind() == UnqualifiedIdKind::IK_Identifier
2145             ? OO_None
2146             : Id.OperatorFunctionId.Operator;
2147
2148     TemplateIdAnnotation *TemplateId = TemplateIdAnnotation::Create(
2149         SS, TemplateKWLoc, Id.StartLocation, TemplateII, OpKind, Template, TNK,
2150         LAngleLoc, RAngleLoc, TemplateArgs, TemplateIds);
2151
2152     Id.setTemplateId(TemplateId);
2153     return false;
2154   }
2155
2156   // Bundle the template arguments together.
2157   ASTTemplateArgsPtr TemplateArgsPtr(TemplateArgs);
2158
2159   // Constructor and destructor names.
2160   TypeResult Type
2161     = Actions.ActOnTemplateIdType(SS, TemplateKWLoc,
2162                                   Template, Name, NameLoc,
2163                                   LAngleLoc, TemplateArgsPtr, RAngleLoc,
2164                                   /*IsCtorOrDtorName=*/true);
2165   if (Type.isInvalid())
2166     return true;
2167   
2168   if (Id.getKind() == UnqualifiedIdKind::IK_ConstructorName)
2169     Id.setConstructorName(Type.get(), NameLoc, RAngleLoc);
2170   else
2171     Id.setDestructorName(Id.StartLocation, Type.get(), RAngleLoc);
2172   
2173   return false;
2174 }
2175
2176 /// \brief Parse an operator-function-id or conversion-function-id as part
2177 /// of a C++ unqualified-id.
2178 ///
2179 /// This routine is responsible only for parsing the operator-function-id or
2180 /// conversion-function-id; it does not handle template arguments in any way.
2181 ///
2182 /// \code
2183 ///       operator-function-id: [C++ 13.5]
2184 ///         'operator' operator
2185 ///
2186 ///       operator: one of
2187 ///            new   delete  new[]   delete[]
2188 ///            +     -    *  /    %  ^    &   |   ~
2189 ///            !     =    <  >    += -=   *=  /=  %=
2190 ///            ^=    &=   |= <<   >> >>= <<=  ==  !=
2191 ///            <=    >=   && ||   ++ --   ,   ->* ->
2192 ///            ()    []   <=>
2193 ///
2194 ///       conversion-function-id: [C++ 12.3.2]
2195 ///         operator conversion-type-id
2196 ///
2197 ///       conversion-type-id:
2198 ///         type-specifier-seq conversion-declarator[opt]
2199 ///
2200 ///       conversion-declarator:
2201 ///         ptr-operator conversion-declarator[opt]
2202 /// \endcode
2203 ///
2204 /// \param SS The nested-name-specifier that preceded this unqualified-id. If
2205 /// non-empty, then we are parsing the unqualified-id of a qualified-id.
2206 ///
2207 /// \param EnteringContext whether we are entering the scope of the 
2208 /// nested-name-specifier.
2209 ///
2210 /// \param ObjectType if this unqualified-id occurs within a member access
2211 /// expression, the type of the base object whose member is being accessed.
2212 ///
2213 /// \param Result on a successful parse, contains the parsed unqualified-id.
2214 ///
2215 /// \returns true if parsing fails, false otherwise.
2216 bool Parser::ParseUnqualifiedIdOperator(CXXScopeSpec &SS, bool EnteringContext,
2217                                         ParsedType ObjectType,
2218                                         UnqualifiedId &Result) {
2219   assert(Tok.is(tok::kw_operator) && "Expected 'operator' keyword");
2220   
2221   // Consume the 'operator' keyword.
2222   SourceLocation KeywordLoc = ConsumeToken();
2223   
2224   // Determine what kind of operator name we have.
2225   unsigned SymbolIdx = 0;
2226   SourceLocation SymbolLocations[3];
2227   OverloadedOperatorKind Op = OO_None;
2228   switch (Tok.getKind()) {
2229     case tok::kw_new:
2230     case tok::kw_delete: {
2231       bool isNew = Tok.getKind() == tok::kw_new;
2232       // Consume the 'new' or 'delete'.
2233       SymbolLocations[SymbolIdx++] = ConsumeToken();
2234       // Check for array new/delete.
2235       if (Tok.is(tok::l_square) &&
2236           (!getLangOpts().CPlusPlus11 || NextToken().isNot(tok::l_square))) {
2237         // Consume the '[' and ']'.
2238         BalancedDelimiterTracker T(*this, tok::l_square);
2239         T.consumeOpen();
2240         T.consumeClose();
2241         if (T.getCloseLocation().isInvalid())
2242           return true;
2243         
2244         SymbolLocations[SymbolIdx++] = T.getOpenLocation();
2245         SymbolLocations[SymbolIdx++] = T.getCloseLocation();
2246         Op = isNew? OO_Array_New : OO_Array_Delete;
2247       } else {
2248         Op = isNew? OO_New : OO_Delete;
2249       }
2250       break;
2251     }
2252       
2253 #define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \
2254     case tok::Token:                                                     \
2255       SymbolLocations[SymbolIdx++] = ConsumeToken();                     \
2256       Op = OO_##Name;                                                    \
2257       break;
2258 #define OVERLOADED_OPERATOR_MULTI(Name,Spelling,Unary,Binary,MemberOnly)
2259 #include "clang/Basic/OperatorKinds.def"
2260       
2261     case tok::l_paren: {
2262       // Consume the '(' and ')'.
2263       BalancedDelimiterTracker T(*this, tok::l_paren);
2264       T.consumeOpen();
2265       T.consumeClose();
2266       if (T.getCloseLocation().isInvalid())
2267         return true;
2268       
2269       SymbolLocations[SymbolIdx++] = T.getOpenLocation();
2270       SymbolLocations[SymbolIdx++] = T.getCloseLocation();
2271       Op = OO_Call;
2272       break;
2273     }
2274       
2275     case tok::l_square: {
2276       // Consume the '[' and ']'.
2277       BalancedDelimiterTracker T(*this, tok::l_square);
2278       T.consumeOpen();
2279       T.consumeClose();
2280       if (T.getCloseLocation().isInvalid())
2281         return true;
2282       
2283       SymbolLocations[SymbolIdx++] = T.getOpenLocation();
2284       SymbolLocations[SymbolIdx++] = T.getCloseLocation();
2285       Op = OO_Subscript;
2286       break;
2287     }
2288       
2289     case tok::code_completion: {
2290       // Code completion for the operator name.
2291       Actions.CodeCompleteOperatorName(getCurScope());
2292       cutOffParsing();      
2293       // Don't try to parse any further.
2294       return true;
2295     }
2296       
2297     default:
2298       break;
2299   }
2300   
2301   if (Op != OO_None) {
2302     // We have parsed an operator-function-id.
2303     Result.setOperatorFunctionId(KeywordLoc, Op, SymbolLocations);
2304     return false;
2305   }
2306
2307   // Parse a literal-operator-id.
2308   //
2309   //   literal-operator-id: C++11 [over.literal]
2310   //     operator string-literal identifier
2311   //     operator user-defined-string-literal
2312
2313   if (getLangOpts().CPlusPlus11 && isTokenStringLiteral()) {
2314     Diag(Tok.getLocation(), diag::warn_cxx98_compat_literal_operator);
2315
2316     SourceLocation DiagLoc;
2317     unsigned DiagId = 0;
2318
2319     // We're past translation phase 6, so perform string literal concatenation
2320     // before checking for "".
2321     SmallVector<Token, 4> Toks;
2322     SmallVector<SourceLocation, 4> TokLocs;
2323     while (isTokenStringLiteral()) {
2324       if (!Tok.is(tok::string_literal) && !DiagId) {
2325         // C++11 [over.literal]p1:
2326         //   The string-literal or user-defined-string-literal in a
2327         //   literal-operator-id shall have no encoding-prefix [...].
2328         DiagLoc = Tok.getLocation();
2329         DiagId = diag::err_literal_operator_string_prefix;
2330       }
2331       Toks.push_back(Tok);
2332       TokLocs.push_back(ConsumeStringToken());
2333     }
2334
2335     StringLiteralParser Literal(Toks, PP);
2336     if (Literal.hadError)
2337       return true;
2338
2339     // Grab the literal operator's suffix, which will be either the next token
2340     // or a ud-suffix from the string literal.
2341     IdentifierInfo *II = nullptr;
2342     SourceLocation SuffixLoc;
2343     if (!Literal.getUDSuffix().empty()) {
2344       II = &PP.getIdentifierTable().get(Literal.getUDSuffix());
2345       SuffixLoc =
2346         Lexer::AdvanceToTokenCharacter(TokLocs[Literal.getUDSuffixToken()],
2347                                        Literal.getUDSuffixOffset(),
2348                                        PP.getSourceManager(), getLangOpts());
2349     } else if (Tok.is(tok::identifier)) {
2350       II = Tok.getIdentifierInfo();
2351       SuffixLoc = ConsumeToken();
2352       TokLocs.push_back(SuffixLoc);
2353     } else {
2354       Diag(Tok.getLocation(), diag::err_expected) << tok::identifier;
2355       return true;
2356     }
2357
2358     // The string literal must be empty.
2359     if (!Literal.GetString().empty() || Literal.Pascal) {
2360       // C++11 [over.literal]p1:
2361       //   The string-literal or user-defined-string-literal in a
2362       //   literal-operator-id shall [...] contain no characters
2363       //   other than the implicit terminating '\0'.
2364       DiagLoc = TokLocs.front();
2365       DiagId = diag::err_literal_operator_string_not_empty;
2366     }
2367
2368     if (DiagId) {
2369       // This isn't a valid literal-operator-id, but we think we know
2370       // what the user meant. Tell them what they should have written.
2371       SmallString<32> Str;
2372       Str += "\"\"";
2373       Str += II->getName();
2374       Diag(DiagLoc, DiagId) << FixItHint::CreateReplacement(
2375           SourceRange(TokLocs.front(), TokLocs.back()), Str);
2376     }
2377
2378     Result.setLiteralOperatorId(II, KeywordLoc, SuffixLoc);
2379
2380     return Actions.checkLiteralOperatorId(SS, Result);
2381   }
2382
2383   // Parse a conversion-function-id.
2384   //
2385   //   conversion-function-id: [C++ 12.3.2]
2386   //     operator conversion-type-id
2387   //
2388   //   conversion-type-id:
2389   //     type-specifier-seq conversion-declarator[opt]
2390   //
2391   //   conversion-declarator:
2392   //     ptr-operator conversion-declarator[opt]
2393   
2394   // Parse the type-specifier-seq.
2395   DeclSpec DS(AttrFactory);
2396   if (ParseCXXTypeSpecifierSeq(DS)) // FIXME: ObjectType?
2397     return true;
2398   
2399   // Parse the conversion-declarator, which is merely a sequence of
2400   // ptr-operators.
2401   Declarator D(DS, DeclaratorContext::ConversionIdContext);
2402   ParseDeclaratorInternal(D, /*DirectDeclParser=*/nullptr);
2403
2404   // Finish up the type.
2405   TypeResult Ty = Actions.ActOnTypeName(getCurScope(), D);
2406   if (Ty.isInvalid())
2407     return true;
2408   
2409   // Note that this is a conversion-function-id.
2410   Result.setConversionFunctionId(KeywordLoc, Ty.get(), 
2411                                  D.getSourceRange().getEnd());
2412   return false;  
2413 }
2414
2415 /// \brief Parse a C++ unqualified-id (or a C identifier), which describes the
2416 /// name of an entity.
2417 ///
2418 /// \code
2419 ///       unqualified-id: [C++ expr.prim.general]
2420 ///         identifier
2421 ///         operator-function-id
2422 ///         conversion-function-id
2423 /// [C++0x] literal-operator-id [TODO]
2424 ///         ~ class-name
2425 ///         template-id
2426 ///
2427 /// \endcode
2428 ///
2429 /// \param SS The nested-name-specifier that preceded this unqualified-id. If
2430 /// non-empty, then we are parsing the unqualified-id of a qualified-id.
2431 ///
2432 /// \param EnteringContext whether we are entering the scope of the 
2433 /// nested-name-specifier.
2434 ///
2435 /// \param AllowDestructorName whether we allow parsing of a destructor name.
2436 ///
2437 /// \param AllowConstructorName whether we allow parsing a constructor name.
2438 ///
2439 /// \param AllowDeductionGuide whether we allow parsing a deduction guide name.
2440 ///
2441 /// \param ObjectType if this unqualified-id occurs within a member access
2442 /// expression, the type of the base object whose member is being accessed.
2443 ///
2444 /// \param Result on a successful parse, contains the parsed unqualified-id.
2445 ///
2446 /// \returns true if parsing fails, false otherwise.
2447 bool Parser::ParseUnqualifiedId(CXXScopeSpec &SS, bool EnteringContext,
2448                                 bool AllowDestructorName,
2449                                 bool AllowConstructorName,
2450                                 bool AllowDeductionGuide,
2451                                 ParsedType ObjectType,
2452                                 SourceLocation& TemplateKWLoc,
2453                                 UnqualifiedId &Result) {
2454
2455   // Handle 'A::template B'. This is for template-ids which have not
2456   // already been annotated by ParseOptionalCXXScopeSpecifier().
2457   bool TemplateSpecified = false;
2458   if (getLangOpts().CPlusPlus && Tok.is(tok::kw_template) &&
2459       (ObjectType || SS.isSet())) {
2460     TemplateSpecified = true;
2461     TemplateKWLoc = ConsumeToken();
2462   }
2463
2464   // unqualified-id:
2465   //   identifier
2466   //   template-id (when it hasn't already been annotated)
2467   if (Tok.is(tok::identifier)) {
2468     // Consume the identifier.
2469     IdentifierInfo *Id = Tok.getIdentifierInfo();
2470     SourceLocation IdLoc = ConsumeToken();
2471
2472     if (!getLangOpts().CPlusPlus) {
2473       // If we're not in C++, only identifiers matter. Record the
2474       // identifier and return.
2475       Result.setIdentifier(Id, IdLoc);
2476       return false;
2477     }
2478
2479     ParsedTemplateTy TemplateName;
2480     if (AllowConstructorName && 
2481         Actions.isCurrentClassName(*Id, getCurScope(), &SS)) {
2482       // We have parsed a constructor name.
2483       ParsedType Ty = Actions.getTypeName(*Id, IdLoc, getCurScope(), &SS, false,
2484                                           false, nullptr,
2485                                           /*IsCtorOrDtorName=*/true,
2486                                           /*NonTrivialTypeSourceInfo=*/true);
2487       Result.setConstructorName(Ty, IdLoc, IdLoc);
2488     } else if (getLangOpts().CPlusPlus17 &&
2489                AllowDeductionGuide && SS.isEmpty() &&
2490                Actions.isDeductionGuideName(getCurScope(), *Id, IdLoc,
2491                                             &TemplateName)) {
2492       // We have parsed a template-name naming a deduction guide.
2493       Result.setDeductionGuideName(TemplateName, IdLoc);
2494     } else {
2495       // We have parsed an identifier.
2496       Result.setIdentifier(Id, IdLoc);      
2497     }
2498
2499     // If the next token is a '<', we may have a template.
2500     if (TemplateSpecified || Tok.is(tok::less))
2501       return ParseUnqualifiedIdTemplateId(SS, TemplateKWLoc, Id, IdLoc,
2502                                           EnteringContext, ObjectType,
2503                                           Result, TemplateSpecified);
2504     
2505     return false;
2506   }
2507   
2508   // unqualified-id:
2509   //   template-id (already parsed and annotated)
2510   if (Tok.is(tok::annot_template_id)) {
2511     TemplateIdAnnotation *TemplateId = takeTemplateIdAnnotation(Tok);
2512
2513     // If the template-name names the current class, then this is a constructor 
2514     if (AllowConstructorName && TemplateId->Name &&
2515         Actions.isCurrentClassName(*TemplateId->Name, getCurScope(), &SS)) {
2516       if (SS.isSet()) {
2517         // C++ [class.qual]p2 specifies that a qualified template-name
2518         // is taken as the constructor name where a constructor can be
2519         // declared. Thus, the template arguments are extraneous, so
2520         // complain about them and remove them entirely.
2521         Diag(TemplateId->TemplateNameLoc, 
2522              diag::err_out_of_line_constructor_template_id)
2523           << TemplateId->Name
2524           << FixItHint::CreateRemoval(
2525                     SourceRange(TemplateId->LAngleLoc, TemplateId->RAngleLoc));
2526         ParsedType Ty =
2527             Actions.getTypeName(*TemplateId->Name, TemplateId->TemplateNameLoc,
2528                                 getCurScope(), &SS, false, false, nullptr,
2529                                 /*IsCtorOrDtorName=*/true,
2530                                 /*NontrivialTypeSourceInfo=*/true);
2531         Result.setConstructorName(Ty, TemplateId->TemplateNameLoc,
2532                                   TemplateId->RAngleLoc);
2533         ConsumeAnnotationToken();
2534         return false;
2535       }
2536
2537       Result.setConstructorTemplateId(TemplateId);
2538       ConsumeAnnotationToken();
2539       return false;
2540     }
2541
2542     // We have already parsed a template-id; consume the annotation token as
2543     // our unqualified-id.
2544     Result.setTemplateId(TemplateId);
2545     TemplateKWLoc = TemplateId->TemplateKWLoc;
2546     ConsumeAnnotationToken();
2547     return false;
2548   }
2549   
2550   // unqualified-id:
2551   //   operator-function-id
2552   //   conversion-function-id
2553   if (Tok.is(tok::kw_operator)) {
2554     if (ParseUnqualifiedIdOperator(SS, EnteringContext, ObjectType, Result))
2555       return true;
2556     
2557     // If we have an operator-function-id or a literal-operator-id and the next
2558     // token is a '<', we may have a
2559     // 
2560     //   template-id:
2561     //     operator-function-id < template-argument-list[opt] >
2562     if ((Result.getKind() == UnqualifiedIdKind::IK_OperatorFunctionId ||
2563          Result.getKind() == UnqualifiedIdKind::IK_LiteralOperatorId) &&
2564         (TemplateSpecified || Tok.is(tok::less)))
2565       return ParseUnqualifiedIdTemplateId(SS, TemplateKWLoc,
2566                                           nullptr, SourceLocation(),
2567                                           EnteringContext, ObjectType,
2568                                           Result, TemplateSpecified);
2569
2570     return false;
2571   }
2572   
2573   if (getLangOpts().CPlusPlus && 
2574       (AllowDestructorName || SS.isSet()) && Tok.is(tok::tilde)) {
2575     // C++ [expr.unary.op]p10:
2576     //   There is an ambiguity in the unary-expression ~X(), where X is a 
2577     //   class-name. The ambiguity is resolved in favor of treating ~ as a 
2578     //    unary complement rather than treating ~X as referring to a destructor.
2579     
2580     // Parse the '~'.
2581     SourceLocation TildeLoc = ConsumeToken();
2582
2583     if (SS.isEmpty() && Tok.is(tok::kw_decltype)) {
2584       DeclSpec DS(AttrFactory);
2585       SourceLocation EndLoc = ParseDecltypeSpecifier(DS);
2586       if (ParsedType Type =
2587               Actions.getDestructorTypeForDecltype(DS, ObjectType)) {
2588         Result.setDestructorName(TildeLoc, Type, EndLoc);
2589         return false;
2590       }
2591       return true;
2592     }
2593     
2594     // Parse the class-name.
2595     if (Tok.isNot(tok::identifier)) {
2596       Diag(Tok, diag::err_destructor_tilde_identifier);
2597       return true;
2598     }
2599
2600     // If the user wrote ~T::T, correct it to T::~T.
2601     DeclaratorScopeObj DeclScopeObj(*this, SS);
2602     if (!TemplateSpecified && NextToken().is(tok::coloncolon)) {
2603       // Don't let ParseOptionalCXXScopeSpecifier() "correct"
2604       // `int A; struct { ~A::A(); };` to `int A; struct { ~A:A(); };`,
2605       // it will confuse this recovery logic.
2606       ColonProtectionRAIIObject ColonRAII(*this, false);
2607
2608       if (SS.isSet()) {
2609         AnnotateScopeToken(SS, /*NewAnnotation*/true);
2610         SS.clear();
2611       }
2612       if (ParseOptionalCXXScopeSpecifier(SS, ObjectType, EnteringContext))
2613         return true;
2614       if (SS.isNotEmpty())
2615         ObjectType = nullptr;
2616       if (Tok.isNot(tok::identifier) || NextToken().is(tok::coloncolon) ||
2617           !SS.isSet()) {
2618         Diag(TildeLoc, diag::err_destructor_tilde_scope);
2619         return true;
2620       }
2621
2622       // Recover as if the tilde had been written before the identifier.
2623       Diag(TildeLoc, diag::err_destructor_tilde_scope)
2624         << FixItHint::CreateRemoval(TildeLoc)
2625         << FixItHint::CreateInsertion(Tok.getLocation(), "~");
2626
2627       // Temporarily enter the scope for the rest of this function.
2628       if (Actions.ShouldEnterDeclaratorScope(getCurScope(), SS))
2629         DeclScopeObj.EnterDeclaratorScope();
2630     }
2631
2632     // Parse the class-name (or template-name in a simple-template-id).
2633     IdentifierInfo *ClassName = Tok.getIdentifierInfo();
2634     SourceLocation ClassNameLoc = ConsumeToken();
2635
2636     if (TemplateSpecified || Tok.is(tok::less)) {
2637       Result.setDestructorName(TildeLoc, nullptr, ClassNameLoc);
2638       return ParseUnqualifiedIdTemplateId(SS, TemplateKWLoc,
2639                                           ClassName, ClassNameLoc,
2640                                           EnteringContext, ObjectType,
2641                                           Result, TemplateSpecified);
2642     }
2643
2644     // Note that this is a destructor name.
2645     ParsedType Ty = Actions.getDestructorName(TildeLoc, *ClassName, 
2646                                               ClassNameLoc, getCurScope(),
2647                                               SS, ObjectType,
2648                                               EnteringContext);
2649     if (!Ty)
2650       return true;
2651
2652     Result.setDestructorName(TildeLoc, Ty, ClassNameLoc);
2653     return false;
2654   }
2655   
2656   Diag(Tok, diag::err_expected_unqualified_id)
2657     << getLangOpts().CPlusPlus;
2658   return true;
2659 }
2660
2661 /// ParseCXXNewExpression - Parse a C++ new-expression. New is used to allocate
2662 /// memory in a typesafe manner and call constructors.
2663 ///
2664 /// This method is called to parse the new expression after the optional :: has
2665 /// been already parsed.  If the :: was present, "UseGlobal" is true and "Start"
2666 /// is its location.  Otherwise, "Start" is the location of the 'new' token.
2667 ///
2668 ///        new-expression:
2669 ///                   '::'[opt] 'new' new-placement[opt] new-type-id
2670 ///                                     new-initializer[opt]
2671 ///                   '::'[opt] 'new' new-placement[opt] '(' type-id ')'
2672 ///                                     new-initializer[opt]
2673 ///
2674 ///        new-placement:
2675 ///                   '(' expression-list ')'
2676 ///
2677 ///        new-type-id:
2678 ///                   type-specifier-seq new-declarator[opt]
2679 /// [GNU]             attributes type-specifier-seq new-declarator[opt]
2680 ///
2681 ///        new-declarator:
2682 ///                   ptr-operator new-declarator[opt]
2683 ///                   direct-new-declarator
2684 ///
2685 ///        new-initializer:
2686 ///                   '(' expression-list[opt] ')'
2687 /// [C++0x]           braced-init-list
2688 ///
2689 ExprResult
2690 Parser::ParseCXXNewExpression(bool UseGlobal, SourceLocation Start) {
2691   assert(Tok.is(tok::kw_new) && "expected 'new' token");
2692   ConsumeToken();   // Consume 'new'
2693
2694   // A '(' now can be a new-placement or the '(' wrapping the type-id in the
2695   // second form of new-expression. It can't be a new-type-id.
2696
2697   ExprVector PlacementArgs;
2698   SourceLocation PlacementLParen, PlacementRParen;
2699
2700   SourceRange TypeIdParens;
2701   DeclSpec DS(AttrFactory);
2702   Declarator DeclaratorInfo(DS, DeclaratorContext::CXXNewContext);
2703   if (Tok.is(tok::l_paren)) {
2704     // If it turns out to be a placement, we change the type location.
2705     BalancedDelimiterTracker T(*this, tok::l_paren);
2706     T.consumeOpen();
2707     PlacementLParen = T.getOpenLocation();
2708     if (ParseExpressionListOrTypeId(PlacementArgs, DeclaratorInfo)) {
2709       SkipUntil(tok::semi, StopAtSemi | StopBeforeMatch);
2710       return ExprError();
2711     }
2712
2713     T.consumeClose();
2714     PlacementRParen = T.getCloseLocation();
2715     if (PlacementRParen.isInvalid()) {
2716       SkipUntil(tok::semi, StopAtSemi | StopBeforeMatch);
2717       return ExprError();
2718     }
2719
2720     if (PlacementArgs.empty()) {
2721       // Reset the placement locations. There was no placement.
2722       TypeIdParens = T.getRange();
2723       PlacementLParen = PlacementRParen = SourceLocation();
2724     } else {
2725       // We still need the type.
2726       if (Tok.is(tok::l_paren)) {
2727         BalancedDelimiterTracker T(*this, tok::l_paren);
2728         T.consumeOpen();
2729         MaybeParseGNUAttributes(DeclaratorInfo);
2730         ParseSpecifierQualifierList(DS);
2731         DeclaratorInfo.SetSourceRange(DS.getSourceRange());
2732         ParseDeclarator(DeclaratorInfo);
2733         T.consumeClose();
2734         TypeIdParens = T.getRange();
2735       } else {
2736         MaybeParseGNUAttributes(DeclaratorInfo);
2737         if (ParseCXXTypeSpecifierSeq(DS))
2738           DeclaratorInfo.setInvalidType(true);
2739         else {
2740           DeclaratorInfo.SetSourceRange(DS.getSourceRange());
2741           ParseDeclaratorInternal(DeclaratorInfo,
2742                                   &Parser::ParseDirectNewDeclarator);
2743         }
2744       }
2745     }
2746   } else {
2747     // A new-type-id is a simplified type-id, where essentially the
2748     // direct-declarator is replaced by a direct-new-declarator.
2749     MaybeParseGNUAttributes(DeclaratorInfo);
2750     if (ParseCXXTypeSpecifierSeq(DS))
2751       DeclaratorInfo.setInvalidType(true);
2752     else {
2753       DeclaratorInfo.SetSourceRange(DS.getSourceRange());
2754       ParseDeclaratorInternal(DeclaratorInfo,
2755                               &Parser::ParseDirectNewDeclarator);
2756     }
2757   }
2758   if (DeclaratorInfo.isInvalidType()) {
2759     SkipUntil(tok::semi, StopAtSemi | StopBeforeMatch);
2760     return ExprError();
2761   }
2762
2763   ExprResult Initializer;
2764
2765   if (Tok.is(tok::l_paren)) {
2766     SourceLocation ConstructorLParen, ConstructorRParen;
2767     ExprVector ConstructorArgs;
2768     BalancedDelimiterTracker T(*this, tok::l_paren);
2769     T.consumeOpen();
2770     ConstructorLParen = T.getOpenLocation();
2771     if (Tok.isNot(tok::r_paren)) {
2772       CommaLocsTy CommaLocs;
2773       if (ParseExpressionList(ConstructorArgs, CommaLocs, [&] {
2774             ParsedType TypeRep = Actions.ActOnTypeName(getCurScope(),
2775                                                        DeclaratorInfo).get();
2776             Actions.CodeCompleteConstructor(getCurScope(),
2777                                       TypeRep.get()->getCanonicalTypeInternal(),
2778                                             DeclaratorInfo.getLocEnd(),
2779                                             ConstructorArgs);
2780       })) {
2781         SkipUntil(tok::semi, StopAtSemi | StopBeforeMatch);
2782         return ExprError();
2783       }
2784     }
2785     T.consumeClose();
2786     ConstructorRParen = T.getCloseLocation();
2787     if (ConstructorRParen.isInvalid()) {
2788       SkipUntil(tok::semi, StopAtSemi | StopBeforeMatch);
2789       return ExprError();
2790     }
2791     Initializer = Actions.ActOnParenListExpr(ConstructorLParen,
2792                                              ConstructorRParen,
2793                                              ConstructorArgs);
2794   } else if (Tok.is(tok::l_brace) && getLangOpts().CPlusPlus11) {
2795     Diag(Tok.getLocation(),
2796          diag::warn_cxx98_compat_generalized_initializer_lists);
2797     Initializer = ParseBraceInitializer();
2798   }
2799   if (Initializer.isInvalid())
2800     return Initializer;
2801
2802   return Actions.ActOnCXXNew(Start, UseGlobal, PlacementLParen,
2803                              PlacementArgs, PlacementRParen,
2804                              TypeIdParens, DeclaratorInfo, Initializer.get());
2805 }
2806
2807 /// ParseDirectNewDeclarator - Parses a direct-new-declarator. Intended to be
2808 /// passed to ParseDeclaratorInternal.
2809 ///
2810 ///        direct-new-declarator:
2811 ///                   '[' expression ']'
2812 ///                   direct-new-declarator '[' constant-expression ']'
2813 ///
2814 void Parser::ParseDirectNewDeclarator(Declarator &D) {
2815   // Parse the array dimensions.
2816   bool first = true;
2817   while (Tok.is(tok::l_square)) {
2818     // An array-size expression can't start with a lambda.
2819     if (CheckProhibitedCXX11Attribute())
2820       continue;
2821
2822     BalancedDelimiterTracker T(*this, tok::l_square);
2823     T.consumeOpen();
2824
2825     ExprResult Size(first ? ParseExpression()
2826                                 : ParseConstantExpression());
2827     if (Size.isInvalid()) {
2828       // Recover
2829       SkipUntil(tok::r_square, StopAtSemi);
2830       return;
2831     }
2832     first = false;
2833
2834     T.consumeClose();
2835
2836     // Attributes here appertain to the array type. C++11 [expr.new]p5.
2837     ParsedAttributes Attrs(AttrFactory);
2838     MaybeParseCXX11Attributes(Attrs);
2839
2840     D.AddTypeInfo(DeclaratorChunk::getArray(0,
2841                                             /*static=*/false, /*star=*/false,
2842                                             Size.get(),
2843                                             T.getOpenLocation(),
2844                                             T.getCloseLocation()),
2845                   Attrs, T.getCloseLocation());
2846
2847     if (T.getCloseLocation().isInvalid())
2848       return;
2849   }
2850 }
2851
2852 /// ParseExpressionListOrTypeId - Parse either an expression-list or a type-id.
2853 /// This ambiguity appears in the syntax of the C++ new operator.
2854 ///
2855 ///        new-expression:
2856 ///                   '::'[opt] 'new' new-placement[opt] '(' type-id ')'
2857 ///                                     new-initializer[opt]
2858 ///
2859 ///        new-placement:
2860 ///                   '(' expression-list ')'
2861 ///
2862 bool Parser::ParseExpressionListOrTypeId(
2863                                    SmallVectorImpl<Expr*> &PlacementArgs,
2864                                          Declarator &D) {
2865   // The '(' was already consumed.
2866   if (isTypeIdInParens()) {
2867     ParseSpecifierQualifierList(D.getMutableDeclSpec());
2868     D.SetSourceRange(D.getDeclSpec().getSourceRange());
2869     ParseDeclarator(D);
2870     return D.isInvalidType();
2871   }
2872
2873   // It's not a type, it has to be an expression list.
2874   // Discard the comma locations - ActOnCXXNew has enough parameters.
2875   CommaLocsTy CommaLocs;
2876   return ParseExpressionList(PlacementArgs, CommaLocs);
2877 }
2878
2879 /// ParseCXXDeleteExpression - Parse a C++ delete-expression. Delete is used
2880 /// to free memory allocated by new.
2881 ///
2882 /// This method is called to parse the 'delete' expression after the optional
2883 /// '::' has been already parsed.  If the '::' was present, "UseGlobal" is true
2884 /// and "Start" is its location.  Otherwise, "Start" is the location of the
2885 /// 'delete' token.
2886 ///
2887 ///        delete-expression:
2888 ///                   '::'[opt] 'delete' cast-expression
2889 ///                   '::'[opt] 'delete' '[' ']' cast-expression
2890 ExprResult
2891 Parser::ParseCXXDeleteExpression(bool UseGlobal, SourceLocation Start) {
2892   assert(Tok.is(tok::kw_delete) && "Expected 'delete' keyword");
2893   ConsumeToken(); // Consume 'delete'
2894
2895   // Array delete?
2896   bool ArrayDelete = false;
2897   if (Tok.is(tok::l_square) && NextToken().is(tok::r_square)) {
2898     // C++11 [expr.delete]p1:
2899     //   Whenever the delete keyword is followed by empty square brackets, it
2900     //   shall be interpreted as [array delete].
2901     //   [Footnote: A lambda expression with a lambda-introducer that consists
2902     //              of empty square brackets can follow the delete keyword if
2903     //              the lambda expression is enclosed in parentheses.]
2904     // FIXME: Produce a better diagnostic if the '[]' is unambiguously a
2905     //        lambda-introducer.
2906     ArrayDelete = true;
2907     BalancedDelimiterTracker T(*this, tok::l_square);
2908
2909     T.consumeOpen();
2910     T.consumeClose();
2911     if (T.getCloseLocation().isInvalid())
2912       return ExprError();
2913   }
2914
2915   ExprResult Operand(ParseCastExpression(false));
2916   if (Operand.isInvalid())
2917     return Operand;
2918
2919   return Actions.ActOnCXXDelete(Start, UseGlobal, ArrayDelete, Operand.get());
2920 }
2921
2922 static TypeTrait TypeTraitFromTokKind(tok::TokenKind kind) {
2923   switch (kind) {
2924   default: llvm_unreachable("Not a known type trait");
2925 #define TYPE_TRAIT_1(Spelling, Name, Key) \
2926 case tok::kw_ ## Spelling: return UTT_ ## Name;
2927 #define TYPE_TRAIT_2(Spelling, Name, Key) \
2928 case tok::kw_ ## Spelling: return BTT_ ## Name;
2929 #include "clang/Basic/TokenKinds.def"
2930 #define TYPE_TRAIT_N(Spelling, Name, Key) \
2931   case tok::kw_ ## Spelling: return TT_ ## Name;
2932 #include "clang/Basic/TokenKinds.def"
2933   }
2934 }
2935
2936 static ArrayTypeTrait ArrayTypeTraitFromTokKind(tok::TokenKind kind) {
2937   switch(kind) {
2938   default: llvm_unreachable("Not a known binary type trait");
2939   case tok::kw___array_rank:                 return ATT_ArrayRank;
2940   case tok::kw___array_extent:               return ATT_ArrayExtent;
2941   }
2942 }
2943
2944 static ExpressionTrait ExpressionTraitFromTokKind(tok::TokenKind kind) {
2945   switch(kind) {
2946   default: llvm_unreachable("Not a known unary expression trait.");
2947   case tok::kw___is_lvalue_expr:             return ET_IsLValueExpr;
2948   case tok::kw___is_rvalue_expr:             return ET_IsRValueExpr;
2949   }
2950 }
2951
2952 static unsigned TypeTraitArity(tok::TokenKind kind) {
2953   switch (kind) {
2954     default: llvm_unreachable("Not a known type trait");
2955 #define TYPE_TRAIT(N,Spelling,K) case tok::kw_##Spelling: return N;
2956 #include "clang/Basic/TokenKinds.def"
2957   }
2958 }
2959
2960 /// \brief Parse the built-in type-trait pseudo-functions that allow 
2961 /// implementation of the TR1/C++11 type traits templates.
2962 ///
2963 ///       primary-expression:
2964 ///          unary-type-trait '(' type-id ')'
2965 ///          binary-type-trait '(' type-id ',' type-id ')'
2966 ///          type-trait '(' type-id-seq ')'
2967 ///
2968 ///       type-id-seq:
2969 ///          type-id ...[opt] type-id-seq[opt]
2970 ///
2971 ExprResult Parser::ParseTypeTrait() {
2972   tok::TokenKind Kind = Tok.getKind();
2973   unsigned Arity = TypeTraitArity(Kind);
2974
2975   SourceLocation Loc = ConsumeToken();
2976   
2977   BalancedDelimiterTracker Parens(*this, tok::l_paren);
2978   if (Parens.expectAndConsume())
2979     return ExprError();
2980
2981   SmallVector<ParsedType, 2> Args;
2982   do {
2983     // Parse the next type.
2984     TypeResult Ty = ParseTypeName();
2985     if (Ty.isInvalid()) {
2986       Parens.skipToEnd();
2987       return ExprError();
2988     }
2989
2990     // Parse the ellipsis, if present.
2991     if (Tok.is(tok::ellipsis)) {
2992       Ty = Actions.ActOnPackExpansion(Ty.get(), ConsumeToken());
2993       if (Ty.isInvalid()) {
2994         Parens.skipToEnd();
2995         return ExprError();
2996       }
2997     }
2998     
2999     // Add this type to the list of arguments.
3000     Args.push_back(Ty.get());
3001   } while (TryConsumeToken(tok::comma));
3002
3003   if (Parens.consumeClose())
3004     return ExprError();
3005
3006   SourceLocation EndLoc = Parens.getCloseLocation();
3007
3008   if (Arity && Args.size() != Arity) {
3009     Diag(EndLoc, diag::err_type_trait_arity)
3010       << Arity << 0 << (Arity > 1) << (int)Args.size() << SourceRange(Loc);
3011     return ExprError();
3012   }
3013
3014   if (!Arity && Args.empty()) {
3015     Diag(EndLoc, diag::err_type_trait_arity)
3016       << 1 << 1 << 1 << (int)Args.size() << SourceRange(Loc);
3017     return ExprError();
3018   }
3019
3020   return Actions.ActOnTypeTrait(TypeTraitFromTokKind(Kind), Loc, Args, EndLoc);
3021 }
3022
3023 /// ParseArrayTypeTrait - Parse the built-in array type-trait
3024 /// pseudo-functions.
3025 ///
3026 ///       primary-expression:
3027 /// [Embarcadero]     '__array_rank' '(' type-id ')'
3028 /// [Embarcadero]     '__array_extent' '(' type-id ',' expression ')'
3029 ///
3030 ExprResult Parser::ParseArrayTypeTrait() {
3031   ArrayTypeTrait ATT = ArrayTypeTraitFromTokKind(Tok.getKind());
3032   SourceLocation Loc = ConsumeToken();
3033
3034   BalancedDelimiterTracker T(*this, tok::l_paren);
3035   if (T.expectAndConsume())
3036     return ExprError();
3037
3038   TypeResult Ty = ParseTypeName();
3039   if (Ty.isInvalid()) {
3040     SkipUntil(tok::comma, StopAtSemi);
3041     SkipUntil(tok::r_paren, StopAtSemi);
3042     return ExprError();
3043   }
3044
3045   switch (ATT) {
3046   case ATT_ArrayRank: {
3047     T.consumeClose();
3048     return Actions.ActOnArrayTypeTrait(ATT, Loc, Ty.get(), nullptr,
3049                                        T.getCloseLocation());
3050   }
3051   case ATT_ArrayExtent: {
3052     if (ExpectAndConsume(tok::comma)) {
3053       SkipUntil(tok::r_paren, StopAtSemi);
3054       return ExprError();
3055     }
3056
3057     ExprResult DimExpr = ParseExpression();
3058     T.consumeClose();
3059
3060     return Actions.ActOnArrayTypeTrait(ATT, Loc, Ty.get(), DimExpr.get(),
3061                                        T.getCloseLocation());
3062   }
3063   }
3064   llvm_unreachable("Invalid ArrayTypeTrait!");
3065 }
3066
3067 /// ParseExpressionTrait - Parse built-in expression-trait
3068 /// pseudo-functions like __is_lvalue_expr( xxx ).
3069 ///
3070 ///       primary-expression:
3071 /// [Embarcadero]     expression-trait '(' expression ')'
3072 ///
3073 ExprResult Parser::ParseExpressionTrait() {
3074   ExpressionTrait ET = ExpressionTraitFromTokKind(Tok.getKind());
3075   SourceLocation Loc = ConsumeToken();
3076
3077   BalancedDelimiterTracker T(*this, tok::l_paren);
3078   if (T.expectAndConsume())
3079     return ExprError();
3080
3081   ExprResult Expr = ParseExpression();
3082
3083   T.consumeClose();
3084
3085   return Actions.ActOnExpressionTrait(ET, Loc, Expr.get(),
3086                                       T.getCloseLocation());
3087 }
3088
3089
3090 /// ParseCXXAmbiguousParenExpression - We have parsed the left paren of a
3091 /// parenthesized ambiguous type-id. This uses tentative parsing to disambiguate
3092 /// based on the context past the parens.
3093 ExprResult
3094 Parser::ParseCXXAmbiguousParenExpression(ParenParseOption &ExprType,
3095                                          ParsedType &CastTy,
3096                                          BalancedDelimiterTracker &Tracker,
3097                                          ColonProtectionRAIIObject &ColonProt) {
3098   assert(getLangOpts().CPlusPlus && "Should only be called for C++!");
3099   assert(ExprType == CastExpr && "Compound literals are not ambiguous!");
3100   assert(isTypeIdInParens() && "Not a type-id!");
3101
3102   ExprResult Result(true);
3103   CastTy = nullptr;
3104
3105   // We need to disambiguate a very ugly part of the C++ syntax:
3106   //
3107   // (T())x;  - type-id
3108   // (T())*x; - type-id
3109   // (T())/x; - expression
3110   // (T());   - expression
3111   //
3112   // The bad news is that we cannot use the specialized tentative parser, since
3113   // it can only verify that the thing inside the parens can be parsed as
3114   // type-id, it is not useful for determining the context past the parens.
3115   //
3116   // The good news is that the parser can disambiguate this part without
3117   // making any unnecessary Action calls.
3118   //
3119   // It uses a scheme similar to parsing inline methods. The parenthesized
3120   // tokens are cached, the context that follows is determined (possibly by
3121   // parsing a cast-expression), and then we re-introduce the cached tokens
3122   // into the token stream and parse them appropriately.
3123
3124   ParenParseOption ParseAs;
3125   CachedTokens Toks;
3126
3127   // Store the tokens of the parentheses. We will parse them after we determine
3128   // the context that follows them.
3129   if (!ConsumeAndStoreUntil(tok::r_paren, Toks)) {
3130     // We didn't find the ')' we expected.
3131     Tracker.consumeClose();
3132     return ExprError();
3133   }
3134
3135   if (Tok.is(tok::l_brace)) {
3136     ParseAs = CompoundLiteral;
3137   } else {
3138     bool NotCastExpr;
3139     if (Tok.is(tok::l_paren) && NextToken().is(tok::r_paren)) {
3140       NotCastExpr = true;
3141     } else {
3142       // Try parsing the cast-expression that may follow.
3143       // If it is not a cast-expression, NotCastExpr will be true and no token
3144       // will be consumed.
3145       ColonProt.restore();
3146       Result = ParseCastExpression(false/*isUnaryExpression*/,
3147                                    false/*isAddressofOperand*/,
3148                                    NotCastExpr,
3149                                    // type-id has priority.
3150                                    IsTypeCast);
3151     }
3152
3153     // If we parsed a cast-expression, it's really a type-id, otherwise it's
3154     // an expression.
3155     ParseAs = NotCastExpr ? SimpleExpr : CastExpr;
3156   }
3157
3158   // Create a fake EOF to mark end of Toks buffer.
3159   Token AttrEnd;
3160   AttrEnd.startToken();
3161   AttrEnd.setKind(tok::eof);
3162   AttrEnd.setLocation(Tok.getLocation());
3163   AttrEnd.setEofData(Toks.data());
3164   Toks.push_back(AttrEnd);
3165
3166   // The current token should go after the cached tokens.
3167   Toks.push_back(Tok);
3168   // Re-enter the stored parenthesized tokens into the token stream, so we may
3169   // parse them now.
3170   PP.EnterTokenStream(Toks, true /*DisableMacroExpansion*/);
3171   // Drop the current token and bring the first cached one. It's the same token
3172   // as when we entered this function.
3173   ConsumeAnyToken();
3174
3175   if (ParseAs >= CompoundLiteral) {
3176     // Parse the type declarator.
3177     DeclSpec DS(AttrFactory);
3178     Declarator DeclaratorInfo(DS, DeclaratorContext::TypeNameContext);
3179     {
3180       ColonProtectionRAIIObject InnerColonProtection(*this);
3181       ParseSpecifierQualifierList(DS);
3182       ParseDeclarator(DeclaratorInfo);
3183     }
3184
3185     // Match the ')'.
3186     Tracker.consumeClose();
3187     ColonProt.restore();
3188
3189     // Consume EOF marker for Toks buffer.
3190     assert(Tok.is(tok::eof) && Tok.getEofData() == AttrEnd.getEofData());
3191     ConsumeAnyToken();
3192
3193     if (ParseAs == CompoundLiteral) {
3194       ExprType = CompoundLiteral;
3195       if (DeclaratorInfo.isInvalidType())
3196         return ExprError();
3197
3198       TypeResult Ty = Actions.ActOnTypeName(getCurScope(), DeclaratorInfo);
3199       return ParseCompoundLiteralExpression(Ty.get(),
3200                                             Tracker.getOpenLocation(),
3201                                             Tracker.getCloseLocation());
3202     }
3203
3204     // We parsed '(' type-id ')' and the thing after it wasn't a '{'.
3205     assert(ParseAs == CastExpr);
3206
3207     if (DeclaratorInfo.isInvalidType())
3208       return ExprError();
3209
3210     // Result is what ParseCastExpression returned earlier.
3211     if (!Result.isInvalid())
3212       Result = Actions.ActOnCastExpr(getCurScope(), Tracker.getOpenLocation(),
3213                                     DeclaratorInfo, CastTy,
3214                                     Tracker.getCloseLocation(), Result.get());
3215     return Result;
3216   }
3217
3218   // Not a compound literal, and not followed by a cast-expression.
3219   assert(ParseAs == SimpleExpr);
3220
3221   ExprType = SimpleExpr;
3222   Result = ParseExpression();
3223   if (!Result.isInvalid() && Tok.is(tok::r_paren))
3224     Result = Actions.ActOnParenExpr(Tracker.getOpenLocation(), 
3225                                     Tok.getLocation(), Result.get());
3226
3227   // Match the ')'.
3228   if (Result.isInvalid()) {
3229     while (Tok.isNot(tok::eof))
3230       ConsumeAnyToken();
3231     assert(Tok.getEofData() == AttrEnd.getEofData());
3232     ConsumeAnyToken();
3233     return ExprError();
3234   }
3235
3236   Tracker.consumeClose();
3237   // Consume EOF marker for Toks buffer.
3238   assert(Tok.is(tok::eof) && Tok.getEofData() == AttrEnd.getEofData());
3239   ConsumeAnyToken();
3240   return Result;
3241 }