]> granicus.if.org Git - clang/commitdiff
We can't emit an aggregate cast as its sub-expression in general just
authorJohn McCall <rjmccall@apple.com>
Tue, 12 Apr 2011 22:02:02 +0000 (22:02 +0000)
committerJohn McCall <rjmccall@apple.com>
Tue, 12 Apr 2011 22:02:02 +0000 (22:02 +0000)
because the result is ignored.  The particular example here is with
property l-values, but there could be all sorts of lovely casts that this
isn't safe for.  Sink the check into the one case that seems to actually
be capable of honoring this.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@129397 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/CGExprAgg.cpp
test/CodeGenObjC/property-agrr-getter.m

index 177d0a4be781ce866cf3531003eae13826cd2809..4315915c166165f2c568850d1a6d502c1b84a47d 100644 (file)
@@ -249,11 +249,6 @@ void AggExprEmitter::VisitOpaqueValueExpr(OpaqueValueExpr *e) {
 }
 
 void AggExprEmitter::VisitCastExpr(CastExpr *E) {
-  if (Dest.isIgnored() && E->getCastKind() != CK_Dynamic) {
-    Visit(E->getSubExpr());
-    return;
-  }
-
   switch (E->getCastKind()) {
   case CK_Dynamic: {
     assert(isa<CXXDynamicCastExpr>(E) && "CK_Dynamic without a dynamic_cast?");
@@ -270,6 +265,8 @@ void AggExprEmitter::VisitCastExpr(CastExpr *E) {
   }
       
   case CK_ToUnion: {
+    if (Dest.isIgnored()) break;
+
     // GCC union extension
     QualType Ty = E->getSubExpr()->getType();
     QualType PtrTy = CGF.getContext().getPointerType(Ty);
index 2dd32bb4f3732425c8d37a75bc177c2913f9457a..6d8f1d6b03ad214589ee7f97882932a92afb8444 100644 (file)
@@ -1,4 +1,4 @@
-// RUN: %clang_cc1 -emit-llvm -o %t %s
+// RUN: %clang_cc1 -emit-llvm-only %s
 
 typedef struct {
   unsigned f0;
@@ -36,3 +36,9 @@ float f ()
   AnObject* obj;
   return (obj.size).width;
 }
+
+// rdar://problem/9272392
+void test3(AnObject *obj) {
+  obj.size;
+  (void) obj.size;
+}