diff options
-rw-r--r-- | lib/AST/ItaniumMangle.cpp | 7 | ||||
-rw-r--r-- | test/CodeGenCXX/mangle-template.cpp | 12 |
2 files changed, 16 insertions, 3 deletions
diff --git a/lib/AST/ItaniumMangle.cpp b/lib/AST/ItaniumMangle.cpp index 7c7a5e5de3..0b8a4c89f8 100644 --- a/lib/AST/ItaniumMangle.cpp +++ b/lib/AST/ItaniumMangle.cpp @@ -693,9 +693,10 @@ void CXXNameMangler::mangleFloat(const llvm::APFloat &f) { void CXXNameMangler::mangleNumber(const llvm::APSInt &Value) { if (Value.isSigned() && Value.isNegative()) { Out << 'n'; - Value.abs().print(Out, true); - } else - Value.print(Out, Value.isSigned()); + Value.abs().print(Out, /*signed*/ false); + } else { + Value.print(Out, /*signed*/ false); + } } void CXXNameMangler::mangleNumber(int64_t Number) { diff --git a/test/CodeGenCXX/mangle-template.cpp b/test/CodeGenCXX/mangle-template.cpp index 05c3a5851e..488f6f3bb1 100644 --- a/test/CodeGenCXX/mangle-template.cpp +++ b/test/CodeGenCXX/mangle-template.cpp @@ -170,3 +170,15 @@ namespace test12 { test<const int&, n>(); } } + +// rdar://problem/12072531 +// Test the boundary condition of minimal signed integers. +namespace test13 { + template <char c> char returnChar() { return c; } + template char returnChar<-128>(); + // CHECK: @_ZN6test1310returnCharILcn128EEEcv() + + template <short s> short returnShort() { return s; } + template short returnShort<-32768>(); + // CHECK: @_ZN6test1311returnShortILsn32768EEEsv() +} |