summaryrefslogtreecommitdiffstats
path: root/clang/lib
diff options
context:
space:
mode:
Diffstat (limited to 'clang/lib')
-rw-r--r--clang/lib/AST/Expr.cpp12
-rw-r--r--clang/lib/CodeGen/CGExpr.cpp6
2 files changed, 15 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();
diff --git a/clang/lib/CodeGen/CGExpr.cpp b/clang/lib/CodeGen/CGExpr.cpp
index bdbd5caa089..a7a64e3860a 100644
--- a/clang/lib/CodeGen/CGExpr.cpp
+++ b/clang/lib/CodeGen/CGExpr.cpp
@@ -146,6 +146,12 @@ LValue CodeGenFunction::EmitLValue(const Expr *E) {
case Expr::MemberExprClass: return EmitMemberExpr(cast<MemberExpr>(E));
case Expr::CompoundLiteralExprClass:
return EmitCompoundLiteralLValue(cast<CompoundLiteralExpr>(E));
+ case Expr::ChooseExprClass:
+ // __builtin_choose_expr is the lvalue of the selected operand.
+ if (cast<ChooseExpr>(E)->isConditionTrue(getContext()))
+ return EmitLValue(cast<ChooseExpr>(E)->getLHS());
+ else
+ return EmitLValue(cast<ChooseExpr>(E)->getRHS());
}
}
OpenPOWER on IntegriCloud