Index: lib/CodeGen/CGStmt.cpp =================================================================== --- lib/CodeGen/CGStmt.cpp (revision 196116) +++ lib/CodeGen/CGStmt.cpp (working copy) @@ -820,7 +820,7 @@ // that the cleanup code should not destroy the variable. if (llvm::Value *NRVOFlag = NRVOFlags[S.getNRVOCandidate()]) Builder.CreateStore(Builder.getTrue(), NRVOFlag); - } else if (!ReturnValue) { + } else if (!ReturnValue || (RV && RV->getType()->isVoidType())) { // Make sure not to return anything, but evaluate the expression // for side effects. if (RV) Index: test/CodeGenCXX/constructor-return-void.cpp =================================================================== --- test/CodeGenCXX/constructor-return-void.cpp (revision 0) +++ test/CodeGenCXX/constructor-return-void.cpp (working copy) @@ -0,0 +1,12 @@ +// RUN: %clang_cc1 %s -triple=thumbv7-unknown-unknown -emit-llvm -o - | FileCheck %s +// rdar://15366494 +// pr17759 + +void f() {} +struct S { S() { return f(); } } s; + +// CHECK: [[THISADDR:%.*]] = alloca %struct.S*, align 4 +// CHECK: store %struct.S* [[THIS:%.*]], %struct.S** [[THISADDR]], align 4 +// CHECK: [[THIS1:%.*]] = load %struct.S** [[THISADDR]] +// CHECK: call arm_aapcscc void @_Z1fv() +// CHECK: ret %struct.S* [[THIS1]]