After some investigation, it seems that the issue is a more fundamental problem 
in the `ASTConsumer` interface; there are various cases where we call 
`HandleTopLevelDecl` multiple times on the same declaration. We get away with 
this if `DeclMustBeEmitted` is false for the declaration, but not otherwise. 
Here's another testcase not involving `constexpr` nor `dllexport`:

  template<typename T> struct S { __attribute__((used)) auto f() { return 0; } 
};
  int k = S<int>().f();
  template struct S<int>;

We also observed that we're missing `HandleTopLevelDecl` (or similar) calls 
when implicitly defining special member functions (which also acts to mask the 
issue in a lot of cases). This causes seemingly-wrong code generation for cases 
like:

  struct S { __attribute__((used)) S() = default; } s;

GCC generates and retains a definition of S::S() in this case.

One possible fix:

- stop calling `HandleTopLevelDecl` except in cases where we just finished 
defining the entity (remove the call from explicit instantiation and from the 
`dllexport` code and perhaps add calls to `DefineImplicit*`)
- add a new `ASTConsumer` callback for the case where the properties of an 
existing declaration have changed (for instance, it's switched from being 
not-`dllexport` to being `dllexport`, or it's switched from being an implicit 
instantiation to being an explicit instantiation)

We might also wish to switch away from using `HandleTopLevelDecl` for template 
instantiations (and special member function definitions, if we ever add it 
there) because they're not really top-level declarations (they're adding a 
definition to an existing declaration in many cases), and instead call 
something like `HandleInlineMethodDefinition` in those cases. However, that 
appears to be merely a cleanup rather than a correctness fix.


http://reviews.llvm.org/D6674

EMAIL PREFERENCES
  http://reviews.llvm.org/settings/panel/emailpreferences/



_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to