I ran into this while look at a different bug (patch coming soon). This function has only two callers. The first is SBTypeStaticField::GetName (which doesn't care about templates), and the other is CompilerDecl::GetCompilerContext (in the TypeQuery constructor), which does want template arguments. This function was (normally) returning the name without template args. Since this code is only used when looking up a type in another shared library, the odds of running into this bug are relatively low, but I add a test to demonstrate the scenario and the fix for it nonetheless. Amazingly (and scarily), this test actually passes without this change in the default configuration -- and only fails with -gsimple-template-names. The reason for that is that in the non-simplified case we create a regular CXXRecordDecl whose name is "bar<int>" (instead of a template record "foo" with an argument of "int"). When evaluating the expression, we are somehow able to replace this with a proper template specialization decl.
14 lines
122 B
C++
14 lines
122 B
C++
#include "foo.h"
|
|
|
|
template <typename T> struct bar {
|
|
T a;
|
|
};
|
|
|
|
int main() {
|
|
bar<int> b{47};
|
|
|
|
foo(&b);
|
|
|
|
return 0;
|
|
}
|