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