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