[cfe-dev] -Wglobal-constructors vs static initialization

Nico Weber thakis at chromium.org
Mon Dec 5 13:15:36 PST 2011


Hi,

-Wglobal-constructors looks like a very useful warning for finding
static initializers. However, it looks like it warns in several cases
where clang is smart enough to not emit a static initializer (but gcc
isn't, at least the versions I'm using):

$ cat test.cc
#include <limits>

class A {
 public:
  A(int n) : a_(n) {}
  int a_;
};

int g_n = std::numeric_limits<int>::max();
A g_a(5);  // gcc 4.2 gets this right, 4.4 doesn't

int main() {
  return g_a.a_ + g_n;
}
#include <string.h>
int f(char* f) {
  return strlen(f) == 0;
}
$ g++ -o foo test.cc -O2
$ otool -l foo | grep -C 5 __mod_init_func  | grep size
      size 0x0000000000000008
$ third_party/llvm-build/Release+Asserts/bin/clang++ -o foo test.cc -O2
$ otool -l foo | grep -C 5 __mod_init_func  | grep size
# Note: No output.


But:

$ third_party/llvm-build/Release+Asserts/bin/clang++ -o foo test.cc
-O2 -Wglobal-constructors
test.cc:9:5: warning: declaration requires a global constructor
[-Wglobal-constructors]
int g_n = std::numeric_limits<int>::max();
    ^     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
test.cc:10:3: warning: declaration requires a global constructor
[-Wglobal-constructors]
A g_a(5);
  ^~~~~~
2 warnings generated.


Is this intentional, or should -Wglobal-constructors be changed to
only warn about constructors that do create static initializers at
-O2?

Thanks,
Nico



More information about the cfe-dev mailing list