<div dir="ltr"><div>Hi folks,</div><div><br></div><div>I've been looking at explicit template instantiations lately, and came across the following</div><div>corner case where gcc and clang disagree on the visibility of a symbol. I'm inclined to think gcc's behavior is correct, but I wanted to make sure I'm not missing some reason why AddS needs to be visible.</div><div><br></div><div>Consider the following file (test.cpp):</div><div><br></div><div><div>template < typename T > class foo {</div><div>public:</div><div>    T x;</div><div>    T getX() { return x; }</div><div>    template < typename S ></div><div>    __attribute__ ((visibility("hidden"))) S AddS(S);</div><div>};</div><div><br></div><div>__attribute__ ((visibility("hidden"))) S foo<T>::AddS(S y) {</div><div>    return ((S) x) + y;</div><div>}</div><div><br></div><div>template < typename T, typename S ></div><div>__attribute__ ((visibility("hidden"))) S AddTS(T x, S y) {</div><div>    return ((S) x) + y;</div><div>}</div><div><br></div><div>extern template struct foo<int>;</div><div>template struct foo<int>;</div><div><br></div><div>int footest() {</div><div>    auto var = foo<int>{5};</div><div>    auto bar = var.AddS((long long)3);</div><div>    auto bar2 = AddTS((int)5,(long long)3);</div><div>    return var.getX();</div><div>}</div></div><div><br></div><div><br></div><div>$ gcc -std=c++11 -c -S -o - test.cpp | grep .hidden</div><div><span class="" style="white-space:pre">        </span>.hidden<span class="" style="white-space:pre">   </span>_ZN3fooIiE4AddSIxEET_S2_</div><div><span class="" style="white-space:pre">   </span>.hidden<span class="" style="white-space:pre">   </span>_Z5AddTSIixET0_T_S0_</div><div>$ clang-3.5 -std=c++11 -c -S -o - test.cpp | grep .hidden</div><div><span class="" style="white-space:pre">       </span>.hidden<span class="" style="white-space:pre">   </span>_Z5AddTSIixET0_T_S0_</div></div>