forked from OSchip/llvm-project
static local variables with destructors don't require a global destructor
unless we're on a platform without __cxa_atexit (or use thereof has been disabled). This patch actually just disables the check completely for static locals, but I've filed http://llvm.org/bugs/show_bug.cgi?id=8176 to track the platform-specific fix. llvm-svn: 114269
This commit is contained in:
parent
b92b13d8a0
commit
386dfc738e
|
@ -5519,7 +5519,8 @@ void Sema::FinalizeVarWithDestructor(VarDecl *VD, const RecordType *Record) {
|
||||||
<< VD->getDeclName()
|
<< VD->getDeclName()
|
||||||
<< VD->getType());
|
<< VD->getType());
|
||||||
|
|
||||||
if (!VD->isInvalidDecl() && VD->hasGlobalStorage())
|
// TODO: this should be re-enabled for static locals by !CXAAtExit
|
||||||
|
if (!VD->isInvalidDecl() && VD->hasGlobalStorage() && !VD->isStaticLocal())
|
||||||
Diag(VD->getLocation(), diag::warn_global_destructor);
|
Diag(VD->getLocation(), diag::warn_global_destructor);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -72,7 +72,7 @@ namespace test6 {
|
||||||
struct A { ~A(); };
|
struct A { ~A(); };
|
||||||
|
|
||||||
void f1() {
|
void f1() {
|
||||||
static A a; // expected-warning {{global destructor}}
|
static A a;
|
||||||
}
|
}
|
||||||
void f2() {
|
void f2() {
|
||||||
static A& a = *new A;
|
static A& a = *new A;
|
||||||
|
@ -84,8 +84,14 @@ namespace pr8095 {
|
||||||
int x;
|
int x;
|
||||||
Foo(int x1) : x(x1) {}
|
Foo(int x1) : x(x1) {}
|
||||||
};
|
};
|
||||||
|
void foo() {
|
||||||
void bar() {
|
|
||||||
static Foo a(0);
|
static Foo a(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct Bar {
|
||||||
|
~Bar();
|
||||||
|
};
|
||||||
|
void bar() {
|
||||||
|
static Bar b;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue