MicrosoftMangle: Fix mangling of integral constant non-type template arguments in a class specialization.

llvm-svn: 159056
This commit is contained in:
Charles Davis 2012-06-23 00:27:49 +00:00
parent de8c6fb24f
commit de2e5ed4aa
2 changed files with 20 additions and 1 deletions

View File

@ -744,7 +744,16 @@ MicrosoftCXXNameMangler::mangleTemplateArgs(
case TemplateArgument::Integral:
mangleIntegerLiteral(TA.getIntegralType(), TA.getAsIntegral());
break;
default: {
case TemplateArgument::Expression: {
// See if this is a constant expression.
Expr *TAE = TA.getAsExpr();
llvm::APSInt Value;
if (TAE->isIntegerConstantExpr(Value, Context.getASTContext())) {
mangleIntegerLiteral(TAE->getType(), Value);
break;
}
/* fallthrough */
} default: {
// Issue a diagnostic.
DiagnosticsEngine &Diags = Context.getDiags();
unsigned DiagID = Diags.getCustomDiagID(DiagnosticsEngine::Error,

View File

@ -23,6 +23,13 @@ class IntTemplate {
IntTemplate() {}
};
template<>
class BoolTemplate<true> {
public:
BoolTemplate() {}
template<class T> void Foo(T arg) {}
};
void template_mangling() {
Class<Typename> c1;
c1.method();
@ -36,7 +43,10 @@ void template_mangling() {
// CHECK: call {{.*}} @"\01??0?$BoolTemplate@$0A@@@QAE@XZ"
BoolTemplate<true> _true;
// PR13158
_true.Foo(1);
// CHECK: call {{.*}} @"\01??0?$BoolTemplate@$00@@QAE@XZ"
// CHECK: call {{.*}} @"\01??$Foo@H@?$BoolTemplate@$00@@QAEXH@Z"
IntTemplate<5> five;
// CHECK: call {{.*}} @"\01??0?$IntTemplate@$04@@QAE@XZ"