forked from OSchip/llvm-project
MicrosoftMangle: Fix mangling of integral constant non-type template arguments in a class specialization.
llvm-svn: 159056
This commit is contained in:
parent
de8c6fb24f
commit
de2e5ed4aa
|
@ -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,
|
||||
|
|
|
@ -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"
|
||||
|
|
Loading…
Reference in New Issue