]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/llvm/tools/clang/lib/Parse/ParseExpr.cpp
Merge ^/head r319251 through r319479.
[FreeBSD/FreeBSD.git] / contrib / llvm / tools / clang / lib / Parse / ParseExpr.cpp
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 /// \file
11 /// \brief Provides the Expression parsing implementation.
12 ///
13 /// Expressions in C99 basically consist of a bunch of binary operators with
14 /// unary operators and other random stuff at the leaves.
15 ///
16 /// In the C99 grammar, these unary operators bind tightest and are represented
17 /// as the 'cast-expression' production.  Everything else is either a binary
18 /// operator (e.g. '/') or a ternary operator ("?:").  The unary leaves are
19 /// handled by ParseCastExpression, the higher level pieces are handled by
20 /// ParseBinaryExpression.
21 ///
22 //===----------------------------------------------------------------------===//
23
24 #include "clang/Parse/Parser.h"
25 #include "clang/AST/ASTContext.h"
26 #include "clang/Basic/PrettyStackTrace.h"
27 #include "clang/Parse/RAIIObjectsForParser.h"
28 #include "clang/Sema/DeclSpec.h"
29 #include "clang/Sema/ParsedTemplate.h"
30 #include "clang/Sema/Scope.h"
31 #include "clang/Sema/TypoCorrection.h"
32 #include "llvm/ADT/SmallVector.h"
33 using namespace clang;
34
35 /// \brief Simple precedence-based parser for binary/ternary operators.
36 ///
37 /// Note: we diverge from the C99 grammar when parsing the assignment-expression
38 /// production.  C99 specifies that the LHS of an assignment operator should be
39 /// parsed as a unary-expression, but consistency dictates that it be a
40 /// conditional-expession.  In practice, the important thing here is that the
41 /// LHS of an assignment has to be an l-value, which productions between
42 /// unary-expression and conditional-expression don't produce.  Because we want
43 /// consistency, we parse the LHS as a conditional-expression, then check for
44 /// l-value-ness in semantic analysis stages.
45 ///
46 /// \verbatim
47 ///       pm-expression: [C++ 5.5]
48 ///         cast-expression
49 ///         pm-expression '.*' cast-expression
50 ///         pm-expression '->*' cast-expression
51 ///
52 ///       multiplicative-expression: [C99 6.5.5]
53 ///     Note: in C++, apply pm-expression instead of cast-expression
54 ///         cast-expression
55 ///         multiplicative-expression '*' cast-expression
56 ///         multiplicative-expression '/' cast-expression
57 ///         multiplicative-expression '%' cast-expression
58 ///
59 ///       additive-expression: [C99 6.5.6]
60 ///         multiplicative-expression
61 ///         additive-expression '+' multiplicative-expression
62 ///         additive-expression '-' multiplicative-expression
63 ///
64 ///       shift-expression: [C99 6.5.7]
65 ///         additive-expression
66 ///         shift-expression '<<' additive-expression
67 ///         shift-expression '>>' additive-expression
68 ///
69 ///       relational-expression: [C99 6.5.8]
70 ///         shift-expression
71 ///         relational-expression '<' shift-expression
72 ///         relational-expression '>' shift-expression
73 ///         relational-expression '<=' shift-expression
74 ///         relational-expression '>=' shift-expression
75 ///
76 ///       equality-expression: [C99 6.5.9]
77 ///         relational-expression
78 ///         equality-expression '==' relational-expression
79 ///         equality-expression '!=' relational-expression
80 ///
81 ///       AND-expression: [C99 6.5.10]
82 ///         equality-expression
83 ///         AND-expression '&' equality-expression
84 ///
85 ///       exclusive-OR-expression: [C99 6.5.11]
86 ///         AND-expression
87 ///         exclusive-OR-expression '^' AND-expression
88 ///
89 ///       inclusive-OR-expression: [C99 6.5.12]
90 ///         exclusive-OR-expression
91 ///         inclusive-OR-expression '|' exclusive-OR-expression
92 ///
93 ///       logical-AND-expression: [C99 6.5.13]
94 ///         inclusive-OR-expression
95 ///         logical-AND-expression '&&' inclusive-OR-expression
96 ///
97 ///       logical-OR-expression: [C99 6.5.14]
98 ///         logical-AND-expression
99 ///         logical-OR-expression '||' logical-AND-expression
100 ///
101 ///       conditional-expression: [C99 6.5.15]
102 ///         logical-OR-expression
103 ///         logical-OR-expression '?' expression ':' conditional-expression
104 /// [GNU]   logical-OR-expression '?' ':' conditional-expression
105 /// [C++] the third operand is an assignment-expression
106 ///
107 ///       assignment-expression: [C99 6.5.16]
108 ///         conditional-expression
109 ///         unary-expression assignment-operator assignment-expression
110 /// [C++]   throw-expression [C++ 15]
111 ///
112 ///       assignment-operator: one of
113 ///         = *= /= %= += -= <<= >>= &= ^= |=
114 ///
115 ///       expression: [C99 6.5.17]
116 ///         assignment-expression ...[opt]
117 ///         expression ',' assignment-expression ...[opt]
118 /// \endverbatim
119 ExprResult Parser::ParseExpression(TypeCastState isTypeCast) {
120   ExprResult LHS(ParseAssignmentExpression(isTypeCast));
121   return ParseRHSOfBinaryExpression(LHS, prec::Comma);
122 }
123
124 /// This routine is called when the '@' is seen and consumed.
125 /// Current token is an Identifier and is not a 'try'. This
126 /// routine is necessary to disambiguate \@try-statement from,
127 /// for example, \@encode-expression.
128 ///
129 ExprResult
130 Parser::ParseExpressionWithLeadingAt(SourceLocation AtLoc) {
131   ExprResult LHS(ParseObjCAtExpression(AtLoc));
132   return ParseRHSOfBinaryExpression(LHS, prec::Comma);
133 }
134
135 /// This routine is called when a leading '__extension__' is seen and
136 /// consumed.  This is necessary because the token gets consumed in the
137 /// process of disambiguating between an expression and a declaration.
138 ExprResult
139 Parser::ParseExpressionWithLeadingExtension(SourceLocation ExtLoc) {
140   ExprResult LHS(true);
141   {
142     // Silence extension warnings in the sub-expression
143     ExtensionRAIIObject O(Diags);
144
145     LHS = ParseCastExpression(false);
146   }
147
148   if (!LHS.isInvalid())
149     LHS = Actions.ActOnUnaryOp(getCurScope(), ExtLoc, tok::kw___extension__,
150                                LHS.get());
151
152   return ParseRHSOfBinaryExpression(LHS, prec::Comma);
153 }
154
155 /// \brief Parse an expr that doesn't include (top-level) commas.
156 ExprResult Parser::ParseAssignmentExpression(TypeCastState isTypeCast) {
157   if (Tok.is(tok::code_completion)) {
158     Actions.CodeCompleteOrdinaryName(getCurScope(), Sema::PCC_Expression);
159     cutOffParsing();
160     return ExprError();
161   }
162
163   if (Tok.is(tok::kw_throw))
164     return ParseThrowExpression();
165   if (Tok.is(tok::kw_co_yield))
166     return ParseCoyieldExpression();
167
168   ExprResult LHS = ParseCastExpression(/*isUnaryExpression=*/false,
169                                        /*isAddressOfOperand=*/false,
170                                        isTypeCast);
171   return ParseRHSOfBinaryExpression(LHS, prec::Assignment);
172 }
173
174 /// \brief Parse an assignment expression where part of an Objective-C message
175 /// send has already been parsed.
176 ///
177 /// In this case \p LBracLoc indicates the location of the '[' of the message
178 /// send, and either \p ReceiverName or \p ReceiverExpr is non-null indicating
179 /// the receiver of the message.
180 ///
181 /// Since this handles full assignment-expression's, it handles postfix
182 /// expressions and other binary operators for these expressions as well.
183 ExprResult
184 Parser::ParseAssignmentExprWithObjCMessageExprStart(SourceLocation LBracLoc,
185                                                     SourceLocation SuperLoc,
186                                                     ParsedType ReceiverType,
187                                                     Expr *ReceiverExpr) {
188   ExprResult R
189     = ParseObjCMessageExpressionBody(LBracLoc, SuperLoc,
190                                      ReceiverType, ReceiverExpr);
191   R = ParsePostfixExpressionSuffix(R);
192   return ParseRHSOfBinaryExpression(R, prec::Assignment);
193 }
194
195 ExprResult
196 Parser::ParseConstantExpressionInExprEvalContext(TypeCastState isTypeCast) {
197   assert(Actions.ExprEvalContexts.back().Context ==
198              Sema::ExpressionEvaluationContext::ConstantEvaluated &&
199          "Call this function only if your ExpressionEvaluationContext is "
200          "already ConstantEvaluated");
201   ExprResult LHS(ParseCastExpression(false, false, isTypeCast));
202   ExprResult Res(ParseRHSOfBinaryExpression(LHS, prec::Conditional));
203   return Actions.ActOnConstantExpression(Res);
204 }
205
206 ExprResult Parser::ParseConstantExpression(TypeCastState isTypeCast) {
207   // C++03 [basic.def.odr]p2:
208   //   An expression is potentially evaluated unless it appears where an
209   //   integral constant expression is required (see 5.19) [...].
210   // C++98 and C++11 have no such rule, but this is only a defect in C++98.
211   EnterExpressionEvaluationContext ConstantEvaluated(
212       Actions, Sema::ExpressionEvaluationContext::ConstantEvaluated);
213   return ParseConstantExpressionInExprEvalContext(isTypeCast);
214 }
215
216 /// \brief Parse a constraint-expression.
217 ///
218 /// \verbatim
219 ///       constraint-expression: [Concepts TS temp.constr.decl p1]
220 ///         logical-or-expression
221 /// \endverbatim
222 ExprResult Parser::ParseConstraintExpression() {
223   // FIXME: this may erroneously consume a function-body as the braced
224   // initializer list of a compound literal
225   //
226   // FIXME: this may erroneously consume a parenthesized rvalue reference
227   // declarator as a parenthesized address-of-label expression
228   ExprResult LHS(ParseCastExpression(/*isUnaryExpression=*/false));
229   ExprResult Res(ParseRHSOfBinaryExpression(LHS, prec::LogicalOr));
230
231   return Res;
232 }
233
234 bool Parser::isNotExpressionStart() {
235   tok::TokenKind K = Tok.getKind();
236   if (K == tok::l_brace || K == tok::r_brace  ||
237       K == tok::kw_for  || K == tok::kw_while ||
238       K == tok::kw_if   || K == tok::kw_else  ||
239       K == tok::kw_goto || K == tok::kw_try)
240     return true;
241   // If this is a decl-specifier, we can't be at the start of an expression.
242   return isKnownToBeDeclarationSpecifier();
243 }
244
245 /// We've parsed something that could plausibly be intended to be a template
246 /// name (\p LHS) followed by a '<' token, and the following code can't possibly
247 /// be an expression. Determine if this is likely to be a template-id and if so,
248 /// diagnose it.
249 bool Parser::diagnoseUnknownTemplateId(ExprResult LHS, SourceLocation Less) {
250   TentativeParsingAction TPA(*this);
251   // FIXME: We could look at the token sequence in a lot more detail here.
252   if (SkipUntil(tok::greater, tok::greatergreater, tok::greatergreatergreater,
253                 StopAtSemi | StopBeforeMatch)) {
254     TPA.Commit();
255
256     SourceLocation Greater;
257     ParseGreaterThanInTemplateList(Greater, true, false);
258     Actions.diagnoseExprIntendedAsTemplateName(getCurScope(), LHS,
259                                                Less, Greater);
260     return true;
261   }
262
263   // There's no matching '>' token, this probably isn't supposed to be
264   // interpreted as a template-id. Parse it as an (ill-formed) comparison.
265   TPA.Revert();
266   return false;
267 }
268
269 static bool isFoldOperator(prec::Level Level) {
270   return Level > prec::Unknown && Level != prec::Conditional;
271 }
272 static bool isFoldOperator(tok::TokenKind Kind) {
273   return isFoldOperator(getBinOpPrecedence(Kind, false, true));
274 }
275
276 /// \brief Parse a binary expression that starts with \p LHS and has a
277 /// precedence of at least \p MinPrec.
278 ExprResult
279 Parser::ParseRHSOfBinaryExpression(ExprResult LHS, prec::Level MinPrec) {
280   prec::Level NextTokPrec = getBinOpPrecedence(Tok.getKind(),
281                                                GreaterThanIsOperator,
282                                                getLangOpts().CPlusPlus11);
283   SourceLocation ColonLoc;
284
285   while (1) {
286     // If this token has a lower precedence than we are allowed to parse (e.g.
287     // because we are called recursively, or because the token is not a binop),
288     // then we are done!
289     if (NextTokPrec < MinPrec)
290       return LHS;
291
292     // Consume the operator, saving the operator token for error reporting.
293     Token OpToken = Tok;
294     ConsumeToken();
295
296     if (OpToken.is(tok::caretcaret)) {
297       return ExprError(Diag(Tok, diag::err_opencl_logical_exclusive_or));
298     }
299     // Bail out when encountering a comma followed by a token which can't
300     // possibly be the start of an expression. For instance:
301     //   int f() { return 1, }
302     // We can't do this before consuming the comma, because
303     // isNotExpressionStart() looks at the token stream.
304     if (OpToken.is(tok::comma) && isNotExpressionStart()) {
305       PP.EnterToken(Tok);
306       Tok = OpToken;
307       return LHS;
308     }
309
310     // If a '<' token is followed by a type that can be a template argument and
311     // cannot be an expression, then this is ill-formed, but might be intended
312     // to be a template-id.
313     if (OpToken.is(tok::less) && Actions.mightBeIntendedToBeTemplateName(LHS) &&
314         (isKnownToBeDeclarationSpecifier() ||
315          Tok.isOneOf(tok::greater, tok::greatergreater,
316                      tok::greatergreatergreater)) &&
317         diagnoseUnknownTemplateId(LHS, OpToken.getLocation()))
318       return ExprError();
319
320     // If the next token is an ellipsis, then this is a fold-expression. Leave
321     // it alone so we can handle it in the paren expression.
322     if (isFoldOperator(NextTokPrec) && Tok.is(tok::ellipsis)) {
323       // FIXME: We can't check this via lookahead before we consume the token
324       // because that tickles a lexer bug.
325       PP.EnterToken(Tok);
326       Tok = OpToken;
327       return LHS;
328     }
329
330     // Special case handling for the ternary operator.
331     ExprResult TernaryMiddle(true);
332     if (NextTokPrec == prec::Conditional) {
333       if (Tok.isNot(tok::colon)) {
334         // Don't parse FOO:BAR as if it were a typo for FOO::BAR.
335         ColonProtectionRAIIObject X(*this);
336
337         // Handle this production specially:
338         //   logical-OR-expression '?' expression ':' conditional-expression
339         // In particular, the RHS of the '?' is 'expression', not
340         // 'logical-OR-expression' as we might expect.
341         TernaryMiddle = ParseExpression();
342         if (TernaryMiddle.isInvalid()) {
343           Actions.CorrectDelayedTyposInExpr(LHS);
344           LHS = ExprError();
345           TernaryMiddle = nullptr;
346         }
347       } else {
348         // Special case handling of "X ? Y : Z" where Y is empty:
349         //   logical-OR-expression '?' ':' conditional-expression   [GNU]
350         TernaryMiddle = nullptr;
351         Diag(Tok, diag::ext_gnu_conditional_expr);
352       }
353
354       if (!TryConsumeToken(tok::colon, ColonLoc)) {
355         // Otherwise, we're missing a ':'.  Assume that this was a typo that
356         // the user forgot. If we're not in a macro expansion, we can suggest
357         // a fixit hint. If there were two spaces before the current token,
358         // suggest inserting the colon in between them, otherwise insert ": ".
359         SourceLocation FILoc = Tok.getLocation();
360         const char *FIText = ": ";
361         const SourceManager &SM = PP.getSourceManager();
362         if (FILoc.isFileID() || PP.isAtStartOfMacroExpansion(FILoc, &FILoc)) {
363           assert(FILoc.isFileID());
364           bool IsInvalid = false;
365           const char *SourcePtr =
366             SM.getCharacterData(FILoc.getLocWithOffset(-1), &IsInvalid);
367           if (!IsInvalid && *SourcePtr == ' ') {
368             SourcePtr =
369               SM.getCharacterData(FILoc.getLocWithOffset(-2), &IsInvalid);
370             if (!IsInvalid && *SourcePtr == ' ') {
371               FILoc = FILoc.getLocWithOffset(-1);
372               FIText = ":";
373             }
374           }
375         }
376
377         Diag(Tok, diag::err_expected)
378             << tok::colon << FixItHint::CreateInsertion(FILoc, FIText);
379         Diag(OpToken, diag::note_matching) << tok::question;
380         ColonLoc = Tok.getLocation();
381       }
382     }
383
384     // Code completion for the right-hand side of an assignment expression
385     // goes through a special hook that takes the left-hand side into account.
386     if (Tok.is(tok::code_completion) && NextTokPrec == prec::Assignment) {
387       Actions.CodeCompleteAssignmentRHS(getCurScope(), LHS.get());
388       cutOffParsing();
389       return ExprError();
390     }
391
392     // Parse another leaf here for the RHS of the operator.
393     // ParseCastExpression works here because all RHS expressions in C have it
394     // as a prefix, at least. However, in C++, an assignment-expression could
395     // be a throw-expression, which is not a valid cast-expression.
396     // Therefore we need some special-casing here.
397     // Also note that the third operand of the conditional operator is
398     // an assignment-expression in C++, and in C++11, we can have a
399     // braced-init-list on the RHS of an assignment. For better diagnostics,
400     // parse as if we were allowed braced-init-lists everywhere, and check that
401     // they only appear on the RHS of assignments later.
402     ExprResult RHS;
403     bool RHSIsInitList = false;
404     if (getLangOpts().CPlusPlus11 && Tok.is(tok::l_brace)) {
405       RHS = ParseBraceInitializer();
406       RHSIsInitList = true;
407     } else if (getLangOpts().CPlusPlus && NextTokPrec <= prec::Conditional)
408       RHS = ParseAssignmentExpression();
409     else
410       RHS = ParseCastExpression(false);
411
412     if (RHS.isInvalid()) {
413       // FIXME: Errors generated by the delayed typo correction should be
414       // printed before errors from parsing the RHS, not after.
415       Actions.CorrectDelayedTyposInExpr(LHS);
416       if (TernaryMiddle.isUsable())
417         TernaryMiddle = Actions.CorrectDelayedTyposInExpr(TernaryMiddle);
418       LHS = ExprError();
419     }
420
421     // Remember the precedence of this operator and get the precedence of the
422     // operator immediately to the right of the RHS.
423     prec::Level ThisPrec = NextTokPrec;
424     NextTokPrec = getBinOpPrecedence(Tok.getKind(), GreaterThanIsOperator,
425                                      getLangOpts().CPlusPlus11);
426
427     // Assignment and conditional expressions are right-associative.
428     bool isRightAssoc = ThisPrec == prec::Conditional ||
429                         ThisPrec == prec::Assignment;
430
431     // Get the precedence of the operator to the right of the RHS.  If it binds
432     // more tightly with RHS than we do, evaluate it completely first.
433     if (ThisPrec < NextTokPrec ||
434         (ThisPrec == NextTokPrec && isRightAssoc)) {
435       if (!RHS.isInvalid() && RHSIsInitList) {
436         Diag(Tok, diag::err_init_list_bin_op)
437           << /*LHS*/0 << PP.getSpelling(Tok) << Actions.getExprRange(RHS.get());
438         RHS = ExprError();
439       }
440       // If this is left-associative, only parse things on the RHS that bind
441       // more tightly than the current operator.  If it is left-associative, it
442       // is okay, to bind exactly as tightly.  For example, compile A=B=C=D as
443       // A=(B=(C=D)), where each paren is a level of recursion here.
444       // The function takes ownership of the RHS.
445       RHS = ParseRHSOfBinaryExpression(RHS, 
446                             static_cast<prec::Level>(ThisPrec + !isRightAssoc));
447       RHSIsInitList = false;
448
449       if (RHS.isInvalid()) {
450         // FIXME: Errors generated by the delayed typo correction should be
451         // printed before errors from ParseRHSOfBinaryExpression, not after.
452         Actions.CorrectDelayedTyposInExpr(LHS);
453         if (TernaryMiddle.isUsable())
454           TernaryMiddle = Actions.CorrectDelayedTyposInExpr(TernaryMiddle);
455         LHS = ExprError();
456       }
457
458       NextTokPrec = getBinOpPrecedence(Tok.getKind(), GreaterThanIsOperator,
459                                        getLangOpts().CPlusPlus11);
460     }
461
462     if (!RHS.isInvalid() && RHSIsInitList) {
463       if (ThisPrec == prec::Assignment) {
464         Diag(OpToken, diag::warn_cxx98_compat_generalized_initializer_lists)
465           << Actions.getExprRange(RHS.get());
466       } else {
467         Diag(OpToken, diag::err_init_list_bin_op)
468           << /*RHS*/1 << PP.getSpelling(OpToken)
469           << Actions.getExprRange(RHS.get());
470         LHS = ExprError();
471       }
472     }
473
474     ExprResult OrigLHS = LHS;
475     if (!LHS.isInvalid()) {
476       // Combine the LHS and RHS into the LHS (e.g. build AST).
477       if (TernaryMiddle.isInvalid()) {
478         // If we're using '>>' as an operator within a template
479         // argument list (in C++98), suggest the addition of
480         // parentheses so that the code remains well-formed in C++0x.
481         if (!GreaterThanIsOperator && OpToken.is(tok::greatergreater))
482           SuggestParentheses(OpToken.getLocation(),
483                              diag::warn_cxx11_right_shift_in_template_arg,
484                          SourceRange(Actions.getExprRange(LHS.get()).getBegin(),
485                                      Actions.getExprRange(RHS.get()).getEnd()));
486
487         LHS = Actions.ActOnBinOp(getCurScope(), OpToken.getLocation(),
488                                  OpToken.getKind(), LHS.get(), RHS.get());
489
490       } else {
491         LHS = Actions.ActOnConditionalOp(OpToken.getLocation(), ColonLoc,
492                                          LHS.get(), TernaryMiddle.get(),
493                                          RHS.get());
494       }
495       // In this case, ActOnBinOp or ActOnConditionalOp performed the
496       // CorrectDelayedTyposInExpr check.
497       if (!getLangOpts().CPlusPlus)
498         continue;
499     }
500
501     // Ensure potential typos aren't left undiagnosed.
502     if (LHS.isInvalid()) {
503       Actions.CorrectDelayedTyposInExpr(OrigLHS);
504       Actions.CorrectDelayedTyposInExpr(TernaryMiddle);
505       Actions.CorrectDelayedTyposInExpr(RHS);
506     }
507   }
508 }
509
510 /// \brief Parse a cast-expression, or, if \p isUnaryExpression is true,
511 /// parse a unary-expression.
512 ///
513 /// \p isAddressOfOperand exists because an id-expression that is the
514 /// operand of address-of gets special treatment due to member pointers.
515 ///
516 ExprResult Parser::ParseCastExpression(bool isUnaryExpression,
517                                        bool isAddressOfOperand,
518                                        TypeCastState isTypeCast,
519                                        bool isVectorLiteral) {
520   bool NotCastExpr;
521   ExprResult Res = ParseCastExpression(isUnaryExpression,
522                                        isAddressOfOperand,
523                                        NotCastExpr,
524                                        isTypeCast,
525                                        isVectorLiteral);
526   if (NotCastExpr)
527     Diag(Tok, diag::err_expected_expression);
528   return Res;
529 }
530
531 namespace {
532 class CastExpressionIdValidator : public CorrectionCandidateCallback {
533  public:
534   CastExpressionIdValidator(Token Next, bool AllowTypes, bool AllowNonTypes)
535       : NextToken(Next), AllowNonTypes(AllowNonTypes) {
536     WantTypeSpecifiers = WantFunctionLikeCasts = AllowTypes;
537   }
538
539   bool ValidateCandidate(const TypoCorrection &candidate) override {
540     NamedDecl *ND = candidate.getCorrectionDecl();
541     if (!ND)
542       return candidate.isKeyword();
543
544     if (isa<TypeDecl>(ND))
545       return WantTypeSpecifiers;
546
547     if (!AllowNonTypes || !CorrectionCandidateCallback::ValidateCandidate(candidate))
548       return false;
549
550     if (!NextToken.isOneOf(tok::equal, tok::arrow, tok::period))
551       return true;
552
553     for (auto *C : candidate) {
554       NamedDecl *ND = C->getUnderlyingDecl();
555       if (isa<ValueDecl>(ND) && !isa<FunctionDecl>(ND))
556         return true;
557     }
558     return false;
559   }
560
561  private:
562   Token NextToken;
563   bool AllowNonTypes;
564 };
565 }
566
567 /// \brief Parse a cast-expression, or, if \pisUnaryExpression is true, parse
568 /// a unary-expression.
569 ///
570 /// \p isAddressOfOperand exists because an id-expression that is the operand
571 /// of address-of gets special treatment due to member pointers. NotCastExpr
572 /// is set to true if the token is not the start of a cast-expression, and no
573 /// diagnostic is emitted in this case and no tokens are consumed.
574 ///
575 /// \verbatim
576 ///       cast-expression: [C99 6.5.4]
577 ///         unary-expression
578 ///         '(' type-name ')' cast-expression
579 ///
580 ///       unary-expression:  [C99 6.5.3]
581 ///         postfix-expression
582 ///         '++' unary-expression
583 ///         '--' unary-expression
584 /// [Coro]  'co_await' cast-expression
585 ///         unary-operator cast-expression
586 ///         'sizeof' unary-expression
587 ///         'sizeof' '(' type-name ')'
588 /// [C++11] 'sizeof' '...' '(' identifier ')'
589 /// [GNU]   '__alignof' unary-expression
590 /// [GNU]   '__alignof' '(' type-name ')'
591 /// [C11]   '_Alignof' '(' type-name ')'
592 /// [C++11] 'alignof' '(' type-id ')'
593 /// [GNU]   '&&' identifier
594 /// [C++11] 'noexcept' '(' expression ')' [C++11 5.3.7]
595 /// [C++]   new-expression
596 /// [C++]   delete-expression
597 ///
598 ///       unary-operator: one of
599 ///         '&'  '*'  '+'  '-'  '~'  '!'
600 /// [GNU]   '__extension__'  '__real'  '__imag'
601 ///
602 ///       primary-expression: [C99 6.5.1]
603 /// [C99]   identifier
604 /// [C++]   id-expression
605 ///         constant
606 ///         string-literal
607 /// [C++]   boolean-literal  [C++ 2.13.5]
608 /// [C++11] 'nullptr'        [C++11 2.14.7]
609 /// [C++11] user-defined-literal
610 ///         '(' expression ')'
611 /// [C11]   generic-selection
612 ///         '__func__'        [C99 6.4.2.2]
613 /// [GNU]   '__FUNCTION__'
614 /// [MS]    '__FUNCDNAME__'
615 /// [MS]    'L__FUNCTION__'
616 /// [GNU]   '__PRETTY_FUNCTION__'
617 /// [GNU]   '(' compound-statement ')'
618 /// [GNU]   '__builtin_va_arg' '(' assignment-expression ',' type-name ')'
619 /// [GNU]   '__builtin_offsetof' '(' type-name ',' offsetof-member-designator')'
620 /// [GNU]   '__builtin_choose_expr' '(' assign-expr ',' assign-expr ','
621 ///                                     assign-expr ')'
622 /// [GNU]   '__builtin_types_compatible_p' '(' type-name ',' type-name ')'
623 /// [GNU]   '__null'
624 /// [OBJC]  '[' objc-message-expr ']'
625 /// [OBJC]  '\@selector' '(' objc-selector-arg ')'
626 /// [OBJC]  '\@protocol' '(' identifier ')'
627 /// [OBJC]  '\@encode' '(' type-name ')'
628 /// [OBJC]  objc-string-literal
629 /// [C++]   simple-type-specifier '(' expression-list[opt] ')'      [C++ 5.2.3]
630 /// [C++11] simple-type-specifier braced-init-list                  [C++11 5.2.3]
631 /// [C++]   typename-specifier '(' expression-list[opt] ')'         [C++ 5.2.3]
632 /// [C++11] typename-specifier braced-init-list                     [C++11 5.2.3]
633 /// [C++]   'const_cast' '<' type-name '>' '(' expression ')'       [C++ 5.2p1]
634 /// [C++]   'dynamic_cast' '<' type-name '>' '(' expression ')'     [C++ 5.2p1]
635 /// [C++]   'reinterpret_cast' '<' type-name '>' '(' expression ')' [C++ 5.2p1]
636 /// [C++]   'static_cast' '<' type-name '>' '(' expression ')'      [C++ 5.2p1]
637 /// [C++]   'typeid' '(' expression ')'                             [C++ 5.2p1]
638 /// [C++]   'typeid' '(' type-id ')'                                [C++ 5.2p1]
639 /// [C++]   'this'          [C++ 9.3.2]
640 /// [G++]   unary-type-trait '(' type-id ')'
641 /// [G++]   binary-type-trait '(' type-id ',' type-id ')'           [TODO]
642 /// [EMBT]  array-type-trait '(' type-id ',' integer ')'
643 /// [clang] '^' block-literal
644 ///
645 ///       constant: [C99 6.4.4]
646 ///         integer-constant
647 ///         floating-constant
648 ///         enumeration-constant -> identifier
649 ///         character-constant
650 ///
651 ///       id-expression: [C++ 5.1]
652 ///                   unqualified-id
653 ///                   qualified-id          
654 ///
655 ///       unqualified-id: [C++ 5.1]
656 ///                   identifier
657 ///                   operator-function-id
658 ///                   conversion-function-id
659 ///                   '~' class-name        
660 ///                   template-id           
661 ///
662 ///       new-expression: [C++ 5.3.4]
663 ///                   '::'[opt] 'new' new-placement[opt] new-type-id
664 ///                                     new-initializer[opt]
665 ///                   '::'[opt] 'new' new-placement[opt] '(' type-id ')'
666 ///                                     new-initializer[opt]
667 ///
668 ///       delete-expression: [C++ 5.3.5]
669 ///                   '::'[opt] 'delete' cast-expression
670 ///                   '::'[opt] 'delete' '[' ']' cast-expression
671 ///
672 /// [GNU/Embarcadero] unary-type-trait:
673 ///                   '__is_arithmetic'
674 ///                   '__is_floating_point'
675 ///                   '__is_integral'
676 ///                   '__is_lvalue_expr'
677 ///                   '__is_rvalue_expr'
678 ///                   '__is_complete_type'
679 ///                   '__is_void'
680 ///                   '__is_array'
681 ///                   '__is_function'
682 ///                   '__is_reference'
683 ///                   '__is_lvalue_reference'
684 ///                   '__is_rvalue_reference'
685 ///                   '__is_fundamental'
686 ///                   '__is_object'
687 ///                   '__is_scalar'
688 ///                   '__is_compound'
689 ///                   '__is_pointer'
690 ///                   '__is_member_object_pointer'
691 ///                   '__is_member_function_pointer'
692 ///                   '__is_member_pointer'
693 ///                   '__is_const'
694 ///                   '__is_volatile'
695 ///                   '__is_trivial'
696 ///                   '__is_standard_layout'
697 ///                   '__is_signed'
698 ///                   '__is_unsigned'
699 ///
700 /// [GNU] unary-type-trait:
701 ///                   '__has_nothrow_assign'
702 ///                   '__has_nothrow_copy'
703 ///                   '__has_nothrow_constructor'
704 ///                   '__has_trivial_assign'                  [TODO]
705 ///                   '__has_trivial_copy'                    [TODO]
706 ///                   '__has_trivial_constructor'
707 ///                   '__has_trivial_destructor'
708 ///                   '__has_virtual_destructor'
709 ///                   '__is_abstract'                         [TODO]
710 ///                   '__is_class'
711 ///                   '__is_empty'                            [TODO]
712 ///                   '__is_enum'
713 ///                   '__is_final'
714 ///                   '__is_pod'
715 ///                   '__is_polymorphic'
716 ///                   '__is_sealed'                           [MS]
717 ///                   '__is_trivial'
718 ///                   '__is_union'
719 ///
720 /// [Clang] unary-type-trait:
721 ///                   '__is_aggregate'
722 ///                   '__trivially_copyable'
723 ///
724 ///       binary-type-trait:
725 /// [GNU]             '__is_base_of'       
726 /// [MS]              '__is_convertible_to'
727 ///                   '__is_convertible'
728 ///                   '__is_same'
729 ///
730 /// [Embarcadero] array-type-trait:
731 ///                   '__array_rank'
732 ///                   '__array_extent'
733 ///
734 /// [Embarcadero] expression-trait:
735 ///                   '__is_lvalue_expr'
736 ///                   '__is_rvalue_expr'
737 /// \endverbatim
738 ///
739 ExprResult Parser::ParseCastExpression(bool isUnaryExpression,
740                                        bool isAddressOfOperand,
741                                        bool &NotCastExpr,
742                                        TypeCastState isTypeCast,
743                                        bool isVectorLiteral) {
744   ExprResult Res;
745   tok::TokenKind SavedKind = Tok.getKind();
746   NotCastExpr = false;
747
748   // This handles all of cast-expression, unary-expression, postfix-expression,
749   // and primary-expression.  We handle them together like this for efficiency
750   // and to simplify handling of an expression starting with a '(' token: which
751   // may be one of a parenthesized expression, cast-expression, compound literal
752   // expression, or statement expression.
753   //
754   // If the parsed tokens consist of a primary-expression, the cases below
755   // break out of the switch;  at the end we call ParsePostfixExpressionSuffix
756   // to handle the postfix expression suffixes.  Cases that cannot be followed
757   // by postfix exprs should return without invoking
758   // ParsePostfixExpressionSuffix.
759   switch (SavedKind) {
760   case tok::l_paren: {
761     // If this expression is limited to being a unary-expression, the parent can
762     // not start a cast expression.
763     ParenParseOption ParenExprType =
764         (isUnaryExpression && !getLangOpts().CPlusPlus) ? CompoundLiteral
765                                                         : CastExpr;
766     ParsedType CastTy;
767     SourceLocation RParenLoc;
768     Res = ParseParenExpression(ParenExprType, false/*stopIfCastExr*/,
769                                isTypeCast == IsTypeCast, CastTy, RParenLoc);
770
771     if (isVectorLiteral)
772         return Res;
773
774     switch (ParenExprType) {
775     case SimpleExpr:   break;    // Nothing else to do.
776     case CompoundStmt: break;  // Nothing else to do.
777     case CompoundLiteral:
778       // We parsed '(' type-name ')' '{' ... '}'.  If any suffixes of
779       // postfix-expression exist, parse them now.
780       break;
781     case CastExpr:
782       // We have parsed the cast-expression and no postfix-expr pieces are
783       // following.
784       return Res;
785     }
786
787     break;
788   }
789
790     // primary-expression
791   case tok::numeric_constant:
792     // constant: integer-constant
793     // constant: floating-constant
794
795     Res = Actions.ActOnNumericConstant(Tok, /*UDLScope*/getCurScope());
796     ConsumeToken();
797     break;
798
799   case tok::kw_true:
800   case tok::kw_false:
801     return ParseCXXBoolLiteral();
802   
803   case tok::kw___objc_yes:
804   case tok::kw___objc_no:
805       return ParseObjCBoolLiteral();
806
807   case tok::kw_nullptr:
808     Diag(Tok, diag::warn_cxx98_compat_nullptr);
809     return Actions.ActOnCXXNullPtrLiteral(ConsumeToken());
810
811   case tok::annot_primary_expr:
812     assert(Res.get() == nullptr && "Stray primary-expression annotation?");
813     Res = getExprAnnotation(Tok);
814     ConsumeAnnotationToken();
815     break;
816
817   case tok::kw___super:
818   case tok::kw_decltype:
819     // Annotate the token and tail recurse.
820     if (TryAnnotateTypeOrScopeToken())
821       return ExprError();
822     assert(Tok.isNot(tok::kw_decltype) && Tok.isNot(tok::kw___super));
823     return ParseCastExpression(isUnaryExpression, isAddressOfOperand);
824       
825   case tok::identifier: {      // primary-expression: identifier
826                                // unqualified-id: identifier
827                                // constant: enumeration-constant
828     // Turn a potentially qualified name into a annot_typename or
829     // annot_cxxscope if it would be valid.  This handles things like x::y, etc.
830     if (getLangOpts().CPlusPlus) {
831       // Avoid the unnecessary parse-time lookup in the common case
832       // where the syntax forbids a type.
833       const Token &Next = NextToken();
834
835       // If this identifier was reverted from a token ID, and the next token
836       // is a parenthesis, this is likely to be a use of a type trait. Check
837       // those tokens.
838       if (Next.is(tok::l_paren) &&
839           Tok.is(tok::identifier) &&
840           Tok.getIdentifierInfo()->hasRevertedTokenIDToIdentifier()) {
841         IdentifierInfo *II = Tok.getIdentifierInfo();
842         // Build up the mapping of revertible type traits, for future use.
843         if (RevertibleTypeTraits.empty()) {
844 #define RTT_JOIN(X,Y) X##Y
845 #define REVERTIBLE_TYPE_TRAIT(Name)                         \
846           RevertibleTypeTraits[PP.getIdentifierInfo(#Name)] \
847             = RTT_JOIN(tok::kw_,Name)
848
849           REVERTIBLE_TYPE_TRAIT(__is_abstract);
850           REVERTIBLE_TYPE_TRAIT(__is_aggregate);
851           REVERTIBLE_TYPE_TRAIT(__is_arithmetic);
852           REVERTIBLE_TYPE_TRAIT(__is_array);
853           REVERTIBLE_TYPE_TRAIT(__is_assignable);
854           REVERTIBLE_TYPE_TRAIT(__is_base_of);
855           REVERTIBLE_TYPE_TRAIT(__is_class);
856           REVERTIBLE_TYPE_TRAIT(__is_complete_type);
857           REVERTIBLE_TYPE_TRAIT(__is_compound);
858           REVERTIBLE_TYPE_TRAIT(__is_const);
859           REVERTIBLE_TYPE_TRAIT(__is_constructible);
860           REVERTIBLE_TYPE_TRAIT(__is_convertible);
861           REVERTIBLE_TYPE_TRAIT(__is_convertible_to);
862           REVERTIBLE_TYPE_TRAIT(__is_destructible);
863           REVERTIBLE_TYPE_TRAIT(__is_empty);
864           REVERTIBLE_TYPE_TRAIT(__is_enum);
865           REVERTIBLE_TYPE_TRAIT(__is_floating_point);
866           REVERTIBLE_TYPE_TRAIT(__is_final);
867           REVERTIBLE_TYPE_TRAIT(__is_function);
868           REVERTIBLE_TYPE_TRAIT(__is_fundamental);
869           REVERTIBLE_TYPE_TRAIT(__is_integral);
870           REVERTIBLE_TYPE_TRAIT(__is_interface_class);
871           REVERTIBLE_TYPE_TRAIT(__is_literal);
872           REVERTIBLE_TYPE_TRAIT(__is_lvalue_expr);
873           REVERTIBLE_TYPE_TRAIT(__is_lvalue_reference);
874           REVERTIBLE_TYPE_TRAIT(__is_member_function_pointer);
875           REVERTIBLE_TYPE_TRAIT(__is_member_object_pointer);
876           REVERTIBLE_TYPE_TRAIT(__is_member_pointer);
877           REVERTIBLE_TYPE_TRAIT(__is_nothrow_assignable);
878           REVERTIBLE_TYPE_TRAIT(__is_nothrow_constructible);
879           REVERTIBLE_TYPE_TRAIT(__is_nothrow_destructible);
880           REVERTIBLE_TYPE_TRAIT(__is_object);
881           REVERTIBLE_TYPE_TRAIT(__is_pod);
882           REVERTIBLE_TYPE_TRAIT(__is_pointer);
883           REVERTIBLE_TYPE_TRAIT(__is_polymorphic);
884           REVERTIBLE_TYPE_TRAIT(__is_reference);
885           REVERTIBLE_TYPE_TRAIT(__is_rvalue_expr);
886           REVERTIBLE_TYPE_TRAIT(__is_rvalue_reference);
887           REVERTIBLE_TYPE_TRAIT(__is_same);
888           REVERTIBLE_TYPE_TRAIT(__is_scalar);
889           REVERTIBLE_TYPE_TRAIT(__is_sealed);
890           REVERTIBLE_TYPE_TRAIT(__is_signed);
891           REVERTIBLE_TYPE_TRAIT(__is_standard_layout);
892           REVERTIBLE_TYPE_TRAIT(__is_trivial);
893           REVERTIBLE_TYPE_TRAIT(__is_trivially_assignable);
894           REVERTIBLE_TYPE_TRAIT(__is_trivially_constructible);
895           REVERTIBLE_TYPE_TRAIT(__is_trivially_copyable);
896           REVERTIBLE_TYPE_TRAIT(__is_union);
897           REVERTIBLE_TYPE_TRAIT(__is_unsigned);
898           REVERTIBLE_TYPE_TRAIT(__is_void);
899           REVERTIBLE_TYPE_TRAIT(__is_volatile);
900 #undef REVERTIBLE_TYPE_TRAIT
901 #undef RTT_JOIN
902         }
903
904         // If we find that this is in fact the name of a type trait,
905         // update the token kind in place and parse again to treat it as
906         // the appropriate kind of type trait.
907         llvm::SmallDenseMap<IdentifierInfo *, tok::TokenKind>::iterator Known
908           = RevertibleTypeTraits.find(II);
909         if (Known != RevertibleTypeTraits.end()) {
910           Tok.setKind(Known->second);
911           return ParseCastExpression(isUnaryExpression, isAddressOfOperand,
912                                      NotCastExpr, isTypeCast);
913         }
914       }
915
916       if ((!ColonIsSacred && Next.is(tok::colon)) ||
917           Next.isOneOf(tok::coloncolon, tok::less, tok::l_paren,
918                        tok::l_brace)) {
919         // If TryAnnotateTypeOrScopeToken annotates the token, tail recurse.
920         if (TryAnnotateTypeOrScopeToken())
921           return ExprError();
922         if (!Tok.is(tok::identifier))
923           return ParseCastExpression(isUnaryExpression, isAddressOfOperand);
924       }
925     }
926
927     // Consume the identifier so that we can see if it is followed by a '(' or
928     // '.'.
929     IdentifierInfo &II = *Tok.getIdentifierInfo();
930     SourceLocation ILoc = ConsumeToken();
931
932     // Support 'Class.property' and 'super.property' notation.
933     if (getLangOpts().ObjC1 && Tok.is(tok::period) &&
934         (Actions.getTypeName(II, ILoc, getCurScope()) ||
935          // Allow the base to be 'super' if in an objc-method.
936          (&II == Ident_super && getCurScope()->isInObjcMethodScope()))) {
937       ConsumeToken();
938
939       if (Tok.is(tok::code_completion) && &II != Ident_super) {
940         Actions.CodeCompleteObjCClassPropertyRefExpr(
941             getCurScope(), II, ILoc, ExprStatementTokLoc == ILoc);
942         cutOffParsing();
943         return ExprError();
944       }
945       // Allow either an identifier or the keyword 'class' (in C++).
946       if (Tok.isNot(tok::identifier) && 
947           !(getLangOpts().CPlusPlus && Tok.is(tok::kw_class))) {
948         Diag(Tok, diag::err_expected_property_name);
949         return ExprError();
950       }
951       IdentifierInfo &PropertyName = *Tok.getIdentifierInfo();
952       SourceLocation PropertyLoc = ConsumeToken();
953       
954       Res = Actions.ActOnClassPropertyRefExpr(II, PropertyName,
955                                               ILoc, PropertyLoc);
956       break;
957     }
958
959     // In an Objective-C method, if we have "super" followed by an identifier,
960     // the token sequence is ill-formed. However, if there's a ':' or ']' after
961     // that identifier, this is probably a message send with a missing open
962     // bracket. Treat it as such. 
963     if (getLangOpts().ObjC1 && &II == Ident_super && !InMessageExpression &&
964         getCurScope()->isInObjcMethodScope() &&
965         ((Tok.is(tok::identifier) &&
966          (NextToken().is(tok::colon) || NextToken().is(tok::r_square))) ||
967          Tok.is(tok::code_completion))) {
968       Res = ParseObjCMessageExpressionBody(SourceLocation(), ILoc, nullptr,
969                                            nullptr);
970       break;
971     }
972     
973     // If we have an Objective-C class name followed by an identifier
974     // and either ':' or ']', this is an Objective-C class message
975     // send that's missing the opening '['. Recovery
976     // appropriately. Also take this path if we're performing code
977     // completion after an Objective-C class name.
978     if (getLangOpts().ObjC1 && 
979         ((Tok.is(tok::identifier) && !InMessageExpression) || 
980          Tok.is(tok::code_completion))) {
981       const Token& Next = NextToken();
982       if (Tok.is(tok::code_completion) || 
983           Next.is(tok::colon) || Next.is(tok::r_square))
984         if (ParsedType Typ = Actions.getTypeName(II, ILoc, getCurScope()))
985           if (Typ.get()->isObjCObjectOrInterfaceType()) {
986             // Fake up a Declarator to use with ActOnTypeName.
987             DeclSpec DS(AttrFactory);
988             DS.SetRangeStart(ILoc);
989             DS.SetRangeEnd(ILoc);
990             const char *PrevSpec = nullptr;
991             unsigned DiagID;
992             DS.SetTypeSpecType(TST_typename, ILoc, PrevSpec, DiagID, Typ,
993                                Actions.getASTContext().getPrintingPolicy());
994             
995             Declarator DeclaratorInfo(DS, Declarator::TypeNameContext);
996             TypeResult Ty = Actions.ActOnTypeName(getCurScope(), 
997                                                   DeclaratorInfo);
998             if (Ty.isInvalid())
999               break;
1000
1001             Res = ParseObjCMessageExpressionBody(SourceLocation(), 
1002                                                  SourceLocation(), 
1003                                                  Ty.get(), nullptr);
1004             break;
1005           }
1006     }
1007     
1008     // Make sure to pass down the right value for isAddressOfOperand.
1009     if (isAddressOfOperand && isPostfixExpressionSuffixStart())
1010       isAddressOfOperand = false;
1011    
1012     // Function designators are allowed to be undeclared (C99 6.5.1p2), so we
1013     // need to know whether or not this identifier is a function designator or
1014     // not.
1015     UnqualifiedId Name;
1016     CXXScopeSpec ScopeSpec;
1017     SourceLocation TemplateKWLoc;
1018     Token Replacement;
1019     auto Validator = llvm::make_unique<CastExpressionIdValidator>(
1020         Tok, isTypeCast != NotTypeCast, isTypeCast != IsTypeCast);
1021     Validator->IsAddressOfOperand = isAddressOfOperand;
1022     if (Tok.isOneOf(tok::periodstar, tok::arrowstar)) {
1023       Validator->WantExpressionKeywords = false;
1024       Validator->WantRemainingKeywords = false;
1025     } else {
1026       Validator->WantRemainingKeywords = Tok.isNot(tok::r_paren);
1027     }
1028     Name.setIdentifier(&II, ILoc);
1029     Res = Actions.ActOnIdExpression(
1030         getCurScope(), ScopeSpec, TemplateKWLoc, Name, Tok.is(tok::l_paren),
1031         isAddressOfOperand, std::move(Validator),
1032         /*IsInlineAsmIdentifier=*/false,
1033         Tok.is(tok::r_paren) ? nullptr : &Replacement);
1034     if (!Res.isInvalid() && !Res.get()) {
1035       UnconsumeToken(Replacement);
1036       return ParseCastExpression(isUnaryExpression, isAddressOfOperand,
1037                                  NotCastExpr, isTypeCast);
1038     }
1039     break;
1040   }
1041   case tok::char_constant:     // constant: character-constant
1042   case tok::wide_char_constant:
1043   case tok::utf8_char_constant:
1044   case tok::utf16_char_constant:
1045   case tok::utf32_char_constant:
1046     Res = Actions.ActOnCharacterConstant(Tok, /*UDLScope*/getCurScope());
1047     ConsumeToken();
1048     break;
1049   case tok::kw___func__:       // primary-expression: __func__ [C99 6.4.2.2]
1050   case tok::kw___FUNCTION__:   // primary-expression: __FUNCTION__ [GNU]
1051   case tok::kw___FUNCDNAME__:   // primary-expression: __FUNCDNAME__ [MS]
1052   case tok::kw___FUNCSIG__:     // primary-expression: __FUNCSIG__ [MS]
1053   case tok::kw_L__FUNCTION__:   // primary-expression: L__FUNCTION__ [MS]
1054   case tok::kw___PRETTY_FUNCTION__:  // primary-expression: __P..Y_F..N__ [GNU]
1055     Res = Actions.ActOnPredefinedExpr(Tok.getLocation(), SavedKind);
1056     ConsumeToken();
1057     break;
1058   case tok::string_literal:    // primary-expression: string-literal
1059   case tok::wide_string_literal:
1060   case tok::utf8_string_literal:
1061   case tok::utf16_string_literal:
1062   case tok::utf32_string_literal:
1063     Res = ParseStringLiteralExpression(true);
1064     break;
1065   case tok::kw__Generic:   // primary-expression: generic-selection [C11 6.5.1]
1066     Res = ParseGenericSelectionExpression();
1067     break;
1068   case tok::kw___builtin_available:
1069     return ParseAvailabilityCheckExpr(Tok.getLocation());
1070   case tok::kw___builtin_va_arg:
1071   case tok::kw___builtin_offsetof:
1072   case tok::kw___builtin_choose_expr:
1073   case tok::kw___builtin_astype: // primary-expression: [OCL] as_type()
1074   case tok::kw___builtin_convertvector:
1075     return ParseBuiltinPrimaryExpression();
1076   case tok::kw___null:
1077     return Actions.ActOnGNUNullExpr(ConsumeToken());
1078
1079   case tok::plusplus:      // unary-expression: '++' unary-expression [C99]
1080   case tok::minusminus: {  // unary-expression: '--' unary-expression [C99]
1081     // C++ [expr.unary] has:
1082     //   unary-expression:
1083     //     ++ cast-expression
1084     //     -- cast-expression
1085     Token SavedTok = Tok;
1086     ConsumeToken();
1087     // One special case is implicitly handled here: if the preceding tokens are
1088     // an ambiguous cast expression, such as "(T())++", then we recurse to
1089     // determine whether the '++' is prefix or postfix.
1090     Res = ParseCastExpression(!getLangOpts().CPlusPlus,
1091                               /*isAddressOfOperand*/false, NotCastExpr,
1092                               NotTypeCast);
1093     if (NotCastExpr) {
1094       // If we return with NotCastExpr = true, we must not consume any tokens,
1095       // so put the token back where we found it.
1096       assert(Res.isInvalid());
1097       UnconsumeToken(SavedTok);
1098       return ExprError();
1099     }
1100     if (!Res.isInvalid())
1101       Res = Actions.ActOnUnaryOp(getCurScope(), SavedTok.getLocation(),
1102                                  SavedKind, Res.get());
1103     return Res;
1104   }
1105   case tok::amp: {         // unary-expression: '&' cast-expression
1106     // Special treatment because of member pointers
1107     SourceLocation SavedLoc = ConsumeToken();
1108     Res = ParseCastExpression(false, true);
1109     if (!Res.isInvalid())
1110       Res = Actions.ActOnUnaryOp(getCurScope(), SavedLoc, SavedKind, Res.get());
1111     return Res;
1112   }
1113
1114   case tok::star:          // unary-expression: '*' cast-expression
1115   case tok::plus:          // unary-expression: '+' cast-expression
1116   case tok::minus:         // unary-expression: '-' cast-expression
1117   case tok::tilde:         // unary-expression: '~' cast-expression
1118   case tok::exclaim:       // unary-expression: '!' cast-expression
1119   case tok::kw___real:     // unary-expression: '__real' cast-expression [GNU]
1120   case tok::kw___imag: {   // unary-expression: '__imag' cast-expression [GNU]
1121     SourceLocation SavedLoc = ConsumeToken();
1122     Res = ParseCastExpression(false);
1123     if (!Res.isInvalid())
1124       Res = Actions.ActOnUnaryOp(getCurScope(), SavedLoc, SavedKind, Res.get());
1125     return Res;
1126   }
1127
1128   case tok::kw_co_await: {  // unary-expression: 'co_await' cast-expression
1129     SourceLocation CoawaitLoc = ConsumeToken();
1130     Res = ParseCastExpression(false);
1131     if (!Res.isInvalid())
1132       Res = Actions.ActOnCoawaitExpr(getCurScope(), CoawaitLoc, Res.get());
1133     return Res;
1134   }
1135
1136   case tok::kw___extension__:{//unary-expression:'__extension__' cast-expr [GNU]
1137     // __extension__ silences extension warnings in the subexpression.
1138     ExtensionRAIIObject O(Diags);  // Use RAII to do this.
1139     SourceLocation SavedLoc = ConsumeToken();
1140     Res = ParseCastExpression(false);
1141     if (!Res.isInvalid())
1142       Res = Actions.ActOnUnaryOp(getCurScope(), SavedLoc, SavedKind, Res.get());
1143     return Res;
1144   }
1145   case tok::kw__Alignof:   // unary-expression: '_Alignof' '(' type-name ')'
1146     if (!getLangOpts().C11)
1147       Diag(Tok, diag::ext_c11_alignment) << Tok.getName();
1148     // fallthrough
1149   case tok::kw_alignof:    // unary-expression: 'alignof' '(' type-id ')'
1150   case tok::kw___alignof:  // unary-expression: '__alignof' unary-expression
1151                            // unary-expression: '__alignof' '(' type-name ')'
1152   case tok::kw_sizeof:     // unary-expression: 'sizeof' unary-expression
1153                            // unary-expression: 'sizeof' '(' type-name ')'
1154   case tok::kw_vec_step:   // unary-expression: OpenCL 'vec_step' expression
1155   // unary-expression: '__builtin_omp_required_simd_align' '(' type-name ')'
1156   case tok::kw___builtin_omp_required_simd_align:
1157     return ParseUnaryExprOrTypeTraitExpression();
1158   case tok::ampamp: {      // unary-expression: '&&' identifier
1159     SourceLocation AmpAmpLoc = ConsumeToken();
1160     if (Tok.isNot(tok::identifier))
1161       return ExprError(Diag(Tok, diag::err_expected) << tok::identifier);
1162
1163     if (getCurScope()->getFnParent() == nullptr)
1164       return ExprError(Diag(Tok, diag::err_address_of_label_outside_fn));
1165     
1166     Diag(AmpAmpLoc, diag::ext_gnu_address_of_label);
1167     LabelDecl *LD = Actions.LookupOrCreateLabel(Tok.getIdentifierInfo(),
1168                                                 Tok.getLocation());
1169     Res = Actions.ActOnAddrLabel(AmpAmpLoc, Tok.getLocation(), LD);
1170     ConsumeToken();
1171     return Res;
1172   }
1173   case tok::kw_const_cast:
1174   case tok::kw_dynamic_cast:
1175   case tok::kw_reinterpret_cast:
1176   case tok::kw_static_cast:
1177     Res = ParseCXXCasts();
1178     break;
1179   case tok::kw_typeid:
1180     Res = ParseCXXTypeid();
1181     break;
1182   case tok::kw___uuidof:
1183     Res = ParseCXXUuidof();
1184     break;
1185   case tok::kw_this:
1186     Res = ParseCXXThis();
1187     break;
1188
1189   case tok::annot_typename:
1190     if (isStartOfObjCClassMessageMissingOpenBracket()) {
1191       ParsedType Type = getTypeAnnotation(Tok);
1192
1193       // Fake up a Declarator to use with ActOnTypeName.
1194       DeclSpec DS(AttrFactory);
1195       DS.SetRangeStart(Tok.getLocation());
1196       DS.SetRangeEnd(Tok.getLastLoc());
1197
1198       const char *PrevSpec = nullptr;
1199       unsigned DiagID;
1200       DS.SetTypeSpecType(TST_typename, Tok.getAnnotationEndLoc(),
1201                          PrevSpec, DiagID, Type,
1202                          Actions.getASTContext().getPrintingPolicy());
1203
1204       Declarator DeclaratorInfo(DS, Declarator::TypeNameContext);
1205       TypeResult Ty = Actions.ActOnTypeName(getCurScope(), DeclaratorInfo);
1206       if (Ty.isInvalid())
1207         break;
1208
1209       ConsumeAnnotationToken();
1210       Res = ParseObjCMessageExpressionBody(SourceLocation(), SourceLocation(),
1211                                            Ty.get(), nullptr);
1212       break;
1213     }
1214     // Fall through
1215
1216   case tok::annot_decltype:
1217   case tok::kw_char:
1218   case tok::kw_wchar_t:
1219   case tok::kw_char16_t:
1220   case tok::kw_char32_t:
1221   case tok::kw_bool:
1222   case tok::kw_short:
1223   case tok::kw_int:
1224   case tok::kw_long:
1225   case tok::kw___int64:
1226   case tok::kw___int128:
1227   case tok::kw_signed:
1228   case tok::kw_unsigned:
1229   case tok::kw_half:
1230   case tok::kw_float:
1231   case tok::kw_double:
1232   case tok::kw___float128:
1233   case tok::kw_void:
1234   case tok::kw_typename:
1235   case tok::kw_typeof:
1236   case tok::kw___vector:
1237 #define GENERIC_IMAGE_TYPE(ImgType, Id) case tok::kw_##ImgType##_t:
1238 #include "clang/Basic/OpenCLImageTypes.def"
1239   {
1240     if (!getLangOpts().CPlusPlus) {
1241       Diag(Tok, diag::err_expected_expression);
1242       return ExprError();
1243     }
1244
1245     if (SavedKind == tok::kw_typename) {
1246       // postfix-expression: typename-specifier '(' expression-list[opt] ')'
1247       //                     typename-specifier braced-init-list
1248       if (TryAnnotateTypeOrScopeToken())
1249         return ExprError();
1250
1251       if (!Actions.isSimpleTypeSpecifier(Tok.getKind()))
1252         // We are trying to parse a simple-type-specifier but might not get such
1253         // a token after error recovery.
1254         return ExprError();
1255     }
1256
1257     // postfix-expression: simple-type-specifier '(' expression-list[opt] ')'
1258     //                     simple-type-specifier braced-init-list
1259     //
1260     DeclSpec DS(AttrFactory);
1261
1262     ParseCXXSimpleTypeSpecifier(DS);
1263     if (Tok.isNot(tok::l_paren) &&
1264         (!getLangOpts().CPlusPlus11 || Tok.isNot(tok::l_brace)))
1265       return ExprError(Diag(Tok, diag::err_expected_lparen_after_type)
1266                          << DS.getSourceRange());
1267
1268     if (Tok.is(tok::l_brace))
1269       Diag(Tok, diag::warn_cxx98_compat_generalized_initializer_lists);
1270
1271     Res = ParseCXXTypeConstructExpression(DS);
1272     break;
1273   }
1274
1275   case tok::annot_cxxscope: { // [C++] id-expression: qualified-id
1276     // If TryAnnotateTypeOrScopeToken annotates the token, tail recurse.
1277     // (We can end up in this situation after tentative parsing.)
1278     if (TryAnnotateTypeOrScopeToken())
1279       return ExprError();
1280     if (!Tok.is(tok::annot_cxxscope))
1281       return ParseCastExpression(isUnaryExpression, isAddressOfOperand,
1282                                  NotCastExpr, isTypeCast);
1283
1284     Token Next = NextToken();
1285     if (Next.is(tok::annot_template_id)) {
1286       TemplateIdAnnotation *TemplateId = takeTemplateIdAnnotation(Next);
1287       if (TemplateId->Kind == TNK_Type_template) {
1288         // We have a qualified template-id that we know refers to a
1289         // type, translate it into a type and continue parsing as a
1290         // cast expression.
1291         CXXScopeSpec SS;
1292         ParseOptionalCXXScopeSpecifier(SS, nullptr,
1293                                        /*EnteringContext=*/false);
1294         AnnotateTemplateIdTokenAsType();
1295         return ParseCastExpression(isUnaryExpression, isAddressOfOperand,
1296                                    NotCastExpr, isTypeCast);
1297       }
1298     }
1299
1300     // Parse as an id-expression.
1301     Res = ParseCXXIdExpression(isAddressOfOperand);
1302     break;
1303   }
1304
1305   case tok::annot_template_id: { // [C++]          template-id
1306     TemplateIdAnnotation *TemplateId = takeTemplateIdAnnotation(Tok);
1307     if (TemplateId->Kind == TNK_Type_template) {
1308       // We have a template-id that we know refers to a type,
1309       // translate it into a type and continue parsing as a cast
1310       // expression.
1311       AnnotateTemplateIdTokenAsType();
1312       return ParseCastExpression(isUnaryExpression, isAddressOfOperand,
1313                                  NotCastExpr, isTypeCast);
1314     }
1315
1316     // Fall through to treat the template-id as an id-expression.
1317   }
1318
1319   case tok::kw_operator: // [C++] id-expression: operator/conversion-function-id
1320     Res = ParseCXXIdExpression(isAddressOfOperand);
1321     break;
1322
1323   case tok::coloncolon: {
1324     // ::foo::bar -> global qualified name etc.   If TryAnnotateTypeOrScopeToken
1325     // annotates the token, tail recurse.
1326     if (TryAnnotateTypeOrScopeToken())
1327       return ExprError();
1328     if (!Tok.is(tok::coloncolon))
1329       return ParseCastExpression(isUnaryExpression, isAddressOfOperand);
1330
1331     // ::new -> [C++] new-expression
1332     // ::delete -> [C++] delete-expression
1333     SourceLocation CCLoc = ConsumeToken();
1334     if (Tok.is(tok::kw_new))
1335       return ParseCXXNewExpression(true, CCLoc);
1336     if (Tok.is(tok::kw_delete))
1337       return ParseCXXDeleteExpression(true, CCLoc);
1338
1339     // This is not a type name or scope specifier, it is an invalid expression.
1340     Diag(CCLoc, diag::err_expected_expression);
1341     return ExprError();
1342   }
1343
1344   case tok::kw_new: // [C++] new-expression
1345     return ParseCXXNewExpression(false, Tok.getLocation());
1346
1347   case tok::kw_delete: // [C++] delete-expression
1348     return ParseCXXDeleteExpression(false, Tok.getLocation());
1349
1350   case tok::kw_noexcept: { // [C++0x] 'noexcept' '(' expression ')'
1351     Diag(Tok, diag::warn_cxx98_compat_noexcept_expr);
1352     SourceLocation KeyLoc = ConsumeToken();
1353     BalancedDelimiterTracker T(*this, tok::l_paren);
1354
1355     if (T.expectAndConsume(diag::err_expected_lparen_after, "noexcept"))
1356       return ExprError();
1357     // C++11 [expr.unary.noexcept]p1:
1358     //   The noexcept operator determines whether the evaluation of its operand,
1359     //   which is an unevaluated operand, can throw an exception.
1360     EnterExpressionEvaluationContext Unevaluated(
1361         Actions, Sema::ExpressionEvaluationContext::Unevaluated);
1362     ExprResult Result = ParseExpression();
1363
1364     T.consumeClose();
1365
1366     if (!Result.isInvalid())
1367       Result = Actions.ActOnNoexceptExpr(KeyLoc, T.getOpenLocation(), 
1368                                          Result.get(), T.getCloseLocation());
1369     return Result;
1370   }
1371
1372 #define TYPE_TRAIT(N,Spelling,K) \
1373   case tok::kw_##Spelling:
1374 #include "clang/Basic/TokenKinds.def"
1375     return ParseTypeTrait();
1376       
1377   case tok::kw___array_rank:
1378   case tok::kw___array_extent:
1379     return ParseArrayTypeTrait();
1380
1381   case tok::kw___is_lvalue_expr:
1382   case tok::kw___is_rvalue_expr:
1383     return ParseExpressionTrait();
1384       
1385   case tok::at: {
1386     SourceLocation AtLoc = ConsumeToken();
1387     return ParseObjCAtExpression(AtLoc);
1388   }
1389   case tok::caret:
1390     Res = ParseBlockLiteralExpression();
1391     break;
1392   case tok::code_completion: {
1393     Actions.CodeCompleteOrdinaryName(getCurScope(), Sema::PCC_Expression);
1394     cutOffParsing();
1395     return ExprError();
1396   }
1397   case tok::l_square:
1398     if (getLangOpts().CPlusPlus11) {
1399       if (getLangOpts().ObjC1) {
1400         // C++11 lambda expressions and Objective-C message sends both start with a
1401         // square bracket.  There are three possibilities here:
1402         // we have a valid lambda expression, we have an invalid lambda
1403         // expression, or we have something that doesn't appear to be a lambda.
1404         // If we're in the last case, we fall back to ParseObjCMessageExpression.
1405         Res = TryParseLambdaExpression();
1406         if (!Res.isInvalid() && !Res.get())
1407           Res = ParseObjCMessageExpression();
1408         break;
1409       }
1410       Res = ParseLambdaExpression();
1411       break;
1412     }
1413     if (getLangOpts().ObjC1) {
1414       Res = ParseObjCMessageExpression();
1415       break;
1416     }
1417     // FALL THROUGH.
1418   default:
1419     NotCastExpr = true;
1420     return ExprError();
1421   }
1422
1423   // Check to see whether Res is a function designator only. If it is and we
1424   // are compiling for OpenCL, we need to return an error as this implies
1425   // that the address of the function is being taken, which is illegal in CL.
1426
1427   // These can be followed by postfix-expr pieces.
1428   Res = ParsePostfixExpressionSuffix(Res);
1429   if (getLangOpts().OpenCL)
1430     if (Expr *PostfixExpr = Res.get()) {
1431       QualType Ty = PostfixExpr->getType();
1432       if (!Ty.isNull() && Ty->isFunctionType()) {
1433         Diag(PostfixExpr->getExprLoc(),
1434              diag::err_opencl_taking_function_address_parser);
1435         return ExprError();
1436       }
1437     }
1438
1439   return Res;
1440 }
1441
1442 /// \brief Once the leading part of a postfix-expression is parsed, this
1443 /// method parses any suffixes that apply.
1444 ///
1445 /// \verbatim
1446 ///       postfix-expression: [C99 6.5.2]
1447 ///         primary-expression
1448 ///         postfix-expression '[' expression ']'
1449 ///         postfix-expression '[' braced-init-list ']'
1450 ///         postfix-expression '(' argument-expression-list[opt] ')'
1451 ///         postfix-expression '.' identifier
1452 ///         postfix-expression '->' identifier
1453 ///         postfix-expression '++'
1454 ///         postfix-expression '--'
1455 ///         '(' type-name ')' '{' initializer-list '}'
1456 ///         '(' type-name ')' '{' initializer-list ',' '}'
1457 ///
1458 ///       argument-expression-list: [C99 6.5.2]
1459 ///         argument-expression ...[opt]
1460 ///         argument-expression-list ',' assignment-expression ...[opt]
1461 /// \endverbatim
1462 ExprResult
1463 Parser::ParsePostfixExpressionSuffix(ExprResult LHS) {
1464   // Now that the primary-expression piece of the postfix-expression has been
1465   // parsed, see if there are any postfix-expression pieces here.
1466   SourceLocation Loc;
1467   while (1) {
1468     switch (Tok.getKind()) {
1469     case tok::code_completion:
1470       if (InMessageExpression)
1471         return LHS;
1472         
1473       Actions.CodeCompletePostfixExpression(getCurScope(), LHS);
1474       cutOffParsing();
1475       return ExprError();
1476         
1477     case tok::identifier:
1478       // If we see identifier: after an expression, and we're not already in a
1479       // message send, then this is probably a message send with a missing
1480       // opening bracket '['.
1481       if (getLangOpts().ObjC1 && !InMessageExpression && 
1482           (NextToken().is(tok::colon) || NextToken().is(tok::r_square))) {
1483         LHS = ParseObjCMessageExpressionBody(SourceLocation(), SourceLocation(),
1484                                              nullptr, LHS.get());
1485         break;
1486       }
1487         
1488       // Fall through; this isn't a message send.
1489                 
1490     default:  // Not a postfix-expression suffix.
1491       return LHS;
1492     case tok::l_square: {  // postfix-expression: p-e '[' expression ']'
1493       // If we have a array postfix expression that starts on a new line and
1494       // Objective-C is enabled, it is highly likely that the user forgot a
1495       // semicolon after the base expression and that the array postfix-expr is
1496       // actually another message send.  In this case, do some look-ahead to see
1497       // if the contents of the square brackets are obviously not a valid
1498       // expression and recover by pretending there is no suffix.
1499       if (getLangOpts().ObjC1 && Tok.isAtStartOfLine() &&
1500           isSimpleObjCMessageExpression())
1501         return LHS;
1502
1503       // Reject array indices starting with a lambda-expression. '[[' is
1504       // reserved for attributes.
1505       if (CheckProhibitedCXX11Attribute()) {
1506         (void)Actions.CorrectDelayedTyposInExpr(LHS);
1507         return ExprError();
1508       }
1509
1510       BalancedDelimiterTracker T(*this, tok::l_square);
1511       T.consumeOpen();
1512       Loc = T.getOpenLocation();
1513       ExprResult Idx, Length;
1514       SourceLocation ColonLoc;
1515       if (getLangOpts().CPlusPlus11 && Tok.is(tok::l_brace)) {
1516         Diag(Tok, diag::warn_cxx98_compat_generalized_initializer_lists);
1517         Idx = ParseBraceInitializer();
1518       } else if (getLangOpts().OpenMP) {
1519         ColonProtectionRAIIObject RAII(*this);
1520         // Parse [: or [ expr or [ expr :
1521         if (!Tok.is(tok::colon)) {
1522           // [ expr
1523           Idx = ParseExpression();
1524         }
1525         if (Tok.is(tok::colon)) {
1526           // Consume ':'
1527           ColonLoc = ConsumeToken();
1528           if (Tok.isNot(tok::r_square))
1529             Length = ParseExpression();
1530         }
1531       } else
1532         Idx = ParseExpression();
1533
1534       SourceLocation RLoc = Tok.getLocation();
1535
1536       ExprResult OrigLHS = LHS;
1537       if (!LHS.isInvalid() && !Idx.isInvalid() && !Length.isInvalid() &&
1538           Tok.is(tok::r_square)) {
1539         if (ColonLoc.isValid()) {
1540           LHS = Actions.ActOnOMPArraySectionExpr(LHS.get(), Loc, Idx.get(),
1541                                                  ColonLoc, Length.get(), RLoc);
1542         } else {
1543           LHS = Actions.ActOnArraySubscriptExpr(getCurScope(), LHS.get(), Loc,
1544                                                 Idx.get(), RLoc);
1545         }
1546       } else {
1547         LHS = ExprError();
1548       }
1549       if (LHS.isInvalid()) {
1550         (void)Actions.CorrectDelayedTyposInExpr(OrigLHS);
1551         (void)Actions.CorrectDelayedTyposInExpr(Idx);
1552         (void)Actions.CorrectDelayedTyposInExpr(Length);
1553         LHS = ExprError();
1554         Idx = ExprError();
1555       }
1556
1557       // Match the ']'.
1558       T.consumeClose();
1559       break;
1560     }
1561
1562     case tok::l_paren:         // p-e: p-e '(' argument-expression-list[opt] ')'
1563     case tok::lesslessless: {  // p-e: p-e '<<<' argument-expression-list '>>>'
1564                                //   '(' argument-expression-list[opt] ')'
1565       tok::TokenKind OpKind = Tok.getKind();
1566       InMessageExpressionRAIIObject InMessage(*this, false);
1567
1568       Expr *ExecConfig = nullptr;
1569
1570       BalancedDelimiterTracker PT(*this, tok::l_paren);
1571
1572       if (OpKind == tok::lesslessless) {
1573         ExprVector ExecConfigExprs;
1574         CommaLocsTy ExecConfigCommaLocs;
1575         SourceLocation OpenLoc = ConsumeToken();
1576
1577         if (ParseSimpleExpressionList(ExecConfigExprs, ExecConfigCommaLocs)) {
1578           (void)Actions.CorrectDelayedTyposInExpr(LHS);
1579           LHS = ExprError();
1580         }
1581
1582         SourceLocation CloseLoc;
1583         if (TryConsumeToken(tok::greatergreatergreater, CloseLoc)) {
1584         } else if (LHS.isInvalid()) {
1585           SkipUntil(tok::greatergreatergreater, StopAtSemi);
1586         } else {
1587           // There was an error closing the brackets
1588           Diag(Tok, diag::err_expected) << tok::greatergreatergreater;
1589           Diag(OpenLoc, diag::note_matching) << tok::lesslessless;
1590           SkipUntil(tok::greatergreatergreater, StopAtSemi);
1591           LHS = ExprError();
1592         }
1593
1594         if (!LHS.isInvalid()) {
1595           if (ExpectAndConsume(tok::l_paren))
1596             LHS = ExprError();
1597           else
1598             Loc = PrevTokLocation;
1599         }
1600
1601         if (!LHS.isInvalid()) {
1602           ExprResult ECResult = Actions.ActOnCUDAExecConfigExpr(getCurScope(),
1603                                     OpenLoc, 
1604                                     ExecConfigExprs, 
1605                                     CloseLoc);
1606           if (ECResult.isInvalid())
1607             LHS = ExprError();
1608           else
1609             ExecConfig = ECResult.get();
1610         }
1611       } else {
1612         PT.consumeOpen();
1613         Loc = PT.getOpenLocation();
1614       }
1615
1616       ExprVector ArgExprs;
1617       CommaLocsTy CommaLocs;
1618       
1619       if (Tok.is(tok::code_completion)) {
1620         Actions.CodeCompleteCall(getCurScope(), LHS.get(), None);
1621         cutOffParsing();
1622         return ExprError();
1623       }
1624
1625       if (OpKind == tok::l_paren || !LHS.isInvalid()) {
1626         if (Tok.isNot(tok::r_paren)) {
1627           if (ParseExpressionList(ArgExprs, CommaLocs, [&] {
1628                 Actions.CodeCompleteCall(getCurScope(), LHS.get(), ArgExprs);
1629              })) {
1630             (void)Actions.CorrectDelayedTyposInExpr(LHS);
1631             LHS = ExprError();
1632           } else if (LHS.isInvalid()) {
1633             for (auto &E : ArgExprs)
1634               Actions.CorrectDelayedTyposInExpr(E);
1635           }
1636         }
1637       }
1638
1639       // Match the ')'.
1640       if (LHS.isInvalid()) {
1641         SkipUntil(tok::r_paren, StopAtSemi);
1642       } else if (Tok.isNot(tok::r_paren)) {
1643         bool HadDelayedTypo = false;
1644         if (Actions.CorrectDelayedTyposInExpr(LHS).get() != LHS.get())
1645           HadDelayedTypo = true;
1646         for (auto &E : ArgExprs)
1647           if (Actions.CorrectDelayedTyposInExpr(E).get() != E)
1648             HadDelayedTypo = true;
1649         // If there were delayed typos in the LHS or ArgExprs, call SkipUntil
1650         // instead of PT.consumeClose() to avoid emitting extra diagnostics for
1651         // the unmatched l_paren.
1652         if (HadDelayedTypo)
1653           SkipUntil(tok::r_paren, StopAtSemi);
1654         else
1655           PT.consumeClose();
1656         LHS = ExprError();
1657       } else {
1658         assert((ArgExprs.size() == 0 || 
1659                 ArgExprs.size()-1 == CommaLocs.size())&&
1660                "Unexpected number of commas!");
1661         LHS = Actions.ActOnCallExpr(getCurScope(), LHS.get(), Loc,
1662                                     ArgExprs, Tok.getLocation(),
1663                                     ExecConfig);
1664         PT.consumeClose();
1665       }
1666
1667       break;
1668     }
1669     case tok::arrow:
1670     case tok::period: {
1671       // postfix-expression: p-e '->' template[opt] id-expression
1672       // postfix-expression: p-e '.' template[opt] id-expression
1673       tok::TokenKind OpKind = Tok.getKind();
1674       SourceLocation OpLoc = ConsumeToken();  // Eat the "." or "->" token.
1675
1676       CXXScopeSpec SS;
1677       ParsedType ObjectType;
1678       bool MayBePseudoDestructor = false;
1679       if (getLangOpts().CPlusPlus && !LHS.isInvalid()) {
1680         Expr *Base = LHS.get();
1681         const Type* BaseType = Base->getType().getTypePtrOrNull();
1682         if (BaseType && Tok.is(tok::l_paren) &&
1683             (BaseType->isFunctionType() ||
1684              BaseType->isSpecificPlaceholderType(BuiltinType::BoundMember))) {
1685           Diag(OpLoc, diag::err_function_is_not_record)
1686               << OpKind << Base->getSourceRange()
1687               << FixItHint::CreateRemoval(OpLoc);
1688           return ParsePostfixExpressionSuffix(Base);
1689         }
1690
1691         LHS = Actions.ActOnStartCXXMemberReference(getCurScope(), Base,
1692                                                    OpLoc, OpKind, ObjectType,
1693                                                    MayBePseudoDestructor);
1694         if (LHS.isInvalid())
1695           break;
1696
1697         ParseOptionalCXXScopeSpecifier(SS, ObjectType, 
1698                                        /*EnteringContext=*/false,
1699                                        &MayBePseudoDestructor);
1700         if (SS.isNotEmpty())
1701           ObjectType = nullptr;
1702       }
1703
1704       if (Tok.is(tok::code_completion)) {
1705         // Code completion for a member access expression.
1706         if (Expr *Base = LHS.get())
1707           Actions.CodeCompleteMemberReferenceExpr(
1708               getCurScope(), Base, OpLoc, OpKind == tok::arrow,
1709               ExprStatementTokLoc == Base->getLocStart());
1710
1711         cutOffParsing();
1712         return ExprError();
1713       }
1714
1715       if (MayBePseudoDestructor && !LHS.isInvalid()) {
1716         LHS = ParseCXXPseudoDestructor(LHS.get(), OpLoc, OpKind, SS, 
1717                                        ObjectType);
1718         break;
1719       }
1720
1721       // Either the action has told us that this cannot be a
1722       // pseudo-destructor expression (based on the type of base
1723       // expression), or we didn't see a '~' in the right place. We
1724       // can still parse a destructor name here, but in that case it
1725       // names a real destructor.
1726       // Allow explicit constructor calls in Microsoft mode.
1727       // FIXME: Add support for explicit call of template constructor.
1728       SourceLocation TemplateKWLoc;
1729       UnqualifiedId Name;
1730       if (getLangOpts().ObjC2 && OpKind == tok::period &&
1731           Tok.is(tok::kw_class)) {
1732         // Objective-C++:
1733         //   After a '.' in a member access expression, treat the keyword
1734         //   'class' as if it were an identifier.
1735         //
1736         // This hack allows property access to the 'class' method because it is
1737         // such a common method name. For other C++ keywords that are 
1738         // Objective-C method names, one must use the message send syntax.
1739         IdentifierInfo *Id = Tok.getIdentifierInfo();
1740         SourceLocation Loc = ConsumeToken();
1741         Name.setIdentifier(Id, Loc);
1742       } else if (ParseUnqualifiedId(SS, 
1743                                     /*EnteringContext=*/false, 
1744                                     /*AllowDestructorName=*/true,
1745                                     /*AllowConstructorName=*/
1746                                       getLangOpts().MicrosoftExt, 
1747                                     /*AllowDeductionGuide=*/false,
1748                                     ObjectType, TemplateKWLoc, Name)) {
1749         (void)Actions.CorrectDelayedTyposInExpr(LHS);
1750         LHS = ExprError();
1751       }
1752       
1753       if (!LHS.isInvalid())
1754         LHS = Actions.ActOnMemberAccessExpr(getCurScope(), LHS.get(), OpLoc, 
1755                                             OpKind, SS, TemplateKWLoc, Name,
1756                                  CurParsedObjCImpl ? CurParsedObjCImpl->Dcl
1757                                                    : nullptr);
1758       break;
1759     }
1760     case tok::plusplus:    // postfix-expression: postfix-expression '++'
1761     case tok::minusminus:  // postfix-expression: postfix-expression '--'
1762       if (!LHS.isInvalid()) {
1763         LHS = Actions.ActOnPostfixUnaryOp(getCurScope(), Tok.getLocation(),
1764                                           Tok.getKind(), LHS.get());
1765       }
1766       ConsumeToken();
1767       break;
1768     }
1769   }
1770 }
1771
1772 /// ParseExprAfterUnaryExprOrTypeTrait - We parsed a typeof/sizeof/alignof/
1773 /// vec_step and we are at the start of an expression or a parenthesized
1774 /// type-id. OpTok is the operand token (typeof/sizeof/alignof). Returns the
1775 /// expression (isCastExpr == false) or the type (isCastExpr == true).
1776 ///
1777 /// \verbatim
1778 ///       unary-expression:  [C99 6.5.3]
1779 ///         'sizeof' unary-expression
1780 ///         'sizeof' '(' type-name ')'
1781 /// [GNU]   '__alignof' unary-expression
1782 /// [GNU]   '__alignof' '(' type-name ')'
1783 /// [C11]   '_Alignof' '(' type-name ')'
1784 /// [C++0x] 'alignof' '(' type-id ')'
1785 ///
1786 /// [GNU]   typeof-specifier:
1787 ///           typeof ( expressions )
1788 ///           typeof ( type-name )
1789 /// [GNU/C++] typeof unary-expression
1790 ///
1791 /// [OpenCL 1.1 6.11.12] vec_step built-in function:
1792 ///           vec_step ( expressions )
1793 ///           vec_step ( type-name )
1794 /// \endverbatim
1795 ExprResult
1796 Parser::ParseExprAfterUnaryExprOrTypeTrait(const Token &OpTok,
1797                                            bool &isCastExpr,
1798                                            ParsedType &CastTy,
1799                                            SourceRange &CastRange) {
1800
1801   assert(OpTok.isOneOf(tok::kw_typeof, tok::kw_sizeof, tok::kw___alignof,
1802                        tok::kw_alignof, tok::kw__Alignof, tok::kw_vec_step,
1803                        tok::kw___builtin_omp_required_simd_align) &&
1804          "Not a typeof/sizeof/alignof/vec_step expression!");
1805
1806   ExprResult Operand;
1807
1808   // If the operand doesn't start with an '(', it must be an expression.
1809   if (Tok.isNot(tok::l_paren)) {
1810     // If construct allows a form without parenthesis, user may forget to put
1811     // pathenthesis around type name.
1812     if (OpTok.isOneOf(tok::kw_sizeof, tok::kw___alignof, tok::kw_alignof,
1813                       tok::kw__Alignof)) {
1814       if (isTypeIdUnambiguously()) {
1815         DeclSpec DS(AttrFactory);
1816         ParseSpecifierQualifierList(DS);
1817         Declarator DeclaratorInfo(DS, Declarator::TypeNameContext);
1818         ParseDeclarator(DeclaratorInfo);
1819
1820         SourceLocation LParenLoc = PP.getLocForEndOfToken(OpTok.getLocation());
1821         SourceLocation RParenLoc = PP.getLocForEndOfToken(PrevTokLocation);
1822         Diag(LParenLoc, diag::err_expected_parentheses_around_typename)
1823           << OpTok.getName()
1824           << FixItHint::CreateInsertion(LParenLoc, "(")
1825           << FixItHint::CreateInsertion(RParenLoc, ")");
1826         isCastExpr = true;
1827         return ExprEmpty();
1828       }
1829     }
1830
1831     isCastExpr = false;
1832     if (OpTok.is(tok::kw_typeof) && !getLangOpts().CPlusPlus) {
1833       Diag(Tok, diag::err_expected_after) << OpTok.getIdentifierInfo()
1834                                           << tok::l_paren;
1835       return ExprError();
1836     }
1837
1838     Operand = ParseCastExpression(true/*isUnaryExpression*/);
1839   } else {
1840     // If it starts with a '(', we know that it is either a parenthesized
1841     // type-name, or it is a unary-expression that starts with a compound
1842     // literal, or starts with a primary-expression that is a parenthesized
1843     // expression.
1844     ParenParseOption ExprType = CastExpr;
1845     SourceLocation LParenLoc = Tok.getLocation(), RParenLoc;
1846
1847     Operand = ParseParenExpression(ExprType, true/*stopIfCastExpr*/, 
1848                                    false, CastTy, RParenLoc);
1849     CastRange = SourceRange(LParenLoc, RParenLoc);
1850
1851     // If ParseParenExpression parsed a '(typename)' sequence only, then this is
1852     // a type.
1853     if (ExprType == CastExpr) {
1854       isCastExpr = true;
1855       return ExprEmpty();
1856     }
1857
1858     if (getLangOpts().CPlusPlus || OpTok.isNot(tok::kw_typeof)) {
1859       // GNU typeof in C requires the expression to be parenthesized. Not so for
1860       // sizeof/alignof or in C++. Therefore, the parenthesized expression is
1861       // the start of a unary-expression, but doesn't include any postfix 
1862       // pieces. Parse these now if present.
1863       if (!Operand.isInvalid())
1864         Operand = ParsePostfixExpressionSuffix(Operand.get());
1865     }
1866   }
1867
1868   // If we get here, the operand to the typeof/sizeof/alignof was an expresion.
1869   isCastExpr = false;
1870   return Operand;
1871 }
1872
1873
1874 /// \brief Parse a sizeof or alignof expression.
1875 ///
1876 /// \verbatim
1877 ///       unary-expression:  [C99 6.5.3]
1878 ///         'sizeof' unary-expression
1879 ///         'sizeof' '(' type-name ')'
1880 /// [C++11] 'sizeof' '...' '(' identifier ')'
1881 /// [GNU]   '__alignof' unary-expression
1882 /// [GNU]   '__alignof' '(' type-name ')'
1883 /// [C11]   '_Alignof' '(' type-name ')'
1884 /// [C++11] 'alignof' '(' type-id ')'
1885 /// \endverbatim
1886 ExprResult Parser::ParseUnaryExprOrTypeTraitExpression() {
1887   assert(Tok.isOneOf(tok::kw_sizeof, tok::kw___alignof, tok::kw_alignof,
1888                      tok::kw__Alignof, tok::kw_vec_step,
1889                      tok::kw___builtin_omp_required_simd_align) &&
1890          "Not a sizeof/alignof/vec_step expression!");
1891   Token OpTok = Tok;
1892   ConsumeToken();
1893
1894   // [C++11] 'sizeof' '...' '(' identifier ')'
1895   if (Tok.is(tok::ellipsis) && OpTok.is(tok::kw_sizeof)) {
1896     SourceLocation EllipsisLoc = ConsumeToken();
1897     SourceLocation LParenLoc, RParenLoc;
1898     IdentifierInfo *Name = nullptr;
1899     SourceLocation NameLoc;
1900     if (Tok.is(tok::l_paren)) {
1901       BalancedDelimiterTracker T(*this, tok::l_paren);
1902       T.consumeOpen();
1903       LParenLoc = T.getOpenLocation();
1904       if (Tok.is(tok::identifier)) {
1905         Name = Tok.getIdentifierInfo();
1906         NameLoc = ConsumeToken();
1907         T.consumeClose();
1908         RParenLoc = T.getCloseLocation();
1909         if (RParenLoc.isInvalid())
1910           RParenLoc = PP.getLocForEndOfToken(NameLoc);
1911       } else {
1912         Diag(Tok, diag::err_expected_parameter_pack);
1913         SkipUntil(tok::r_paren, StopAtSemi);
1914       }
1915     } else if (Tok.is(tok::identifier)) {
1916       Name = Tok.getIdentifierInfo();
1917       NameLoc = ConsumeToken();
1918       LParenLoc = PP.getLocForEndOfToken(EllipsisLoc);
1919       RParenLoc = PP.getLocForEndOfToken(NameLoc);
1920       Diag(LParenLoc, diag::err_paren_sizeof_parameter_pack)
1921         << Name
1922         << FixItHint::CreateInsertion(LParenLoc, "(")
1923         << FixItHint::CreateInsertion(RParenLoc, ")");
1924     } else {
1925       Diag(Tok, diag::err_sizeof_parameter_pack);
1926     }
1927     
1928     if (!Name)
1929       return ExprError();
1930
1931     EnterExpressionEvaluationContext Unevaluated(
1932         Actions, Sema::ExpressionEvaluationContext::Unevaluated,
1933         Sema::ReuseLambdaContextDecl);
1934
1935     return Actions.ActOnSizeofParameterPackExpr(getCurScope(),
1936                                                 OpTok.getLocation(), 
1937                                                 *Name, NameLoc,
1938                                                 RParenLoc);
1939   }
1940
1941   if (OpTok.isOneOf(tok::kw_alignof, tok::kw__Alignof))
1942     Diag(OpTok, diag::warn_cxx98_compat_alignof);
1943
1944   EnterExpressionEvaluationContext Unevaluated(
1945       Actions, Sema::ExpressionEvaluationContext::Unevaluated,
1946       Sema::ReuseLambdaContextDecl);
1947
1948   bool isCastExpr;
1949   ParsedType CastTy;
1950   SourceRange CastRange;
1951   ExprResult Operand = ParseExprAfterUnaryExprOrTypeTrait(OpTok,
1952                                                           isCastExpr,
1953                                                           CastTy,
1954                                                           CastRange);
1955
1956   UnaryExprOrTypeTrait ExprKind = UETT_SizeOf;
1957   if (OpTok.isOneOf(tok::kw_alignof, tok::kw___alignof, tok::kw__Alignof))
1958     ExprKind = UETT_AlignOf;
1959   else if (OpTok.is(tok::kw_vec_step))
1960     ExprKind = UETT_VecStep;
1961   else if (OpTok.is(tok::kw___builtin_omp_required_simd_align))
1962     ExprKind = UETT_OpenMPRequiredSimdAlign;
1963
1964   if (isCastExpr)
1965     return Actions.ActOnUnaryExprOrTypeTraitExpr(OpTok.getLocation(),
1966                                                  ExprKind,
1967                                                  /*isType=*/true,
1968                                                  CastTy.getAsOpaquePtr(),
1969                                                  CastRange);
1970
1971   if (OpTok.isOneOf(tok::kw_alignof, tok::kw__Alignof))
1972     Diag(OpTok, diag::ext_alignof_expr) << OpTok.getIdentifierInfo();
1973
1974   // If we get here, the operand to the sizeof/alignof was an expresion.
1975   if (!Operand.isInvalid())
1976     Operand = Actions.ActOnUnaryExprOrTypeTraitExpr(OpTok.getLocation(),
1977                                                     ExprKind,
1978                                                     /*isType=*/false,
1979                                                     Operand.get(),
1980                                                     CastRange);
1981   return Operand;
1982 }
1983
1984 /// ParseBuiltinPrimaryExpression
1985 ///
1986 /// \verbatim
1987 ///       primary-expression: [C99 6.5.1]
1988 /// [GNU]   '__builtin_va_arg' '(' assignment-expression ',' type-name ')'
1989 /// [GNU]   '__builtin_offsetof' '(' type-name ',' offsetof-member-designator')'
1990 /// [GNU]   '__builtin_choose_expr' '(' assign-expr ',' assign-expr ','
1991 ///                                     assign-expr ')'
1992 /// [GNU]   '__builtin_types_compatible_p' '(' type-name ',' type-name ')'
1993 /// [OCL]   '__builtin_astype' '(' assignment-expression ',' type-name ')'
1994 ///
1995 /// [GNU] offsetof-member-designator:
1996 /// [GNU]   identifier
1997 /// [GNU]   offsetof-member-designator '.' identifier
1998 /// [GNU]   offsetof-member-designator '[' expression ']'
1999 /// \endverbatim
2000 ExprResult Parser::ParseBuiltinPrimaryExpression() {
2001   ExprResult Res;
2002   const IdentifierInfo *BuiltinII = Tok.getIdentifierInfo();
2003
2004   tok::TokenKind T = Tok.getKind();
2005   SourceLocation StartLoc = ConsumeToken();   // Eat the builtin identifier.
2006
2007   // All of these start with an open paren.
2008   if (Tok.isNot(tok::l_paren))
2009     return ExprError(Diag(Tok, diag::err_expected_after) << BuiltinII
2010                                                          << tok::l_paren);
2011
2012   BalancedDelimiterTracker PT(*this, tok::l_paren);
2013   PT.consumeOpen();
2014
2015   // TODO: Build AST.
2016
2017   switch (T) {
2018   default: llvm_unreachable("Not a builtin primary expression!");
2019   case tok::kw___builtin_va_arg: {
2020     ExprResult Expr(ParseAssignmentExpression());
2021
2022     if (ExpectAndConsume(tok::comma)) {
2023       SkipUntil(tok::r_paren, StopAtSemi);
2024       Expr = ExprError();
2025     }
2026
2027     TypeResult Ty = ParseTypeName();
2028
2029     if (Tok.isNot(tok::r_paren)) {
2030       Diag(Tok, diag::err_expected) << tok::r_paren;
2031       Expr = ExprError();
2032     }
2033
2034     if (Expr.isInvalid() || Ty.isInvalid())
2035       Res = ExprError();
2036     else
2037       Res = Actions.ActOnVAArg(StartLoc, Expr.get(), Ty.get(), ConsumeParen());
2038     break;
2039   }
2040   case tok::kw___builtin_offsetof: {
2041     SourceLocation TypeLoc = Tok.getLocation();
2042     TypeResult Ty = ParseTypeName();
2043     if (Ty.isInvalid()) {
2044       SkipUntil(tok::r_paren, StopAtSemi);
2045       return ExprError();
2046     }
2047
2048     if (ExpectAndConsume(tok::comma)) {
2049       SkipUntil(tok::r_paren, StopAtSemi);
2050       return ExprError();
2051     }
2052
2053     // We must have at least one identifier here.
2054     if (Tok.isNot(tok::identifier)) {
2055       Diag(Tok, diag::err_expected) << tok::identifier;
2056       SkipUntil(tok::r_paren, StopAtSemi);
2057       return ExprError();
2058     }
2059
2060     // Keep track of the various subcomponents we see.
2061     SmallVector<Sema::OffsetOfComponent, 4> Comps;
2062
2063     Comps.push_back(Sema::OffsetOfComponent());
2064     Comps.back().isBrackets = false;
2065     Comps.back().U.IdentInfo = Tok.getIdentifierInfo();
2066     Comps.back().LocStart = Comps.back().LocEnd = ConsumeToken();
2067
2068     // FIXME: This loop leaks the index expressions on error.
2069     while (1) {
2070       if (Tok.is(tok::period)) {
2071         // offsetof-member-designator: offsetof-member-designator '.' identifier
2072         Comps.push_back(Sema::OffsetOfComponent());
2073         Comps.back().isBrackets = false;
2074         Comps.back().LocStart = ConsumeToken();
2075
2076         if (Tok.isNot(tok::identifier)) {
2077           Diag(Tok, diag::err_expected) << tok::identifier;
2078           SkipUntil(tok::r_paren, StopAtSemi);
2079           return ExprError();
2080         }
2081         Comps.back().U.IdentInfo = Tok.getIdentifierInfo();
2082         Comps.back().LocEnd = ConsumeToken();
2083
2084       } else if (Tok.is(tok::l_square)) {
2085         if (CheckProhibitedCXX11Attribute())
2086           return ExprError();
2087
2088         // offsetof-member-designator: offsetof-member-design '[' expression ']'
2089         Comps.push_back(Sema::OffsetOfComponent());
2090         Comps.back().isBrackets = true;
2091         BalancedDelimiterTracker ST(*this, tok::l_square);
2092         ST.consumeOpen();
2093         Comps.back().LocStart = ST.getOpenLocation();
2094         Res = ParseExpression();
2095         if (Res.isInvalid()) {
2096           SkipUntil(tok::r_paren, StopAtSemi);
2097           return Res;
2098         }
2099         Comps.back().U.E = Res.get();
2100
2101         ST.consumeClose();
2102         Comps.back().LocEnd = ST.getCloseLocation();
2103       } else {
2104         if (Tok.isNot(tok::r_paren)) {
2105           PT.consumeClose();
2106           Res = ExprError();
2107         } else if (Ty.isInvalid()) {
2108           Res = ExprError();
2109         } else {
2110           PT.consumeClose();
2111           Res = Actions.ActOnBuiltinOffsetOf(getCurScope(), StartLoc, TypeLoc,
2112                                              Ty.get(), Comps,
2113                                              PT.getCloseLocation());
2114         }
2115         break;
2116       }
2117     }
2118     break;
2119   }
2120   case tok::kw___builtin_choose_expr: {
2121     ExprResult Cond(ParseAssignmentExpression());
2122     if (Cond.isInvalid()) {
2123       SkipUntil(tok::r_paren, StopAtSemi);
2124       return Cond;
2125     }
2126     if (ExpectAndConsume(tok::comma)) {
2127       SkipUntil(tok::r_paren, StopAtSemi);
2128       return ExprError();
2129     }
2130
2131     ExprResult Expr1(ParseAssignmentExpression());
2132     if (Expr1.isInvalid()) {
2133       SkipUntil(tok::r_paren, StopAtSemi);
2134       return Expr1;
2135     }
2136     if (ExpectAndConsume(tok::comma)) {
2137       SkipUntil(tok::r_paren, StopAtSemi);
2138       return ExprError();
2139     }
2140
2141     ExprResult Expr2(ParseAssignmentExpression());
2142     if (Expr2.isInvalid()) {
2143       SkipUntil(tok::r_paren, StopAtSemi);
2144       return Expr2;
2145     }
2146     if (Tok.isNot(tok::r_paren)) {
2147       Diag(Tok, diag::err_expected) << tok::r_paren;
2148       return ExprError();
2149     }
2150     Res = Actions.ActOnChooseExpr(StartLoc, Cond.get(), Expr1.get(),
2151                                   Expr2.get(), ConsumeParen());
2152     break;
2153   }
2154   case tok::kw___builtin_astype: {
2155     // The first argument is an expression to be converted, followed by a comma.
2156     ExprResult Expr(ParseAssignmentExpression());
2157     if (Expr.isInvalid()) {
2158       SkipUntil(tok::r_paren, StopAtSemi);
2159       return ExprError();
2160     }
2161
2162     if (ExpectAndConsume(tok::comma)) {
2163       SkipUntil(tok::r_paren, StopAtSemi);
2164       return ExprError();
2165     }
2166
2167     // Second argument is the type to bitcast to.
2168     TypeResult DestTy = ParseTypeName();
2169     if (DestTy.isInvalid())
2170       return ExprError();
2171     
2172     // Attempt to consume the r-paren.
2173     if (Tok.isNot(tok::r_paren)) {
2174       Diag(Tok, diag::err_expected) << tok::r_paren;
2175       SkipUntil(tok::r_paren, StopAtSemi);
2176       return ExprError();
2177     }
2178     
2179     Res = Actions.ActOnAsTypeExpr(Expr.get(), DestTy.get(), StartLoc, 
2180                                   ConsumeParen());
2181     break;
2182   }
2183   case tok::kw___builtin_convertvector: {
2184     // The first argument is an expression to be converted, followed by a comma.
2185     ExprResult Expr(ParseAssignmentExpression());
2186     if (Expr.isInvalid()) {
2187       SkipUntil(tok::r_paren, StopAtSemi);
2188       return ExprError();
2189     }
2190
2191     if (ExpectAndConsume(tok::comma)) {
2192       SkipUntil(tok::r_paren, StopAtSemi);
2193       return ExprError();
2194     }
2195
2196     // Second argument is the type to bitcast to.
2197     TypeResult DestTy = ParseTypeName();
2198     if (DestTy.isInvalid())
2199       return ExprError();
2200     
2201     // Attempt to consume the r-paren.
2202     if (Tok.isNot(tok::r_paren)) {
2203       Diag(Tok, diag::err_expected) << tok::r_paren;
2204       SkipUntil(tok::r_paren, StopAtSemi);
2205       return ExprError();
2206     }
2207     
2208     Res = Actions.ActOnConvertVectorExpr(Expr.get(), DestTy.get(), StartLoc, 
2209                                          ConsumeParen());
2210     break;
2211   }
2212   }
2213
2214   if (Res.isInvalid())
2215     return ExprError();
2216
2217   // These can be followed by postfix-expr pieces because they are
2218   // primary-expressions.
2219   return ParsePostfixExpressionSuffix(Res.get());
2220 }
2221
2222 /// ParseParenExpression - This parses the unit that starts with a '(' token,
2223 /// based on what is allowed by ExprType.  The actual thing parsed is returned
2224 /// in ExprType. If stopIfCastExpr is true, it will only return the parsed type,
2225 /// not the parsed cast-expression.
2226 ///
2227 /// \verbatim
2228 ///       primary-expression: [C99 6.5.1]
2229 ///         '(' expression ')'
2230 /// [GNU]   '(' compound-statement ')'      (if !ParenExprOnly)
2231 ///       postfix-expression: [C99 6.5.2]
2232 ///         '(' type-name ')' '{' initializer-list '}'
2233 ///         '(' type-name ')' '{' initializer-list ',' '}'
2234 ///       cast-expression: [C99 6.5.4]
2235 ///         '(' type-name ')' cast-expression
2236 /// [ARC]   bridged-cast-expression
2237 /// [ARC] bridged-cast-expression:
2238 ///         (__bridge type-name) cast-expression
2239 ///         (__bridge_transfer type-name) cast-expression
2240 ///         (__bridge_retained type-name) cast-expression
2241 ///       fold-expression: [C++1z]
2242 ///         '(' cast-expression fold-operator '...' ')'
2243 ///         '(' '...' fold-operator cast-expression ')'
2244 ///         '(' cast-expression fold-operator '...'
2245 ///                 fold-operator cast-expression ')'
2246 /// \endverbatim
2247 ExprResult
2248 Parser::ParseParenExpression(ParenParseOption &ExprType, bool stopIfCastExpr,
2249                              bool isTypeCast, ParsedType &CastTy,
2250                              SourceLocation &RParenLoc) {
2251   assert(Tok.is(tok::l_paren) && "Not a paren expr!");
2252   ColonProtectionRAIIObject ColonProtection(*this, false);
2253   BalancedDelimiterTracker T(*this, tok::l_paren);
2254   if (T.consumeOpen())
2255     return ExprError();
2256   SourceLocation OpenLoc = T.getOpenLocation();
2257
2258   ExprResult Result(true);
2259   bool isAmbiguousTypeId;
2260   CastTy = nullptr;
2261
2262   if (Tok.is(tok::code_completion)) {
2263     Actions.CodeCompleteOrdinaryName(getCurScope(), 
2264                  ExprType >= CompoundLiteral? Sema::PCC_ParenthesizedExpression
2265                                             : Sema::PCC_Expression);
2266     cutOffParsing();
2267     return ExprError();
2268   }
2269
2270   // Diagnose use of bridge casts in non-arc mode.
2271   bool BridgeCast = (getLangOpts().ObjC2 &&
2272                      Tok.isOneOf(tok::kw___bridge,
2273                                  tok::kw___bridge_transfer,
2274                                  tok::kw___bridge_retained,
2275                                  tok::kw___bridge_retain));
2276   if (BridgeCast && !getLangOpts().ObjCAutoRefCount) {
2277     if (!TryConsumeToken(tok::kw___bridge)) {
2278       StringRef BridgeCastName = Tok.getName();
2279       SourceLocation BridgeKeywordLoc = ConsumeToken();
2280       if (!PP.getSourceManager().isInSystemHeader(BridgeKeywordLoc))
2281         Diag(BridgeKeywordLoc, diag::warn_arc_bridge_cast_nonarc)
2282           << BridgeCastName
2283           << FixItHint::CreateReplacement(BridgeKeywordLoc, "");
2284     }
2285     BridgeCast = false;
2286   }
2287   
2288   // None of these cases should fall through with an invalid Result
2289   // unless they've already reported an error.
2290   if (ExprType >= CompoundStmt && Tok.is(tok::l_brace)) {
2291     Diag(Tok, diag::ext_gnu_statement_expr);
2292
2293     if (!getCurScope()->getFnParent() && !getCurScope()->getBlockParent()) {
2294       Result = ExprError(Diag(OpenLoc, diag::err_stmtexpr_file_scope));
2295     } else {
2296       // Find the nearest non-record decl context. Variables declared in a
2297       // statement expression behave as if they were declared in the enclosing
2298       // function, block, or other code construct.
2299       DeclContext *CodeDC = Actions.CurContext;
2300       while (CodeDC->isRecord() || isa<EnumDecl>(CodeDC)) {
2301         CodeDC = CodeDC->getParent();
2302         assert(CodeDC && !CodeDC->isFileContext() &&
2303                "statement expr not in code context");
2304       }
2305       Sema::ContextRAII SavedContext(Actions, CodeDC, /*NewThisContext=*/false);
2306
2307       Actions.ActOnStartStmtExpr();
2308
2309       StmtResult Stmt(ParseCompoundStatement(true));
2310       ExprType = CompoundStmt;
2311
2312       // If the substmt parsed correctly, build the AST node.
2313       if (!Stmt.isInvalid()) {
2314         Result = Actions.ActOnStmtExpr(OpenLoc, Stmt.get(), Tok.getLocation());
2315       } else {
2316         Actions.ActOnStmtExprError();
2317       }
2318     }
2319   } else if (ExprType >= CompoundLiteral && BridgeCast) {
2320     tok::TokenKind tokenKind = Tok.getKind();
2321     SourceLocation BridgeKeywordLoc = ConsumeToken();
2322
2323     // Parse an Objective-C ARC ownership cast expression.
2324     ObjCBridgeCastKind Kind;
2325     if (tokenKind == tok::kw___bridge)
2326       Kind = OBC_Bridge;
2327     else if (tokenKind == tok::kw___bridge_transfer)
2328       Kind = OBC_BridgeTransfer;
2329     else if (tokenKind == tok::kw___bridge_retained)
2330       Kind = OBC_BridgeRetained;
2331     else {
2332       // As a hopefully temporary workaround, allow __bridge_retain as
2333       // a synonym for __bridge_retained, but only in system headers.
2334       assert(tokenKind == tok::kw___bridge_retain);
2335       Kind = OBC_BridgeRetained;
2336       if (!PP.getSourceManager().isInSystemHeader(BridgeKeywordLoc))
2337         Diag(BridgeKeywordLoc, diag::err_arc_bridge_retain)
2338           << FixItHint::CreateReplacement(BridgeKeywordLoc,
2339                                           "__bridge_retained");
2340     }
2341              
2342     TypeResult Ty = ParseTypeName();
2343     T.consumeClose();
2344     ColonProtection.restore();
2345     RParenLoc = T.getCloseLocation();
2346     ExprResult SubExpr = ParseCastExpression(/*isUnaryExpression=*/false);
2347     
2348     if (Ty.isInvalid() || SubExpr.isInvalid())
2349       return ExprError();
2350     
2351     return Actions.ActOnObjCBridgedCast(getCurScope(), OpenLoc, Kind,
2352                                         BridgeKeywordLoc, Ty.get(),
2353                                         RParenLoc, SubExpr.get());
2354   } else if (ExprType >= CompoundLiteral &&
2355              isTypeIdInParens(isAmbiguousTypeId)) {
2356
2357     // Otherwise, this is a compound literal expression or cast expression.
2358
2359     // In C++, if the type-id is ambiguous we disambiguate based on context.
2360     // If stopIfCastExpr is true the context is a typeof/sizeof/alignof
2361     // in which case we should treat it as type-id.
2362     // if stopIfCastExpr is false, we need to determine the context past the
2363     // parens, so we defer to ParseCXXAmbiguousParenExpression for that.
2364     if (isAmbiguousTypeId && !stopIfCastExpr) {
2365       ExprResult res = ParseCXXAmbiguousParenExpression(ExprType, CastTy, T,
2366                                                         ColonProtection);
2367       RParenLoc = T.getCloseLocation();
2368       return res;
2369     }
2370
2371     // Parse the type declarator.
2372     DeclSpec DS(AttrFactory);
2373     ParseSpecifierQualifierList(DS);
2374     Declarator DeclaratorInfo(DS, Declarator::TypeNameContext);
2375     ParseDeclarator(DeclaratorInfo);
2376     
2377     // If our type is followed by an identifier and either ':' or ']', then 
2378     // this is probably an Objective-C message send where the leading '[' is
2379     // missing. Recover as if that were the case.
2380     if (!DeclaratorInfo.isInvalidType() && Tok.is(tok::identifier) &&
2381         !InMessageExpression && getLangOpts().ObjC1 &&
2382         (NextToken().is(tok::colon) || NextToken().is(tok::r_square))) {
2383       TypeResult Ty;
2384       {
2385         InMessageExpressionRAIIObject InMessage(*this, false);
2386         Ty = Actions.ActOnTypeName(getCurScope(), DeclaratorInfo);
2387       }
2388       Result = ParseObjCMessageExpressionBody(SourceLocation(), 
2389                                               SourceLocation(), 
2390                                               Ty.get(), nullptr);
2391     } else {          
2392       // Match the ')'.
2393       T.consumeClose();
2394       ColonProtection.restore();
2395       RParenLoc = T.getCloseLocation();
2396       if (Tok.is(tok::l_brace)) {
2397         ExprType = CompoundLiteral;
2398         TypeResult Ty;
2399         {
2400           InMessageExpressionRAIIObject InMessage(*this, false);
2401           Ty = Actions.ActOnTypeName(getCurScope(), DeclaratorInfo);
2402         }
2403         return ParseCompoundLiteralExpression(Ty.get(), OpenLoc, RParenLoc);
2404       }
2405
2406       if (Tok.is(tok::l_paren)) {
2407         // This could be OpenCL vector Literals
2408         if (getLangOpts().OpenCL)
2409         {
2410           TypeResult Ty;
2411           {
2412             InMessageExpressionRAIIObject InMessage(*this, false);
2413             Ty = Actions.ActOnTypeName(getCurScope(), DeclaratorInfo);
2414           }
2415           if(Ty.isInvalid())
2416           {
2417              return ExprError();
2418           }
2419           QualType QT = Ty.get().get().getCanonicalType();
2420           if (QT->isVectorType())
2421           {
2422             // We parsed '(' vector-type-name ')' followed by '('
2423
2424             // Parse the cast-expression that follows it next.
2425             // isVectorLiteral = true will make sure we don't parse any
2426             // Postfix expression yet
2427             Result = ParseCastExpression(/*isUnaryExpression=*/false,
2428                                          /*isAddressOfOperand=*/false,
2429                                          /*isTypeCast=*/IsTypeCast,
2430                                          /*isVectorLiteral=*/true);
2431
2432             if (!Result.isInvalid()) {
2433               Result = Actions.ActOnCastExpr(getCurScope(), OpenLoc,
2434                                              DeclaratorInfo, CastTy,
2435                                              RParenLoc, Result.get());
2436             }
2437
2438             // After we performed the cast we can check for postfix-expr pieces.
2439             if (!Result.isInvalid()) {
2440               Result = ParsePostfixExpressionSuffix(Result);
2441             }
2442
2443             return Result;
2444           }
2445         }
2446       }
2447
2448       if (ExprType == CastExpr) {
2449         // We parsed '(' type-name ')' and the thing after it wasn't a '{'.
2450
2451         if (DeclaratorInfo.isInvalidType())
2452           return ExprError();
2453
2454         // Note that this doesn't parse the subsequent cast-expression, it just
2455         // returns the parsed type to the callee.
2456         if (stopIfCastExpr) {
2457           TypeResult Ty;
2458           {
2459             InMessageExpressionRAIIObject InMessage(*this, false);
2460             Ty = Actions.ActOnTypeName(getCurScope(), DeclaratorInfo);
2461           }
2462           CastTy = Ty.get();
2463           return ExprResult();
2464         }
2465
2466         // Reject the cast of super idiom in ObjC.
2467         if (Tok.is(tok::identifier) && getLangOpts().ObjC1 &&
2468             Tok.getIdentifierInfo() == Ident_super && 
2469             getCurScope()->isInObjcMethodScope() &&
2470             GetLookAheadToken(1).isNot(tok::period)) {
2471           Diag(Tok.getLocation(), diag::err_illegal_super_cast)
2472             << SourceRange(OpenLoc, RParenLoc);
2473           return ExprError();
2474         }
2475
2476         // Parse the cast-expression that follows it next.
2477         // TODO: For cast expression with CastTy.
2478         Result = ParseCastExpression(/*isUnaryExpression=*/false,
2479                                      /*isAddressOfOperand=*/false,
2480                                      /*isTypeCast=*/IsTypeCast);
2481         if (!Result.isInvalid()) {
2482           Result = Actions.ActOnCastExpr(getCurScope(), OpenLoc,
2483                                          DeclaratorInfo, CastTy, 
2484                                          RParenLoc, Result.get());
2485         }
2486         return Result;
2487       }
2488
2489       Diag(Tok, diag::err_expected_lbrace_in_compound_literal);
2490       return ExprError();
2491     }
2492   } else if (Tok.is(tok::ellipsis) &&
2493              isFoldOperator(NextToken().getKind())) {
2494     return ParseFoldExpression(ExprResult(), T);
2495   } else if (isTypeCast) {
2496     // Parse the expression-list.
2497     InMessageExpressionRAIIObject InMessage(*this, false);
2498
2499     ExprVector ArgExprs;
2500     CommaLocsTy CommaLocs;
2501
2502     if (!ParseSimpleExpressionList(ArgExprs, CommaLocs)) {
2503       // FIXME: If we ever support comma expressions as operands to
2504       // fold-expressions, we'll need to allow multiple ArgExprs here.
2505       if (ArgExprs.size() == 1 && isFoldOperator(Tok.getKind()) &&
2506           NextToken().is(tok::ellipsis))
2507         return ParseFoldExpression(ArgExprs[0], T);
2508
2509       ExprType = SimpleExpr;
2510       Result = Actions.ActOnParenListExpr(OpenLoc, Tok.getLocation(),
2511                                           ArgExprs);
2512     }
2513   } else {
2514     InMessageExpressionRAIIObject InMessage(*this, false);
2515
2516     Result = ParseExpression(MaybeTypeCast);
2517     if (!getLangOpts().CPlusPlus && MaybeTypeCast && Result.isUsable()) {
2518       // Correct typos in non-C++ code earlier so that implicit-cast-like
2519       // expressions are parsed correctly.
2520       Result = Actions.CorrectDelayedTyposInExpr(Result);
2521     }
2522     ExprType = SimpleExpr;
2523
2524     if (isFoldOperator(Tok.getKind()) && NextToken().is(tok::ellipsis))
2525       return ParseFoldExpression(Result, T);
2526
2527     // Don't build a paren expression unless we actually match a ')'.
2528     if (!Result.isInvalid() && Tok.is(tok::r_paren))
2529       Result =
2530           Actions.ActOnParenExpr(OpenLoc, Tok.getLocation(), Result.get());
2531   }
2532
2533   // Match the ')'.
2534   if (Result.isInvalid()) {
2535     SkipUntil(tok::r_paren, StopAtSemi);
2536     return ExprError();
2537   }
2538
2539   T.consumeClose();
2540   RParenLoc = T.getCloseLocation();
2541   return Result;
2542 }
2543
2544 /// ParseCompoundLiteralExpression - We have parsed the parenthesized type-name
2545 /// and we are at the left brace.
2546 ///
2547 /// \verbatim
2548 ///       postfix-expression: [C99 6.5.2]
2549 ///         '(' type-name ')' '{' initializer-list '}'
2550 ///         '(' type-name ')' '{' initializer-list ',' '}'
2551 /// \endverbatim
2552 ExprResult
2553 Parser::ParseCompoundLiteralExpression(ParsedType Ty,
2554                                        SourceLocation LParenLoc,
2555                                        SourceLocation RParenLoc) {
2556   assert(Tok.is(tok::l_brace) && "Not a compound literal!");
2557   if (!getLangOpts().C99)   // Compound literals don't exist in C90.
2558     Diag(LParenLoc, diag::ext_c99_compound_literal);
2559   ExprResult Result = ParseInitializer();
2560   if (!Result.isInvalid() && Ty)
2561     return Actions.ActOnCompoundLiteral(LParenLoc, Ty, RParenLoc, Result.get());
2562   return Result;
2563 }
2564
2565 /// ParseStringLiteralExpression - This handles the various token types that
2566 /// form string literals, and also handles string concatenation [C99 5.1.1.2,
2567 /// translation phase #6].
2568 ///
2569 /// \verbatim
2570 ///       primary-expression: [C99 6.5.1]
2571 ///         string-literal
2572 /// \verbatim
2573 ExprResult Parser::ParseStringLiteralExpression(bool AllowUserDefinedLiteral) {
2574   assert(isTokenStringLiteral() && "Not a string literal!");
2575
2576   // String concat.  Note that keywords like __func__ and __FUNCTION__ are not
2577   // considered to be strings for concatenation purposes.
2578   SmallVector<Token, 4> StringToks;
2579
2580   do {
2581     StringToks.push_back(Tok);
2582     ConsumeStringToken();
2583   } while (isTokenStringLiteral());
2584
2585   // Pass the set of string tokens, ready for concatenation, to the actions.
2586   return Actions.ActOnStringLiteral(StringToks,
2587                                     AllowUserDefinedLiteral ? getCurScope()
2588                                                             : nullptr);
2589 }
2590
2591 /// ParseGenericSelectionExpression - Parse a C11 generic-selection
2592 /// [C11 6.5.1.1].
2593 ///
2594 /// \verbatim
2595 ///    generic-selection:
2596 ///           _Generic ( assignment-expression , generic-assoc-list )
2597 ///    generic-assoc-list:
2598 ///           generic-association
2599 ///           generic-assoc-list , generic-association
2600 ///    generic-association:
2601 ///           type-name : assignment-expression
2602 ///           default : assignment-expression
2603 /// \endverbatim
2604 ExprResult Parser::ParseGenericSelectionExpression() {
2605   assert(Tok.is(tok::kw__Generic) && "_Generic keyword expected");
2606   SourceLocation KeyLoc = ConsumeToken();
2607
2608   if (!getLangOpts().C11)
2609     Diag(KeyLoc, diag::ext_c11_generic_selection);
2610
2611   BalancedDelimiterTracker T(*this, tok::l_paren);
2612   if (T.expectAndConsume())
2613     return ExprError();
2614
2615   ExprResult ControllingExpr;
2616   {
2617     // C11 6.5.1.1p3 "The controlling expression of a generic selection is
2618     // not evaluated."
2619     EnterExpressionEvaluationContext Unevaluated(
2620         Actions, Sema::ExpressionEvaluationContext::Unevaluated);
2621     ControllingExpr =
2622         Actions.CorrectDelayedTyposInExpr(ParseAssignmentExpression());
2623     if (ControllingExpr.isInvalid()) {
2624       SkipUntil(tok::r_paren, StopAtSemi);
2625       return ExprError();
2626     }
2627   }
2628
2629   if (ExpectAndConsume(tok::comma)) {
2630     SkipUntil(tok::r_paren, StopAtSemi);
2631     return ExprError();
2632   }
2633
2634   SourceLocation DefaultLoc;
2635   TypeVector Types;
2636   ExprVector Exprs;
2637   do {
2638     ParsedType Ty;
2639     if (Tok.is(tok::kw_default)) {
2640       // C11 6.5.1.1p2 "A generic selection shall have no more than one default
2641       // generic association."
2642       if (!DefaultLoc.isInvalid()) {
2643         Diag(Tok, diag::err_duplicate_default_assoc);
2644         Diag(DefaultLoc, diag::note_previous_default_assoc);
2645         SkipUntil(tok::r_paren, StopAtSemi);
2646         return ExprError();
2647       }
2648       DefaultLoc = ConsumeToken();
2649       Ty = nullptr;
2650     } else {
2651       ColonProtectionRAIIObject X(*this);
2652       TypeResult TR = ParseTypeName();
2653       if (TR.isInvalid()) {
2654         SkipUntil(tok::r_paren, StopAtSemi);
2655         return ExprError();
2656       }
2657       Ty = TR.get();
2658     }
2659     Types.push_back(Ty);
2660
2661     if (ExpectAndConsume(tok::colon)) {
2662       SkipUntil(tok::r_paren, StopAtSemi);
2663       return ExprError();
2664     }
2665
2666     // FIXME: These expressions should be parsed in a potentially potentially
2667     // evaluated context.
2668     ExprResult ER(
2669         Actions.CorrectDelayedTyposInExpr(ParseAssignmentExpression()));
2670     if (ER.isInvalid()) {
2671       SkipUntil(tok::r_paren, StopAtSemi);
2672       return ExprError();
2673     }
2674     Exprs.push_back(ER.get());
2675   } while (TryConsumeToken(tok::comma));
2676
2677   T.consumeClose();
2678   if (T.getCloseLocation().isInvalid())
2679     return ExprError();
2680
2681   return Actions.ActOnGenericSelectionExpr(KeyLoc, DefaultLoc, 
2682                                            T.getCloseLocation(),
2683                                            ControllingExpr.get(),
2684                                            Types, Exprs);
2685 }
2686
2687 /// \brief Parse A C++1z fold-expression after the opening paren and optional
2688 /// left-hand-side expression.
2689 ///
2690 /// \verbatim
2691 ///   fold-expression:
2692 ///       ( cast-expression fold-operator ... )
2693 ///       ( ... fold-operator cast-expression )
2694 ///       ( cast-expression fold-operator ... fold-operator cast-expression )
2695 ExprResult Parser::ParseFoldExpression(ExprResult LHS,
2696                                        BalancedDelimiterTracker &T) {
2697   if (LHS.isInvalid()) {
2698     T.skipToEnd();
2699     return true;
2700   }
2701
2702   tok::TokenKind Kind = tok::unknown;
2703   SourceLocation FirstOpLoc;
2704   if (LHS.isUsable()) {
2705     Kind = Tok.getKind();
2706     assert(isFoldOperator(Kind) && "missing fold-operator");
2707     FirstOpLoc = ConsumeToken();
2708   }
2709
2710   assert(Tok.is(tok::ellipsis) && "not a fold-expression");
2711   SourceLocation EllipsisLoc = ConsumeToken();
2712
2713   ExprResult RHS;
2714   if (Tok.isNot(tok::r_paren)) {
2715     if (!isFoldOperator(Tok.getKind()))
2716       return Diag(Tok.getLocation(), diag::err_expected_fold_operator);
2717
2718     if (Kind != tok::unknown && Tok.getKind() != Kind)
2719       Diag(Tok.getLocation(), diag::err_fold_operator_mismatch)
2720         << SourceRange(FirstOpLoc);
2721     Kind = Tok.getKind();
2722     ConsumeToken();
2723
2724     RHS = ParseExpression();
2725     if (RHS.isInvalid()) {
2726       T.skipToEnd();
2727       return true;
2728     }
2729   }
2730
2731   Diag(EllipsisLoc, getLangOpts().CPlusPlus1z
2732                         ? diag::warn_cxx14_compat_fold_expression
2733                         : diag::ext_fold_expression);
2734
2735   T.consumeClose();
2736   return Actions.ActOnCXXFoldExpr(T.getOpenLocation(), LHS.get(), Kind,
2737                                   EllipsisLoc, RHS.get(), T.getCloseLocation());
2738 }
2739
2740 /// ParseExpressionList - Used for C/C++ (argument-)expression-list.
2741 ///
2742 /// \verbatim
2743 ///       argument-expression-list:
2744 ///         assignment-expression
2745 ///         argument-expression-list , assignment-expression
2746 ///
2747 /// [C++] expression-list:
2748 /// [C++]   assignment-expression
2749 /// [C++]   expression-list , assignment-expression
2750 ///
2751 /// [C++0x] expression-list:
2752 /// [C++0x]   initializer-list
2753 ///
2754 /// [C++0x] initializer-list
2755 /// [C++0x]   initializer-clause ...[opt]
2756 /// [C++0x]   initializer-list , initializer-clause ...[opt]
2757 ///
2758 /// [C++0x] initializer-clause:
2759 /// [C++0x]   assignment-expression
2760 /// [C++0x]   braced-init-list
2761 /// \endverbatim
2762 bool Parser::ParseExpressionList(SmallVectorImpl<Expr *> &Exprs,
2763                                  SmallVectorImpl<SourceLocation> &CommaLocs,
2764                                  std::function<void()> Completer) {
2765   bool SawError = false;
2766   while (1) {
2767     if (Tok.is(tok::code_completion)) {
2768       if (Completer)
2769         Completer();
2770       else
2771         Actions.CodeCompleteOrdinaryName(getCurScope(), Sema::PCC_Expression);
2772       cutOffParsing();
2773       return true;
2774     }
2775
2776     ExprResult Expr;
2777     if (getLangOpts().CPlusPlus11 && Tok.is(tok::l_brace)) {
2778       Diag(Tok, diag::warn_cxx98_compat_generalized_initializer_lists);
2779       Expr = ParseBraceInitializer();
2780     } else
2781       Expr = ParseAssignmentExpression();
2782
2783     if (Tok.is(tok::ellipsis))
2784       Expr = Actions.ActOnPackExpansion(Expr.get(), ConsumeToken());    
2785     if (Expr.isInvalid()) {
2786       SkipUntil(tok::comma, tok::r_paren, StopBeforeMatch);
2787       SawError = true;
2788     } else {
2789       Exprs.push_back(Expr.get());
2790     }
2791
2792     if (Tok.isNot(tok::comma))
2793       break;
2794     // Move to the next argument, remember where the comma was.
2795     CommaLocs.push_back(ConsumeToken());
2796   }
2797   if (SawError) {
2798     // Ensure typos get diagnosed when errors were encountered while parsing the
2799     // expression list.
2800     for (auto &E : Exprs) {
2801       ExprResult Expr = Actions.CorrectDelayedTyposInExpr(E);
2802       if (Expr.isUsable()) E = Expr.get();
2803     }
2804   }
2805   return SawError;
2806 }
2807
2808 /// ParseSimpleExpressionList - A simple comma-separated list of expressions,
2809 /// used for misc language extensions.
2810 ///
2811 /// \verbatim
2812 ///       simple-expression-list:
2813 ///         assignment-expression
2814 ///         simple-expression-list , assignment-expression
2815 /// \endverbatim
2816 bool
2817 Parser::ParseSimpleExpressionList(SmallVectorImpl<Expr*> &Exprs,
2818                                   SmallVectorImpl<SourceLocation> &CommaLocs) {
2819   while (1) {
2820     ExprResult Expr = ParseAssignmentExpression();
2821     if (Expr.isInvalid())
2822       return true;
2823
2824     Exprs.push_back(Expr.get());
2825
2826     if (Tok.isNot(tok::comma))
2827       return false;
2828
2829     // Move to the next argument, remember where the comma was.
2830     CommaLocs.push_back(ConsumeToken());
2831   }
2832 }
2833
2834 /// ParseBlockId - Parse a block-id, which roughly looks like int (int x).
2835 ///
2836 /// \verbatim
2837 /// [clang] block-id:
2838 /// [clang]   specifier-qualifier-list block-declarator
2839 /// \endverbatim
2840 void Parser::ParseBlockId(SourceLocation CaretLoc) {
2841   if (Tok.is(tok::code_completion)) {
2842     Actions.CodeCompleteOrdinaryName(getCurScope(), Sema::PCC_Type);
2843     return cutOffParsing();
2844   }
2845   
2846   // Parse the specifier-qualifier-list piece.
2847   DeclSpec DS(AttrFactory);
2848   ParseSpecifierQualifierList(DS);
2849
2850   // Parse the block-declarator.
2851   Declarator DeclaratorInfo(DS, Declarator::BlockLiteralContext);
2852   DeclaratorInfo.setFunctionDefinitionKind(FDK_Definition);
2853   ParseDeclarator(DeclaratorInfo);
2854
2855   MaybeParseGNUAttributes(DeclaratorInfo);
2856
2857   // Inform sema that we are starting a block.
2858   Actions.ActOnBlockArguments(CaretLoc, DeclaratorInfo, getCurScope());
2859 }
2860
2861 /// ParseBlockLiteralExpression - Parse a block literal, which roughly looks
2862 /// like ^(int x){ return x+1; }
2863 ///
2864 /// \verbatim
2865 ///         block-literal:
2866 /// [clang]   '^' block-args[opt] compound-statement
2867 /// [clang]   '^' block-id compound-statement
2868 /// [clang] block-args:
2869 /// [clang]   '(' parameter-list ')'
2870 /// \endverbatim
2871 ExprResult Parser::ParseBlockLiteralExpression() {
2872   assert(Tok.is(tok::caret) && "block literal starts with ^");
2873   SourceLocation CaretLoc = ConsumeToken();
2874
2875   PrettyStackTraceLoc CrashInfo(PP.getSourceManager(), CaretLoc,
2876                                 "block literal parsing");
2877
2878   // Enter a scope to hold everything within the block.  This includes the
2879   // argument decls, decls within the compound expression, etc.  This also
2880   // allows determining whether a variable reference inside the block is
2881   // within or outside of the block.
2882   ParseScope BlockScope(this, Scope::BlockScope | Scope::FnScope |
2883                               Scope::DeclScope);
2884
2885   // Inform sema that we are starting a block.
2886   Actions.ActOnBlockStart(CaretLoc, getCurScope());
2887
2888   // Parse the return type if present.
2889   DeclSpec DS(AttrFactory);
2890   Declarator ParamInfo(DS, Declarator::BlockLiteralContext);
2891   ParamInfo.setFunctionDefinitionKind(FDK_Definition);
2892   // FIXME: Since the return type isn't actually parsed, it can't be used to
2893   // fill ParamInfo with an initial valid range, so do it manually.
2894   ParamInfo.SetSourceRange(SourceRange(Tok.getLocation(), Tok.getLocation()));
2895
2896   // If this block has arguments, parse them.  There is no ambiguity here with
2897   // the expression case, because the expression case requires a parameter list.
2898   if (Tok.is(tok::l_paren)) {
2899     ParseParenDeclarator(ParamInfo);
2900     // Parse the pieces after the identifier as if we had "int(...)".
2901     // SetIdentifier sets the source range end, but in this case we're past
2902     // that location.
2903     SourceLocation Tmp = ParamInfo.getSourceRange().getEnd();
2904     ParamInfo.SetIdentifier(nullptr, CaretLoc);
2905     ParamInfo.SetRangeEnd(Tmp);
2906     if (ParamInfo.isInvalidType()) {
2907       // If there was an error parsing the arguments, they may have
2908       // tried to use ^(x+y) which requires an argument list.  Just
2909       // skip the whole block literal.
2910       Actions.ActOnBlockError(CaretLoc, getCurScope());
2911       return ExprError();
2912     }
2913
2914     MaybeParseGNUAttributes(ParamInfo);
2915
2916     // Inform sema that we are starting a block.
2917     Actions.ActOnBlockArguments(CaretLoc, ParamInfo, getCurScope());
2918   } else if (!Tok.is(tok::l_brace)) {
2919     ParseBlockId(CaretLoc);
2920   } else {
2921     // Otherwise, pretend we saw (void).
2922     ParsedAttributes attrs(AttrFactory);
2923     SourceLocation NoLoc;
2924     ParamInfo.AddTypeInfo(DeclaratorChunk::getFunction(/*HasProto=*/true,
2925                                              /*IsAmbiguous=*/false,
2926                                              /*RParenLoc=*/NoLoc,
2927                                              /*ArgInfo=*/nullptr,
2928                                              /*NumArgs=*/0,
2929                                              /*EllipsisLoc=*/NoLoc,
2930                                              /*RParenLoc=*/NoLoc,
2931                                              /*TypeQuals=*/0,
2932                                              /*RefQualifierIsLvalueRef=*/true,
2933                                              /*RefQualifierLoc=*/NoLoc,
2934                                              /*ConstQualifierLoc=*/NoLoc,
2935                                              /*VolatileQualifierLoc=*/NoLoc,
2936                                              /*RestrictQualifierLoc=*/NoLoc,
2937                                              /*MutableLoc=*/NoLoc,
2938                                              EST_None,
2939                                              /*ESpecRange=*/SourceRange(),
2940                                              /*Exceptions=*/nullptr,
2941                                              /*ExceptionRanges=*/nullptr,
2942                                              /*NumExceptions=*/0,
2943                                              /*NoexceptExpr=*/nullptr,
2944                                              /*ExceptionSpecTokens=*/nullptr,
2945                                              /*DeclsInPrototype=*/None,
2946                                              CaretLoc, CaretLoc,
2947                                              ParamInfo),
2948                           attrs, CaretLoc);
2949
2950     MaybeParseGNUAttributes(ParamInfo);
2951
2952     // Inform sema that we are starting a block.
2953     Actions.ActOnBlockArguments(CaretLoc, ParamInfo, getCurScope());
2954   }
2955
2956
2957   ExprResult Result(true);
2958   if (!Tok.is(tok::l_brace)) {
2959     // Saw something like: ^expr
2960     Diag(Tok, diag::err_expected_expression);
2961     Actions.ActOnBlockError(CaretLoc, getCurScope());
2962     return ExprError();
2963   }
2964
2965   StmtResult Stmt(ParseCompoundStatementBody());
2966   BlockScope.Exit();
2967   if (!Stmt.isInvalid())
2968     Result = Actions.ActOnBlockStmtExpr(CaretLoc, Stmt.get(), getCurScope());
2969   else
2970     Actions.ActOnBlockError(CaretLoc, getCurScope());
2971   return Result;
2972 }
2973
2974 /// ParseObjCBoolLiteral - This handles the objective-c Boolean literals.
2975 ///
2976 ///         '__objc_yes'
2977 ///         '__objc_no'
2978 ExprResult Parser::ParseObjCBoolLiteral() {
2979   tok::TokenKind Kind = Tok.getKind();
2980   return Actions.ActOnObjCBoolLiteral(ConsumeToken(), Kind);
2981 }
2982
2983 /// Validate availability spec list, emitting diagnostics if necessary. Returns
2984 /// true if invalid.
2985 static bool CheckAvailabilitySpecList(Parser &P,
2986                                       ArrayRef<AvailabilitySpec> AvailSpecs) {
2987   llvm::SmallSet<StringRef, 4> Platforms;
2988   bool HasOtherPlatformSpec = false;
2989   bool Valid = true;
2990   for (const auto &Spec : AvailSpecs) {
2991     if (Spec.isOtherPlatformSpec()) {
2992       if (HasOtherPlatformSpec) {
2993         P.Diag(Spec.getBeginLoc(), diag::err_availability_query_repeated_star);
2994         Valid = false;
2995       }
2996
2997       HasOtherPlatformSpec = true;
2998       continue;
2999     }
3000
3001     bool Inserted = Platforms.insert(Spec.getPlatform()).second;
3002     if (!Inserted) {
3003       // Rule out multiple version specs referring to the same platform.
3004       // For example, we emit an error for:
3005       // @available(macos 10.10, macos 10.11, *)
3006       StringRef Platform = Spec.getPlatform();
3007       P.Diag(Spec.getBeginLoc(), diag::err_availability_query_repeated_platform)
3008           << Spec.getEndLoc() << Platform;
3009       Valid = false;
3010     }
3011   }
3012
3013   if (!HasOtherPlatformSpec) {
3014     SourceLocation InsertWildcardLoc = AvailSpecs.back().getEndLoc();
3015     P.Diag(InsertWildcardLoc, diag::err_availability_query_wildcard_required)
3016         << FixItHint::CreateInsertion(InsertWildcardLoc, ", *");
3017     return true;
3018   }
3019
3020   return !Valid;
3021 }
3022
3023 /// Parse availability query specification.
3024 ///
3025 ///  availability-spec:
3026 ///     '*'
3027 ///     identifier version-tuple
3028 Optional<AvailabilitySpec> Parser::ParseAvailabilitySpec() {
3029   if (Tok.is(tok::star)) {
3030     return AvailabilitySpec(ConsumeToken());
3031   } else {
3032     // Parse the platform name.
3033     if (Tok.is(tok::code_completion)) {
3034       Actions.CodeCompleteAvailabilityPlatformName();
3035       cutOffParsing();
3036       return None;
3037     }
3038     if (Tok.isNot(tok::identifier)) {
3039       Diag(Tok, diag::err_avail_query_expected_platform_name);
3040       return None;
3041     }
3042
3043     IdentifierLoc *PlatformIdentifier = ParseIdentifierLoc();
3044     SourceRange VersionRange;
3045     VersionTuple Version = ParseVersionTuple(VersionRange);
3046
3047     if (Version.empty())
3048       return None;
3049
3050     StringRef GivenPlatform = PlatformIdentifier->Ident->getName();
3051     StringRef Platform =
3052         AvailabilityAttr::canonicalizePlatformName(GivenPlatform);
3053
3054     if (AvailabilityAttr::getPrettyPlatformName(Platform).empty()) {
3055       Diag(PlatformIdentifier->Loc,
3056            diag::err_avail_query_unrecognized_platform_name)
3057           << GivenPlatform;
3058       return None;
3059     }
3060
3061     return AvailabilitySpec(Version, Platform, PlatformIdentifier->Loc,
3062                             VersionRange.getEnd());
3063   }
3064 }
3065
3066 ExprResult Parser::ParseAvailabilityCheckExpr(SourceLocation BeginLoc) {
3067   assert(Tok.is(tok::kw___builtin_available) ||
3068          Tok.isObjCAtKeyword(tok::objc_available));
3069
3070   // Eat the available or __builtin_available.
3071   ConsumeToken();
3072
3073   BalancedDelimiterTracker Parens(*this, tok::l_paren);
3074   if (Parens.expectAndConsume())
3075     return ExprError();
3076
3077   SmallVector<AvailabilitySpec, 4> AvailSpecs;
3078   bool HasError = false;
3079   while (true) {
3080     Optional<AvailabilitySpec> Spec = ParseAvailabilitySpec();
3081     if (!Spec)
3082       HasError = true;
3083     else
3084       AvailSpecs.push_back(*Spec);
3085
3086     if (!TryConsumeToken(tok::comma))
3087       break;
3088   }
3089
3090   if (HasError) {
3091     SkipUntil(tok::r_paren, StopAtSemi);
3092     return ExprError();
3093   }
3094
3095   CheckAvailabilitySpecList(*this, AvailSpecs);
3096
3097   if (Parens.consumeClose())
3098     return ExprError();
3099
3100   return Actions.ActOnObjCAvailabilityCheckExpr(AvailSpecs, BeginLoc,
3101                                                 Parens.getCloseLocation());
3102 }