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