aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2009-03-18 18:30:44 +0000
committerChris Lattner <sabre@nondot.org>2009-03-18 18:30:44 +0000
commit40f929242a58103f7883e7dbe2415787895b5cbe (patch)
tree5fc92feef2cf7ab451b246b9acff9e95a96b5997
parent75dfedaf702822c9e51a4f3c5d3ecf2d2ad99272 (diff)
fix the more complex cases by actually codegen'ing the right expr :)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@67219 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/CodeGen/CGExpr.cpp2
-rw-r--r--test/CodeGen/exprs.c6
2 files changed, 7 insertions, 1 deletions
diff --git a/lib/CodeGen/CGExpr.cpp b/lib/CodeGen/CGExpr.cpp
index 93b2382166..95cb53c1f7 100644
--- a/lib/CodeGen/CGExpr.cpp
+++ b/lib/CodeGen/CGExpr.cpp
@@ -1024,7 +1024,7 @@ LValue CodeGenFunction::EmitCastLValue(const CastExpr *E) {
// Casts are only lvalues when the source and destination types are the same.
llvm::Value *Temp = CreateTempAlloca(ConvertType(E->getType()));
- EmitAnyExpr(E, Temp, false);
+ EmitAnyExpr(E->getSubExpr(), Temp, false);
return LValue::MakeAddr(Temp, E->getType().getCVRQualifiers(),
getContext().getObjCGCAttrKind(E->getType()));
diff --git a/test/CodeGen/exprs.c b/test/CodeGen/exprs.c
index a0fe960089..dbc14997d4 100644
--- a/test/CodeGen/exprs.c
+++ b/test/CodeGen/exprs.c
@@ -82,3 +82,9 @@ unsigned f1(void) {
union f3_x {int x; float y;};
int f3() {return ((union f3_x)2).x;}
+union f4_y {int x; _Complex float y;};
+_Complex float f4() {return ((union f4_y)(_Complex float)2.0).y;}
+
+struct f5_a { int a; } f5_a;
+union f5_z {int x; struct f5_a y;};
+struct f5_a f5() {return ((union f5_z)f5_a).y;}