-
Notifications
You must be signed in to change notification settings - Fork 116
Description
AppleClang (and clang?) handles RTTI for template instantiations a little different than MSVC and GCC:
With visibility "hidden", a template instantiation in library A is a different type than the exact same template instantiation in library B that links against A. That means, that dynamic_casts between those types fail with AppleClang, but not with MSVC or GCC. With visibility "default", it works.
An example is the gloperate::Loader<T>. During component registration, e.g., gloperate::Loader<Texture> is instantiated within the gloperate-qt-loaders plugin (soon to be gloperate-qt). Loader objects created by the ResourceManager have this type. When an application then calls ResourceManager::load<Texture>, gloperate::Loader<Texture> is instantiated again within the application. As both are different types according to AppleClangs RTTI, the dynamic_cast used to find a loader of the correct type always fails.
A "clean" solution might be to explicitly export all those template instantiations; however, (I think) @scheibel and I both tried it and could not get it to work. Until someone actually manages that, I propose to set the cmake CXX_VISIBILITY_PRESET to "default" for AppleClang, as this is a very subtle bug that is hard to find.
Does anybody know, whether this affects clang as well?