mirror of https://github.com/microsoft/clang.git
CGDecl: Skip static variable initializers in unreachable code
This fixes http://llvm.org/PR31054 Differential Revision: https://reviews.llvm.org/D28505 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@291576 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
96e79e3c6f
commit
2b6d6f109e
|
@ -311,7 +311,7 @@ CodeGenFunction::AddInitializerToStaticVarDecl(const VarDecl &D,
|
|||
if (!Init) {
|
||||
if (!getLangOpts().CPlusPlus)
|
||||
CGM.ErrorUnsupported(D.getInit(), "constant l-value expression");
|
||||
else if (Builder.GetInsertBlock()) {
|
||||
else if (HaveInsertPoint()) {
|
||||
// Since we have a static initializer, this global variable can't
|
||||
// be constant.
|
||||
GV->setConstant(false);
|
||||
|
@ -352,7 +352,7 @@ CodeGenFunction::AddInitializerToStaticVarDecl(const VarDecl &D,
|
|||
GV->setConstant(CGM.isTypeConstant(D.getType(), true));
|
||||
GV->setInitializer(Init);
|
||||
|
||||
if (hasNontrivialDestruction(D.getType())) {
|
||||
if (hasNontrivialDestruction(D.getType()) && HaveInsertPoint()) {
|
||||
// We have a constant initializer, but a nontrivial destructor. We still
|
||||
// need to perform a guarded "initialization" in order to register the
|
||||
// destructor.
|
||||
|
|
|
@ -0,0 +1,12 @@
|
|||
// RUN: %clang_cc1 -triple x86_64-unknown-unknown -emit-llvm -o - %s | FileCheck %s
|
||||
|
||||
struct A { ~A(); };
|
||||
void func() {
|
||||
return;
|
||||
static A k;
|
||||
}
|
||||
|
||||
// Test that we did not crash, by checking whether function was created.
|
||||
// CHECK-LABEL: define void @_Z4funcv() #0 {
|
||||
// CHECK: ret void
|
||||
// CHECK: }
|
Loading…
Reference in New Issue