diff options
author | Chris Lattner <sabre@nondot.org> | 2008-12-12 05:35:08 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2008-12-12 05:35:08 +0000 |
commit | 053441f39d0ca64f1369517c0d59ce057658f4d0 (patch) | |
tree | b4eb8ff775908dbefd5a5e649c3a9759ed1091d3 /clang/lib/AST/Expr.cpp | |
parent | 54139445ba95e6c5531b4e1fffdd3d8dc17a8f79 (diff) | |
download | bcm5719-llvm-053441f39d0ca64f1369517c0d59ce057658f4d0.tar.gz bcm5719-llvm-053441f39d0ca64f1369517c0d59ce057658f4d0.zip |
Fix rdar://6095061 - gcc allows __builtin_choose_expr as an lvalue
llvm-svn: 60924
Diffstat (limited to 'clang/lib/AST/Expr.cpp')
-rw-r--r-- | clang/lib/AST/Expr.cpp | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/clang/lib/AST/Expr.cpp b/clang/lib/AST/Expr.cpp index b5f966d8621..728b13534a3 100644 --- a/clang/lib/AST/Expr.cpp +++ b/clang/lib/AST/Expr.cpp @@ -467,6 +467,13 @@ Expr::isLvalueResult Expr::isLvalue(ASTContext &Ctx) const { } case CompoundLiteralExprClass: // C99 6.5.2.5p5 return LV_Valid; + case ChooseExprClass: + // __builtin_choose_expr is an lvalue if the selected operand is. + if (cast<ChooseExpr>(this)->isConditionTrue(Ctx)) + return cast<ChooseExpr>(this)->getLHS()->isLvalue(Ctx); + else + return cast<ChooseExpr>(this)->getRHS()->isLvalue(Ctx); + case ExtVectorElementExprClass: if (cast<ExtVectorElementExpr>(this)->containsDuplicateElements()) return LV_DuplicateVectorComponents; @@ -476,7 +483,7 @@ Expr::isLvalueResult Expr::isLvalue(ASTContext &Ctx) const { case ObjCPropertyRefExprClass: // FIXME: check if read-only property. return LV_Valid; case ObjCKVCRefExprClass: // FIXME: check if read-only property. - return LV_Valid; + return LV_Valid; case PredefinedExprClass: return LV_Valid; case VAArgExprClass: @@ -1213,8 +1220,7 @@ bool ChooseExpr::isConditionTrue(ASTContext &C) const { return getCond()->getIntegerConstantExprValue(C) != 0; } -static int64_t evaluateOffsetOf(ASTContext& C, const Expr *E) -{ +static int64_t evaluateOffsetOf(ASTContext& C, const Expr *E) { if (const MemberExpr *ME = dyn_cast<MemberExpr>(E)) { QualType Ty = ME->getBase()->getType(); |