summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJohn McCall <rjmccall@apple.com>2011-04-12 22:02:02 +0000
committerJohn McCall <rjmccall@apple.com>2011-04-12 22:02:02 +0000
commit58989b7125a04be7a05d6ad7090a16ecda496481 (patch)
treef19398c9a07f1f3c3a42b32301bed5c39a06377d
parenta4e29a64d858b7b7132c4e5552131146239e16b2 (diff)
downloadbcm5719-llvm-58989b7125a04be7a05d6ad7090a16ecda496481.tar.gz
bcm5719-llvm-58989b7125a04be7a05d6ad7090a16ecda496481.zip
We can't emit an aggregate cast as its sub-expression in general just
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. llvm-svn: 129397
-rw-r--r--clang/lib/CodeGen/CGExprAgg.cpp7
-rw-r--r--clang/test/CodeGenObjC/property-agrr-getter.m8
2 files changed, 9 insertions, 6 deletions
diff --git a/clang/lib/CodeGen/CGExprAgg.cpp b/clang/lib/CodeGen/CGExprAgg.cpp
index 177d0a4be78..4315915c166 100644
--- a/clang/lib/CodeGen/CGExprAgg.cpp
+++ b/clang/lib/CodeGen/CGExprAgg.cpp
@@ -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);
diff --git a/clang/test/CodeGenObjC/property-agrr-getter.m b/clang/test/CodeGenObjC/property-agrr-getter.m
index 2dd32bb4f37..6d8f1d6b03a 100644
--- a/clang/test/CodeGenObjC/property-agrr-getter.m
+++ b/clang/test/CodeGenObjC/property-agrr-getter.m
@@ -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;
+}
OpenPOWER on IntegriCloud