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