Created attachment 8568 [details] repro Compile the attachment with clang++ -c repro.ii -fvisibility=hidden then run `nm -m repro.o`. gcc4.2 and clang prior to r156821 resulted in: 0000000000000000 (__DATA,__data) external __ZN18DeviceDataProviderI9RadioDataE17factory_function_E (undefined) external __ZN18DeviceDataProviderI9RadioDataE22DefaultFactoryFunctionEv clang with r156821 results in: 0000000000000000 (__DATA,__data) private external __ZN18DeviceDataProviderI9RadioDataE17factory_function_E (undefined) external __ZN18DeviceDataProviderI9RadioDataE22DefaultFactoryFunctionEv This breaks the chromium component build, target 'content_unittest' no longer links. $ cat repro.ii struct __attribute__((visibility("default"))) RadioData {}; class __attribute__((visibility("default"))) DeviceDataProviderImplBaseHack {}; template<typename DataType> class DeviceDataProviderImplBase : public DeviceDataProviderImplBaseHack {}; template<typename DataType> class DeviceDataProvider { typedef DeviceDataProviderImplBase<DataType>* (*ImplFactoryFunction)(void); __attribute__((visibility("default"))) static DeviceDataProviderImplBase<DataType>* DefaultFactoryFunction(); __attribute__((visibility("default"))) static ImplFactoryFunction factory_function_; }; template<> DeviceDataProvider<RadioData>::ImplFactoryFunction DeviceDataProvider<RadioData>::factory_function_ = DefaultFactoryFunction;
reduces to: template<typename T> struct foo { __attribute__((visibility("default"))) static int bar; }; template<typename T> int foo<T>::bar; int f() { return foo<int>::bar; }
Fixed in r156897.
Verified. Thanks!