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