[cfe-dev] Linkage of static local variables in available_externally definitions

Reid Kleckner via cfe-dev cfe-dev at lists.llvm.org
Thu Jan 26 16:05:23 PST 2017


Looks buggy to me. Static locals created by explicit template instantiation
should probably not be discardable.

I think we're just lucky so far because either the local has constant
initialization and no guard variable, so we never need a real definition,
or it has a guard variable which keeps it from being optimized away.

On Thu, Jan 26, 2017 at 2:51 PM, David Blaikie via cfe-dev <
cfe-dev at lists.llvm.org> wrote:

> In implementing modular codegen, specifically verifying the behavior for
> static local variables in inline functions in modular headers, I came
> across a piece of logic in Clang's linkage calculation that seems off.
>
> To demonstrate a real-world example:
>
> template<typename T>
> inline void f() { static int i; }
> extern template void f<int>();
> ...
> template void f<int>();
>
> In the TU with the extern template declaration, an available_externally
> definition of f<int> and f<int>::i are provided (when optimizations are
> enabled).
>
> In the TU with the extern template definition, a weak_odr definition of
> f<int> is provided but a linkonce_odr definition of f<int>::i is provided.
>
> This surprises me and doesn't seem correct. What if the TU with the
> weak_odr definition is optimized to the point of removing the f<int>::i
> definition - but the available_externally TU is not - it inlines f<int> but
> leaves a use of f<int>::i available?
>
> What's the deal here - am I missing something that makes this safe/correct?
>
> - Dave
>
> _______________________________________________
> cfe-dev mailing list
> cfe-dev at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20170126/83870658/attachment.html>


More information about the cfe-dev mailing list