ParseExpr.cpp revision efaa93aaa2653f4eb40e6a22e504a448da94aaf8
1//===--- ParseExpr.cpp - 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.  Expressions in
11// C99 basically consist of a bunch of binary operators with unary operators and
12// other random stuff at the leaves.
13//
14// In the C99 grammar, these unary operators bind tightest and are represented
15// as the 'cast-expression' production.  Everything else is either a binary
16// operator (e.g. '/') or a ternary operator ("?:").  The unary leaves are
17// handled by ParseCastExpression, the higher level pieces are handled by
18// ParseBinaryExpression.
19//
20//===----------------------------------------------------------------------===//
21
22#include "clang/Parse/Parser.h"
23#include "clang/Sema/DeclSpec.h"
24#include "clang/Sema/Scope.h"
25#include "clang/Sema/ParsedTemplate.h"
26#include "clang/Basic/PrettyStackTrace.h"
27#include "RAIIObjectsForParser.h"
28#include "llvm/ADT/SmallVector.h"
29#include "llvm/ADT/SmallString.h"
30using namespace clang;
31
32/// getBinOpPrecedence - Return the precedence of the specified binary operator
33/// token.
34static prec::Level getBinOpPrecedence(tok::TokenKind Kind,
35                                      bool GreaterThanIsOperator,
36                                      bool CPlusPlus0x) {
37  switch (Kind) {
38  case tok::greater:
39    // C++ [temp.names]p3:
40    //   [...] When parsing a template-argument-list, the first
41    //   non-nested > is taken as the ending delimiter rather than a
42    //   greater-than operator. [...]
43    if (GreaterThanIsOperator)
44      return prec::Relational;
45    return prec::Unknown;
46
47  case tok::greatergreater:
48    // C++0x [temp.names]p3:
49    //
50    //   [...] Similarly, the first non-nested >> is treated as two
51    //   consecutive but distinct > tokens, the first of which is
52    //   taken as the end of the template-argument-list and completes
53    //   the template-id. [...]
54    if (GreaterThanIsOperator || !CPlusPlus0x)
55      return prec::Shift;
56    return prec::Unknown;
57
58  default:                        return prec::Unknown;
59  case tok::comma:                return prec::Comma;
60  case tok::equal:
61  case tok::starequal:
62  case tok::slashequal:
63  case tok::percentequal:
64  case tok::plusequal:
65  case tok::minusequal:
66  case tok::lesslessequal:
67  case tok::greatergreaterequal:
68  case tok::ampequal:
69  case tok::caretequal:
70  case tok::pipeequal:            return prec::Assignment;
71  case tok::question:             return prec::Conditional;
72  case tok::pipepipe:             return prec::LogicalOr;
73  case tok::ampamp:               return prec::LogicalAnd;
74  case tok::pipe:                 return prec::InclusiveOr;
75  case tok::caret:                return prec::ExclusiveOr;
76  case tok::amp:                  return prec::And;
77  case tok::exclaimequal:
78  case tok::equalequal:           return prec::Equality;
79  case tok::lessequal:
80  case tok::less:
81  case tok::greaterequal:         return prec::Relational;
82  case tok::lessless:             return prec::Shift;
83  case tok::plus:
84  case tok::minus:                return prec::Additive;
85  case tok::percent:
86  case tok::slash:
87  case tok::star:                 return prec::Multiplicative;
88  case tok::periodstar:
89  case tok::arrowstar:            return prec::PointerToMember;
90  }
91}
92
93
94/// ParseExpression - Simple precedence-based parser for binary/ternary
95/// operators.
96///
97/// Note: we diverge from the C99 grammar when parsing the assignment-expression
98/// production.  C99 specifies that the LHS of an assignment operator should be
99/// parsed as a unary-expression, but consistency dictates that it be a
100/// conditional-expession.  In practice, the important thing here is that the
101/// LHS of an assignment has to be an l-value, which productions between
102/// unary-expression and conditional-expression don't produce.  Because we want
103/// consistency, we parse the LHS as a conditional-expression, then check for
104/// l-value-ness in semantic analysis stages.
105///
106///       pm-expression: [C++ 5.5]
107///         cast-expression
108///         pm-expression '.*' cast-expression
109///         pm-expression '->*' cast-expression
110///
111///       multiplicative-expression: [C99 6.5.5]
112///     Note: in C++, apply pm-expression instead of cast-expression
113///         cast-expression
114///         multiplicative-expression '*' cast-expression
115///         multiplicative-expression '/' cast-expression
116///         multiplicative-expression '%' cast-expression
117///
118///       additive-expression: [C99 6.5.6]
119///         multiplicative-expression
120///         additive-expression '+' multiplicative-expression
121///         additive-expression '-' multiplicative-expression
122///
123///       shift-expression: [C99 6.5.7]
124///         additive-expression
125///         shift-expression '<<' additive-expression
126///         shift-expression '>>' additive-expression
127///
128///       relational-expression: [C99 6.5.8]
129///         shift-expression
130///         relational-expression '<' shift-expression
131///         relational-expression '>' shift-expression
132///         relational-expression '<=' shift-expression
133///         relational-expression '>=' shift-expression
134///
135///       equality-expression: [C99 6.5.9]
136///         relational-expression
137///         equality-expression '==' relational-expression
138///         equality-expression '!=' relational-expression
139///
140///       AND-expression: [C99 6.5.10]
141///         equality-expression
142///         AND-expression '&' equality-expression
143///
144///       exclusive-OR-expression: [C99 6.5.11]
145///         AND-expression
146///         exclusive-OR-expression '^' AND-expression
147///
148///       inclusive-OR-expression: [C99 6.5.12]
149///         exclusive-OR-expression
150///         inclusive-OR-expression '|' exclusive-OR-expression
151///
152///       logical-AND-expression: [C99 6.5.13]
153///         inclusive-OR-expression
154///         logical-AND-expression '&&' inclusive-OR-expression
155///
156///       logical-OR-expression: [C99 6.5.14]
157///         logical-AND-expression
158///         logical-OR-expression '||' logical-AND-expression
159///
160///       conditional-expression: [C99 6.5.15]
161///         logical-OR-expression
162///         logical-OR-expression '?' expression ':' conditional-expression
163/// [GNU]   logical-OR-expression '?' ':' conditional-expression
164/// [C++] the third operand is an assignment-expression
165///
166///       assignment-expression: [C99 6.5.16]
167///         conditional-expression
168///         unary-expression assignment-operator assignment-expression
169/// [C++]   throw-expression [C++ 15]
170///
171///       assignment-operator: one of
172///         = *= /= %= += -= <<= >>= &= ^= |=
173///
174///       expression: [C99 6.5.17]
175///         assignment-expression ...[opt]
176///         expression ',' assignment-expression ...[opt]
177ExprResult Parser::ParseExpression() {
178  ExprResult LHS(ParseAssignmentExpression());
179  return ParseRHSOfBinaryExpression(move(LHS), prec::Comma);
180}
181
182/// This routine is called when the '@' is seen and consumed.
183/// Current token is an Identifier and is not a 'try'. This
184/// routine is necessary to disambiguate @try-statement from,
185/// for example, @encode-expression.
186///
187ExprResult
188Parser::ParseExpressionWithLeadingAt(SourceLocation AtLoc) {
189  ExprResult LHS(ParseObjCAtExpression(AtLoc));
190  return ParseRHSOfBinaryExpression(move(LHS), prec::Comma);
191}
192
193/// This routine is called when a leading '__extension__' is seen and
194/// consumed.  This is necessary because the token gets consumed in the
195/// process of disambiguating between an expression and a declaration.
196ExprResult
197Parser::ParseExpressionWithLeadingExtension(SourceLocation ExtLoc) {
198  ExprResult LHS(true);
199  {
200    // Silence extension warnings in the sub-expression
201    ExtensionRAIIObject O(Diags);
202
203    LHS = ParseCastExpression(false);
204  }
205
206  if (!LHS.isInvalid())
207    LHS = Actions.ActOnUnaryOp(getCurScope(), ExtLoc, tok::kw___extension__,
208                               LHS.take());
209
210  return ParseRHSOfBinaryExpression(move(LHS), prec::Comma);
211}
212
213/// ParseAssignmentExpression - Parse an expr that doesn't include commas.
214ExprResult Parser::ParseAssignmentExpression() {
215  if (Tok.is(tok::code_completion)) {
216    Actions.CodeCompleteOrdinaryName(getCurScope(), Sema::PCC_Expression);
217    cutOffParsing();
218    return ExprError();
219  }
220
221  if (Tok.is(tok::kw_throw))
222    return ParseThrowExpression();
223
224  ExprResult LHS = ParseCastExpression(/*isUnaryExpression=*/false);
225  return ParseRHSOfBinaryExpression(move(LHS), prec::Assignment);
226}
227
228/// ParseAssignmentExprWithObjCMessageExprStart - Parse an assignment expression
229/// where part of an objc message send has already been parsed.  In this case
230/// LBracLoc indicates the location of the '[' of the message send, and either
231/// ReceiverName or ReceiverExpr is non-null indicating the receiver of the
232/// message.
233///
234/// Since this handles full assignment-expression's, it handles postfix
235/// expressions and other binary operators for these expressions as well.
236ExprResult
237Parser::ParseAssignmentExprWithObjCMessageExprStart(SourceLocation LBracLoc,
238                                                    SourceLocation SuperLoc,
239                                                    ParsedType ReceiverType,
240                                                    Expr *ReceiverExpr) {
241  ExprResult R
242    = ParseObjCMessageExpressionBody(LBracLoc, SuperLoc,
243                                     ReceiverType, ReceiverExpr);
244  R = ParsePostfixExpressionSuffix(R);
245  return ParseRHSOfBinaryExpression(R, prec::Assignment);
246}
247
248
249ExprResult Parser::ParseConstantExpression() {
250  // C++ [basic.def.odr]p2:
251  //   An expression is potentially evaluated unless it appears where an
252  //   integral constant expression is required (see 5.19) [...].
253  EnterExpressionEvaluationContext Unevaluated(Actions,
254                                               Sema::Unevaluated);
255
256  ExprResult LHS(ParseCastExpression(false));
257  return ParseRHSOfBinaryExpression(LHS, prec::Conditional);
258}
259
260/// ParseRHSOfBinaryExpression - Parse a binary expression that starts with
261/// LHS and has a precedence of at least MinPrec.
262ExprResult
263Parser::ParseRHSOfBinaryExpression(ExprResult LHS, prec::Level MinPrec) {
264  prec::Level NextTokPrec = getBinOpPrecedence(Tok.getKind(),
265                                               GreaterThanIsOperator,
266                                               getLang().CPlusPlus0x);
267  SourceLocation ColonLoc;
268
269  while (1) {
270    // If this token has a lower precedence than we are allowed to parse (e.g.
271    // because we are called recursively, or because the token is not a binop),
272    // then we are done!
273    if (NextTokPrec < MinPrec)
274      return move(LHS);
275
276    // Consume the operator, saving the operator token for error reporting.
277    Token OpToken = Tok;
278    ConsumeToken();
279
280    // Special case handling for the ternary operator.
281    ExprResult TernaryMiddle(true);
282    if (NextTokPrec == prec::Conditional) {
283      if (Tok.isNot(tok::colon)) {
284        // Don't parse FOO:BAR as if it were a typo for FOO::BAR.
285        ColonProtectionRAIIObject X(*this);
286
287        // Handle this production specially:
288        //   logical-OR-expression '?' expression ':' conditional-expression
289        // In particular, the RHS of the '?' is 'expression', not
290        // 'logical-OR-expression' as we might expect.
291        TernaryMiddle = ParseExpression();
292        if (TernaryMiddle.isInvalid()) {
293          LHS = ExprError();
294          TernaryMiddle = 0;
295        }
296      } else {
297        // Special case handling of "X ? Y : Z" where Y is empty:
298        //   logical-OR-expression '?' ':' conditional-expression   [GNU]
299        TernaryMiddle = 0;
300        Diag(Tok, diag::ext_gnu_conditional_expr);
301      }
302
303      if (Tok.is(tok::colon)) {
304        // Eat the colon.
305        ColonLoc = ConsumeToken();
306      } else {
307        // Otherwise, we're missing a ':'.  Assume that this was a typo that
308        // the user forgot. If we're not in a macro expansion, we can suggest
309        // a fixit hint. If there were two spaces before the current token,
310        // suggest inserting the colon in between them, otherwise insert ": ".
311        SourceLocation FILoc = Tok.getLocation();
312        const char *FIText = ": ";
313        const SourceManager &SM = PP.getSourceManager();
314        if (FILoc.isFileID() || PP.isAtStartOfMacroExpansion(FILoc)) {
315          FILoc = SM.getExpansionLoc(FILoc);
316          bool IsInvalid = false;
317          const char *SourcePtr =
318            SM.getCharacterData(FILoc.getLocWithOffset(-1), &IsInvalid);
319          if (!IsInvalid && *SourcePtr == ' ') {
320            SourcePtr =
321              SM.getCharacterData(FILoc.getLocWithOffset(-2), &IsInvalid);
322            if (!IsInvalid && *SourcePtr == ' ') {
323              FILoc = FILoc.getLocWithOffset(-1);
324              FIText = ":";
325            }
326          }
327        }
328
329        Diag(Tok, diag::err_expected_colon)
330          << FixItHint::CreateInsertion(FILoc, FIText);
331        Diag(OpToken, diag::note_matching) << "?";
332        ColonLoc = Tok.getLocation();
333      }
334    }
335
336    // Code completion for the right-hand side of an assignment expression
337    // goes through a special hook that takes the left-hand side into account.
338    if (Tok.is(tok::code_completion) && NextTokPrec == prec::Assignment) {
339      Actions.CodeCompleteAssignmentRHS(getCurScope(), LHS.get());
340      cutOffParsing();
341      return ExprError();
342    }
343
344    // Parse another leaf here for the RHS of the operator.
345    // ParseCastExpression works here because all RHS expressions in C have it
346    // as a prefix, at least. However, in C++, an assignment-expression could
347    // be a throw-expression, which is not a valid cast-expression.
348    // Therefore we need some special-casing here.
349    // Also note that the third operand of the conditional operator is
350    // an assignment-expression in C++.
351    ExprResult RHS;
352    if (getLang().CPlusPlus && NextTokPrec <= prec::Conditional)
353      RHS = ParseAssignmentExpression();
354    else
355      RHS = ParseCastExpression(false);
356
357    if (RHS.isInvalid())
358      LHS = ExprError();
359
360    // Remember the precedence of this operator and get the precedence of the
361    // operator immediately to the right of the RHS.
362    prec::Level ThisPrec = NextTokPrec;
363    NextTokPrec = getBinOpPrecedence(Tok.getKind(), GreaterThanIsOperator,
364                                     getLang().CPlusPlus0x);
365
366    // Assignment and conditional expressions are right-associative.
367    bool isRightAssoc = ThisPrec == prec::Conditional ||
368                        ThisPrec == prec::Assignment;
369
370    // Get the precedence of the operator to the right of the RHS.  If it binds
371    // more tightly with RHS than we do, evaluate it completely first.
372    if (ThisPrec < NextTokPrec ||
373        (ThisPrec == NextTokPrec && isRightAssoc)) {
374      // If this is left-associative, only parse things on the RHS that bind
375      // more tightly than the current operator.  If it is left-associative, it
376      // is okay, to bind exactly as tightly.  For example, compile A=B=C=D as
377      // A=(B=(C=D)), where each paren is a level of recursion here.
378      // The function takes ownership of the RHS.
379      RHS = ParseRHSOfBinaryExpression(RHS,
380                            static_cast<prec::Level>(ThisPrec + !isRightAssoc));
381
382      if (RHS.isInvalid())
383        LHS = ExprError();
384
385      NextTokPrec = getBinOpPrecedence(Tok.getKind(), GreaterThanIsOperator,
386                                       getLang().CPlusPlus0x);
387    }
388    assert(NextTokPrec <= ThisPrec && "Recursion didn't work!");
389
390    if (!LHS.isInvalid()) {
391      // Combine the LHS and RHS into the LHS (e.g. build AST).
392      if (TernaryMiddle.isInvalid()) {
393        // If we're using '>>' as an operator within a template
394        // argument list (in C++98), suggest the addition of
395        // parentheses so that the code remains well-formed in C++0x.
396        if (!GreaterThanIsOperator && OpToken.is(tok::greatergreater))
397          SuggestParentheses(OpToken.getLocation(),
398                             diag::warn_cxx0x_right_shift_in_template_arg,
399                         SourceRange(Actions.getExprRange(LHS.get()).getBegin(),
400                                     Actions.getExprRange(RHS.get()).getEnd()));
401
402        LHS = Actions.ActOnBinOp(getCurScope(), OpToken.getLocation(),
403                                 OpToken.getKind(), LHS.take(), RHS.take());
404      } else
405        LHS = Actions.ActOnConditionalOp(OpToken.getLocation(), ColonLoc,
406                                         LHS.take(), TernaryMiddle.take(),
407                                         RHS.take());
408    }
409  }
410}
411
412/// ParseCastExpression - Parse a cast-expression, or, if isUnaryExpression is
413/// true, parse a unary-expression. isAddressOfOperand exists because an
414/// id-expression that is the operand of address-of gets special treatment
415/// due to member pointers.
416///
417ExprResult Parser::ParseCastExpression(bool isUnaryExpression,
418                                       bool isAddressOfOperand,
419                                       bool isTypeCast) {
420  bool NotCastExpr;
421  ExprResult Res = ParseCastExpression(isUnaryExpression,
422                                       isAddressOfOperand,
423                                       NotCastExpr,
424                                       isTypeCast);
425  if (NotCastExpr)
426    Diag(Tok, diag::err_expected_expression);
427  return move(Res);
428}
429
430/// ParseCastExpression - Parse a cast-expression, or, if isUnaryExpression is
431/// true, parse a unary-expression. isAddressOfOperand exists because an
432/// id-expression that is the operand of address-of gets special treatment
433/// due to member pointers. NotCastExpr is set to true if the token is not the
434/// start of a cast-expression, and no diagnostic is emitted in this case.
435///
436///       cast-expression: [C99 6.5.4]
437///         unary-expression
438///         '(' type-name ')' cast-expression
439///
440///       unary-expression:  [C99 6.5.3]
441///         postfix-expression
442///         '++' unary-expression
443///         '--' unary-expression
444///         unary-operator cast-expression
445///         'sizeof' unary-expression
446///         'sizeof' '(' type-name ')'
447/// [C++0x] 'sizeof' '...' '(' identifier ')'
448/// [GNU]   '__alignof' unary-expression
449/// [GNU]   '__alignof' '(' type-name ')'
450/// [C++0x] 'alignof' '(' type-id ')'
451/// [GNU]   '&&' identifier
452/// [C++]   new-expression
453/// [C++]   delete-expression
454/// [C++0x] 'noexcept' '(' expression ')'
455///
456///       unary-operator: one of
457///         '&'  '*'  '+'  '-'  '~'  '!'
458/// [GNU]   '__extension__'  '__real'  '__imag'
459///
460///       primary-expression: [C99 6.5.1]
461/// [C99]   identifier
462/// [C++]   id-expression
463///         constant
464///         string-literal
465/// [C++]   boolean-literal  [C++ 2.13.5]
466/// [C++0x] 'nullptr'        [C++0x 2.14.7]
467///         '(' expression ')'
468/// [C1X]   generic-selection
469///         '__func__'        [C99 6.4.2.2]
470/// [GNU]   '__FUNCTION__'
471/// [GNU]   '__PRETTY_FUNCTION__'
472/// [GNU]   '(' compound-statement ')'
473/// [GNU]   '__builtin_va_arg' '(' assignment-expression ',' type-name ')'
474/// [GNU]   '__builtin_offsetof' '(' type-name ',' offsetof-member-designator')'
475/// [GNU]   '__builtin_choose_expr' '(' assign-expr ',' assign-expr ','
476///                                     assign-expr ')'
477/// [GNU]   '__builtin_types_compatible_p' '(' type-name ',' type-name ')'
478/// [GNU]   '__null'
479/// [OBJC]  '[' objc-message-expr ']'
480/// [OBJC]  '@selector' '(' objc-selector-arg ')'
481/// [OBJC]  '@protocol' '(' identifier ')'
482/// [OBJC]  '@encode' '(' type-name ')'
483/// [OBJC]  objc-string-literal
484/// [C++]   simple-type-specifier '(' expression-list[opt] ')'      [C++ 5.2.3]
485/// [C++0x] simple-type-specifier braced-init-list                  [C++ 5.2.3]
486/// [C++]   typename-specifier '(' expression-list[opt] ')'         [C++ 5.2.3]
487/// [C++0x] typename-specifier braced-init-list                     [C++ 5.2.3]
488/// [C++]   'const_cast' '<' type-name '>' '(' expression ')'       [C++ 5.2p1]
489/// [C++]   'dynamic_cast' '<' type-name '>' '(' expression ')'     [C++ 5.2p1]
490/// [C++]   'reinterpret_cast' '<' type-name '>' '(' expression ')' [C++ 5.2p1]
491/// [C++]   'static_cast' '<' type-name '>' '(' expression ')'      [C++ 5.2p1]
492/// [C++]   'typeid' '(' expression ')'                             [C++ 5.2p1]
493/// [C++]   'typeid' '(' type-id ')'                                [C++ 5.2p1]
494/// [C++]   'this'          [C++ 9.3.2]
495/// [G++]   unary-type-trait '(' type-id ')'
496/// [G++]   binary-type-trait '(' type-id ',' type-id ')'           [TODO]
497/// [EMBT]  array-type-trait '(' type-id ',' integer ')'
498/// [clang] '^' block-literal
499///
500///       constant: [C99 6.4.4]
501///         integer-constant
502///         floating-constant
503///         enumeration-constant -> identifier
504///         character-constant
505///
506///       id-expression: [C++ 5.1]
507///                   unqualified-id
508///                   qualified-id
509///
510///       unqualified-id: [C++ 5.1]
511///                   identifier
512///                   operator-function-id
513///                   conversion-function-id
514///                   '~' class-name
515///                   template-id
516///
517///       new-expression: [C++ 5.3.4]
518///                   '::'[opt] 'new' new-placement[opt] new-type-id
519///                                     new-initializer[opt]
520///                   '::'[opt] 'new' new-placement[opt] '(' type-id ')'
521///                                     new-initializer[opt]
522///
523///       delete-expression: [C++ 5.3.5]
524///                   '::'[opt] 'delete' cast-expression
525///                   '::'[opt] 'delete' '[' ']' cast-expression
526///
527/// [GNU/Embarcadero] unary-type-trait:
528///                   '__is_arithmetic'
529///                   '__is_floating_point'
530///                   '__is_integral'
531///                   '__is_lvalue_expr'
532///                   '__is_rvalue_expr'
533///                   '__is_complete_type'
534///                   '__is_void'
535///                   '__is_array'
536///                   '__is_function'
537///                   '__is_reference'
538///                   '__is_lvalue_reference'
539///                   '__is_rvalue_reference'
540///                   '__is_fundamental'
541///                   '__is_object'
542///                   '__is_scalar'
543///                   '__is_compound'
544///                   '__is_pointer'
545///                   '__is_member_object_pointer'
546///                   '__is_member_function_pointer'
547///                   '__is_member_pointer'
548///                   '__is_const'
549///                   '__is_volatile'
550///                   '__is_trivial'
551///                   '__is_standard_layout'
552///                   '__is_signed'
553///                   '__is_unsigned'
554///
555/// [GNU] unary-type-trait:
556///                   '__has_nothrow_assign'
557///                   '__has_nothrow_copy'
558///                   '__has_nothrow_constructor'
559///                   '__has_trivial_assign'                  [TODO]
560///                   '__has_trivial_copy'                    [TODO]
561///                   '__has_trivial_constructor'
562///                   '__has_trivial_destructor'
563///                   '__has_virtual_destructor'
564///                   '__is_abstract'                         [TODO]
565///                   '__is_class'
566///                   '__is_empty'                            [TODO]
567///                   '__is_enum'
568///                   '__is_pod'
569///                   '__is_polymorphic'
570///                   '__is_trivial'
571///                   '__is_union'
572///
573/// [Clang] unary-type-trait:
574///                   '__trivially_copyable'
575///
576///       binary-type-trait:
577/// [GNU]             '__is_base_of'
578/// [MS]              '__is_convertible_to'
579///                   '__is_convertible'
580///                   '__is_same'
581///
582/// [Embarcadero] array-type-trait:
583///                   '__array_rank'
584///                   '__array_extent'
585///
586/// [Embarcadero] expression-trait:
587///                   '__is_lvalue_expr'
588///                   '__is_rvalue_expr'
589///
590ExprResult Parser::ParseCastExpression(bool isUnaryExpression,
591                                       bool isAddressOfOperand,
592                                       bool &NotCastExpr,
593                                       bool isTypeCast) {
594  ExprResult Res;
595  tok::TokenKind SavedKind = Tok.getKind();
596  NotCastExpr = false;
597
598  // This handles all of cast-expression, unary-expression, postfix-expression,
599  // and primary-expression.  We handle them together like this for efficiency
600  // and to simplify handling of an expression starting with a '(' token: which
601  // may be one of a parenthesized expression, cast-expression, compound literal
602  // expression, or statement expression.
603  //
604  // If the parsed tokens consist of a primary-expression, the cases below
605  // break out of the switch;  at the end we call ParsePostfixExpressionSuffix
606  // to handle the postfix expression suffixes.  Cases that cannot be followed
607  // by postfix exprs should return without invoking
608  // ParsePostfixExpressionSuffix.
609  switch (SavedKind) {
610  case tok::l_paren: {
611    // If this expression is limited to being a unary-expression, the parent can
612    // not start a cast expression.
613    ParenParseOption ParenExprType =
614      (isUnaryExpression && !getLang().CPlusPlus)? CompoundLiteral : CastExpr;
615    ParsedType CastTy;
616    SourceLocation RParenLoc;
617
618    {
619      // The inside of the parens don't need to be a colon protected scope, and
620      // isn't immediately a message send.
621      ColonProtectionRAIIObject X(*this, false);
622
623      Res = ParseParenExpression(ParenExprType, false/*stopIfCastExr*/,
624                                 isTypeCast, CastTy, RParenLoc);
625    }
626
627    switch (ParenExprType) {
628    case SimpleExpr:   break;    // Nothing else to do.
629    case CompoundStmt: break;  // Nothing else to do.
630    case CompoundLiteral:
631      // We parsed '(' type-name ')' '{' ... '}'.  If any suffixes of
632      // postfix-expression exist, parse them now.
633      break;
634    case CastExpr:
635      // We have parsed the cast-expression and no postfix-expr pieces are
636      // following.
637      return move(Res);
638    }
639
640    break;
641  }
642
643    // primary-expression
644  case tok::numeric_constant:
645    // constant: integer-constant
646    // constant: floating-constant
647
648    Res = Actions.ActOnNumericConstant(Tok);
649    ConsumeToken();
650    break;
651
652  case tok::kw_true:
653  case tok::kw_false:
654    return ParseCXXBoolLiteral();
655
656  case tok::kw_nullptr:
657    Diag(Tok, diag::warn_cxx98_compat_nullptr);
658    return Actions.ActOnCXXNullPtrLiteral(ConsumeToken());
659
660  case tok::annot_primary_expr:
661    assert(Res.get() == 0 && "Stray primary-expression annotation?");
662    Res = getExprAnnotation(Tok);
663    ConsumeToken();
664    break;
665
666  case tok::identifier: {      // primary-expression: identifier
667                               // unqualified-id: identifier
668                               // constant: enumeration-constant
669    // Turn a potentially qualified name into a annot_typename or
670    // annot_cxxscope if it would be valid.  This handles things like x::y, etc.
671    if (getLang().CPlusPlus) {
672      // Avoid the unnecessary parse-time lookup in the common case
673      // where the syntax forbids a type.
674      const Token &Next = NextToken();
675      if (Next.is(tok::coloncolon) ||
676          (!ColonIsSacred && Next.is(tok::colon)) ||
677          Next.is(tok::less) ||
678          Next.is(tok::l_paren)) {
679        // If TryAnnotateTypeOrScopeToken annotates the token, tail recurse.
680        if (TryAnnotateTypeOrScopeToken())
681          return ExprError();
682        if (!Tok.is(tok::identifier))
683          return ParseCastExpression(isUnaryExpression, isAddressOfOperand);
684      }
685    }
686
687    // Consume the identifier so that we can see if it is followed by a '(' or
688    // '.'.
689    IdentifierInfo &II = *Tok.getIdentifierInfo();
690    SourceLocation ILoc = ConsumeToken();
691
692    // Support 'Class.property' and 'super.property' notation.
693    if (getLang().ObjC1 && Tok.is(tok::period) &&
694        (Actions.getTypeName(II, ILoc, getCurScope()) ||
695         // Allow the base to be 'super' if in an objc-method.
696         (&II == Ident_super && getCurScope()->isInObjcMethodScope()))) {
697      ConsumeToken();
698
699      if (Tok.isNot(tok::identifier)) {
700        Diag(Tok, diag::err_expected_property_name);
701        return ExprError();
702      }
703      IdentifierInfo &PropertyName = *Tok.getIdentifierInfo();
704      SourceLocation PropertyLoc = ConsumeToken();
705
706      Res = Actions.ActOnClassPropertyRefExpr(II, PropertyName,
707                                              ILoc, PropertyLoc);
708      break;
709    }
710
711    // In an Objective-C method, if we have "super" followed by an identifier,
712    // the token sequence is ill-formed. However, if there's a ':' or ']' after
713    // that identifier, this is probably a message send with a missing open
714    // bracket. Treat it as such.
715    if (getLang().ObjC1 && &II == Ident_super && !InMessageExpression &&
716        getCurScope()->isInObjcMethodScope() &&
717        ((Tok.is(tok::identifier) &&
718         (NextToken().is(tok::colon) || NextToken().is(tok::r_square))) ||
719         Tok.is(tok::code_completion))) {
720      Res = ParseObjCMessageExpressionBody(SourceLocation(), ILoc, ParsedType(),
721                                           0);
722      break;
723    }
724
725    // If we have an Objective-C class name followed by an identifier
726    // and either ':' or ']', this is an Objective-C class message
727    // send that's missing the opening '['. Recovery
728    // appropriately. Also take this path if we're performing code
729    // completion after an Objective-C class name.
730    if (getLang().ObjC1 &&
731        ((Tok.is(tok::identifier) && !InMessageExpression) ||
732         Tok.is(tok::code_completion))) {
733      const Token& Next = NextToken();
734      if (Tok.is(tok::code_completion) ||
735          Next.is(tok::colon) || Next.is(tok::r_square))
736        if (ParsedType Typ = Actions.getTypeName(II, ILoc, getCurScope()))
737          if (Typ.get()->isObjCObjectOrInterfaceType()) {
738            // Fake up a Declarator to use with ActOnTypeName.
739            DeclSpec DS(AttrFactory);
740            DS.SetRangeStart(ILoc);
741            DS.SetRangeEnd(ILoc);
742            const char *PrevSpec = 0;
743            unsigned DiagID;
744            DS.SetTypeSpecType(TST_typename, ILoc, PrevSpec, DiagID, Typ);
745
746            Declarator DeclaratorInfo(DS, Declarator::TypeNameContext);
747            TypeResult Ty = Actions.ActOnTypeName(getCurScope(),
748                                                  DeclaratorInfo);
749            if (Ty.isInvalid())
750              break;
751
752            Res = ParseObjCMessageExpressionBody(SourceLocation(),
753                                                 SourceLocation(),
754                                                 Ty.get(), 0);
755            break;
756          }
757    }
758
759    // Make sure to pass down the right value for isAddressOfOperand.
760    if (isAddressOfOperand && isPostfixExpressionSuffixStart())
761      isAddressOfOperand = false;
762
763    // Function designators are allowed to be undeclared (C99 6.5.1p2), so we
764    // need to know whether or not this identifier is a function designator or
765    // not.
766    UnqualifiedId Name;
767    CXXScopeSpec ScopeSpec;
768    Name.setIdentifier(&II, ILoc);
769    Res = Actions.ActOnIdExpression(getCurScope(), ScopeSpec, Name,
770                                    Tok.is(tok::l_paren), isAddressOfOperand);
771    break;
772  }
773  case tok::char_constant:     // constant: character-constant
774  case tok::wide_char_constant:
775  case tok::utf16_char_constant:
776  case tok::utf32_char_constant:
777    Res = Actions.ActOnCharacterConstant(Tok);
778    ConsumeToken();
779    break;
780  case tok::kw___func__:       // primary-expression: __func__ [C99 6.4.2.2]
781  case tok::kw___FUNCTION__:   // primary-expression: __FUNCTION__ [GNU]
782  case tok::kw___PRETTY_FUNCTION__:  // primary-expression: __P..Y_F..N__ [GNU]
783    Res = Actions.ActOnPredefinedExpr(Tok.getLocation(), SavedKind);
784    ConsumeToken();
785    break;
786  case tok::string_literal:    // primary-expression: string-literal
787  case tok::wide_string_literal:
788  case tok::utf8_string_literal:
789  case tok::utf16_string_literal:
790  case tok::utf32_string_literal:
791    Res = ParseStringLiteralExpression();
792    break;
793  case tok::kw__Generic:   // primary-expression: generic-selection [C1X 6.5.1]
794    Res = ParseGenericSelectionExpression();
795    break;
796  case tok::kw___builtin_va_arg:
797  case tok::kw___builtin_offsetof:
798  case tok::kw___builtin_choose_expr:
799  case tok::kw___builtin_astype: // primary-expression: [OCL] as_type()
800    return ParseBuiltinPrimaryExpression();
801  case tok::kw___null:
802    return Actions.ActOnGNUNullExpr(ConsumeToken());
803
804  case tok::plusplus:      // unary-expression: '++' unary-expression [C99]
805  case tok::minusminus: {  // unary-expression: '--' unary-expression [C99]
806    // C++ [expr.unary] has:
807    //   unary-expression:
808    //     ++ cast-expression
809    //     -- cast-expression
810    SourceLocation SavedLoc = ConsumeToken();
811    Res = ParseCastExpression(!getLang().CPlusPlus);
812    if (!Res.isInvalid())
813      Res = Actions.ActOnUnaryOp(getCurScope(), SavedLoc, SavedKind, Res.get());
814    return move(Res);
815  }
816  case tok::amp: {         // unary-expression: '&' cast-expression
817    // Special treatment because of member pointers
818    SourceLocation SavedLoc = ConsumeToken();
819    Res = ParseCastExpression(false, true);
820    if (!Res.isInvalid())
821      Res = Actions.ActOnUnaryOp(getCurScope(), SavedLoc, SavedKind, Res.get());
822    return move(Res);
823  }
824
825  case tok::star:          // unary-expression: '*' cast-expression
826  case tok::plus:          // unary-expression: '+' cast-expression
827  case tok::minus:         // unary-expression: '-' cast-expression
828  case tok::tilde:         // unary-expression: '~' cast-expression
829  case tok::exclaim:       // unary-expression: '!' cast-expression
830  case tok::kw___real:     // unary-expression: '__real' cast-expression [GNU]
831  case tok::kw___imag: {   // unary-expression: '__imag' cast-expression [GNU]
832    SourceLocation SavedLoc = ConsumeToken();
833    Res = ParseCastExpression(false);
834    if (!Res.isInvalid())
835      Res = Actions.ActOnUnaryOp(getCurScope(), SavedLoc, SavedKind, Res.get());
836    return move(Res);
837  }
838
839  case tok::kw___extension__:{//unary-expression:'__extension__' cast-expr [GNU]
840    // __extension__ silences extension warnings in the subexpression.
841    ExtensionRAIIObject O(Diags);  // Use RAII to do this.
842    SourceLocation SavedLoc = ConsumeToken();
843    Res = ParseCastExpression(false);
844    if (!Res.isInvalid())
845      Res = Actions.ActOnUnaryOp(getCurScope(), SavedLoc, SavedKind, Res.get());
846    return move(Res);
847  }
848  case tok::kw_sizeof:     // unary-expression: 'sizeof' unary-expression
849                           // unary-expression: 'sizeof' '(' type-name ')'
850  case tok::kw_alignof:
851  case tok::kw___alignof:  // unary-expression: '__alignof' unary-expression
852                           // unary-expression: '__alignof' '(' type-name ')'
853                           // unary-expression: 'alignof' '(' type-id ')'
854  case tok::kw_vec_step:   // unary-expression: OpenCL 'vec_step' expression
855    return ParseUnaryExprOrTypeTraitExpression();
856  case tok::ampamp: {      // unary-expression: '&&' identifier
857    SourceLocation AmpAmpLoc = ConsumeToken();
858    if (Tok.isNot(tok::identifier))
859      return ExprError(Diag(Tok, diag::err_expected_ident));
860
861    if (getCurScope()->getFnParent() == 0)
862      return ExprError(Diag(Tok, diag::err_address_of_label_outside_fn));
863
864    Diag(AmpAmpLoc, diag::ext_gnu_address_of_label);
865    LabelDecl *LD = Actions.LookupOrCreateLabel(Tok.getIdentifierInfo(),
866                                                Tok.getLocation());
867    Res = Actions.ActOnAddrLabel(AmpAmpLoc, Tok.getLocation(), LD);
868    ConsumeToken();
869    return move(Res);
870  }
871  case tok::kw_const_cast:
872  case tok::kw_dynamic_cast:
873  case tok::kw_reinterpret_cast:
874  case tok::kw_static_cast:
875    Res = ParseCXXCasts();
876    break;
877  case tok::kw_typeid:
878    Res = ParseCXXTypeid();
879    break;
880  case tok::kw___uuidof:
881    Res = ParseCXXUuidof();
882    break;
883  case tok::kw_this:
884    Res = ParseCXXThis();
885    break;
886
887  case tok::annot_typename:
888    if (isStartOfObjCClassMessageMissingOpenBracket()) {
889      ParsedType Type = getTypeAnnotation(Tok);
890
891      // Fake up a Declarator to use with ActOnTypeName.
892      DeclSpec DS(AttrFactory);
893      DS.SetRangeStart(Tok.getLocation());
894      DS.SetRangeEnd(Tok.getLastLoc());
895
896      const char *PrevSpec = 0;
897      unsigned DiagID;
898      DS.SetTypeSpecType(TST_typename, Tok.getAnnotationEndLoc(),
899                         PrevSpec, DiagID, Type);
900
901      Declarator DeclaratorInfo(DS, Declarator::TypeNameContext);
902      TypeResult Ty = Actions.ActOnTypeName(getCurScope(), DeclaratorInfo);
903      if (Ty.isInvalid())
904        break;
905
906      ConsumeToken();
907      Res = ParseObjCMessageExpressionBody(SourceLocation(), SourceLocation(),
908                                           Ty.get(), 0);
909      break;
910    }
911    // Fall through
912
913  case tok::kw_char:
914  case tok::kw_wchar_t:
915  case tok::kw_char16_t:
916  case tok::kw_char32_t:
917  case tok::kw_bool:
918  case tok::kw_short:
919  case tok::kw_int:
920  case tok::kw_long:
921  case tok::kw___int64:
922  case tok::kw_signed:
923  case tok::kw_unsigned:
924  case tok::kw_half:
925  case tok::kw_float:
926  case tok::kw_double:
927  case tok::kw_void:
928  case tok::kw_typename:
929  case tok::kw_typeof:
930  case tok::kw___vector: {
931    if (!getLang().CPlusPlus) {
932      Diag(Tok, diag::err_expected_expression);
933      return ExprError();
934    }
935
936    if (SavedKind == tok::kw_typename) {
937      // postfix-expression: typename-specifier '(' expression-list[opt] ')'
938      //                     typename-specifier braced-init-list
939      if (TryAnnotateTypeOrScopeToken())
940        return ExprError();
941    }
942
943    // postfix-expression: simple-type-specifier '(' expression-list[opt] ')'
944    //                     simple-type-specifier braced-init-list
945    //
946    DeclSpec DS(AttrFactory);
947    ParseCXXSimpleTypeSpecifier(DS);
948    if (Tok.isNot(tok::l_paren) &&
949        (!getLang().CPlusPlus0x || Tok.isNot(tok::l_brace)))
950      return ExprError(Diag(Tok, diag::err_expected_lparen_after_type)
951                         << DS.getSourceRange());
952
953    if (Tok.is(tok::l_brace))
954      Diag(Tok, diag::warn_cxx98_compat_generalized_initializer_lists);
955
956    Res = ParseCXXTypeConstructExpression(DS);
957    break;
958  }
959
960  case tok::annot_cxxscope: { // [C++] id-expression: qualified-id
961    // If TryAnnotateTypeOrScopeToken annotates the token, tail recurse.
962    // (We can end up in this situation after tentative parsing.)
963    if (TryAnnotateTypeOrScopeToken())
964      return ExprError();
965    if (!Tok.is(tok::annot_cxxscope))
966      return ParseCastExpression(isUnaryExpression, isAddressOfOperand,
967                                 NotCastExpr, isTypeCast);
968
969    Token Next = NextToken();
970    if (Next.is(tok::annot_template_id)) {
971      TemplateIdAnnotation *TemplateId = takeTemplateIdAnnotation(Next);
972      if (TemplateId->Kind == TNK_Type_template) {
973        // We have a qualified template-id that we know refers to a
974        // type, translate it into a type and continue parsing as a
975        // cast expression.
976        CXXScopeSpec SS;
977        ParseOptionalCXXScopeSpecifier(SS, ParsedType(),
978                                       /*EnteringContext=*/false);
979        AnnotateTemplateIdTokenAsType();
980        return ParseCastExpression(isUnaryExpression, isAddressOfOperand,
981                                   NotCastExpr, isTypeCast);
982      }
983    }
984
985    // Parse as an id-expression.
986    Res = ParseCXXIdExpression(isAddressOfOperand);
987    break;
988  }
989
990  case tok::annot_template_id: { // [C++]          template-id
991    TemplateIdAnnotation *TemplateId = takeTemplateIdAnnotation(Tok);
992    if (TemplateId->Kind == TNK_Type_template) {
993      // We have a template-id that we know refers to a type,
994      // translate it into a type and continue parsing as a cast
995      // expression.
996      AnnotateTemplateIdTokenAsType();
997      return ParseCastExpression(isUnaryExpression, isAddressOfOperand,
998                                 NotCastExpr, isTypeCast);
999    }
1000
1001    // Fall through to treat the template-id as an id-expression.
1002  }
1003
1004  case tok::kw_operator: // [C++] id-expression: operator/conversion-function-id
1005    Res = ParseCXXIdExpression(isAddressOfOperand);
1006    break;
1007
1008  case tok::coloncolon: {
1009    // ::foo::bar -> global qualified name etc.   If TryAnnotateTypeOrScopeToken
1010    // annotates the token, tail recurse.
1011    if (TryAnnotateTypeOrScopeToken())
1012      return ExprError();
1013    if (!Tok.is(tok::coloncolon))
1014      return ParseCastExpression(isUnaryExpression, isAddressOfOperand);
1015
1016    // ::new -> [C++] new-expression
1017    // ::delete -> [C++] delete-expression
1018    SourceLocation CCLoc = ConsumeToken();
1019    if (Tok.is(tok::kw_new))
1020      return ParseCXXNewExpression(true, CCLoc);
1021    if (Tok.is(tok::kw_delete))
1022      return ParseCXXDeleteExpression(true, CCLoc);
1023
1024    // This is not a type name or scope specifier, it is an invalid expression.
1025    Diag(CCLoc, diag::err_expected_expression);
1026    return ExprError();
1027  }
1028
1029  case tok::kw_new: // [C++] new-expression
1030    return ParseCXXNewExpression(false, Tok.getLocation());
1031
1032  case tok::kw_delete: // [C++] delete-expression
1033    return ParseCXXDeleteExpression(false, Tok.getLocation());
1034
1035  case tok::kw_noexcept: { // [C++0x] 'noexcept' '(' expression ')'
1036    Diag(Tok, diag::warn_cxx98_compat_noexcept_expr);
1037    SourceLocation KeyLoc = ConsumeToken();
1038    BalancedDelimiterTracker T(*this, tok::l_paren);
1039
1040    if (T.expectAndConsume(diag::err_expected_lparen_after, "noexcept"))
1041      return ExprError();
1042    // C++ [expr.unary.noexcept]p1:
1043    //   The noexcept operator determines whether the evaluation of its operand,
1044    //   which is an unevaluated operand, can throw an exception.
1045    EnterExpressionEvaluationContext Unevaluated(Actions, Sema::Unevaluated);
1046    ExprResult Result = ParseExpression();
1047
1048    T.consumeClose();
1049
1050    if (!Result.isInvalid())
1051      Result = Actions.ActOnNoexceptExpr(KeyLoc, T.getOpenLocation(),
1052                                         Result.take(), T.getCloseLocation());
1053    return move(Result);
1054  }
1055
1056  case tok::kw___is_abstract: // [GNU] unary-type-trait
1057  case tok::kw___is_class:
1058  case tok::kw___is_empty:
1059  case tok::kw___is_enum:
1060  case tok::kw___is_literal:
1061  case tok::kw___is_arithmetic:
1062  case tok::kw___is_integral:
1063  case tok::kw___is_floating_point:
1064  case tok::kw___is_complete_type:
1065  case tok::kw___is_void:
1066  case tok::kw___is_array:
1067  case tok::kw___is_function:
1068  case tok::kw___is_reference:
1069  case tok::kw___is_lvalue_reference:
1070  case tok::kw___is_rvalue_reference:
1071  case tok::kw___is_fundamental:
1072  case tok::kw___is_object:
1073  case tok::kw___is_scalar:
1074  case tok::kw___is_compound:
1075  case tok::kw___is_pointer:
1076  case tok::kw___is_member_object_pointer:
1077  case tok::kw___is_member_function_pointer:
1078  case tok::kw___is_member_pointer:
1079  case tok::kw___is_const:
1080  case tok::kw___is_volatile:
1081  case tok::kw___is_standard_layout:
1082  case tok::kw___is_signed:
1083  case tok::kw___is_unsigned:
1084  case tok::kw___is_literal_type:
1085  case tok::kw___is_pod:
1086  case tok::kw___is_polymorphic:
1087  case tok::kw___is_trivial:
1088  case tok::kw___is_trivially_copyable:
1089  case tok::kw___is_union:
1090  case tok::kw___has_trivial_constructor:
1091  case tok::kw___has_trivial_copy:
1092  case tok::kw___has_trivial_assign:
1093  case tok::kw___has_trivial_destructor:
1094  case tok::kw___has_nothrow_assign:
1095  case tok::kw___has_nothrow_copy:
1096  case tok::kw___has_nothrow_constructor:
1097  case tok::kw___has_virtual_destructor:
1098    return ParseUnaryTypeTrait();
1099
1100  case tok::kw___builtin_types_compatible_p:
1101  case tok::kw___is_base_of:
1102  case tok::kw___is_same:
1103  case tok::kw___is_convertible:
1104  case tok::kw___is_convertible_to:
1105    return ParseBinaryTypeTrait();
1106
1107  case tok::kw___array_rank:
1108  case tok::kw___array_extent:
1109    return ParseArrayTypeTrait();
1110
1111  case tok::kw___is_lvalue_expr:
1112  case tok::kw___is_rvalue_expr:
1113    return ParseExpressionTrait();
1114
1115  case tok::at: {
1116    SourceLocation AtLoc = ConsumeToken();
1117    return ParseObjCAtExpression(AtLoc);
1118  }
1119  case tok::caret:
1120    Res = ParseBlockLiteralExpression();
1121    break;
1122  case tok::code_completion: {
1123    Actions.CodeCompleteOrdinaryName(getCurScope(), Sema::PCC_Expression);
1124    cutOffParsing();
1125    return ExprError();
1126  }
1127  case tok::l_square:
1128    if (getLang().CPlusPlus0x) {
1129      if (getLang().ObjC1) {
1130        Res = TryParseLambdaExpression();
1131        if (Res.isInvalid())
1132          Res = ParseObjCMessageExpression();
1133        break;
1134      }
1135      Res = ParseLambdaExpression();
1136      break;
1137    }
1138    if (getLang().ObjC1) {
1139      Res = ParseObjCMessageExpression();
1140      break;
1141    }
1142    // FALL THROUGH.
1143  default:
1144    NotCastExpr = true;
1145    return ExprError();
1146  }
1147
1148  // These can be followed by postfix-expr pieces.
1149  return ParsePostfixExpressionSuffix(Res);
1150}
1151
1152/// ParsePostfixExpressionSuffix - Once the leading part of a postfix-expression
1153/// is parsed, this method parses any suffixes that apply.
1154///
1155///       postfix-expression: [C99 6.5.2]
1156///         primary-expression
1157///         postfix-expression '[' expression ']'
1158///         postfix-expression '[' braced-init-list ']'
1159///         postfix-expression '(' argument-expression-list[opt] ')'
1160///         postfix-expression '.' identifier
1161///         postfix-expression '->' identifier
1162///         postfix-expression '++'
1163///         postfix-expression '--'
1164///         '(' type-name ')' '{' initializer-list '}'
1165///         '(' type-name ')' '{' initializer-list ',' '}'
1166///
1167///       argument-expression-list: [C99 6.5.2]
1168///         argument-expression ...[opt]
1169///         argument-expression-list ',' assignment-expression ...[opt]
1170///
1171ExprResult
1172Parser::ParsePostfixExpressionSuffix(ExprResult LHS) {
1173  // Now that the primary-expression piece of the postfix-expression has been
1174  // parsed, see if there are any postfix-expression pieces here.
1175  SourceLocation Loc;
1176  while (1) {
1177    switch (Tok.getKind()) {
1178    case tok::code_completion:
1179      if (InMessageExpression)
1180        return move(LHS);
1181
1182      Actions.CodeCompletePostfixExpression(getCurScope(), LHS);
1183      cutOffParsing();
1184      return ExprError();
1185
1186    case tok::identifier:
1187      // If we see identifier: after an expression, and we're not already in a
1188      // message send, then this is probably a message send with a missing
1189      // opening bracket '['.
1190      if (getLang().ObjC1 && !InMessageExpression &&
1191          (NextToken().is(tok::colon) || NextToken().is(tok::r_square))) {
1192        LHS = ParseObjCMessageExpressionBody(SourceLocation(), SourceLocation(),
1193                                             ParsedType(), LHS.get());
1194        break;
1195      }
1196
1197      // Fall through; this isn't a message send.
1198
1199    default:  // Not a postfix-expression suffix.
1200      return move(LHS);
1201    case tok::l_square: {  // postfix-expression: p-e '[' expression ']'
1202      // If we have a array postfix expression that starts on a new line and
1203      // Objective-C is enabled, it is highly likely that the user forgot a
1204      // semicolon after the base expression and that the array postfix-expr is
1205      // actually another message send.  In this case, do some look-ahead to see
1206      // if the contents of the square brackets are obviously not a valid
1207      // expression and recover by pretending there is no suffix.
1208      if (getLang().ObjC1 && Tok.isAtStartOfLine() &&
1209          isSimpleObjCMessageExpression())
1210        return move(LHS);
1211
1212      BalancedDelimiterTracker T(*this, tok::l_square);
1213      T.consumeOpen();
1214      Loc = T.getOpenLocation();
1215      ExprResult Idx;
1216      if (getLang().CPlusPlus0x && Tok.is(tok::l_brace)) {
1217        Diag(Tok, diag::warn_cxx98_compat_generalized_initializer_lists);
1218        Idx = ParseBraceInitializer();
1219      } else
1220        Idx = ParseExpression();
1221
1222      SourceLocation RLoc = Tok.getLocation();
1223
1224      if (!LHS.isInvalid() && !Idx.isInvalid() && Tok.is(tok::r_square)) {
1225        LHS = Actions.ActOnArraySubscriptExpr(getCurScope(), LHS.take(), Loc,
1226                                              Idx.take(), RLoc);
1227      } else
1228        LHS = ExprError();
1229
1230      // Match the ']'.
1231      T.consumeClose();
1232      break;
1233    }
1234
1235    case tok::l_paren:         // p-e: p-e '(' argument-expression-list[opt] ')'
1236    case tok::lesslessless: {  // p-e: p-e '<<<' argument-expression-list '>>>'
1237                               //   '(' argument-expression-list[opt] ')'
1238      tok::TokenKind OpKind = Tok.getKind();
1239      InMessageExpressionRAIIObject InMessage(*this, false);
1240
1241      Expr *ExecConfig = 0;
1242
1243      BalancedDelimiterTracker LLLT(*this, tok::lesslessless);
1244      BalancedDelimiterTracker PT(*this, tok::l_paren);
1245
1246      if (OpKind == tok::lesslessless) {
1247        ExprVector ExecConfigExprs(Actions);
1248        CommaLocsTy ExecConfigCommaLocs;
1249        LLLT.consumeOpen();
1250
1251        if (ParseExpressionList(ExecConfigExprs, ExecConfigCommaLocs)) {
1252          LHS = ExprError();
1253        }
1254
1255        if (LHS.isInvalid()) {
1256          SkipUntil(tok::greatergreatergreater);
1257        } else if (LLLT.consumeClose()) {
1258          // There was an error closing the brackets
1259          LHS = ExprError();
1260        }
1261
1262        if (!LHS.isInvalid()) {
1263          if (ExpectAndConsume(tok::l_paren, diag::err_expected_lparen, ""))
1264            LHS = ExprError();
1265          else
1266            Loc = PrevTokLocation;
1267        }
1268
1269        if (!LHS.isInvalid()) {
1270          ExprResult ECResult = Actions.ActOnCUDAExecConfigExpr(getCurScope(),
1271                                    LLLT.getOpenLocation(),
1272                                    move_arg(ExecConfigExprs),
1273                                    LLLT.getCloseLocation());
1274          if (ECResult.isInvalid())
1275            LHS = ExprError();
1276          else
1277            ExecConfig = ECResult.get();
1278        }
1279      } else {
1280        PT.consumeOpen();
1281        Loc = PT.getOpenLocation();
1282      }
1283
1284      ExprVector ArgExprs(Actions);
1285      CommaLocsTy CommaLocs;
1286
1287      if (Tok.is(tok::code_completion)) {
1288        Actions.CodeCompleteCall(getCurScope(), LHS.get(), 0, 0);
1289        cutOffParsing();
1290        return ExprError();
1291      }
1292
1293      if (OpKind == tok::l_paren || !LHS.isInvalid()) {
1294        if (Tok.isNot(tok::r_paren)) {
1295          if (ParseExpressionList(ArgExprs, CommaLocs, &Sema::CodeCompleteCall,
1296                                  LHS.get())) {
1297            LHS = ExprError();
1298          }
1299        }
1300      }
1301
1302      // Match the ')'.
1303      if (LHS.isInvalid()) {
1304        SkipUntil(tok::r_paren);
1305      } else if (Tok.isNot(tok::r_paren)) {
1306        PT.consumeClose();
1307        LHS = ExprError();
1308      } else {
1309        assert((ArgExprs.size() == 0 ||
1310                ArgExprs.size()-1 == CommaLocs.size())&&
1311               "Unexpected number of commas!");
1312        LHS = Actions.ActOnCallExpr(getCurScope(), LHS.take(), Loc,
1313                                    move_arg(ArgExprs), Tok.getLocation(),
1314                                    ExecConfig);
1315        PT.consumeClose();
1316      }
1317
1318      break;
1319    }
1320    case tok::arrow:
1321    case tok::period: {
1322      // postfix-expression: p-e '->' template[opt] id-expression
1323      // postfix-expression: p-e '.' template[opt] id-expression
1324      tok::TokenKind OpKind = Tok.getKind();
1325      SourceLocation OpLoc = ConsumeToken();  // Eat the "." or "->" token.
1326
1327      CXXScopeSpec SS;
1328      ParsedType ObjectType;
1329      bool MayBePseudoDestructor = false;
1330      if (getLang().CPlusPlus && !LHS.isInvalid()) {
1331        LHS = Actions.ActOnStartCXXMemberReference(getCurScope(), LHS.take(),
1332                                                   OpLoc, OpKind, ObjectType,
1333                                                   MayBePseudoDestructor);
1334        if (LHS.isInvalid())
1335          break;
1336
1337        ParseOptionalCXXScopeSpecifier(SS, ObjectType,
1338                                       /*EnteringContext=*/false,
1339                                       &MayBePseudoDestructor);
1340        if (SS.isNotEmpty())
1341          ObjectType = ParsedType();
1342      }
1343
1344      if (Tok.is(tok::code_completion)) {
1345        // Code completion for a member access expression.
1346        Actions.CodeCompleteMemberReferenceExpr(getCurScope(), LHS.get(),
1347                                                OpLoc, OpKind == tok::arrow);
1348
1349        cutOffParsing();
1350        return ExprError();
1351      }
1352
1353      if (MayBePseudoDestructor && !LHS.isInvalid()) {
1354        LHS = ParseCXXPseudoDestructor(LHS.take(), OpLoc, OpKind, SS,
1355                                       ObjectType);
1356        break;
1357      }
1358
1359      // Either the action has told is that this cannot be a
1360      // pseudo-destructor expression (based on the type of base
1361      // expression), or we didn't see a '~' in the right place. We
1362      // can still parse a destructor name here, but in that case it
1363      // names a real destructor.
1364      // Allow explicit constructor calls in Microsoft mode.
1365      // FIXME: Add support for explicit call of template constructor.
1366      UnqualifiedId Name;
1367      if (ParseUnqualifiedId(SS,
1368                             /*EnteringContext=*/false,
1369                             /*AllowDestructorName=*/true,
1370                             /*AllowConstructorName=*/ getLang().MicrosoftExt,
1371                             ObjectType,
1372                             Name))
1373        LHS = ExprError();
1374
1375      if (!LHS.isInvalid())
1376        LHS = Actions.ActOnMemberAccessExpr(getCurScope(), LHS.take(), OpLoc,
1377                                            OpKind, SS, Name, ObjCImpDecl,
1378                                            Tok.is(tok::l_paren));
1379      break;
1380    }
1381    case tok::plusplus:    // postfix-expression: postfix-expression '++'
1382    case tok::minusminus:  // postfix-expression: postfix-expression '--'
1383      if (!LHS.isInvalid()) {
1384        LHS = Actions.ActOnPostfixUnaryOp(getCurScope(), Tok.getLocation(),
1385                                          Tok.getKind(), LHS.take());
1386      }
1387      ConsumeToken();
1388      break;
1389    }
1390  }
1391}
1392
1393/// ParseExprAfterUnaryExprOrTypeTrait - We parsed a typeof/sizeof/alignof/
1394/// vec_step and we are at the start of an expression or a parenthesized
1395/// type-id. OpTok is the operand token (typeof/sizeof/alignof). Returns the
1396/// expression (isCastExpr == false) or the type (isCastExpr == true).
1397///
1398///       unary-expression:  [C99 6.5.3]
1399///         'sizeof' unary-expression
1400///         'sizeof' '(' type-name ')'
1401/// [GNU]   '__alignof' unary-expression
1402/// [GNU]   '__alignof' '(' type-name ')'
1403/// [C++0x] 'alignof' '(' type-id ')'
1404///
1405/// [GNU]   typeof-specifier:
1406///           typeof ( expressions )
1407///           typeof ( type-name )
1408/// [GNU/C++] typeof unary-expression
1409///
1410/// [OpenCL 1.1 6.11.12] vec_step built-in function:
1411///           vec_step ( expressions )
1412///           vec_step ( type-name )
1413///
1414ExprResult
1415Parser::ParseExprAfterUnaryExprOrTypeTrait(const Token &OpTok,
1416                                           bool &isCastExpr,
1417                                           ParsedType &CastTy,
1418                                           SourceRange &CastRange) {
1419
1420  assert((OpTok.is(tok::kw_typeof)    || OpTok.is(tok::kw_sizeof) ||
1421          OpTok.is(tok::kw___alignof) || OpTok.is(tok::kw_alignof) ||
1422          OpTok.is(tok::kw_vec_step)) &&
1423          "Not a typeof/sizeof/alignof/vec_step expression!");
1424
1425  ExprResult Operand;
1426
1427  // If the operand doesn't start with an '(', it must be an expression.
1428  if (Tok.isNot(tok::l_paren)) {
1429    isCastExpr = false;
1430    if (OpTok.is(tok::kw_typeof) && !getLang().CPlusPlus) {
1431      Diag(Tok,diag::err_expected_lparen_after_id) << OpTok.getIdentifierInfo();
1432      return ExprError();
1433    }
1434
1435    // C++0x [expr.sizeof]p1:
1436    //   [...] The operand is either an expression, which is an unevaluated
1437    //   operand (Clause 5) [...]
1438    //
1439    // The GNU typeof and alignof extensions also behave as unevaluated
1440    // operands.
1441    EnterExpressionEvaluationContext Unevaluated(Actions,
1442                                                 Sema::Unevaluated);
1443    Operand = ParseCastExpression(true/*isUnaryExpression*/);
1444  } else {
1445    // If it starts with a '(', we know that it is either a parenthesized
1446    // type-name, or it is a unary-expression that starts with a compound
1447    // literal, or starts with a primary-expression that is a parenthesized
1448    // expression.
1449    ParenParseOption ExprType = CastExpr;
1450    SourceLocation LParenLoc = Tok.getLocation(), RParenLoc;
1451
1452    // C++0x [expr.sizeof]p1:
1453    //   [...] The operand is either an expression, which is an unevaluated
1454    //   operand (Clause 5) [...]
1455    //
1456    // The GNU typeof and alignof extensions also behave as unevaluated
1457    // operands.
1458    EnterExpressionEvaluationContext Unevaluated(Actions,
1459                                                 Sema::Unevaluated);
1460    Operand = ParseParenExpression(ExprType, true/*stopIfCastExpr*/,
1461                                   false, CastTy, RParenLoc);
1462    CastRange = SourceRange(LParenLoc, RParenLoc);
1463
1464    // If ParseParenExpression parsed a '(typename)' sequence only, then this is
1465    // a type.
1466    if (ExprType == CastExpr) {
1467      isCastExpr = true;
1468      return ExprEmpty();
1469    }
1470
1471    if (getLang().CPlusPlus || OpTok.isNot(tok::kw_typeof)) {
1472      // GNU typeof in C requires the expression to be parenthesized. Not so for
1473      // sizeof/alignof or in C++. Therefore, the parenthesized expression is
1474      // the start of a unary-expression, but doesn't include any postfix
1475      // pieces. Parse these now if present.
1476      if (!Operand.isInvalid())
1477        Operand = ParsePostfixExpressionSuffix(Operand.get());
1478    }
1479  }
1480
1481  // If we get here, the operand to the typeof/sizeof/alignof was an expresion.
1482  isCastExpr = false;
1483  return move(Operand);
1484}
1485
1486
1487/// ParseUnaryExprOrTypeTraitExpression - Parse a sizeof or alignof expression.
1488///       unary-expression:  [C99 6.5.3]
1489///         'sizeof' unary-expression
1490///         'sizeof' '(' type-name ')'
1491/// [C++0x] 'sizeof' '...' '(' identifier ')'
1492/// [GNU]   '__alignof' unary-expression
1493/// [GNU]   '__alignof' '(' type-name ')'
1494/// [C++0x] 'alignof' '(' type-id ')'
1495ExprResult Parser::ParseUnaryExprOrTypeTraitExpression() {
1496  assert((Tok.is(tok::kw_sizeof) || Tok.is(tok::kw___alignof)
1497          || Tok.is(tok::kw_alignof) || Tok.is(tok::kw_vec_step)) &&
1498         "Not a sizeof/alignof/vec_step expression!");
1499  Token OpTok = Tok;
1500  ConsumeToken();
1501
1502  // [C++0x] 'sizeof' '...' '(' identifier ')'
1503  if (Tok.is(tok::ellipsis) && OpTok.is(tok::kw_sizeof)) {
1504    SourceLocation EllipsisLoc = ConsumeToken();
1505    SourceLocation LParenLoc, RParenLoc;
1506    IdentifierInfo *Name = 0;
1507    SourceLocation NameLoc;
1508    if (Tok.is(tok::l_paren)) {
1509      BalancedDelimiterTracker T(*this, tok::l_paren);
1510      T.consumeOpen();
1511      LParenLoc = T.getOpenLocation();
1512      if (Tok.is(tok::identifier)) {
1513        Name = Tok.getIdentifierInfo();
1514        NameLoc = ConsumeToken();
1515        T.consumeClose();
1516        RParenLoc = T.getCloseLocation();
1517        if (RParenLoc.isInvalid())
1518          RParenLoc = PP.getLocForEndOfToken(NameLoc);
1519      } else {
1520        Diag(Tok, diag::err_expected_parameter_pack);
1521        SkipUntil(tok::r_paren);
1522      }
1523    } else if (Tok.is(tok::identifier)) {
1524      Name = Tok.getIdentifierInfo();
1525      NameLoc = ConsumeToken();
1526      LParenLoc = PP.getLocForEndOfToken(EllipsisLoc);
1527      RParenLoc = PP.getLocForEndOfToken(NameLoc);
1528      Diag(LParenLoc, diag::err_paren_sizeof_parameter_pack)
1529        << Name
1530        << FixItHint::CreateInsertion(LParenLoc, "(")
1531        << FixItHint::CreateInsertion(RParenLoc, ")");
1532    } else {
1533      Diag(Tok, diag::err_sizeof_parameter_pack);
1534    }
1535
1536    if (!Name)
1537      return ExprError();
1538
1539    return Actions.ActOnSizeofParameterPackExpr(getCurScope(),
1540                                                OpTok.getLocation(),
1541                                                *Name, NameLoc,
1542                                                RParenLoc);
1543  }
1544
1545  if (OpTok.is(tok::kw_alignof))
1546    Diag(OpTok, diag::warn_cxx98_compat_alignof);
1547
1548  bool isCastExpr;
1549  ParsedType CastTy;
1550  SourceRange CastRange;
1551  ExprResult Operand = ParseExprAfterUnaryExprOrTypeTrait(OpTok,
1552                                                          isCastExpr,
1553                                                          CastTy,
1554                                                          CastRange);
1555
1556  UnaryExprOrTypeTrait ExprKind = UETT_SizeOf;
1557  if (OpTok.is(tok::kw_alignof) || OpTok.is(tok::kw___alignof))
1558    ExprKind = UETT_AlignOf;
1559  else if (OpTok.is(tok::kw_vec_step))
1560    ExprKind = UETT_VecStep;
1561
1562  if (isCastExpr)
1563    return Actions.ActOnUnaryExprOrTypeTraitExpr(OpTok.getLocation(),
1564                                                 ExprKind,
1565                                                 /*isType=*/true,
1566                                                 CastTy.getAsOpaquePtr(),
1567                                                 CastRange);
1568
1569  // If we get here, the operand to the sizeof/alignof was an expresion.
1570  if (!Operand.isInvalid())
1571    Operand = Actions.ActOnUnaryExprOrTypeTraitExpr(OpTok.getLocation(),
1572                                                    ExprKind,
1573                                                    /*isType=*/false,
1574                                                    Operand.release(),
1575                                                    CastRange);
1576  return move(Operand);
1577}
1578
1579/// ParseBuiltinPrimaryExpression
1580///
1581///       primary-expression: [C99 6.5.1]
1582/// [GNU]   '__builtin_va_arg' '(' assignment-expression ',' type-name ')'
1583/// [GNU]   '__builtin_offsetof' '(' type-name ',' offsetof-member-designator')'
1584/// [GNU]   '__builtin_choose_expr' '(' assign-expr ',' assign-expr ','
1585///                                     assign-expr ')'
1586/// [GNU]   '__builtin_types_compatible_p' '(' type-name ',' type-name ')'
1587/// [OCL]   '__builtin_astype' '(' assignment-expression ',' type-name ')'
1588///
1589/// [GNU] offsetof-member-designator:
1590/// [GNU]   identifier
1591/// [GNU]   offsetof-member-designator '.' identifier
1592/// [GNU]   offsetof-member-designator '[' expression ']'
1593///
1594ExprResult Parser::ParseBuiltinPrimaryExpression() {
1595  ExprResult Res;
1596  const IdentifierInfo *BuiltinII = Tok.getIdentifierInfo();
1597
1598  tok::TokenKind T = Tok.getKind();
1599  SourceLocation StartLoc = ConsumeToken();   // Eat the builtin identifier.
1600
1601  // All of these start with an open paren.
1602  if (Tok.isNot(tok::l_paren))
1603    return ExprError(Diag(Tok, diag::err_expected_lparen_after_id)
1604                       << BuiltinII);
1605
1606  BalancedDelimiterTracker PT(*this, tok::l_paren);
1607  PT.consumeOpen();
1608
1609  // TODO: Build AST.
1610
1611  switch (T) {
1612  default: llvm_unreachable("Not a builtin primary expression!");
1613  case tok::kw___builtin_va_arg: {
1614    ExprResult Expr(ParseAssignmentExpression());
1615
1616    if (ExpectAndConsume(tok::comma, diag::err_expected_comma, "",tok::r_paren))
1617      Expr = ExprError();
1618
1619    TypeResult Ty = ParseTypeName();
1620
1621    if (Tok.isNot(tok::r_paren)) {
1622      Diag(Tok, diag::err_expected_rparen);
1623      Expr = ExprError();
1624    }
1625
1626    if (Expr.isInvalid() || Ty.isInvalid())
1627      Res = ExprError();
1628    else
1629      Res = Actions.ActOnVAArg(StartLoc, Expr.take(), Ty.get(), ConsumeParen());
1630    break;
1631  }
1632  case tok::kw___builtin_offsetof: {
1633    SourceLocation TypeLoc = Tok.getLocation();
1634    TypeResult Ty = ParseTypeName();
1635    if (Ty.isInvalid()) {
1636      SkipUntil(tok::r_paren);
1637      return ExprError();
1638    }
1639
1640    if (ExpectAndConsume(tok::comma, diag::err_expected_comma, "",tok::r_paren))
1641      return ExprError();
1642
1643    // We must have at least one identifier here.
1644    if (Tok.isNot(tok::identifier)) {
1645      Diag(Tok, diag::err_expected_ident);
1646      SkipUntil(tok::r_paren);
1647      return ExprError();
1648    }
1649
1650    // Keep track of the various subcomponents we see.
1651    SmallVector<Sema::OffsetOfComponent, 4> Comps;
1652
1653    Comps.push_back(Sema::OffsetOfComponent());
1654    Comps.back().isBrackets = false;
1655    Comps.back().U.IdentInfo = Tok.getIdentifierInfo();
1656    Comps.back().LocStart = Comps.back().LocEnd = ConsumeToken();
1657
1658    // FIXME: This loop leaks the index expressions on error.
1659    while (1) {
1660      if (Tok.is(tok::period)) {
1661        // offsetof-member-designator: offsetof-member-designator '.' identifier
1662        Comps.push_back(Sema::OffsetOfComponent());
1663        Comps.back().isBrackets = false;
1664        Comps.back().LocStart = ConsumeToken();
1665
1666        if (Tok.isNot(tok::identifier)) {
1667          Diag(Tok, diag::err_expected_ident);
1668          SkipUntil(tok::r_paren);
1669          return ExprError();
1670        }
1671        Comps.back().U.IdentInfo = Tok.getIdentifierInfo();
1672        Comps.back().LocEnd = ConsumeToken();
1673
1674      } else if (Tok.is(tok::l_square)) {
1675        // offsetof-member-designator: offsetof-member-design '[' expression ']'
1676        Comps.push_back(Sema::OffsetOfComponent());
1677        Comps.back().isBrackets = true;
1678        BalancedDelimiterTracker ST(*this, tok::l_square);
1679        ST.consumeOpen();
1680        Comps.back().LocStart = ST.getOpenLocation();
1681        Res = ParseExpression();
1682        if (Res.isInvalid()) {
1683          SkipUntil(tok::r_paren);
1684          return move(Res);
1685        }
1686        Comps.back().U.E = Res.release();
1687
1688        ST.consumeClose();
1689        Comps.back().LocEnd = ST.getCloseLocation();
1690      } else {
1691        if (Tok.isNot(tok::r_paren)) {
1692          PT.consumeClose();
1693          Res = ExprError();
1694        } else if (Ty.isInvalid()) {
1695          Res = ExprError();
1696        } else {
1697          PT.consumeClose();
1698          Res = Actions.ActOnBuiltinOffsetOf(getCurScope(), StartLoc, TypeLoc,
1699                                             Ty.get(), &Comps[0], Comps.size(),
1700                                             PT.getCloseLocation());
1701        }
1702        break;
1703      }
1704    }
1705    break;
1706  }
1707  case tok::kw___builtin_choose_expr: {
1708    ExprResult Cond(ParseAssignmentExpression());
1709    if (Cond.isInvalid()) {
1710      SkipUntil(tok::r_paren);
1711      return move(Cond);
1712    }
1713    if (ExpectAndConsume(tok::comma, diag::err_expected_comma, "",tok::r_paren))
1714      return ExprError();
1715
1716    ExprResult Expr1(ParseAssignmentExpression());
1717    if (Expr1.isInvalid()) {
1718      SkipUntil(tok::r_paren);
1719      return move(Expr1);
1720    }
1721    if (ExpectAndConsume(tok::comma, diag::err_expected_comma, "",tok::r_paren))
1722      return ExprError();
1723
1724    ExprResult Expr2(ParseAssignmentExpression());
1725    if (Expr2.isInvalid()) {
1726      SkipUntil(tok::r_paren);
1727      return move(Expr2);
1728    }
1729    if (Tok.isNot(tok::r_paren)) {
1730      Diag(Tok, diag::err_expected_rparen);
1731      return ExprError();
1732    }
1733    Res = Actions.ActOnChooseExpr(StartLoc, Cond.take(), Expr1.take(),
1734                                  Expr2.take(), ConsumeParen());
1735    break;
1736  }
1737  case tok::kw___builtin_astype: {
1738    // The first argument is an expression to be converted, followed by a comma.
1739    ExprResult Expr(ParseAssignmentExpression());
1740    if (Expr.isInvalid()) {
1741      SkipUntil(tok::r_paren);
1742      return ExprError();
1743    }
1744
1745    if (ExpectAndConsume(tok::comma, diag::err_expected_comma, "",
1746                         tok::r_paren))
1747      return ExprError();
1748
1749    // Second argument is the type to bitcast to.
1750    TypeResult DestTy = ParseTypeName();
1751    if (DestTy.isInvalid())
1752      return ExprError();
1753
1754    // Attempt to consume the r-paren.
1755    if (Tok.isNot(tok::r_paren)) {
1756      Diag(Tok, diag::err_expected_rparen);
1757      SkipUntil(tok::r_paren);
1758      return ExprError();
1759    }
1760
1761    Res = Actions.ActOnAsTypeExpr(Expr.take(), DestTy.get(), StartLoc,
1762                                  ConsumeParen());
1763    break;
1764  }
1765  }
1766
1767  if (Res.isInvalid())
1768    return ExprError();
1769
1770  // These can be followed by postfix-expr pieces because they are
1771  // primary-expressions.
1772  return ParsePostfixExpressionSuffix(Res.take());
1773}
1774
1775/// ParseParenExpression - This parses the unit that starts with a '(' token,
1776/// based on what is allowed by ExprType.  The actual thing parsed is returned
1777/// in ExprType. If stopIfCastExpr is true, it will only return the parsed type,
1778/// not the parsed cast-expression.
1779///
1780///       primary-expression: [C99 6.5.1]
1781///         '(' expression ')'
1782/// [GNU]   '(' compound-statement ')'      (if !ParenExprOnly)
1783///       postfix-expression: [C99 6.5.2]
1784///         '(' type-name ')' '{' initializer-list '}'
1785///         '(' type-name ')' '{' initializer-list ',' '}'
1786///       cast-expression: [C99 6.5.4]
1787///         '(' type-name ')' cast-expression
1788/// [ARC]   bridged-cast-expression
1789///
1790/// [ARC] bridged-cast-expression:
1791///         (__bridge type-name) cast-expression
1792///         (__bridge_transfer type-name) cast-expression
1793///         (__bridge_retained type-name) cast-expression
1794ExprResult
1795Parser::ParseParenExpression(ParenParseOption &ExprType, bool stopIfCastExpr,
1796                             bool isTypeCast, ParsedType &CastTy,
1797                             SourceLocation &RParenLoc) {
1798  assert(Tok.is(tok::l_paren) && "Not a paren expr!");
1799  GreaterThanIsOperatorScope G(GreaterThanIsOperator, true);
1800  BalancedDelimiterTracker T(*this, tok::l_paren);
1801  if (T.consumeOpen())
1802    return ExprError();
1803  SourceLocation OpenLoc = T.getOpenLocation();
1804
1805  ExprResult Result(true);
1806  bool isAmbiguousTypeId;
1807  CastTy = ParsedType();
1808
1809  if (Tok.is(tok::code_completion)) {
1810    Actions.CodeCompleteOrdinaryName(getCurScope(),
1811                 ExprType >= CompoundLiteral? Sema::PCC_ParenthesizedExpression
1812                                            : Sema::PCC_Expression);
1813    cutOffParsing();
1814    return ExprError();
1815  }
1816
1817  // None of these cases should fall through with an invalid Result
1818  // unless they've already reported an error.
1819
1820  if (ExprType >= CompoundStmt && Tok.is(tok::l_brace)) {
1821    Diag(Tok, diag::ext_gnu_statement_expr);
1822    ParsedAttributes attrs(AttrFactory);
1823    StmtResult Stmt(ParseCompoundStatement(attrs, true));
1824    ExprType = CompoundStmt;
1825
1826    // If the substmt parsed correctly, build the AST node.
1827    if (!Stmt.isInvalid())
1828      Result = Actions.ActOnStmtExpr(OpenLoc, Stmt.take(), Tok.getLocation());
1829  } else if (ExprType >= CompoundLiteral &&
1830             (Tok.is(tok::kw___bridge) ||
1831              Tok.is(tok::kw___bridge_transfer) ||
1832              Tok.is(tok::kw___bridge_retained) ||
1833              Tok.is(tok::kw___bridge_retain))) {
1834    tok::TokenKind tokenKind = Tok.getKind();
1835    SourceLocation BridgeKeywordLoc = ConsumeToken();
1836
1837    // Parse an Objective-C ARC ownership cast expression.
1838    ObjCBridgeCastKind Kind;
1839    if (tokenKind == tok::kw___bridge)
1840      Kind = OBC_Bridge;
1841    else if (tokenKind == tok::kw___bridge_transfer)
1842      Kind = OBC_BridgeTransfer;
1843    else if (tokenKind == tok::kw___bridge_retained)
1844      Kind = OBC_BridgeRetained;
1845    else {
1846      // As a hopefully temporary workaround, allow __bridge_retain as
1847      // a synonym for __bridge_retained, but only in system headers.
1848      assert(tokenKind == tok::kw___bridge_retain);
1849      Kind = OBC_BridgeRetained;
1850      if (!PP.getSourceManager().isInSystemHeader(BridgeKeywordLoc))
1851        Diag(BridgeKeywordLoc, diag::err_arc_bridge_retain)
1852          << FixItHint::CreateReplacement(BridgeKeywordLoc,
1853                                          "__bridge_retained");
1854    }
1855
1856    TypeResult Ty = ParseTypeName();
1857    T.consumeClose();
1858    RParenLoc = T.getCloseLocation();
1859    ExprResult SubExpr = ParseCastExpression(/*isUnaryExpression=*/false);
1860
1861    if (Ty.isInvalid() || SubExpr.isInvalid())
1862      return ExprError();
1863
1864    return Actions.ActOnObjCBridgedCast(getCurScope(), OpenLoc, Kind,
1865                                        BridgeKeywordLoc, Ty.get(),
1866                                        RParenLoc, SubExpr.get());
1867  } else if (ExprType >= CompoundLiteral &&
1868             isTypeIdInParens(isAmbiguousTypeId)) {
1869
1870    // Otherwise, this is a compound literal expression or cast expression.
1871
1872    // In C++, if the type-id is ambiguous we disambiguate based on context.
1873    // If stopIfCastExpr is true the context is a typeof/sizeof/alignof
1874    // in which case we should treat it as type-id.
1875    // if stopIfCastExpr is false, we need to determine the context past the
1876    // parens, so we defer to ParseCXXAmbiguousParenExpression for that.
1877    if (isAmbiguousTypeId && !stopIfCastExpr) {
1878      ExprResult res = ParseCXXAmbiguousParenExpression(ExprType, CastTy, T);
1879      RParenLoc = T.getCloseLocation();
1880      return res;
1881    }
1882
1883    // Parse the type declarator.
1884    DeclSpec DS(AttrFactory);
1885    ParseSpecifierQualifierList(DS);
1886    Declarator DeclaratorInfo(DS, Declarator::TypeNameContext);
1887    ParseDeclarator(DeclaratorInfo);
1888
1889    // If our type is followed by an identifier and either ':' or ']', then
1890    // this is probably an Objective-C message send where the leading '[' is
1891    // missing. Recover as if that were the case.
1892    if (!DeclaratorInfo.isInvalidType() && Tok.is(tok::identifier) &&
1893        !InMessageExpression && getLang().ObjC1 &&
1894        (NextToken().is(tok::colon) || NextToken().is(tok::r_square))) {
1895      TypeResult Ty;
1896      {
1897        InMessageExpressionRAIIObject InMessage(*this, false);
1898        Ty = Actions.ActOnTypeName(getCurScope(), DeclaratorInfo);
1899      }
1900      Result = ParseObjCMessageExpressionBody(SourceLocation(),
1901                                              SourceLocation(),
1902                                              Ty.get(), 0);
1903    } else {
1904      // Match the ')'.
1905      T.consumeClose();
1906      RParenLoc = T.getCloseLocation();
1907      if (Tok.is(tok::l_brace)) {
1908        ExprType = CompoundLiteral;
1909        TypeResult Ty;
1910        {
1911          InMessageExpressionRAIIObject InMessage(*this, false);
1912          Ty = Actions.ActOnTypeName(getCurScope(), DeclaratorInfo);
1913        }
1914        return ParseCompoundLiteralExpression(Ty.get(), OpenLoc, RParenLoc);
1915      }
1916
1917      if (ExprType == CastExpr) {
1918        // We parsed '(' type-name ')' and the thing after it wasn't a '{'.
1919
1920        if (DeclaratorInfo.isInvalidType())
1921          return ExprError();
1922
1923        // Note that this doesn't parse the subsequent cast-expression, it just
1924        // returns the parsed type to the callee.
1925        if (stopIfCastExpr) {
1926          TypeResult Ty;
1927          {
1928            InMessageExpressionRAIIObject InMessage(*this, false);
1929            Ty = Actions.ActOnTypeName(getCurScope(), DeclaratorInfo);
1930          }
1931          CastTy = Ty.get();
1932          return ExprResult();
1933        }
1934
1935        // Reject the cast of super idiom in ObjC.
1936        if (Tok.is(tok::identifier) && getLang().ObjC1 &&
1937            Tok.getIdentifierInfo() == Ident_super &&
1938            getCurScope()->isInObjcMethodScope() &&
1939            GetLookAheadToken(1).isNot(tok::period)) {
1940          Diag(Tok.getLocation(), diag::err_illegal_super_cast)
1941            << SourceRange(OpenLoc, RParenLoc);
1942          return ExprError();
1943        }
1944
1945        // Parse the cast-expression that follows it next.
1946        // TODO: For cast expression with CastTy.
1947        Result = ParseCastExpression(/*isUnaryExpression=*/false,
1948                                     /*isAddressOfOperand=*/false,
1949                                     /*isTypeCast=*/true);
1950        if (!Result.isInvalid()) {
1951          Result = Actions.ActOnCastExpr(getCurScope(), OpenLoc,
1952                                         DeclaratorInfo, CastTy,
1953                                         RParenLoc, Result.take());
1954        }
1955        return move(Result);
1956      }
1957
1958      Diag(Tok, diag::err_expected_lbrace_in_compound_literal);
1959      return ExprError();
1960    }
1961  } else if (isTypeCast) {
1962    // Parse the expression-list.
1963    InMessageExpressionRAIIObject InMessage(*this, false);
1964
1965    ExprVector ArgExprs(Actions);
1966    CommaLocsTy CommaLocs;
1967
1968    if (!ParseExpressionList(ArgExprs, CommaLocs)) {
1969      ExprType = SimpleExpr;
1970      Result = Actions.ActOnParenOrParenListExpr(OpenLoc, Tok.getLocation(),
1971                                                 move_arg(ArgExprs));
1972    }
1973  } else {
1974    InMessageExpressionRAIIObject InMessage(*this, false);
1975
1976    Result = ParseExpression();
1977    ExprType = SimpleExpr;
1978
1979    // Don't build a paren expression unless we actually match a ')'.
1980    if (!Result.isInvalid() && Tok.is(tok::r_paren))
1981      Result = Actions.ActOnParenExpr(OpenLoc, Tok.getLocation(), Result.take());
1982  }
1983
1984  // Match the ')'.
1985  if (Result.isInvalid()) {
1986    SkipUntil(tok::r_paren);
1987    return ExprError();
1988  }
1989
1990  T.consumeClose();
1991  RParenLoc = T.getCloseLocation();
1992  return move(Result);
1993}
1994
1995/// ParseCompoundLiteralExpression - We have parsed the parenthesized type-name
1996/// and we are at the left brace.
1997///
1998///       postfix-expression: [C99 6.5.2]
1999///         '(' type-name ')' '{' initializer-list '}'
2000///         '(' type-name ')' '{' initializer-list ',' '}'
2001///
2002ExprResult
2003Parser::ParseCompoundLiteralExpression(ParsedType Ty,
2004                                       SourceLocation LParenLoc,
2005                                       SourceLocation RParenLoc) {
2006  assert(Tok.is(tok::l_brace) && "Not a compound literal!");
2007  if (!getLang().C99)   // Compound literals don't exist in C90.
2008    Diag(LParenLoc, diag::ext_c99_compound_literal);
2009  ExprResult Result = ParseInitializer();
2010  if (!Result.isInvalid() && Ty)
2011    return Actions.ActOnCompoundLiteral(LParenLoc, Ty, RParenLoc, Result.take());
2012  return move(Result);
2013}
2014
2015/// ParseStringLiteralExpression - This handles the various token types that
2016/// form string literals, and also handles string concatenation [C99 5.1.1.2,
2017/// translation phase #6].
2018///
2019///       primary-expression: [C99 6.5.1]
2020///         string-literal
2021ExprResult Parser::ParseStringLiteralExpression() {
2022  assert(isTokenStringLiteral() && "Not a string literal!");
2023
2024  // String concat.  Note that keywords like __func__ and __FUNCTION__ are not
2025  // considered to be strings for concatenation purposes.
2026  SmallVector<Token, 4> StringToks;
2027
2028  do {
2029    StringToks.push_back(Tok);
2030    ConsumeStringToken();
2031  } while (isTokenStringLiteral());
2032
2033  // Pass the set of string tokens, ready for concatenation, to the actions.
2034  return Actions.ActOnStringLiteral(&StringToks[0], StringToks.size());
2035}
2036
2037/// ParseGenericSelectionExpression - Parse a C1X generic-selection
2038/// [C1X 6.5.1.1].
2039///
2040///    generic-selection:
2041///           _Generic ( assignment-expression , generic-assoc-list )
2042///    generic-assoc-list:
2043///           generic-association
2044///           generic-assoc-list , generic-association
2045///    generic-association:
2046///           type-name : assignment-expression
2047///           default : assignment-expression
2048ExprResult Parser::ParseGenericSelectionExpression() {
2049  assert(Tok.is(tok::kw__Generic) && "_Generic keyword expected");
2050  SourceLocation KeyLoc = ConsumeToken();
2051
2052  if (!getLang().C1X)
2053    Diag(KeyLoc, diag::ext_c1x_generic_selection);
2054
2055  BalancedDelimiterTracker T(*this, tok::l_paren);
2056  if (T.expectAndConsume(diag::err_expected_lparen))
2057    return ExprError();
2058
2059  ExprResult ControllingExpr;
2060  {
2061    // C1X 6.5.1.1p3 "The controlling expression of a generic selection is
2062    // not evaluated."
2063    EnterExpressionEvaluationContext Unevaluated(Actions, Sema::Unevaluated);
2064    ControllingExpr = ParseAssignmentExpression();
2065    if (ControllingExpr.isInvalid()) {
2066      SkipUntil(tok::r_paren);
2067      return ExprError();
2068    }
2069  }
2070
2071  if (ExpectAndConsume(tok::comma, diag::err_expected_comma, "")) {
2072    SkipUntil(tok::r_paren);
2073    return ExprError();
2074  }
2075
2076  SourceLocation DefaultLoc;
2077  TypeVector Types(Actions);
2078  ExprVector Exprs(Actions);
2079  while (1) {
2080    ParsedType Ty;
2081    if (Tok.is(tok::kw_default)) {
2082      // C1X 6.5.1.1p2 "A generic selection shall have no more than one default
2083      // generic association."
2084      if (!DefaultLoc.isInvalid()) {
2085        Diag(Tok, diag::err_duplicate_default_assoc);
2086        Diag(DefaultLoc, diag::note_previous_default_assoc);
2087        SkipUntil(tok::r_paren);
2088        return ExprError();
2089      }
2090      DefaultLoc = ConsumeToken();
2091      Ty = ParsedType();
2092    } else {
2093      ColonProtectionRAIIObject X(*this);
2094      TypeResult TR = ParseTypeName();
2095      if (TR.isInvalid()) {
2096        SkipUntil(tok::r_paren);
2097        return ExprError();
2098      }
2099      Ty = TR.release();
2100    }
2101    Types.push_back(Ty);
2102
2103    if (ExpectAndConsume(tok::colon, diag::err_expected_colon, "")) {
2104      SkipUntil(tok::r_paren);
2105      return ExprError();
2106    }
2107
2108    // FIXME: These expressions should be parsed in a potentially potentially
2109    // evaluated context.
2110    ExprResult ER(ParseAssignmentExpression());
2111    if (ER.isInvalid()) {
2112      SkipUntil(tok::r_paren);
2113      return ExprError();
2114    }
2115    Exprs.push_back(ER.release());
2116
2117    if (Tok.isNot(tok::comma))
2118      break;
2119    ConsumeToken();
2120  }
2121
2122  T.consumeClose();
2123  if (T.getCloseLocation().isInvalid())
2124    return ExprError();
2125
2126  return Actions.ActOnGenericSelectionExpr(KeyLoc, DefaultLoc,
2127                                           T.getCloseLocation(),
2128                                           ControllingExpr.release(),
2129                                           move_arg(Types), move_arg(Exprs));
2130}
2131
2132/// ParseExpressionList - Used for C/C++ (argument-)expression-list.
2133///
2134///       argument-expression-list:
2135///         assignment-expression
2136///         argument-expression-list , assignment-expression
2137///
2138/// [C++] expression-list:
2139/// [C++]   assignment-expression
2140/// [C++]   expression-list , assignment-expression
2141///
2142/// [C++0x] expression-list:
2143/// [C++0x]   initializer-list
2144///
2145/// [C++0x] initializer-list
2146/// [C++0x]   initializer-clause ...[opt]
2147/// [C++0x]   initializer-list , initializer-clause ...[opt]
2148///
2149/// [C++0x] initializer-clause:
2150/// [C++0x]   assignment-expression
2151/// [C++0x]   braced-init-list
2152///
2153bool Parser::ParseExpressionList(SmallVectorImpl<Expr*> &Exprs,
2154                            SmallVectorImpl<SourceLocation> &CommaLocs,
2155                                 void (Sema::*Completer)(Scope *S,
2156                                                           Expr *Data,
2157                                                           Expr **Args,
2158                                                           unsigned NumArgs),
2159                                 Expr *Data) {
2160  while (1) {
2161    if (Tok.is(tok::code_completion)) {
2162      if (Completer)
2163        (Actions.*Completer)(getCurScope(), Data, Exprs.data(), Exprs.size());
2164      else
2165        Actions.CodeCompleteOrdinaryName(getCurScope(), Sema::PCC_Expression);
2166      cutOffParsing();
2167      return true;
2168    }
2169
2170    ExprResult Expr;
2171    if (getLang().CPlusPlus0x && Tok.is(tok::l_brace)) {
2172      Diag(Tok, diag::warn_cxx98_compat_generalized_initializer_lists);
2173      Expr = ParseBraceInitializer();
2174    } else
2175      Expr = ParseAssignmentExpression();
2176
2177    if (Tok.is(tok::ellipsis))
2178      Expr = Actions.ActOnPackExpansion(Expr.get(), ConsumeToken());
2179    if (Expr.isInvalid())
2180      return true;
2181
2182    Exprs.push_back(Expr.release());
2183
2184    if (Tok.isNot(tok::comma))
2185      return false;
2186    // Move to the next argument, remember where the comma was.
2187    CommaLocs.push_back(ConsumeToken());
2188  }
2189}
2190
2191/// ParseBlockId - Parse a block-id, which roughly looks like int (int x).
2192///
2193/// [clang] block-id:
2194/// [clang]   specifier-qualifier-list block-declarator
2195///
2196void Parser::ParseBlockId() {
2197  if (Tok.is(tok::code_completion)) {
2198    Actions.CodeCompleteOrdinaryName(getCurScope(), Sema::PCC_Type);
2199    return cutOffParsing();
2200  }
2201
2202  // Parse the specifier-qualifier-list piece.
2203  DeclSpec DS(AttrFactory);
2204  ParseSpecifierQualifierList(DS);
2205
2206  // Parse the block-declarator.
2207  Declarator DeclaratorInfo(DS, Declarator::BlockLiteralContext);
2208  ParseDeclarator(DeclaratorInfo);
2209
2210  // We do this for: ^ __attribute__((noreturn)) {, as DS has the attributes.
2211  DeclaratorInfo.takeAttributes(DS.getAttributes(), SourceLocation());
2212
2213  MaybeParseGNUAttributes(DeclaratorInfo);
2214
2215  // Inform sema that we are starting a block.
2216  Actions.ActOnBlockArguments(DeclaratorInfo, getCurScope());
2217}
2218
2219/// ParseBlockLiteralExpression - Parse a block literal, which roughly looks
2220/// like ^(int x){ return x+1; }
2221///
2222///         block-literal:
2223/// [clang]   '^' block-args[opt] compound-statement
2224/// [clang]   '^' block-id compound-statement
2225/// [clang] block-args:
2226/// [clang]   '(' parameter-list ')'
2227///
2228ExprResult Parser::ParseBlockLiteralExpression() {
2229  assert(Tok.is(tok::caret) && "block literal starts with ^");
2230  SourceLocation CaretLoc = ConsumeToken();
2231
2232  PrettyStackTraceLoc CrashInfo(PP.getSourceManager(), CaretLoc,
2233                                "block literal parsing");
2234
2235  // Enter a scope to hold everything within the block.  This includes the
2236  // argument decls, decls within the compound expression, etc.  This also
2237  // allows determining whether a variable reference inside the block is
2238  // within or outside of the block.
2239  ParseScope BlockScope(this, Scope::BlockScope | Scope::FnScope |
2240                              Scope::BreakScope | Scope::ContinueScope |
2241                              Scope::DeclScope);
2242
2243  // Inform sema that we are starting a block.
2244  Actions.ActOnBlockStart(CaretLoc, getCurScope());
2245
2246  // Parse the return type if present.
2247  DeclSpec DS(AttrFactory);
2248  Declarator ParamInfo(DS, Declarator::BlockLiteralContext);
2249  // FIXME: Since the return type isn't actually parsed, it can't be used to
2250  // fill ParamInfo with an initial valid range, so do it manually.
2251  ParamInfo.SetSourceRange(SourceRange(Tok.getLocation(), Tok.getLocation()));
2252
2253  // If this block has arguments, parse them.  There is no ambiguity here with
2254  // the expression case, because the expression case requires a parameter list.
2255  if (Tok.is(tok::l_paren)) {
2256    ParseParenDeclarator(ParamInfo);
2257    // Parse the pieces after the identifier as if we had "int(...)".
2258    // SetIdentifier sets the source range end, but in this case we're past
2259    // that location.
2260    SourceLocation Tmp = ParamInfo.getSourceRange().getEnd();
2261    ParamInfo.SetIdentifier(0, CaretLoc);
2262    ParamInfo.SetRangeEnd(Tmp);
2263    if (ParamInfo.isInvalidType()) {
2264      // If there was an error parsing the arguments, they may have
2265      // tried to use ^(x+y) which requires an argument list.  Just
2266      // skip the whole block literal.
2267      Actions.ActOnBlockError(CaretLoc, getCurScope());
2268      return ExprError();
2269    }
2270
2271    MaybeParseGNUAttributes(ParamInfo);
2272
2273    // Inform sema that we are starting a block.
2274    Actions.ActOnBlockArguments(ParamInfo, getCurScope());
2275  } else if (!Tok.is(tok::l_brace)) {
2276    ParseBlockId();
2277  } else {
2278    // Otherwise, pretend we saw (void).
2279    ParsedAttributes attrs(AttrFactory);
2280    ParamInfo.AddTypeInfo(DeclaratorChunk::getFunction(true, false,
2281                                                       SourceLocation(),
2282                                                       0, 0, 0,
2283                                                       true, SourceLocation(),
2284                                                       SourceLocation(),
2285                                                       SourceLocation(),
2286                                                       SourceLocation(),
2287                                                       EST_None,
2288                                                       SourceLocation(),
2289                                                       0, 0, 0, 0,
2290                                                       CaretLoc, CaretLoc,
2291                                                       ParamInfo),
2292                          attrs, CaretLoc);
2293
2294    MaybeParseGNUAttributes(ParamInfo);
2295
2296    // Inform sema that we are starting a block.
2297    Actions.ActOnBlockArguments(ParamInfo, getCurScope());
2298  }
2299
2300
2301  ExprResult Result(true);
2302  if (!Tok.is(tok::l_brace)) {
2303    // Saw something like: ^expr
2304    Diag(Tok, diag::err_expected_expression);
2305    Actions.ActOnBlockError(CaretLoc, getCurScope());
2306    return ExprError();
2307  }
2308
2309  StmtResult Stmt(ParseCompoundStatementBody());
2310  BlockScope.Exit();
2311  if (!Stmt.isInvalid())
2312    Result = Actions.ActOnBlockStmtExpr(CaretLoc, Stmt.take(), getCurScope());
2313  else
2314    Actions.ActOnBlockError(CaretLoc, getCurScope());
2315  return move(Result);
2316}
2317