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