]> granicus.if.org Git - clang/commitdiff
static local variables with destructors don't require a global destructor
authorJohn McCall <rjmccall@apple.com>
Sat, 18 Sep 2010 05:25:11 +0000 (05:25 +0000)
committerJohn McCall <rjmccall@apple.com>
Sat, 18 Sep 2010 05:25:11 +0000 (05:25 +0000)
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.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@114269 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaDeclCXX.cpp
test/SemaCXX/warn-global-constructors.cpp

index 0580392689b61aa9165db9b026ba3c2e04c5c5ad..4816d22013fa3eaeffa5e255a24a78910c3955aa 100644 (file)
@@ -5519,7 +5519,8 @@ void Sema::FinalizeVarWithDestructor(VarDecl *VD, const RecordType *Record) {
                             << VD->getDeclName()
                             << 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);
   }
 }
index 0391f5ba3d1fbf0b3d45e9ee0f8aba46e94c86ad..ad609545ece1abbb9d54e8e5b409e9b357088360 100644 (file)
@@ -72,7 +72,7 @@ namespace test6 {
   struct A { ~A(); };
 
   void f1() {
-    static A a; // expected-warning {{global destructor}}
+    static A a;
   }
   void f2() {
     static A& a = *new A;
@@ -84,8 +84,14 @@ namespace pr8095 {
     int x;
     Foo(int x1) : x(x1) {}
   };
+  void foo() {
+    static Foo a(0);
+  }
 
+  struct Bar {
+    ~Bar();
+  };
   void bar() {
-    static Foo a(0);
+    static Bar b;
   }
 }