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
This commit is contained in:
John McCall 2011-04-12 22:02:02 +00:00
parent a4e29a64d8
commit 58989b7125
2 changed files with 9 additions and 6 deletions

View 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);

View 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;
}