<div dir="ltr">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.<br><br>To demonstrate a real-world example:<br><br>template<typename T><br>inline void f() { static int i; }<br>extern template void f<int>();<br>...<br>template void f<int>();<br><br>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).<br><br>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.<br><br>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?<br><br>What's the deal here - am I missing something that makes this safe/correct?<br><br>- Dave</div>