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