[AST] Really allocate a SmallVector to the right size.
authorBenjamin Kramer <benny.kra@googlemail.com>
Tue, 4 Aug 2015 13:34:50 +0000 (13:34 +0000)
committerBenjamin Kramer <benny.kra@googlemail.com>
Tue, 4 Aug 2015 13:34:50 +0000 (13:34 +0000)
set_size only resets the end pointer and asserts if it is used to grow
the buffer. This would crash when mangling a float with more than 80 bits,
add a test with a ppc double double (128 bits).

Found by inspection.

llvm-svn: 243979

clang/lib/AST/ItaniumMangle.cpp
clang/test/CodeGenCXX/mangle-literal-suffix.cpp

index dac803e..e51aad9 100644 (file)
@@ -700,8 +700,7 @@ void CXXNameMangler::mangleFloat(const llvm::APFloat &f) {
   assert(numCharacters != 0);
 
   // Allocate a buffer of the right number of characters.
-  SmallVector<char, 20> buffer;
-  buffer.set_size(numCharacters);
+  SmallVector<char, 20> buffer(numCharacters);
 
   // Fill the buffer left-to-right.
   for (unsigned stringIndex = 0; stringIndex != numCharacters; ++stringIndex) {
index ab557d5..d3ca9ff 100644 (file)
@@ -1,4 +1,5 @@
-// RUN: %clang_cc1 -triple mips-none-none -emit-llvm -o - %s | FileCheck %s
+// RUN: %clang_cc1 -triple mips-none-none -emit-llvm -o - %s | FileCheck %s -check-prefix=CHECK -check-prefix=FP64
+// RUN: %clang_cc1 -triple powerpc64-none-none -emit-llvm -o - %s | FileCheck %s -check-prefix=CHECK -check-prefix=FP128
 
 template <class T> void g3(char (&buffer)[sizeof(T() + 5.0)]) {}
 template void g3<int>(char (&)[sizeof(double)]);
@@ -6,7 +7,8 @@ template void g3<int>(char (&)[sizeof(double)]);
 
 template <class T> void g4(char (&buffer)[sizeof(T() + 5.0L)]) {}
 template void g4<int>(char (&)[sizeof(long double)]);
-// CHECK: _Z2g4IiEvRAszplcvT__ELe4014000000000000E_c
+// FP64: _Z2g4IiEvRAszplcvT__ELe4014000000000000E_c
+// FP128: _Z2g4IiEvRAszplcvT__ELg00000000000000004014000000000000E_c
 
 template <class T> void g5(char (&buffer)[sizeof(T() + 5)]) {}
 template void g5<int>(char (&)[sizeof(int)]);