From: Richard Smith Date: Tue, 4 Jun 2013 04:45:03 +0000 (+0000) Subject: Remove some unreachable (and wrong) code and replace it with an assertion. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=34f94f93dc20e08c9327441e4b5bcbce9ba23e9c;p=clang Remove some unreachable (and wrong) code and replace it with an assertion. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@183206 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/CGExpr.cpp b/lib/CodeGen/CGExpr.cpp index 28eae50832..501d7ecfa3 100644 --- a/lib/CodeGen/CGExpr.cpp +++ b/lib/CodeGen/CGExpr.cpp @@ -361,19 +361,9 @@ EmitExprForReferenceBinding(CodeGenFunction &CGF, const Expr *E, case SubobjectAdjustment::FieldAdjustment: { LValue LV = CGF.MakeAddrLValue(Object, E->getType()); LV = CGF.EmitLValueForField(LV, Adjustment.Field); - if (LV.isSimple()) { - Object = LV.getAddress(); - break; - } - - // For non-simple lvalues, we actually have to create a copy of - // the object we're binding to. - QualType T = Adjustment.Field->getType().getNonReferenceType() - .getUnqualifiedType(); - Object = CreateReferenceTemporary(CGF, T, InitializedDecl); - LValue TempLV = CGF.MakeAddrLValue(Object, - Adjustment.Field->getType()); - CGF.EmitStoreThroughLValue(CGF.EmitLoadOfLValue(LV), TempLV); + assert(LV.isSimple() && + "materialized temporary field is not a simple lvalue"); + Object = LV.getAddress(); break; } diff --git a/test/CodeGenCXX/temporaries.cpp b/test/CodeGenCXX/temporaries.cpp index 37871b8638..61b517abeb 100644 --- a/test/CodeGenCXX/temporaries.cpp +++ b/test/CodeGenCXX/temporaries.cpp @@ -616,3 +616,25 @@ namespace Bitfield { // CHECK: store i32* @_ZGRN8Bitfield1rE, i32** @_ZN8Bitfield1rE, align 8 int &&r = S().a; } + +namespace Vector { + typedef __attribute__((vector_size(16))) int vi4a; + typedef __attribute__((ext_vector_type(4))) int vi4b; + struct S { + vi4a v; + vi4b w; + }; + // CHECK: alloca + // CHECK: extractelement + // CHECK: store i32 {{.*}}, i32* @_ZGRN6Vector1rE, + // CHECK: store i32* @_ZGRN6Vector1rE, i32** @_ZN6Vector1rE, + int &&r = S().v[1]; + + // CHECK: alloca + // CHECK: extractelement + // CHECK: store i32 {{.*}}, i32* @_ZGRN6Vector1sE, + // CHECK: store i32* @_ZGRN6Vector1sE, i32** @_ZN6Vector1sE, + int &&s = S().w[1]; + // FIXME PR16204: The following code leads to an assertion in Sema. + //int &&s = S().w.y; +}