]> CyberLeo.Net >> Repos - FreeBSD/stable/9.git/blob - contrib/llvm/tools/clang/lib/Parse/ParseExprCXX.cpp
Copy head to stable/9 as part of 9.0-RELEASE release cycle.
[FreeBSD/stable/9.git] / contrib / llvm / tools / clang / lib / Parse / ParseExprCXX.cpp
1 //===--- ParseExprCXX.cpp - C++ Expression Parsing ------------------------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This file implements the Expression parsing implementation for C++.
11 //
12 //===----------------------------------------------------------------------===//
13
14 #include "clang/Parse/ParseDiagnostic.h"
15 #include "clang/Parse/Parser.h"
16 #include "RAIIObjectsForParser.h"
17 #include "clang/Sema/DeclSpec.h"
18 #include "clang/Sema/ParsedTemplate.h"
19 #include "llvm/Support/ErrorHandling.h"
20
21 using namespace clang;
22
23 static int SelectDigraphErrorMessage(tok::TokenKind Kind) {
24   switch (Kind) {
25     case tok::kw_template:         return 0;
26     case tok::kw_const_cast:       return 1;
27     case tok::kw_dynamic_cast:     return 2;
28     case tok::kw_reinterpret_cast: return 3;
29     case tok::kw_static_cast:      return 4;
30     default:
31       assert(0 && "Unknown type for digraph error message.");
32       return -1;
33   }
34 }
35
36 // Are the two tokens adjacent in the same source file?
37 static bool AreTokensAdjacent(Preprocessor &PP, Token &First, Token &Second) {
38   SourceManager &SM = PP.getSourceManager();
39   SourceLocation FirstLoc = SM.getSpellingLoc(First.getLocation());
40   SourceLocation FirstEnd = FirstLoc.getFileLocWithOffset(First.getLength());
41   return FirstEnd == SM.getSpellingLoc(Second.getLocation());
42 }
43
44 // Suggest fixit for "<::" after a cast.
45 static void FixDigraph(Parser &P, Preprocessor &PP, Token &DigraphToken,
46                        Token &ColonToken, tok::TokenKind Kind, bool AtDigraph) {
47   // Pull '<:' and ':' off token stream.
48   if (!AtDigraph)
49     PP.Lex(DigraphToken);
50   PP.Lex(ColonToken);
51
52   SourceRange Range;
53   Range.setBegin(DigraphToken.getLocation());
54   Range.setEnd(ColonToken.getLocation());
55   P.Diag(DigraphToken.getLocation(), diag::err_missing_whitespace_digraph)
56       << SelectDigraphErrorMessage(Kind)
57       << FixItHint::CreateReplacement(Range, "< ::");
58
59   // Update token information to reflect their change in token type.
60   ColonToken.setKind(tok::coloncolon);
61   ColonToken.setLocation(ColonToken.getLocation().getFileLocWithOffset(-1));
62   ColonToken.setLength(2);
63   DigraphToken.setKind(tok::less);
64   DigraphToken.setLength(1);
65
66   // Push new tokens back to token stream.
67   PP.EnterToken(ColonToken);
68   if (!AtDigraph)
69     PP.EnterToken(DigraphToken);
70 }
71
72 /// \brief Parse global scope or nested-name-specifier if present.
73 ///
74 /// Parses a C++ global scope specifier ('::') or nested-name-specifier (which
75 /// may be preceded by '::'). Note that this routine will not parse ::new or
76 /// ::delete; it will just leave them in the token stream.
77 ///
78 ///       '::'[opt] nested-name-specifier
79 ///       '::'
80 ///
81 ///       nested-name-specifier:
82 ///         type-name '::'
83 ///         namespace-name '::'
84 ///         nested-name-specifier identifier '::'
85 ///         nested-name-specifier 'template'[opt] simple-template-id '::'
86 ///
87 ///
88 /// \param SS the scope specifier that will be set to the parsed
89 /// nested-name-specifier (or empty)
90 ///
91 /// \param ObjectType if this nested-name-specifier is being parsed following
92 /// the "." or "->" of a member access expression, this parameter provides the
93 /// type of the object whose members are being accessed.
94 ///
95 /// \param EnteringContext whether we will be entering into the context of
96 /// the nested-name-specifier after parsing it.
97 ///
98 /// \param MayBePseudoDestructor When non-NULL, points to a flag that
99 /// indicates whether this nested-name-specifier may be part of a
100 /// pseudo-destructor name. In this case, the flag will be set false
101 /// if we don't actually end up parsing a destructor name. Moreorover,
102 /// if we do end up determining that we are parsing a destructor name,
103 /// the last component of the nested-name-specifier is not parsed as
104 /// part of the scope specifier.
105
106 /// member access expression, e.g., the \p T:: in \p p->T::m.
107 ///
108 /// \returns true if there was an error parsing a scope specifier
109 bool Parser::ParseOptionalCXXScopeSpecifier(CXXScopeSpec &SS,
110                                             ParsedType ObjectType,
111                                             bool EnteringContext,
112                                             bool *MayBePseudoDestructor,
113                                             bool IsTypename) {
114   assert(getLang().CPlusPlus &&
115          "Call sites of this function should be guarded by checking for C++");
116
117   if (Tok.is(tok::annot_cxxscope)) {
118     Actions.RestoreNestedNameSpecifierAnnotation(Tok.getAnnotationValue(),
119                                                  Tok.getAnnotationRange(),
120                                                  SS);
121     ConsumeToken();
122     return false;
123   }
124
125   bool HasScopeSpecifier = false;
126
127   if (Tok.is(tok::coloncolon)) {
128     // ::new and ::delete aren't nested-name-specifiers.
129     tok::TokenKind NextKind = NextToken().getKind();
130     if (NextKind == tok::kw_new || NextKind == tok::kw_delete)
131       return false;
132
133     // '::' - Global scope qualifier.
134     if (Actions.ActOnCXXGlobalScopeSpecifier(getCurScope(), ConsumeToken(), SS))
135       return true;
136     
137     HasScopeSpecifier = true;
138   }
139
140   bool CheckForDestructor = false;
141   if (MayBePseudoDestructor && *MayBePseudoDestructor) {
142     CheckForDestructor = true;
143     *MayBePseudoDestructor = false;
144   }
145
146   while (true) {
147     if (HasScopeSpecifier) {
148       // C++ [basic.lookup.classref]p5:
149       //   If the qualified-id has the form
150       //
151       //       ::class-name-or-namespace-name::...
152       //
153       //   the class-name-or-namespace-name is looked up in global scope as a
154       //   class-name or namespace-name.
155       //
156       // To implement this, we clear out the object type as soon as we've
157       // seen a leading '::' or part of a nested-name-specifier.
158       ObjectType = ParsedType();
159       
160       if (Tok.is(tok::code_completion)) {
161         // Code completion for a nested-name-specifier, where the code
162         // code completion token follows the '::'.
163         Actions.CodeCompleteQualifiedId(getCurScope(), SS, EnteringContext);
164         SourceLocation ccLoc = ConsumeCodeCompletionToken();
165         // Include code completion token into the range of the scope otherwise
166         // when we try to annotate the scope tokens the dangling code completion
167         // token will cause assertion in
168         // Preprocessor::AnnotatePreviousCachedTokens.
169         SS.setEndLoc(ccLoc);
170       }
171     }
172
173     // nested-name-specifier:
174     //   nested-name-specifier 'template'[opt] simple-template-id '::'
175
176     // Parse the optional 'template' keyword, then make sure we have
177     // 'identifier <' after it.
178     if (Tok.is(tok::kw_template)) {
179       // If we don't have a scope specifier or an object type, this isn't a
180       // nested-name-specifier, since they aren't allowed to start with
181       // 'template'.
182       if (!HasScopeSpecifier && !ObjectType)
183         break;
184
185       TentativeParsingAction TPA(*this);
186       SourceLocation TemplateKWLoc = ConsumeToken();
187       
188       UnqualifiedId TemplateName;
189       if (Tok.is(tok::identifier)) {
190         // Consume the identifier.
191         TemplateName.setIdentifier(Tok.getIdentifierInfo(), Tok.getLocation());
192         ConsumeToken();
193       } else if (Tok.is(tok::kw_operator)) {
194         if (ParseUnqualifiedIdOperator(SS, EnteringContext, ObjectType, 
195                                        TemplateName)) {
196           TPA.Commit();
197           break;
198         }
199         
200         if (TemplateName.getKind() != UnqualifiedId::IK_OperatorFunctionId &&
201             TemplateName.getKind() != UnqualifiedId::IK_LiteralOperatorId) {
202           Diag(TemplateName.getSourceRange().getBegin(),
203                diag::err_id_after_template_in_nested_name_spec)
204             << TemplateName.getSourceRange();
205           TPA.Commit();
206           break;
207         }
208       } else {
209         TPA.Revert();
210         break;
211       }
212
213       // If the next token is not '<', we have a qualified-id that refers
214       // to a template name, such as T::template apply, but is not a 
215       // template-id.
216       if (Tok.isNot(tok::less)) {
217         TPA.Revert();
218         break;
219       }        
220       
221       // Commit to parsing the template-id.
222       TPA.Commit();
223       TemplateTy Template;
224       if (TemplateNameKind TNK = Actions.ActOnDependentTemplateName(getCurScope(), 
225                                                                 TemplateKWLoc, 
226                                                                     SS, 
227                                                                   TemplateName,
228                                                                     ObjectType, 
229                                                                 EnteringContext,
230                                                                     Template)) {
231         if (AnnotateTemplateIdToken(Template, TNK, SS, TemplateName, 
232                                     TemplateKWLoc, false))
233           return true;
234       } else
235         return true;
236
237       continue;
238     }
239
240     if (Tok.is(tok::annot_template_id) && NextToken().is(tok::coloncolon)) {
241       // We have
242       //
243       //   simple-template-id '::'
244       //
245       // So we need to check whether the simple-template-id is of the
246       // right kind (it should name a type or be dependent), and then
247       // convert it into a type within the nested-name-specifier.
248       TemplateIdAnnotation *TemplateId = takeTemplateIdAnnotation(Tok);
249       if (CheckForDestructor && GetLookAheadToken(2).is(tok::tilde)) {
250         *MayBePseudoDestructor = true;
251         return false;
252       }
253
254       // Consume the template-id token.
255       ConsumeToken();
256       
257       assert(Tok.is(tok::coloncolon) && "NextToken() not working properly!");
258       SourceLocation CCLoc = ConsumeToken();
259
260       if (!HasScopeSpecifier)
261         HasScopeSpecifier = true;
262       
263       ASTTemplateArgsPtr TemplateArgsPtr(Actions,
264                                          TemplateId->getTemplateArgs(),
265                                          TemplateId->NumArgs);
266       
267       if (Actions.ActOnCXXNestedNameSpecifier(getCurScope(),
268                                               /*FIXME:*/SourceLocation(),
269                                               SS, 
270                                               TemplateId->Template,
271                                               TemplateId->TemplateNameLoc,
272                                               TemplateId->LAngleLoc,
273                                               TemplateArgsPtr,
274                                               TemplateId->RAngleLoc,
275                                               CCLoc,
276                                               EnteringContext)) {
277         SourceLocation StartLoc 
278           = SS.getBeginLoc().isValid()? SS.getBeginLoc()
279                                       : TemplateId->TemplateNameLoc;
280         SS.SetInvalid(SourceRange(StartLoc, CCLoc));
281       }
282
283       continue;
284     }
285
286
287     // The rest of the nested-name-specifier possibilities start with
288     // tok::identifier.
289     if (Tok.isNot(tok::identifier))
290       break;
291
292     IdentifierInfo &II = *Tok.getIdentifierInfo();
293
294     // nested-name-specifier:
295     //   type-name '::'
296     //   namespace-name '::'
297     //   nested-name-specifier identifier '::'
298     Token Next = NextToken();
299     
300     // If we get foo:bar, this is almost certainly a typo for foo::bar.  Recover
301     // and emit a fixit hint for it.
302     if (Next.is(tok::colon) && !ColonIsSacred) {
303       if (Actions.IsInvalidUnlessNestedName(getCurScope(), SS, II, 
304                                             Tok.getLocation(), 
305                                             Next.getLocation(), ObjectType,
306                                             EnteringContext) &&
307           // If the token after the colon isn't an identifier, it's still an
308           // error, but they probably meant something else strange so don't
309           // recover like this.
310           PP.LookAhead(1).is(tok::identifier)) {
311         Diag(Next, diag::err_unexected_colon_in_nested_name_spec)
312           << FixItHint::CreateReplacement(Next.getLocation(), "::");
313         
314         // Recover as if the user wrote '::'.
315         Next.setKind(tok::coloncolon);
316       }
317     }
318     
319     if (Next.is(tok::coloncolon)) {
320       if (CheckForDestructor && GetLookAheadToken(2).is(tok::tilde) &&
321           !Actions.isNonTypeNestedNameSpecifier(getCurScope(), SS, Tok.getLocation(),
322                                                 II, ObjectType)) {
323         *MayBePseudoDestructor = true;
324         return false;
325       }
326
327       // We have an identifier followed by a '::'. Lookup this name
328       // as the name in a nested-name-specifier.
329       SourceLocation IdLoc = ConsumeToken();
330       assert((Tok.is(tok::coloncolon) || Tok.is(tok::colon)) &&
331              "NextToken() not working properly!");
332       SourceLocation CCLoc = ConsumeToken();
333
334       HasScopeSpecifier = true;
335       if (Actions.ActOnCXXNestedNameSpecifier(getCurScope(), II, IdLoc, CCLoc,
336                                               ObjectType, EnteringContext, SS))
337         SS.SetInvalid(SourceRange(IdLoc, CCLoc));
338       
339       continue;
340     }
341
342     // Check for '<::' which should be '< ::' instead of '[:' when following
343     // a template name.
344     if (Next.is(tok::l_square) && Next.getLength() == 2) {
345       Token SecondToken = GetLookAheadToken(2);
346       if (SecondToken.is(tok::colon) &&
347           AreTokensAdjacent(PP, Next, SecondToken)) {
348         TemplateTy Template;
349         UnqualifiedId TemplateName;
350         TemplateName.setIdentifier(&II, Tok.getLocation());
351         bool MemberOfUnknownSpecialization;
352         if (Actions.isTemplateName(getCurScope(), SS,
353                                    /*hasTemplateKeyword=*/false,
354                                    TemplateName,
355                                    ObjectType,
356                                    EnteringContext,
357                                    Template,
358                                    MemberOfUnknownSpecialization)) {
359           FixDigraph(*this, PP, Next, SecondToken, tok::kw_template,
360                      /*AtDigraph*/false);
361         }
362       }
363     }
364
365     // nested-name-specifier:
366     //   type-name '<'
367     if (Next.is(tok::less)) {
368       TemplateTy Template;
369       UnqualifiedId TemplateName;
370       TemplateName.setIdentifier(&II, Tok.getLocation());
371       bool MemberOfUnknownSpecialization;
372       if (TemplateNameKind TNK = Actions.isTemplateName(getCurScope(), SS, 
373                                               /*hasTemplateKeyword=*/false,
374                                                         TemplateName,
375                                                         ObjectType,
376                                                         EnteringContext,
377                                                         Template,
378                                               MemberOfUnknownSpecialization)) {
379         // We have found a template name, so annotate this this token
380         // with a template-id annotation. We do not permit the
381         // template-id to be translated into a type annotation,
382         // because some clients (e.g., the parsing of class template
383         // specializations) still want to see the original template-id
384         // token.
385         ConsumeToken();
386         if (AnnotateTemplateIdToken(Template, TNK, SS, TemplateName, 
387                                     SourceLocation(), false))
388           return true;
389         continue;
390       } 
391       
392       if (MemberOfUnknownSpecialization && (ObjectType || SS.isSet()) && 
393           (IsTypename || IsTemplateArgumentList(1))) {
394         // We have something like t::getAs<T>, where getAs is a 
395         // member of an unknown specialization. However, this will only
396         // parse correctly as a template, so suggest the keyword 'template'
397         // before 'getAs' and treat this as a dependent template name.
398         unsigned DiagID = diag::err_missing_dependent_template_keyword;
399         if (getLang().Microsoft)
400           DiagID = diag::warn_missing_dependent_template_keyword;
401         
402         Diag(Tok.getLocation(), DiagID)
403           << II.getName()
404           << FixItHint::CreateInsertion(Tok.getLocation(), "template ");
405         
406         if (TemplateNameKind TNK 
407               = Actions.ActOnDependentTemplateName(getCurScope(), 
408                                                    Tok.getLocation(), SS, 
409                                                    TemplateName, ObjectType,
410                                                    EnteringContext, Template)) {
411           // Consume the identifier.
412           ConsumeToken();
413           if (AnnotateTemplateIdToken(Template, TNK, SS, TemplateName, 
414                                       SourceLocation(), false))
415             return true;                
416         }
417         else
418           return true;     
419                 
420         continue;        
421       }
422     }
423
424     // We don't have any tokens that form the beginning of a
425     // nested-name-specifier, so we're done.
426     break;
427   }
428
429   // Even if we didn't see any pieces of a nested-name-specifier, we
430   // still check whether there is a tilde in this position, which
431   // indicates a potential pseudo-destructor.
432   if (CheckForDestructor && Tok.is(tok::tilde))
433     *MayBePseudoDestructor = true;
434
435   return false;
436 }
437
438 /// ParseCXXIdExpression - Handle id-expression.
439 ///
440 ///       id-expression:
441 ///         unqualified-id
442 ///         qualified-id
443 ///
444 ///       qualified-id:
445 ///         '::'[opt] nested-name-specifier 'template'[opt] unqualified-id
446 ///         '::' identifier
447 ///         '::' operator-function-id
448 ///         '::' template-id
449 ///
450 /// NOTE: The standard specifies that, for qualified-id, the parser does not
451 /// expect:
452 ///
453 ///   '::' conversion-function-id
454 ///   '::' '~' class-name
455 ///
456 /// This may cause a slight inconsistency on diagnostics:
457 ///
458 /// class C {};
459 /// namespace A {}
460 /// void f() {
461 ///   :: A :: ~ C(); // Some Sema error about using destructor with a
462 ///                  // namespace.
463 ///   :: ~ C(); // Some Parser error like 'unexpected ~'.
464 /// }
465 ///
466 /// We simplify the parser a bit and make it work like:
467 ///
468 ///       qualified-id:
469 ///         '::'[opt] nested-name-specifier 'template'[opt] unqualified-id
470 ///         '::' unqualified-id
471 ///
472 /// That way Sema can handle and report similar errors for namespaces and the
473 /// global scope.
474 ///
475 /// The isAddressOfOperand parameter indicates that this id-expression is a
476 /// direct operand of the address-of operator. This is, besides member contexts,
477 /// the only place where a qualified-id naming a non-static class member may
478 /// appear.
479 ///
480 ExprResult Parser::ParseCXXIdExpression(bool isAddressOfOperand) {
481   // qualified-id:
482   //   '::'[opt] nested-name-specifier 'template'[opt] unqualified-id
483   //   '::' unqualified-id
484   //
485   CXXScopeSpec SS;
486   ParseOptionalCXXScopeSpecifier(SS, ParsedType(), false);
487   
488   UnqualifiedId Name;
489   if (ParseUnqualifiedId(SS, 
490                          /*EnteringContext=*/false, 
491                          /*AllowDestructorName=*/false, 
492                          /*AllowConstructorName=*/false, 
493                          /*ObjectType=*/ ParsedType(),
494                          Name))
495     return ExprError();
496
497   // This is only the direct operand of an & operator if it is not
498   // followed by a postfix-expression suffix.
499   if (isAddressOfOperand && isPostfixExpressionSuffixStart())
500     isAddressOfOperand = false;
501   
502   return Actions.ActOnIdExpression(getCurScope(), SS, Name, Tok.is(tok::l_paren),
503                                    isAddressOfOperand);
504   
505 }
506
507 /// ParseCXXCasts - This handles the various ways to cast expressions to another
508 /// type.
509 ///
510 ///       postfix-expression: [C++ 5.2p1]
511 ///         'dynamic_cast' '<' type-name '>' '(' expression ')'
512 ///         'static_cast' '<' type-name '>' '(' expression ')'
513 ///         'reinterpret_cast' '<' type-name '>' '(' expression ')'
514 ///         'const_cast' '<' type-name '>' '(' expression ')'
515 ///
516 ExprResult Parser::ParseCXXCasts() {
517   tok::TokenKind Kind = Tok.getKind();
518   const char *CastName = 0;     // For error messages
519
520   switch (Kind) {
521   default: assert(0 && "Unknown C++ cast!"); abort();
522   case tok::kw_const_cast:       CastName = "const_cast";       break;
523   case tok::kw_dynamic_cast:     CastName = "dynamic_cast";     break;
524   case tok::kw_reinterpret_cast: CastName = "reinterpret_cast"; break;
525   case tok::kw_static_cast:      CastName = "static_cast";      break;
526   }
527
528   SourceLocation OpLoc = ConsumeToken();
529   SourceLocation LAngleBracketLoc = Tok.getLocation();
530
531   // Check for "<::" which is parsed as "[:".  If found, fix token stream,
532   // diagnose error, suggest fix, and recover parsing.
533   Token Next = NextToken();
534   if (Tok.is(tok::l_square) && Tok.getLength() == 2 && Next.is(tok::colon) &&
535       AreTokensAdjacent(PP, Tok, Next))
536     FixDigraph(*this, PP, Tok, Next, Kind, /*AtDigraph*/true);
537
538   if (ExpectAndConsume(tok::less, diag::err_expected_less_after, CastName))
539     return ExprError();
540
541   // Parse the common declaration-specifiers piece.
542   DeclSpec DS(AttrFactory);
543   ParseSpecifierQualifierList(DS);
544
545   // Parse the abstract-declarator, if present.
546   Declarator DeclaratorInfo(DS, Declarator::TypeNameContext);
547   ParseDeclarator(DeclaratorInfo);
548
549   SourceLocation RAngleBracketLoc = Tok.getLocation();
550
551   if (ExpectAndConsume(tok::greater, diag::err_expected_greater))
552     return ExprError(Diag(LAngleBracketLoc, diag::note_matching) << "<");
553
554   SourceLocation LParenLoc = Tok.getLocation(), RParenLoc;
555
556   if (ExpectAndConsume(tok::l_paren, diag::err_expected_lparen_after, CastName))
557     return ExprError();
558
559   ExprResult Result = ParseExpression();
560
561   // Match the ')'.
562   RParenLoc = MatchRHSPunctuation(tok::r_paren, LParenLoc);
563
564   if (!Result.isInvalid() && !DeclaratorInfo.isInvalidType())
565     Result = Actions.ActOnCXXNamedCast(OpLoc, Kind,
566                                        LAngleBracketLoc, DeclaratorInfo,
567                                        RAngleBracketLoc,
568                                        LParenLoc, Result.take(), RParenLoc);
569
570   return move(Result);
571 }
572
573 /// ParseCXXTypeid - This handles the C++ typeid expression.
574 ///
575 ///       postfix-expression: [C++ 5.2p1]
576 ///         'typeid' '(' expression ')'
577 ///         'typeid' '(' type-id ')'
578 ///
579 ExprResult Parser::ParseCXXTypeid() {
580   assert(Tok.is(tok::kw_typeid) && "Not 'typeid'!");
581
582   SourceLocation OpLoc = ConsumeToken();
583   SourceLocation LParenLoc = Tok.getLocation();
584   SourceLocation RParenLoc;
585
586   // typeid expressions are always parenthesized.
587   if (ExpectAndConsume(tok::l_paren, diag::err_expected_lparen_after,
588       "typeid"))
589     return ExprError();
590
591   ExprResult Result;
592
593   if (isTypeIdInParens()) {
594     TypeResult Ty = ParseTypeName();
595
596     // Match the ')'.
597     RParenLoc = MatchRHSPunctuation(tok::r_paren, LParenLoc);
598
599     if (Ty.isInvalid() || RParenLoc.isInvalid())
600       return ExprError();
601
602     Result = Actions.ActOnCXXTypeid(OpLoc, LParenLoc, /*isType=*/true,
603                                     Ty.get().getAsOpaquePtr(), RParenLoc);
604   } else {
605     // C++0x [expr.typeid]p3:
606     //   When typeid is applied to an expression other than an lvalue of a
607     //   polymorphic class type [...] The expression is an unevaluated
608     //   operand (Clause 5).
609     //
610     // Note that we can't tell whether the expression is an lvalue of a
611     // polymorphic class type until after we've parsed the expression, so
612     // we the expression is potentially potentially evaluated.
613     EnterExpressionEvaluationContext Unevaluated(Actions,
614                                        Sema::PotentiallyPotentiallyEvaluated);
615     Result = ParseExpression();
616
617     // Match the ')'.
618     if (Result.isInvalid())
619       SkipUntil(tok::r_paren);
620     else {
621       RParenLoc = MatchRHSPunctuation(tok::r_paren, LParenLoc);
622       if (RParenLoc.isInvalid())
623         return ExprError();
624
625       // If we are a foo<int> that identifies a single function, resolve it now...  
626       Expr* e = Result.get();
627       if (e->getType() == Actions.Context.OverloadTy) {
628         ExprResult er = 
629               Actions.ResolveAndFixSingleFunctionTemplateSpecialization(e);
630         if (er.isUsable())
631           Result = er.release();
632       }
633       Result = Actions.ActOnCXXTypeid(OpLoc, LParenLoc, /*isType=*/false,
634                                       Result.release(), RParenLoc);
635     }
636   }
637
638   return move(Result);
639 }
640
641 /// ParseCXXUuidof - This handles the Microsoft C++ __uuidof expression.
642 ///
643 ///         '__uuidof' '(' expression ')'
644 ///         '__uuidof' '(' type-id ')'
645 ///
646 ExprResult Parser::ParseCXXUuidof() {
647   assert(Tok.is(tok::kw___uuidof) && "Not '__uuidof'!");
648
649   SourceLocation OpLoc = ConsumeToken();
650   SourceLocation LParenLoc = Tok.getLocation();
651   SourceLocation RParenLoc;
652
653   // __uuidof expressions are always parenthesized.
654   if (ExpectAndConsume(tok::l_paren, diag::err_expected_lparen_after,
655       "__uuidof"))
656     return ExprError();
657
658   ExprResult Result;
659
660   if (isTypeIdInParens()) {
661     TypeResult Ty = ParseTypeName();
662
663     // Match the ')'.
664     RParenLoc = MatchRHSPunctuation(tok::r_paren, LParenLoc);
665
666     if (Ty.isInvalid())
667       return ExprError();
668
669     Result = Actions.ActOnCXXUuidof(OpLoc, LParenLoc, /*isType=*/true,
670                                     Ty.get().getAsOpaquePtr(), RParenLoc);
671   } else {
672     EnterExpressionEvaluationContext Unevaluated(Actions, Sema::Unevaluated);
673     Result = ParseExpression();
674
675     // Match the ')'.
676     if (Result.isInvalid())
677       SkipUntil(tok::r_paren);
678     else {
679       RParenLoc = MatchRHSPunctuation(tok::r_paren, LParenLoc);
680
681       Result = Actions.ActOnCXXUuidof(OpLoc, LParenLoc, /*isType=*/false,
682                                       Result.release(), RParenLoc);
683     }
684   }
685
686   return move(Result);
687 }
688
689 /// \brief Parse a C++ pseudo-destructor expression after the base,
690 /// . or -> operator, and nested-name-specifier have already been
691 /// parsed.
692 ///
693 ///       postfix-expression: [C++ 5.2]
694 ///         postfix-expression . pseudo-destructor-name
695 ///         postfix-expression -> pseudo-destructor-name
696 ///
697 ///       pseudo-destructor-name: 
698 ///         ::[opt] nested-name-specifier[opt] type-name :: ~type-name 
699 ///         ::[opt] nested-name-specifier template simple-template-id :: 
700 ///                 ~type-name 
701 ///         ::[opt] nested-name-specifier[opt] ~type-name
702 ///       
703 ExprResult 
704 Parser::ParseCXXPseudoDestructor(ExprArg Base, SourceLocation OpLoc,
705                                  tok::TokenKind OpKind,
706                                  CXXScopeSpec &SS,
707                                  ParsedType ObjectType) {
708   // We're parsing either a pseudo-destructor-name or a dependent
709   // member access that has the same form as a
710   // pseudo-destructor-name. We parse both in the same way and let
711   // the action model sort them out.
712   //
713   // Note that the ::[opt] nested-name-specifier[opt] has already
714   // been parsed, and if there was a simple-template-id, it has
715   // been coalesced into a template-id annotation token.
716   UnqualifiedId FirstTypeName;
717   SourceLocation CCLoc;
718   if (Tok.is(tok::identifier)) {
719     FirstTypeName.setIdentifier(Tok.getIdentifierInfo(), Tok.getLocation());
720     ConsumeToken();
721     assert(Tok.is(tok::coloncolon) &&"ParseOptionalCXXScopeSpecifier fail");
722     CCLoc = ConsumeToken();
723   } else if (Tok.is(tok::annot_template_id)) {
724     FirstTypeName.setTemplateId(
725                               (TemplateIdAnnotation *)Tok.getAnnotationValue());
726     ConsumeToken();
727     assert(Tok.is(tok::coloncolon) &&"ParseOptionalCXXScopeSpecifier fail");
728     CCLoc = ConsumeToken();
729   } else {
730     FirstTypeName.setIdentifier(0, SourceLocation());
731   }
732
733   // Parse the tilde.
734   assert(Tok.is(tok::tilde) && "ParseOptionalCXXScopeSpecifier fail");
735   SourceLocation TildeLoc = ConsumeToken();
736   if (!Tok.is(tok::identifier)) {
737     Diag(Tok, diag::err_destructor_tilde_identifier);
738     return ExprError();
739   }
740   
741   // Parse the second type.
742   UnqualifiedId SecondTypeName;
743   IdentifierInfo *Name = Tok.getIdentifierInfo();
744   SourceLocation NameLoc = ConsumeToken();
745   SecondTypeName.setIdentifier(Name, NameLoc);
746   
747   // If there is a '<', the second type name is a template-id. Parse
748   // it as such.
749   if (Tok.is(tok::less) &&
750       ParseUnqualifiedIdTemplateId(SS, Name, NameLoc, false, ObjectType,
751                                    SecondTypeName, /*AssumeTemplateName=*/true,
752                                    /*TemplateKWLoc*/SourceLocation()))
753     return ExprError();
754
755   return Actions.ActOnPseudoDestructorExpr(getCurScope(), Base,
756                                            OpLoc, OpKind,
757                                            SS, FirstTypeName, CCLoc,
758                                            TildeLoc, SecondTypeName,
759                                            Tok.is(tok::l_paren));
760 }
761
762 /// ParseCXXBoolLiteral - This handles the C++ Boolean literals.
763 ///
764 ///       boolean-literal: [C++ 2.13.5]
765 ///         'true'
766 ///         'false'
767 ExprResult Parser::ParseCXXBoolLiteral() {
768   tok::TokenKind Kind = Tok.getKind();
769   return Actions.ActOnCXXBoolLiteral(ConsumeToken(), Kind);
770 }
771
772 /// ParseThrowExpression - This handles the C++ throw expression.
773 ///
774 ///       throw-expression: [C++ 15]
775 ///         'throw' assignment-expression[opt]
776 ExprResult Parser::ParseThrowExpression() {
777   assert(Tok.is(tok::kw_throw) && "Not throw!");
778   SourceLocation ThrowLoc = ConsumeToken();           // Eat the throw token.
779
780   // If the current token isn't the start of an assignment-expression,
781   // then the expression is not present.  This handles things like:
782   //   "C ? throw : (void)42", which is crazy but legal.
783   switch (Tok.getKind()) {  // FIXME: move this predicate somewhere common.
784   case tok::semi:
785   case tok::r_paren:
786   case tok::r_square:
787   case tok::r_brace:
788   case tok::colon:
789   case tok::comma:
790     return Actions.ActOnCXXThrow(getCurScope(), ThrowLoc, 0);
791
792   default:
793     ExprResult Expr(ParseAssignmentExpression());
794     if (Expr.isInvalid()) return move(Expr);
795     return Actions.ActOnCXXThrow(getCurScope(), ThrowLoc, Expr.take());
796   }
797 }
798
799 /// ParseCXXThis - This handles the C++ 'this' pointer.
800 ///
801 /// C++ 9.3.2: In the body of a non-static member function, the keyword this is
802 /// a non-lvalue expression whose value is the address of the object for which
803 /// the function is called.
804 ExprResult Parser::ParseCXXThis() {
805   assert(Tok.is(tok::kw_this) && "Not 'this'!");
806   SourceLocation ThisLoc = ConsumeToken();
807   return Actions.ActOnCXXThis(ThisLoc);
808 }
809
810 /// ParseCXXTypeConstructExpression - Parse construction of a specified type.
811 /// Can be interpreted either as function-style casting ("int(x)")
812 /// or class type construction ("ClassType(x,y,z)")
813 /// or creation of a value-initialized type ("int()").
814 /// See [C++ 5.2.3].
815 ///
816 ///       postfix-expression: [C++ 5.2p1]
817 ///         simple-type-specifier '(' expression-list[opt] ')'
818 /// [C++0x] simple-type-specifier braced-init-list
819 ///         typename-specifier '(' expression-list[opt] ')'
820 /// [C++0x] typename-specifier braced-init-list
821 ///
822 ExprResult
823 Parser::ParseCXXTypeConstructExpression(const DeclSpec &DS) {
824   Declarator DeclaratorInfo(DS, Declarator::TypeNameContext);
825   ParsedType TypeRep = Actions.ActOnTypeName(getCurScope(), DeclaratorInfo).get();
826
827   assert((Tok.is(tok::l_paren) ||
828           (getLang().CPlusPlus0x && Tok.is(tok::l_brace)))
829          && "Expected '(' or '{'!");
830
831   if (Tok.is(tok::l_brace)) {
832
833     // FIXME: Convert to a proper type construct expression.
834     return ParseBraceInitializer();
835
836   } else {
837     GreaterThanIsOperatorScope G(GreaterThanIsOperator, true);
838
839     SourceLocation LParenLoc = ConsumeParen();
840
841     ExprVector Exprs(Actions);
842     CommaLocsTy CommaLocs;
843
844     if (Tok.isNot(tok::r_paren)) {
845       if (ParseExpressionList(Exprs, CommaLocs)) {
846         SkipUntil(tok::r_paren);
847         return ExprError();
848       }
849     }
850
851     // Match the ')'.
852     SourceLocation RParenLoc = MatchRHSPunctuation(tok::r_paren, LParenLoc);
853
854     // TypeRep could be null, if it references an invalid typedef.
855     if (!TypeRep)
856       return ExprError();
857
858     assert((Exprs.size() == 0 || Exprs.size()-1 == CommaLocs.size())&&
859            "Unexpected number of commas!");
860     return Actions.ActOnCXXTypeConstructExpr(TypeRep, LParenLoc, move_arg(Exprs),
861                                              RParenLoc);
862   }
863 }
864
865 /// ParseCXXCondition - if/switch/while condition expression.
866 ///
867 ///       condition:
868 ///         expression
869 ///         type-specifier-seq declarator '=' assignment-expression
870 /// [GNU]   type-specifier-seq declarator simple-asm-expr[opt] attributes[opt]
871 ///             '=' assignment-expression
872 ///
873 /// \param ExprResult if the condition was parsed as an expression, the
874 /// parsed expression.
875 ///
876 /// \param DeclResult if the condition was parsed as a declaration, the
877 /// parsed declaration.
878 ///
879 /// \param Loc The location of the start of the statement that requires this
880 /// condition, e.g., the "for" in a for loop.
881 ///
882 /// \param ConvertToBoolean Whether the condition expression should be
883 /// converted to a boolean value.
884 ///
885 /// \returns true if there was a parsing, false otherwise.
886 bool Parser::ParseCXXCondition(ExprResult &ExprOut,
887                                Decl *&DeclOut,
888                                SourceLocation Loc,
889                                bool ConvertToBoolean) {
890   if (Tok.is(tok::code_completion)) {
891     Actions.CodeCompleteOrdinaryName(getCurScope(), Sema::PCC_Condition);
892     ConsumeCodeCompletionToken();
893   }
894
895   if (!isCXXConditionDeclaration()) {
896     // Parse the expression.
897     ExprOut = ParseExpression(); // expression
898     DeclOut = 0;
899     if (ExprOut.isInvalid())
900       return true;
901
902     // If required, convert to a boolean value.
903     if (ConvertToBoolean)
904       ExprOut
905         = Actions.ActOnBooleanCondition(getCurScope(), Loc, ExprOut.get());
906     return ExprOut.isInvalid();
907   }
908
909   // type-specifier-seq
910   DeclSpec DS(AttrFactory);
911   ParseSpecifierQualifierList(DS);
912
913   // declarator
914   Declarator DeclaratorInfo(DS, Declarator::ConditionContext);
915   ParseDeclarator(DeclaratorInfo);
916
917   // simple-asm-expr[opt]
918   if (Tok.is(tok::kw_asm)) {
919     SourceLocation Loc;
920     ExprResult AsmLabel(ParseSimpleAsm(&Loc));
921     if (AsmLabel.isInvalid()) {
922       SkipUntil(tok::semi);
923       return true;
924     }
925     DeclaratorInfo.setAsmLabel(AsmLabel.release());
926     DeclaratorInfo.SetRangeEnd(Loc);
927   }
928
929   // If attributes are present, parse them.
930   MaybeParseGNUAttributes(DeclaratorInfo);
931
932   // Type-check the declaration itself.
933   DeclResult Dcl = Actions.ActOnCXXConditionDeclaration(getCurScope(), 
934                                                         DeclaratorInfo);
935   DeclOut = Dcl.get();
936   ExprOut = ExprError();
937
938   // '=' assignment-expression
939   if (isTokenEqualOrMistypedEqualEqual(
940                                diag::err_invalid_equalequal_after_declarator)) {
941     ConsumeToken();
942     ExprResult AssignExpr(ParseAssignmentExpression());
943     if (!AssignExpr.isInvalid()) 
944       Actions.AddInitializerToDecl(DeclOut, AssignExpr.take(), false,
945                                    DS.getTypeSpecType() == DeclSpec::TST_auto);
946   } else {
947     // FIXME: C++0x allows a braced-init-list
948     Diag(Tok, diag::err_expected_equal_after_declarator);
949   }
950   
951   // FIXME: Build a reference to this declaration? Convert it to bool?
952   // (This is currently handled by Sema).
953
954   Actions.FinalizeDeclaration(DeclOut);
955   
956   return false;
957 }
958
959 /// \brief Determine whether the current token starts a C++
960 /// simple-type-specifier.
961 bool Parser::isCXXSimpleTypeSpecifier() const {
962   switch (Tok.getKind()) {
963   case tok::annot_typename:
964   case tok::kw_short:
965   case tok::kw_long:
966   case tok::kw___int64:
967   case tok::kw_signed:
968   case tok::kw_unsigned:
969   case tok::kw_void:
970   case tok::kw_char:
971   case tok::kw_int:
972   case tok::kw_float:
973   case tok::kw_double:
974   case tok::kw_wchar_t:
975   case tok::kw_char16_t:
976   case tok::kw_char32_t:
977   case tok::kw_bool:
978   case tok::kw_decltype:
979   case tok::kw_typeof:
980   case tok::kw___underlying_type:
981     return true;
982
983   default:
984     break;
985   }
986
987   return false;
988 }
989
990 /// ParseCXXSimpleTypeSpecifier - [C++ 7.1.5.2] Simple type specifiers.
991 /// This should only be called when the current token is known to be part of
992 /// simple-type-specifier.
993 ///
994 ///       simple-type-specifier:
995 ///         '::'[opt] nested-name-specifier[opt] type-name
996 ///         '::'[opt] nested-name-specifier 'template' simple-template-id [TODO]
997 ///         char
998 ///         wchar_t
999 ///         bool
1000 ///         short
1001 ///         int
1002 ///         long
1003 ///         signed
1004 ///         unsigned
1005 ///         float
1006 ///         double
1007 ///         void
1008 /// [GNU]   typeof-specifier
1009 /// [C++0x] auto               [TODO]
1010 ///
1011 ///       type-name:
1012 ///         class-name
1013 ///         enum-name
1014 ///         typedef-name
1015 ///
1016 void Parser::ParseCXXSimpleTypeSpecifier(DeclSpec &DS) {
1017   DS.SetRangeStart(Tok.getLocation());
1018   const char *PrevSpec;
1019   unsigned DiagID;
1020   SourceLocation Loc = Tok.getLocation();
1021
1022   switch (Tok.getKind()) {
1023   case tok::identifier:   // foo::bar
1024   case tok::coloncolon:   // ::foo::bar
1025     assert(0 && "Annotation token should already be formed!");
1026   default:
1027     assert(0 && "Not a simple-type-specifier token!");
1028     abort();
1029
1030   // type-name
1031   case tok::annot_typename: {
1032     if (getTypeAnnotation(Tok))
1033       DS.SetTypeSpecType(DeclSpec::TST_typename, Loc, PrevSpec, DiagID,
1034                          getTypeAnnotation(Tok));
1035     else
1036       DS.SetTypeSpecError();
1037     
1038     DS.SetRangeEnd(Tok.getAnnotationEndLoc());
1039     ConsumeToken();
1040     
1041     // Objective-C supports syntax of the form 'id<proto1,proto2>' where 'id'
1042     // is a specific typedef and 'itf<proto1,proto2>' where 'itf' is an
1043     // Objective-C interface.  If we don't have Objective-C or a '<', this is
1044     // just a normal reference to a typedef name.
1045     if (Tok.is(tok::less) && getLang().ObjC1)
1046       ParseObjCProtocolQualifiers(DS);
1047     
1048     DS.Finish(Diags, PP);
1049     return;
1050   }
1051
1052   // builtin types
1053   case tok::kw_short:
1054     DS.SetTypeSpecWidth(DeclSpec::TSW_short, Loc, PrevSpec, DiagID);
1055     break;
1056   case tok::kw_long:
1057     DS.SetTypeSpecWidth(DeclSpec::TSW_long, Loc, PrevSpec, DiagID);
1058     break;
1059   case tok::kw___int64:
1060     DS.SetTypeSpecWidth(DeclSpec::TSW_longlong, Loc, PrevSpec, DiagID);
1061     break;
1062   case tok::kw_signed:
1063     DS.SetTypeSpecSign(DeclSpec::TSS_signed, Loc, PrevSpec, DiagID);
1064     break;
1065   case tok::kw_unsigned:
1066     DS.SetTypeSpecSign(DeclSpec::TSS_unsigned, Loc, PrevSpec, DiagID);
1067     break;
1068   case tok::kw_void:
1069     DS.SetTypeSpecType(DeclSpec::TST_void, Loc, PrevSpec, DiagID);
1070     break;
1071   case tok::kw_char:
1072     DS.SetTypeSpecType(DeclSpec::TST_char, Loc, PrevSpec, DiagID);
1073     break;
1074   case tok::kw_int:
1075     DS.SetTypeSpecType(DeclSpec::TST_int, Loc, PrevSpec, DiagID);
1076     break;
1077   case tok::kw_float:
1078     DS.SetTypeSpecType(DeclSpec::TST_float, Loc, PrevSpec, DiagID);
1079     break;
1080   case tok::kw_double:
1081     DS.SetTypeSpecType(DeclSpec::TST_double, Loc, PrevSpec, DiagID);
1082     break;
1083   case tok::kw_wchar_t:
1084     DS.SetTypeSpecType(DeclSpec::TST_wchar, Loc, PrevSpec, DiagID);
1085     break;
1086   case tok::kw_char16_t:
1087     DS.SetTypeSpecType(DeclSpec::TST_char16, Loc, PrevSpec, DiagID);
1088     break;
1089   case tok::kw_char32_t:
1090     DS.SetTypeSpecType(DeclSpec::TST_char32, Loc, PrevSpec, DiagID);
1091     break;
1092   case tok::kw_bool:
1093     DS.SetTypeSpecType(DeclSpec::TST_bool, Loc, PrevSpec, DiagID);
1094     break;
1095
1096     // FIXME: C++0x decltype support.
1097   // GNU typeof support.
1098   case tok::kw_typeof:
1099     ParseTypeofSpecifier(DS);
1100     DS.Finish(Diags, PP);
1101     return;
1102   }
1103   if (Tok.is(tok::annot_typename))
1104     DS.SetRangeEnd(Tok.getAnnotationEndLoc());
1105   else
1106     DS.SetRangeEnd(Tok.getLocation());
1107   ConsumeToken();
1108   DS.Finish(Diags, PP);
1109 }
1110
1111 /// ParseCXXTypeSpecifierSeq - Parse a C++ type-specifier-seq (C++
1112 /// [dcl.name]), which is a non-empty sequence of type-specifiers,
1113 /// e.g., "const short int". Note that the DeclSpec is *not* finished
1114 /// by parsing the type-specifier-seq, because these sequences are
1115 /// typically followed by some form of declarator. Returns true and
1116 /// emits diagnostics if this is not a type-specifier-seq, false
1117 /// otherwise.
1118 ///
1119 ///   type-specifier-seq: [C++ 8.1]
1120 ///     type-specifier type-specifier-seq[opt]
1121 ///
1122 bool Parser::ParseCXXTypeSpecifierSeq(DeclSpec &DS) {
1123   DS.SetRangeStart(Tok.getLocation());
1124   const char *PrevSpec = 0;
1125   unsigned DiagID;
1126   bool isInvalid = 0;
1127
1128   // Parse one or more of the type specifiers.
1129   if (!ParseOptionalTypeSpecifier(DS, isInvalid, PrevSpec, DiagID,
1130       ParsedTemplateInfo(), /*SuppressDeclarations*/true)) {
1131     Diag(Tok, diag::err_expected_type);
1132     return true;
1133   }
1134
1135   while (ParseOptionalTypeSpecifier(DS, isInvalid, PrevSpec, DiagID,
1136          ParsedTemplateInfo(), /*SuppressDeclarations*/true))
1137   {}
1138
1139   DS.Finish(Diags, PP);
1140   return false;
1141 }
1142
1143 /// \brief Finish parsing a C++ unqualified-id that is a template-id of
1144 /// some form. 
1145 ///
1146 /// This routine is invoked when a '<' is encountered after an identifier or
1147 /// operator-function-id is parsed by \c ParseUnqualifiedId() to determine
1148 /// whether the unqualified-id is actually a template-id. This routine will
1149 /// then parse the template arguments and form the appropriate template-id to
1150 /// return to the caller.
1151 ///
1152 /// \param SS the nested-name-specifier that precedes this template-id, if
1153 /// we're actually parsing a qualified-id.
1154 ///
1155 /// \param Name for constructor and destructor names, this is the actual
1156 /// identifier that may be a template-name.
1157 ///
1158 /// \param NameLoc the location of the class-name in a constructor or 
1159 /// destructor.
1160 ///
1161 /// \param EnteringContext whether we're entering the scope of the 
1162 /// nested-name-specifier.
1163 ///
1164 /// \param ObjectType if this unqualified-id occurs within a member access
1165 /// expression, the type of the base object whose member is being accessed.
1166 ///
1167 /// \param Id as input, describes the template-name or operator-function-id
1168 /// that precedes the '<'. If template arguments were parsed successfully,
1169 /// will be updated with the template-id.
1170 /// 
1171 /// \param AssumeTemplateId When true, this routine will assume that the name
1172 /// refers to a template without performing name lookup to verify. 
1173 ///
1174 /// \returns true if a parse error occurred, false otherwise.
1175 bool Parser::ParseUnqualifiedIdTemplateId(CXXScopeSpec &SS,
1176                                           IdentifierInfo *Name,
1177                                           SourceLocation NameLoc,
1178                                           bool EnteringContext,
1179                                           ParsedType ObjectType,
1180                                           UnqualifiedId &Id,
1181                                           bool AssumeTemplateId,
1182                                           SourceLocation TemplateKWLoc) {
1183   assert((AssumeTemplateId || Tok.is(tok::less)) &&
1184          "Expected '<' to finish parsing a template-id");
1185   
1186   TemplateTy Template;
1187   TemplateNameKind TNK = TNK_Non_template;
1188   switch (Id.getKind()) {
1189   case UnqualifiedId::IK_Identifier:
1190   case UnqualifiedId::IK_OperatorFunctionId:
1191   case UnqualifiedId::IK_LiteralOperatorId:
1192     if (AssumeTemplateId) {
1193       TNK = Actions.ActOnDependentTemplateName(getCurScope(), TemplateKWLoc, SS, 
1194                                                Id, ObjectType, EnteringContext,
1195                                                Template);
1196       if (TNK == TNK_Non_template)
1197         return true;
1198     } else {
1199       bool MemberOfUnknownSpecialization;
1200       TNK = Actions.isTemplateName(getCurScope(), SS,
1201                                    TemplateKWLoc.isValid(), Id,
1202                                    ObjectType, EnteringContext, Template,
1203                                    MemberOfUnknownSpecialization);
1204       
1205       if (TNK == TNK_Non_template && MemberOfUnknownSpecialization &&
1206           ObjectType && IsTemplateArgumentList()) {
1207         // We have something like t->getAs<T>(), where getAs is a 
1208         // member of an unknown specialization. However, this will only
1209         // parse correctly as a template, so suggest the keyword 'template'
1210         // before 'getAs' and treat this as a dependent template name.
1211         std::string Name;
1212         if (Id.getKind() == UnqualifiedId::IK_Identifier)
1213           Name = Id.Identifier->getName();
1214         else {
1215           Name = "operator ";
1216           if (Id.getKind() == UnqualifiedId::IK_OperatorFunctionId)
1217             Name += getOperatorSpelling(Id.OperatorFunctionId.Operator);
1218           else
1219             Name += Id.Identifier->getName();
1220         }
1221         Diag(Id.StartLocation, diag::err_missing_dependent_template_keyword)
1222           << Name
1223           << FixItHint::CreateInsertion(Id.StartLocation, "template ");
1224         TNK = Actions.ActOnDependentTemplateName(getCurScope(), TemplateKWLoc,
1225                                                  SS, Id, ObjectType,
1226                                                  EnteringContext, Template);
1227         if (TNK == TNK_Non_template)
1228           return true;              
1229       }
1230     }
1231     break;
1232       
1233   case UnqualifiedId::IK_ConstructorName: {
1234     UnqualifiedId TemplateName;
1235     bool MemberOfUnknownSpecialization;
1236     TemplateName.setIdentifier(Name, NameLoc);
1237     TNK = Actions.isTemplateName(getCurScope(), SS, TemplateKWLoc.isValid(),
1238                                  TemplateName, ObjectType, 
1239                                  EnteringContext, Template,
1240                                  MemberOfUnknownSpecialization);
1241     break;
1242   }
1243       
1244   case UnqualifiedId::IK_DestructorName: {
1245     UnqualifiedId TemplateName;
1246     bool MemberOfUnknownSpecialization;
1247     TemplateName.setIdentifier(Name, NameLoc);
1248     if (ObjectType) {
1249       TNK = Actions.ActOnDependentTemplateName(getCurScope(), TemplateKWLoc, SS, 
1250                                                TemplateName, ObjectType,
1251                                                EnteringContext, Template);
1252       if (TNK == TNK_Non_template)
1253         return true;
1254     } else {
1255       TNK = Actions.isTemplateName(getCurScope(), SS, TemplateKWLoc.isValid(),
1256                                    TemplateName, ObjectType, 
1257                                    EnteringContext, Template,
1258                                    MemberOfUnknownSpecialization);
1259       
1260       if (TNK == TNK_Non_template && !Id.DestructorName.get()) {
1261         Diag(NameLoc, diag::err_destructor_template_id)
1262           << Name << SS.getRange();
1263         return true;        
1264       }
1265     }
1266     break;
1267   }
1268       
1269   default:
1270     return false;
1271   }
1272   
1273   if (TNK == TNK_Non_template)
1274     return false;
1275   
1276   // Parse the enclosed template argument list.
1277   SourceLocation LAngleLoc, RAngleLoc;
1278   TemplateArgList TemplateArgs;
1279   if (Tok.is(tok::less) &&
1280       ParseTemplateIdAfterTemplateName(Template, Id.StartLocation,
1281                                        SS, true, LAngleLoc,
1282                                        TemplateArgs,
1283                                        RAngleLoc))
1284     return true;
1285   
1286   if (Id.getKind() == UnqualifiedId::IK_Identifier ||
1287       Id.getKind() == UnqualifiedId::IK_OperatorFunctionId ||
1288       Id.getKind() == UnqualifiedId::IK_LiteralOperatorId) {
1289     // Form a parsed representation of the template-id to be stored in the
1290     // UnqualifiedId.
1291     TemplateIdAnnotation *TemplateId
1292       = TemplateIdAnnotation::Allocate(TemplateArgs.size());
1293
1294     if (Id.getKind() == UnqualifiedId::IK_Identifier) {
1295       TemplateId->Name = Id.Identifier;
1296       TemplateId->Operator = OO_None;
1297       TemplateId->TemplateNameLoc = Id.StartLocation;
1298     } else {
1299       TemplateId->Name = 0;
1300       TemplateId->Operator = Id.OperatorFunctionId.Operator;
1301       TemplateId->TemplateNameLoc = Id.StartLocation;
1302     }
1303
1304     TemplateId->SS = SS;
1305     TemplateId->Template = Template;
1306     TemplateId->Kind = TNK;
1307     TemplateId->LAngleLoc = LAngleLoc;
1308     TemplateId->RAngleLoc = RAngleLoc;
1309     ParsedTemplateArgument *Args = TemplateId->getTemplateArgs();
1310     for (unsigned Arg = 0, ArgEnd = TemplateArgs.size(); 
1311          Arg != ArgEnd; ++Arg)
1312       Args[Arg] = TemplateArgs[Arg];
1313     
1314     Id.setTemplateId(TemplateId);
1315     return false;
1316   }
1317
1318   // Bundle the template arguments together.
1319   ASTTemplateArgsPtr TemplateArgsPtr(Actions, TemplateArgs.data(),
1320                                      TemplateArgs.size());
1321   
1322   // Constructor and destructor names.
1323   TypeResult Type
1324     = Actions.ActOnTemplateIdType(SS, Template, NameLoc,
1325                                   LAngleLoc, TemplateArgsPtr,
1326                                   RAngleLoc);
1327   if (Type.isInvalid())
1328     return true;
1329   
1330   if (Id.getKind() == UnqualifiedId::IK_ConstructorName)
1331     Id.setConstructorName(Type.get(), NameLoc, RAngleLoc);
1332   else
1333     Id.setDestructorName(Id.StartLocation, Type.get(), RAngleLoc);
1334   
1335   return false;
1336 }
1337
1338 /// \brief Parse an operator-function-id or conversion-function-id as part
1339 /// of a C++ unqualified-id.
1340 ///
1341 /// This routine is responsible only for parsing the operator-function-id or
1342 /// conversion-function-id; it does not handle template arguments in any way.
1343 ///
1344 /// \code
1345 ///       operator-function-id: [C++ 13.5]
1346 ///         'operator' operator
1347 ///
1348 ///       operator: one of
1349 ///            new   delete  new[]   delete[]
1350 ///            +     -    *  /    %  ^    &   |   ~
1351 ///            !     =    <  >    += -=   *=  /=  %=
1352 ///            ^=    &=   |= <<   >> >>= <<=  ==  !=
1353 ///            <=    >=   && ||   ++ --   ,   ->* ->
1354 ///            ()    []
1355 ///
1356 ///       conversion-function-id: [C++ 12.3.2]
1357 ///         operator conversion-type-id
1358 ///
1359 ///       conversion-type-id:
1360 ///         type-specifier-seq conversion-declarator[opt]
1361 ///
1362 ///       conversion-declarator:
1363 ///         ptr-operator conversion-declarator[opt]
1364 /// \endcode
1365 ///
1366 /// \param The nested-name-specifier that preceded this unqualified-id. If
1367 /// non-empty, then we are parsing the unqualified-id of a qualified-id.
1368 ///
1369 /// \param EnteringContext whether we are entering the scope of the 
1370 /// nested-name-specifier.
1371 ///
1372 /// \param ObjectType if this unqualified-id occurs within a member access
1373 /// expression, the type of the base object whose member is being accessed.
1374 ///
1375 /// \param Result on a successful parse, contains the parsed unqualified-id.
1376 ///
1377 /// \returns true if parsing fails, false otherwise.
1378 bool Parser::ParseUnqualifiedIdOperator(CXXScopeSpec &SS, bool EnteringContext,
1379                                         ParsedType ObjectType,
1380                                         UnqualifiedId &Result) {
1381   assert(Tok.is(tok::kw_operator) && "Expected 'operator' keyword");
1382   
1383   // Consume the 'operator' keyword.
1384   SourceLocation KeywordLoc = ConsumeToken();
1385   
1386   // Determine what kind of operator name we have.
1387   unsigned SymbolIdx = 0;
1388   SourceLocation SymbolLocations[3];
1389   OverloadedOperatorKind Op = OO_None;
1390   switch (Tok.getKind()) {
1391     case tok::kw_new:
1392     case tok::kw_delete: {
1393       bool isNew = Tok.getKind() == tok::kw_new;
1394       // Consume the 'new' or 'delete'.
1395       SymbolLocations[SymbolIdx++] = ConsumeToken();
1396       if (Tok.is(tok::l_square)) {
1397         // Consume the '['.
1398         SourceLocation LBracketLoc = ConsumeBracket();
1399         // Consume the ']'.
1400         SourceLocation RBracketLoc = MatchRHSPunctuation(tok::r_square,
1401                                                          LBracketLoc);
1402         if (RBracketLoc.isInvalid())
1403           return true;
1404         
1405         SymbolLocations[SymbolIdx++] = LBracketLoc;
1406         SymbolLocations[SymbolIdx++] = RBracketLoc;
1407         Op = isNew? OO_Array_New : OO_Array_Delete;
1408       } else {
1409         Op = isNew? OO_New : OO_Delete;
1410       }
1411       break;
1412     }
1413       
1414 #define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \
1415     case tok::Token:                                                     \
1416       SymbolLocations[SymbolIdx++] = ConsumeToken();                     \
1417       Op = OO_##Name;                                                    \
1418       break;
1419 #define OVERLOADED_OPERATOR_MULTI(Name,Spelling,Unary,Binary,MemberOnly)
1420 #include "clang/Basic/OperatorKinds.def"
1421       
1422     case tok::l_paren: {
1423       // Consume the '('.
1424       SourceLocation LParenLoc = ConsumeParen();
1425       // Consume the ')'.
1426       SourceLocation RParenLoc = MatchRHSPunctuation(tok::r_paren,
1427                                                      LParenLoc);
1428       if (RParenLoc.isInvalid())
1429         return true;
1430       
1431       SymbolLocations[SymbolIdx++] = LParenLoc;
1432       SymbolLocations[SymbolIdx++] = RParenLoc;
1433       Op = OO_Call;
1434       break;
1435     }
1436       
1437     case tok::l_square: {
1438       // Consume the '['.
1439       SourceLocation LBracketLoc = ConsumeBracket();
1440       // Consume the ']'.
1441       SourceLocation RBracketLoc = MatchRHSPunctuation(tok::r_square,
1442                                                        LBracketLoc);
1443       if (RBracketLoc.isInvalid())
1444         return true;
1445       
1446       SymbolLocations[SymbolIdx++] = LBracketLoc;
1447       SymbolLocations[SymbolIdx++] = RBracketLoc;
1448       Op = OO_Subscript;
1449       break;
1450     }
1451       
1452     case tok::code_completion: {
1453       // Code completion for the operator name.
1454       Actions.CodeCompleteOperatorName(getCurScope());
1455       
1456       // Consume the operator token.
1457       ConsumeCodeCompletionToken();
1458       
1459       // Don't try to parse any further.
1460       return true;
1461     }
1462       
1463     default:
1464       break;
1465   }
1466   
1467   if (Op != OO_None) {
1468     // We have parsed an operator-function-id.
1469     Result.setOperatorFunctionId(KeywordLoc, Op, SymbolLocations);
1470     return false;
1471   }
1472
1473   // Parse a literal-operator-id.
1474   //
1475   //   literal-operator-id: [C++0x 13.5.8]
1476   //     operator "" identifier
1477
1478   if (getLang().CPlusPlus0x && Tok.is(tok::string_literal)) {
1479     if (Tok.getLength() != 2)
1480       Diag(Tok.getLocation(), diag::err_operator_string_not_empty);
1481     ConsumeStringToken();
1482
1483     if (Tok.isNot(tok::identifier)) {
1484       Diag(Tok.getLocation(), diag::err_expected_ident);
1485       return true;
1486     }
1487
1488     IdentifierInfo *II = Tok.getIdentifierInfo();
1489     Result.setLiteralOperatorId(II, KeywordLoc, ConsumeToken());
1490     return false;
1491   }
1492   
1493   // Parse a conversion-function-id.
1494   //
1495   //   conversion-function-id: [C++ 12.3.2]
1496   //     operator conversion-type-id
1497   //
1498   //   conversion-type-id:
1499   //     type-specifier-seq conversion-declarator[opt]
1500   //
1501   //   conversion-declarator:
1502   //     ptr-operator conversion-declarator[opt]
1503   
1504   // Parse the type-specifier-seq.
1505   DeclSpec DS(AttrFactory);
1506   if (ParseCXXTypeSpecifierSeq(DS)) // FIXME: ObjectType?
1507     return true;
1508   
1509   // Parse the conversion-declarator, which is merely a sequence of
1510   // ptr-operators.
1511   Declarator D(DS, Declarator::TypeNameContext);
1512   ParseDeclaratorInternal(D, /*DirectDeclParser=*/0);
1513   
1514   // Finish up the type.
1515   TypeResult Ty = Actions.ActOnTypeName(getCurScope(), D);
1516   if (Ty.isInvalid())
1517     return true;
1518   
1519   // Note that this is a conversion-function-id.
1520   Result.setConversionFunctionId(KeywordLoc, Ty.get(), 
1521                                  D.getSourceRange().getEnd());
1522   return false;  
1523 }
1524
1525 /// \brief Parse a C++ unqualified-id (or a C identifier), which describes the
1526 /// name of an entity.
1527 ///
1528 /// \code
1529 ///       unqualified-id: [C++ expr.prim.general]
1530 ///         identifier
1531 ///         operator-function-id
1532 ///         conversion-function-id
1533 /// [C++0x] literal-operator-id [TODO]
1534 ///         ~ class-name
1535 ///         template-id
1536 ///
1537 /// \endcode
1538 ///
1539 /// \param The nested-name-specifier that preceded this unqualified-id. If
1540 /// non-empty, then we are parsing the unqualified-id of a qualified-id.
1541 ///
1542 /// \param EnteringContext whether we are entering the scope of the 
1543 /// nested-name-specifier.
1544 ///
1545 /// \param AllowDestructorName whether we allow parsing of a destructor name.
1546 ///
1547 /// \param AllowConstructorName whether we allow parsing a constructor name.
1548 ///
1549 /// \param ObjectType if this unqualified-id occurs within a member access
1550 /// expression, the type of the base object whose member is being accessed.
1551 ///
1552 /// \param Result on a successful parse, contains the parsed unqualified-id.
1553 ///
1554 /// \returns true if parsing fails, false otherwise.
1555 bool Parser::ParseUnqualifiedId(CXXScopeSpec &SS, bool EnteringContext,
1556                                 bool AllowDestructorName,
1557                                 bool AllowConstructorName,
1558                                 ParsedType ObjectType,
1559                                 UnqualifiedId &Result) {
1560
1561   // Handle 'A::template B'. This is for template-ids which have not
1562   // already been annotated by ParseOptionalCXXScopeSpecifier().
1563   bool TemplateSpecified = false;
1564   SourceLocation TemplateKWLoc;
1565   if (getLang().CPlusPlus && Tok.is(tok::kw_template) &&
1566       (ObjectType || SS.isSet())) {
1567     TemplateSpecified = true;
1568     TemplateKWLoc = ConsumeToken();
1569   }
1570
1571   // unqualified-id:
1572   //   identifier
1573   //   template-id (when it hasn't already been annotated)
1574   if (Tok.is(tok::identifier)) {
1575     // Consume the identifier.
1576     IdentifierInfo *Id = Tok.getIdentifierInfo();
1577     SourceLocation IdLoc = ConsumeToken();
1578
1579     if (!getLang().CPlusPlus) {
1580       // If we're not in C++, only identifiers matter. Record the
1581       // identifier and return.
1582       Result.setIdentifier(Id, IdLoc);
1583       return false;
1584     }
1585
1586     if (AllowConstructorName && 
1587         Actions.isCurrentClassName(*Id, getCurScope(), &SS)) {
1588       // We have parsed a constructor name.
1589       Result.setConstructorName(Actions.getTypeName(*Id, IdLoc, getCurScope(),
1590                                                     &SS, false, false,
1591                                                     ParsedType(),
1592                                             /*NonTrivialTypeSourceInfo=*/true),
1593                                 IdLoc, IdLoc);
1594     } else {
1595       // We have parsed an identifier.
1596       Result.setIdentifier(Id, IdLoc);      
1597     }
1598
1599     // If the next token is a '<', we may have a template.
1600     if (TemplateSpecified || Tok.is(tok::less))
1601       return ParseUnqualifiedIdTemplateId(SS, Id, IdLoc, EnteringContext, 
1602                                           ObjectType, Result,
1603                                           TemplateSpecified, TemplateKWLoc);
1604     
1605     return false;
1606   }
1607   
1608   // unqualified-id:
1609   //   template-id (already parsed and annotated)
1610   if (Tok.is(tok::annot_template_id)) {
1611     TemplateIdAnnotation *TemplateId = takeTemplateIdAnnotation(Tok);
1612
1613     // If the template-name names the current class, then this is a constructor 
1614     if (AllowConstructorName && TemplateId->Name &&
1615         Actions.isCurrentClassName(*TemplateId->Name, getCurScope(), &SS)) {
1616       if (SS.isSet()) {
1617         // C++ [class.qual]p2 specifies that a qualified template-name
1618         // is taken as the constructor name where a constructor can be
1619         // declared. Thus, the template arguments are extraneous, so
1620         // complain about them and remove them entirely.
1621         Diag(TemplateId->TemplateNameLoc, 
1622              diag::err_out_of_line_constructor_template_id)
1623           << TemplateId->Name
1624           << FixItHint::CreateRemoval(
1625                     SourceRange(TemplateId->LAngleLoc, TemplateId->RAngleLoc));
1626         Result.setConstructorName(Actions.getTypeName(*TemplateId->Name,
1627                                                   TemplateId->TemplateNameLoc, 
1628                                                       getCurScope(),
1629                                                       &SS, false, false,
1630                                                       ParsedType(),
1631                                             /*NontrivialTypeSourceInfo=*/true),
1632                                   TemplateId->TemplateNameLoc, 
1633                                   TemplateId->RAngleLoc);
1634         ConsumeToken();
1635         return false;
1636       }
1637
1638       Result.setConstructorTemplateId(TemplateId);
1639       ConsumeToken();
1640       return false;
1641     }
1642
1643     // We have already parsed a template-id; consume the annotation token as
1644     // our unqualified-id.
1645     Result.setTemplateId(TemplateId);
1646     ConsumeToken();
1647     return false;
1648   }
1649   
1650   // unqualified-id:
1651   //   operator-function-id
1652   //   conversion-function-id
1653   if (Tok.is(tok::kw_operator)) {
1654     if (ParseUnqualifiedIdOperator(SS, EnteringContext, ObjectType, Result))
1655       return true;
1656     
1657     // If we have an operator-function-id or a literal-operator-id and the next
1658     // token is a '<', we may have a
1659     // 
1660     //   template-id:
1661     //     operator-function-id < template-argument-list[opt] >
1662     if ((Result.getKind() == UnqualifiedId::IK_OperatorFunctionId ||
1663          Result.getKind() == UnqualifiedId::IK_LiteralOperatorId) &&
1664         (TemplateSpecified || Tok.is(tok::less)))
1665       return ParseUnqualifiedIdTemplateId(SS, 0, SourceLocation(), 
1666                                           EnteringContext, ObjectType, 
1667                                           Result,
1668                                           TemplateSpecified, TemplateKWLoc);
1669     
1670     return false;
1671   }
1672   
1673   if (getLang().CPlusPlus && 
1674       (AllowDestructorName || SS.isSet()) && Tok.is(tok::tilde)) {
1675     // C++ [expr.unary.op]p10:
1676     //   There is an ambiguity in the unary-expression ~X(), where X is a 
1677     //   class-name. The ambiguity is resolved in favor of treating ~ as a 
1678     //    unary complement rather than treating ~X as referring to a destructor.
1679     
1680     // Parse the '~'.
1681     SourceLocation TildeLoc = ConsumeToken();
1682     
1683     // Parse the class-name.
1684     if (Tok.isNot(tok::identifier)) {
1685       Diag(Tok, diag::err_destructor_tilde_identifier);
1686       return true;
1687     }
1688
1689     // Parse the class-name (or template-name in a simple-template-id).
1690     IdentifierInfo *ClassName = Tok.getIdentifierInfo();
1691     SourceLocation ClassNameLoc = ConsumeToken();
1692     
1693     if (TemplateSpecified || Tok.is(tok::less)) {
1694       Result.setDestructorName(TildeLoc, ParsedType(), ClassNameLoc);
1695       return ParseUnqualifiedIdTemplateId(SS, ClassName, ClassNameLoc,
1696                                           EnteringContext, ObjectType, Result,
1697                                           TemplateSpecified, TemplateKWLoc);
1698     }
1699     
1700     // Note that this is a destructor name.
1701     ParsedType Ty = Actions.getDestructorName(TildeLoc, *ClassName, 
1702                                               ClassNameLoc, getCurScope(),
1703                                               SS, ObjectType,
1704                                               EnteringContext);
1705     if (!Ty)
1706       return true;
1707
1708     Result.setDestructorName(TildeLoc, Ty, ClassNameLoc);
1709     return false;
1710   }
1711   
1712   Diag(Tok, diag::err_expected_unqualified_id)
1713     << getLang().CPlusPlus;
1714   return true;
1715 }
1716
1717 /// ParseCXXNewExpression - Parse a C++ new-expression. New is used to allocate
1718 /// memory in a typesafe manner and call constructors.
1719 ///
1720 /// This method is called to parse the new expression after the optional :: has
1721 /// been already parsed.  If the :: was present, "UseGlobal" is true and "Start"
1722 /// is its location.  Otherwise, "Start" is the location of the 'new' token.
1723 ///
1724 ///        new-expression:
1725 ///                   '::'[opt] 'new' new-placement[opt] new-type-id
1726 ///                                     new-initializer[opt]
1727 ///                   '::'[opt] 'new' new-placement[opt] '(' type-id ')'
1728 ///                                     new-initializer[opt]
1729 ///
1730 ///        new-placement:
1731 ///                   '(' expression-list ')'
1732 ///
1733 ///        new-type-id:
1734 ///                   type-specifier-seq new-declarator[opt]
1735 /// [GNU]             attributes type-specifier-seq new-declarator[opt]
1736 ///
1737 ///        new-declarator:
1738 ///                   ptr-operator new-declarator[opt]
1739 ///                   direct-new-declarator
1740 ///
1741 ///        new-initializer:
1742 ///                   '(' expression-list[opt] ')'
1743 /// [C++0x]           braced-init-list
1744 ///
1745 ExprResult
1746 Parser::ParseCXXNewExpression(bool UseGlobal, SourceLocation Start) {
1747   assert(Tok.is(tok::kw_new) && "expected 'new' token");
1748   ConsumeToken();   // Consume 'new'
1749
1750   // A '(' now can be a new-placement or the '(' wrapping the type-id in the
1751   // second form of new-expression. It can't be a new-type-id.
1752
1753   ExprVector PlacementArgs(Actions);
1754   SourceLocation PlacementLParen, PlacementRParen;
1755
1756   SourceRange TypeIdParens;
1757   DeclSpec DS(AttrFactory);
1758   Declarator DeclaratorInfo(DS, Declarator::CXXNewContext);
1759   if (Tok.is(tok::l_paren)) {
1760     // If it turns out to be a placement, we change the type location.
1761     PlacementLParen = ConsumeParen();
1762     if (ParseExpressionListOrTypeId(PlacementArgs, DeclaratorInfo)) {
1763       SkipUntil(tok::semi, /*StopAtSemi=*/true, /*DontConsume=*/true);
1764       return ExprError();
1765     }
1766
1767     PlacementRParen = MatchRHSPunctuation(tok::r_paren, PlacementLParen);
1768     if (PlacementRParen.isInvalid()) {
1769       SkipUntil(tok::semi, /*StopAtSemi=*/true, /*DontConsume=*/true);
1770       return ExprError();
1771     }
1772
1773     if (PlacementArgs.empty()) {
1774       // Reset the placement locations. There was no placement.
1775       TypeIdParens = SourceRange(PlacementLParen, PlacementRParen);
1776       PlacementLParen = PlacementRParen = SourceLocation();
1777     } else {
1778       // We still need the type.
1779       if (Tok.is(tok::l_paren)) {
1780         TypeIdParens.setBegin(ConsumeParen());
1781         MaybeParseGNUAttributes(DeclaratorInfo);
1782         ParseSpecifierQualifierList(DS);
1783         DeclaratorInfo.SetSourceRange(DS.getSourceRange());
1784         ParseDeclarator(DeclaratorInfo);
1785         TypeIdParens.setEnd(MatchRHSPunctuation(tok::r_paren, 
1786                                                 TypeIdParens.getBegin()));
1787       } else {
1788         MaybeParseGNUAttributes(DeclaratorInfo);
1789         if (ParseCXXTypeSpecifierSeq(DS))
1790           DeclaratorInfo.setInvalidType(true);
1791         else {
1792           DeclaratorInfo.SetSourceRange(DS.getSourceRange());
1793           ParseDeclaratorInternal(DeclaratorInfo,
1794                                   &Parser::ParseDirectNewDeclarator);
1795         }
1796       }
1797     }
1798   } else {
1799     // A new-type-id is a simplified type-id, where essentially the
1800     // direct-declarator is replaced by a direct-new-declarator.
1801     MaybeParseGNUAttributes(DeclaratorInfo);
1802     if (ParseCXXTypeSpecifierSeq(DS))
1803       DeclaratorInfo.setInvalidType(true);
1804     else {
1805       DeclaratorInfo.SetSourceRange(DS.getSourceRange());
1806       ParseDeclaratorInternal(DeclaratorInfo,
1807                               &Parser::ParseDirectNewDeclarator);
1808     }
1809   }
1810   if (DeclaratorInfo.isInvalidType()) {
1811     SkipUntil(tok::semi, /*StopAtSemi=*/true, /*DontConsume=*/true);
1812     return ExprError();
1813   }
1814
1815   ExprVector ConstructorArgs(Actions);
1816   SourceLocation ConstructorLParen, ConstructorRParen;
1817
1818   if (Tok.is(tok::l_paren)) {
1819     ConstructorLParen = ConsumeParen();
1820     if (Tok.isNot(tok::r_paren)) {
1821       CommaLocsTy CommaLocs;
1822       if (ParseExpressionList(ConstructorArgs, CommaLocs)) {
1823         SkipUntil(tok::semi, /*StopAtSemi=*/true, /*DontConsume=*/true);
1824         return ExprError();
1825       }
1826     }
1827     ConstructorRParen = MatchRHSPunctuation(tok::r_paren, ConstructorLParen);
1828     if (ConstructorRParen.isInvalid()) {
1829       SkipUntil(tok::semi, /*StopAtSemi=*/true, /*DontConsume=*/true);
1830       return ExprError();
1831     }
1832   } else if (Tok.is(tok::l_brace)) {
1833     // FIXME: Have to communicate the init-list to ActOnCXXNew.
1834     ParseBraceInitializer();
1835   }
1836
1837   return Actions.ActOnCXXNew(Start, UseGlobal, PlacementLParen,
1838                              move_arg(PlacementArgs), PlacementRParen,
1839                              TypeIdParens, DeclaratorInfo, ConstructorLParen,
1840                              move_arg(ConstructorArgs), ConstructorRParen);
1841 }
1842
1843 /// ParseDirectNewDeclarator - Parses a direct-new-declarator. Intended to be
1844 /// passed to ParseDeclaratorInternal.
1845 ///
1846 ///        direct-new-declarator:
1847 ///                   '[' expression ']'
1848 ///                   direct-new-declarator '[' constant-expression ']'
1849 ///
1850 void Parser::ParseDirectNewDeclarator(Declarator &D) {
1851   // Parse the array dimensions.
1852   bool first = true;
1853   while (Tok.is(tok::l_square)) {
1854     SourceLocation LLoc = ConsumeBracket();
1855     ExprResult Size(first ? ParseExpression()
1856                                 : ParseConstantExpression());
1857     if (Size.isInvalid()) {
1858       // Recover
1859       SkipUntil(tok::r_square);
1860       return;
1861     }
1862     first = false;
1863
1864     SourceLocation RLoc = MatchRHSPunctuation(tok::r_square, LLoc);
1865
1866     ParsedAttributes attrs(AttrFactory);
1867     D.AddTypeInfo(DeclaratorChunk::getArray(0,
1868                                             /*static=*/false, /*star=*/false,
1869                                             Size.release(), LLoc, RLoc),
1870                   attrs, RLoc);
1871
1872     if (RLoc.isInvalid())
1873       return;
1874   }
1875 }
1876
1877 /// ParseExpressionListOrTypeId - Parse either an expression-list or a type-id.
1878 /// This ambiguity appears in the syntax of the C++ new operator.
1879 ///
1880 ///        new-expression:
1881 ///                   '::'[opt] 'new' new-placement[opt] '(' type-id ')'
1882 ///                                     new-initializer[opt]
1883 ///
1884 ///        new-placement:
1885 ///                   '(' expression-list ')'
1886 ///
1887 bool Parser::ParseExpressionListOrTypeId(
1888                                    llvm::SmallVectorImpl<Expr*> &PlacementArgs,
1889                                          Declarator &D) {
1890   // The '(' was already consumed.
1891   if (isTypeIdInParens()) {
1892     ParseSpecifierQualifierList(D.getMutableDeclSpec());
1893     D.SetSourceRange(D.getDeclSpec().getSourceRange());
1894     ParseDeclarator(D);
1895     return D.isInvalidType();
1896   }
1897
1898   // It's not a type, it has to be an expression list.
1899   // Discard the comma locations - ActOnCXXNew has enough parameters.
1900   CommaLocsTy CommaLocs;
1901   return ParseExpressionList(PlacementArgs, CommaLocs);
1902 }
1903
1904 /// ParseCXXDeleteExpression - Parse a C++ delete-expression. Delete is used
1905 /// to free memory allocated by new.
1906 ///
1907 /// This method is called to parse the 'delete' expression after the optional
1908 /// '::' has been already parsed.  If the '::' was present, "UseGlobal" is true
1909 /// and "Start" is its location.  Otherwise, "Start" is the location of the
1910 /// 'delete' token.
1911 ///
1912 ///        delete-expression:
1913 ///                   '::'[opt] 'delete' cast-expression
1914 ///                   '::'[opt] 'delete' '[' ']' cast-expression
1915 ExprResult
1916 Parser::ParseCXXDeleteExpression(bool UseGlobal, SourceLocation Start) {
1917   assert(Tok.is(tok::kw_delete) && "Expected 'delete' keyword");
1918   ConsumeToken(); // Consume 'delete'
1919
1920   // Array delete?
1921   bool ArrayDelete = false;
1922   if (Tok.is(tok::l_square)) {
1923     ArrayDelete = true;
1924     SourceLocation LHS = ConsumeBracket();
1925     SourceLocation RHS = MatchRHSPunctuation(tok::r_square, LHS);
1926     if (RHS.isInvalid())
1927       return ExprError();
1928   }
1929
1930   ExprResult Operand(ParseCastExpression(false));
1931   if (Operand.isInvalid())
1932     return move(Operand);
1933
1934   return Actions.ActOnCXXDelete(Start, UseGlobal, ArrayDelete, Operand.take());
1935 }
1936
1937 static UnaryTypeTrait UnaryTypeTraitFromTokKind(tok::TokenKind kind) {
1938   switch(kind) {
1939   default: assert(false && "Not a known unary type trait.");
1940   case tok::kw___has_nothrow_assign:      return UTT_HasNothrowAssign;
1941   case tok::kw___has_nothrow_constructor: return UTT_HasNothrowConstructor;
1942   case tok::kw___has_nothrow_copy:           return UTT_HasNothrowCopy;
1943   case tok::kw___has_trivial_assign:      return UTT_HasTrivialAssign;
1944   case tok::kw___has_trivial_constructor:
1945                                     return UTT_HasTrivialDefaultConstructor;
1946   case tok::kw___has_trivial_copy:           return UTT_HasTrivialCopy;
1947   case tok::kw___has_trivial_destructor:  return UTT_HasTrivialDestructor;
1948   case tok::kw___has_virtual_destructor:  return UTT_HasVirtualDestructor;
1949   case tok::kw___is_abstract:             return UTT_IsAbstract;
1950   case tok::kw___is_arithmetic:              return UTT_IsArithmetic;
1951   case tok::kw___is_array:                   return UTT_IsArray;
1952   case tok::kw___is_class:                return UTT_IsClass;
1953   case tok::kw___is_complete_type:           return UTT_IsCompleteType;
1954   case tok::kw___is_compound:                return UTT_IsCompound;
1955   case tok::kw___is_const:                   return UTT_IsConst;
1956   case tok::kw___is_empty:                return UTT_IsEmpty;
1957   case tok::kw___is_enum:                 return UTT_IsEnum;
1958   case tok::kw___is_floating_point:          return UTT_IsFloatingPoint;
1959   case tok::kw___is_function:                return UTT_IsFunction;
1960   case tok::kw___is_fundamental:             return UTT_IsFundamental;
1961   case tok::kw___is_integral:                return UTT_IsIntegral;
1962   case tok::kw___is_lvalue_reference:        return UTT_IsLvalueReference;
1963   case tok::kw___is_member_function_pointer: return UTT_IsMemberFunctionPointer;
1964   case tok::kw___is_member_object_pointer:   return UTT_IsMemberObjectPointer;
1965   case tok::kw___is_member_pointer:          return UTT_IsMemberPointer;
1966   case tok::kw___is_object:                  return UTT_IsObject;
1967   case tok::kw___is_literal:              return UTT_IsLiteral;
1968   case tok::kw___is_literal_type:         return UTT_IsLiteral;
1969   case tok::kw___is_pod:                  return UTT_IsPOD;
1970   case tok::kw___is_pointer:                 return UTT_IsPointer;
1971   case tok::kw___is_polymorphic:          return UTT_IsPolymorphic;
1972   case tok::kw___is_reference:               return UTT_IsReference;
1973   case tok::kw___is_rvalue_reference:        return UTT_IsRvalueReference;
1974   case tok::kw___is_scalar:                  return UTT_IsScalar;
1975   case tok::kw___is_signed:                  return UTT_IsSigned;
1976   case tok::kw___is_standard_layout:         return UTT_IsStandardLayout;
1977   case tok::kw___is_trivial:                 return UTT_IsTrivial;
1978   case tok::kw___is_trivially_copyable:      return UTT_IsTriviallyCopyable;
1979   case tok::kw___is_union:                return UTT_IsUnion;
1980   case tok::kw___is_unsigned:                return UTT_IsUnsigned;
1981   case tok::kw___is_void:                    return UTT_IsVoid;
1982   case tok::kw___is_volatile:                return UTT_IsVolatile;
1983   }
1984 }
1985
1986 static BinaryTypeTrait BinaryTypeTraitFromTokKind(tok::TokenKind kind) {
1987   switch(kind) {
1988   default: llvm_unreachable("Not a known binary type trait");
1989   case tok::kw___is_base_of:                 return BTT_IsBaseOf;
1990   case tok::kw___is_convertible:             return BTT_IsConvertible;
1991   case tok::kw___is_same:                    return BTT_IsSame;
1992   case tok::kw___builtin_types_compatible_p: return BTT_TypeCompatible;
1993   case tok::kw___is_convertible_to:          return BTT_IsConvertibleTo;
1994   }
1995 }
1996
1997 static ArrayTypeTrait ArrayTypeTraitFromTokKind(tok::TokenKind kind) {
1998   switch(kind) {
1999   default: llvm_unreachable("Not a known binary type trait");
2000   case tok::kw___array_rank:                 return ATT_ArrayRank;
2001   case tok::kw___array_extent:               return ATT_ArrayExtent;
2002   }
2003 }
2004
2005 static ExpressionTrait ExpressionTraitFromTokKind(tok::TokenKind kind) {
2006   switch(kind) {
2007   default: assert(false && "Not a known unary expression trait.");
2008   case tok::kw___is_lvalue_expr:             return ET_IsLValueExpr;
2009   case tok::kw___is_rvalue_expr:             return ET_IsRValueExpr;
2010   }
2011 }
2012
2013 /// ParseUnaryTypeTrait - Parse the built-in unary type-trait
2014 /// pseudo-functions that allow implementation of the TR1/C++0x type traits
2015 /// templates.
2016 ///
2017 ///       primary-expression:
2018 /// [GNU]             unary-type-trait '(' type-id ')'
2019 ///
2020 ExprResult Parser::ParseUnaryTypeTrait() {
2021   UnaryTypeTrait UTT = UnaryTypeTraitFromTokKind(Tok.getKind());
2022   SourceLocation Loc = ConsumeToken();
2023
2024   SourceLocation LParen = Tok.getLocation();
2025   if (ExpectAndConsume(tok::l_paren, diag::err_expected_lparen))
2026     return ExprError();
2027
2028   // FIXME: Error reporting absolutely sucks! If the this fails to parse a type
2029   // there will be cryptic errors about mismatched parentheses and missing
2030   // specifiers.
2031   TypeResult Ty = ParseTypeName();
2032
2033   SourceLocation RParen = MatchRHSPunctuation(tok::r_paren, LParen);
2034
2035   if (Ty.isInvalid())
2036     return ExprError();
2037
2038   return Actions.ActOnUnaryTypeTrait(UTT, Loc, Ty.get(), RParen);
2039 }
2040
2041 /// ParseBinaryTypeTrait - Parse the built-in binary type-trait
2042 /// pseudo-functions that allow implementation of the TR1/C++0x type traits
2043 /// templates.
2044 ///
2045 ///       primary-expression:
2046 /// [GNU]             binary-type-trait '(' type-id ',' type-id ')'
2047 ///
2048 ExprResult Parser::ParseBinaryTypeTrait() {
2049   BinaryTypeTrait BTT = BinaryTypeTraitFromTokKind(Tok.getKind());
2050   SourceLocation Loc = ConsumeToken();
2051
2052   SourceLocation LParen = Tok.getLocation();
2053   if (ExpectAndConsume(tok::l_paren, diag::err_expected_lparen))
2054     return ExprError();
2055
2056   TypeResult LhsTy = ParseTypeName();
2057   if (LhsTy.isInvalid()) {
2058     SkipUntil(tok::r_paren);
2059     return ExprError();
2060   }
2061
2062   if (ExpectAndConsume(tok::comma, diag::err_expected_comma)) {
2063     SkipUntil(tok::r_paren);
2064     return ExprError();
2065   }
2066
2067   TypeResult RhsTy = ParseTypeName();
2068   if (RhsTy.isInvalid()) {
2069     SkipUntil(tok::r_paren);
2070     return ExprError();
2071   }
2072
2073   SourceLocation RParen = MatchRHSPunctuation(tok::r_paren, LParen);
2074
2075   return Actions.ActOnBinaryTypeTrait(BTT, Loc, LhsTy.get(), RhsTy.get(), RParen);
2076 }
2077
2078 /// ParseArrayTypeTrait - Parse the built-in array type-trait
2079 /// pseudo-functions.
2080 ///
2081 ///       primary-expression:
2082 /// [Embarcadero]     '__array_rank' '(' type-id ')'
2083 /// [Embarcadero]     '__array_extent' '(' type-id ',' expression ')'
2084 ///
2085 ExprResult Parser::ParseArrayTypeTrait() {
2086   ArrayTypeTrait ATT = ArrayTypeTraitFromTokKind(Tok.getKind());
2087   SourceLocation Loc = ConsumeToken();
2088
2089   SourceLocation LParen = Tok.getLocation();
2090   if (ExpectAndConsume(tok::l_paren, diag::err_expected_lparen))
2091     return ExprError();
2092
2093   TypeResult Ty = ParseTypeName();
2094   if (Ty.isInvalid()) {
2095     SkipUntil(tok::comma);
2096     SkipUntil(tok::r_paren);
2097     return ExprError();
2098   }
2099
2100   switch (ATT) {
2101   case ATT_ArrayRank: {
2102     SourceLocation RParen = MatchRHSPunctuation(tok::r_paren, LParen);
2103     return Actions.ActOnArrayTypeTrait(ATT, Loc, Ty.get(), NULL, RParen);
2104   }
2105   case ATT_ArrayExtent: {
2106     if (ExpectAndConsume(tok::comma, diag::err_expected_comma)) {
2107       SkipUntil(tok::r_paren);
2108       return ExprError();
2109     }
2110
2111     ExprResult DimExpr = ParseExpression();
2112     SourceLocation RParen = MatchRHSPunctuation(tok::r_paren, LParen);
2113
2114     return Actions.ActOnArrayTypeTrait(ATT, Loc, Ty.get(), DimExpr.get(), RParen);
2115   }
2116   default:
2117     break;
2118   }
2119   return ExprError();
2120 }
2121
2122 /// ParseExpressionTrait - Parse built-in expression-trait
2123 /// pseudo-functions like __is_lvalue_expr( xxx ).
2124 ///
2125 ///       primary-expression:
2126 /// [Embarcadero]     expression-trait '(' expression ')'
2127 ///
2128 ExprResult Parser::ParseExpressionTrait() {
2129   ExpressionTrait ET = ExpressionTraitFromTokKind(Tok.getKind());
2130   SourceLocation Loc = ConsumeToken();
2131
2132   SourceLocation LParen = Tok.getLocation();
2133   if (ExpectAndConsume(tok::l_paren, diag::err_expected_lparen))
2134     return ExprError();
2135
2136   ExprResult Expr = ParseExpression();
2137
2138   SourceLocation RParen = MatchRHSPunctuation(tok::r_paren, LParen);
2139
2140   return Actions.ActOnExpressionTrait(ET, Loc, Expr.get(), RParen);
2141 }
2142
2143
2144 /// ParseCXXAmbiguousParenExpression - We have parsed the left paren of a
2145 /// parenthesized ambiguous type-id. This uses tentative parsing to disambiguate
2146 /// based on the context past the parens.
2147 ExprResult
2148 Parser::ParseCXXAmbiguousParenExpression(ParenParseOption &ExprType,
2149                                          ParsedType &CastTy,
2150                                          SourceLocation LParenLoc,
2151                                          SourceLocation &RParenLoc) {
2152   assert(getLang().CPlusPlus && "Should only be called for C++!");
2153   assert(ExprType == CastExpr && "Compound literals are not ambiguous!");
2154   assert(isTypeIdInParens() && "Not a type-id!");
2155
2156   ExprResult Result(true);
2157   CastTy = ParsedType();
2158
2159   // We need to disambiguate a very ugly part of the C++ syntax:
2160   //
2161   // (T())x;  - type-id
2162   // (T())*x; - type-id
2163   // (T())/x; - expression
2164   // (T());   - expression
2165   //
2166   // The bad news is that we cannot use the specialized tentative parser, since
2167   // it can only verify that the thing inside the parens can be parsed as
2168   // type-id, it is not useful for determining the context past the parens.
2169   //
2170   // The good news is that the parser can disambiguate this part without
2171   // making any unnecessary Action calls.
2172   //
2173   // It uses a scheme similar to parsing inline methods. The parenthesized
2174   // tokens are cached, the context that follows is determined (possibly by
2175   // parsing a cast-expression), and then we re-introduce the cached tokens
2176   // into the token stream and parse them appropriately.
2177
2178   ParenParseOption ParseAs;
2179   CachedTokens Toks;
2180
2181   // Store the tokens of the parentheses. We will parse them after we determine
2182   // the context that follows them.
2183   if (!ConsumeAndStoreUntil(tok::r_paren, Toks)) {
2184     // We didn't find the ')' we expected.
2185     MatchRHSPunctuation(tok::r_paren, LParenLoc);
2186     return ExprError();
2187   }
2188
2189   if (Tok.is(tok::l_brace)) {
2190     ParseAs = CompoundLiteral;
2191   } else {
2192     bool NotCastExpr;
2193     // FIXME: Special-case ++ and --: "(S())++;" is not a cast-expression
2194     if (Tok.is(tok::l_paren) && NextToken().is(tok::r_paren)) {
2195       NotCastExpr = true;
2196     } else {
2197       // Try parsing the cast-expression that may follow.
2198       // If it is not a cast-expression, NotCastExpr will be true and no token
2199       // will be consumed.
2200       Result = ParseCastExpression(false/*isUnaryExpression*/,
2201                                    false/*isAddressofOperand*/,
2202                                    NotCastExpr,
2203                                    // type-id has priority.
2204                                    true/*isTypeCast*/);
2205     }
2206
2207     // If we parsed a cast-expression, it's really a type-id, otherwise it's
2208     // an expression.
2209     ParseAs = NotCastExpr ? SimpleExpr : CastExpr;
2210   }
2211
2212   // The current token should go after the cached tokens.
2213   Toks.push_back(Tok);
2214   // Re-enter the stored parenthesized tokens into the token stream, so we may
2215   // parse them now.
2216   PP.EnterTokenStream(Toks.data(), Toks.size(),
2217                       true/*DisableMacroExpansion*/, false/*OwnsTokens*/);
2218   // Drop the current token and bring the first cached one. It's the same token
2219   // as when we entered this function.
2220   ConsumeAnyToken();
2221
2222   if (ParseAs >= CompoundLiteral) {
2223     // Parse the type declarator.
2224     DeclSpec DS(AttrFactory);
2225     ParseSpecifierQualifierList(DS);
2226     Declarator DeclaratorInfo(DS, Declarator::TypeNameContext);
2227     ParseDeclarator(DeclaratorInfo);
2228
2229     // Match the ')'.
2230     if (Tok.is(tok::r_paren))
2231       RParenLoc = ConsumeParen();
2232     else
2233       MatchRHSPunctuation(tok::r_paren, LParenLoc);
2234
2235     if (ParseAs == CompoundLiteral) {
2236       ExprType = CompoundLiteral;
2237       TypeResult Ty = ParseTypeName();
2238       return ParseCompoundLiteralExpression(Ty.get(), LParenLoc, RParenLoc);
2239     }
2240
2241     // We parsed '(' type-id ')' and the thing after it wasn't a '{'.
2242     assert(ParseAs == CastExpr);
2243
2244     if (DeclaratorInfo.isInvalidType())
2245       return ExprError();
2246
2247     // Result is what ParseCastExpression returned earlier.
2248     if (!Result.isInvalid())
2249       Result = Actions.ActOnCastExpr(getCurScope(), LParenLoc,
2250                                      DeclaratorInfo, CastTy,
2251                                      RParenLoc, Result.take());
2252     return move(Result);
2253   }
2254
2255   // Not a compound literal, and not followed by a cast-expression.
2256   assert(ParseAs == SimpleExpr);
2257
2258   ExprType = SimpleExpr;
2259   Result = ParseExpression();
2260   if (!Result.isInvalid() && Tok.is(tok::r_paren))
2261     Result = Actions.ActOnParenExpr(LParenLoc, Tok.getLocation(), Result.take());
2262
2263   // Match the ')'.
2264   if (Result.isInvalid()) {
2265     SkipUntil(tok::r_paren);
2266     return ExprError();
2267   }
2268
2269   if (Tok.is(tok::r_paren))
2270     RParenLoc = ConsumeParen();
2271   else
2272     MatchRHSPunctuation(tok::r_paren, LParenLoc);
2273
2274   return move(Result);
2275 }