From: Benjamin Kramer Date: Tue, 4 Aug 2015 13:34:50 +0000 (+0000) Subject: [AST] Really allocate a SmallVector to the right size. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=6bcb1609b940850f3b1ce660c9026ab7e0804bcf;p=clang [AST] Really allocate a SmallVector to the right size. 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. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@243979 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/AST/ItaniumMangle.cpp b/lib/AST/ItaniumMangle.cpp index dac803e5d2..e51aad9ad8 100644 --- a/lib/AST/ItaniumMangle.cpp +++ b/lib/AST/ItaniumMangle.cpp @@ -700,8 +700,7 @@ void CXXNameMangler::mangleFloat(const llvm::APFloat &f) { assert(numCharacters != 0); // Allocate a buffer of the right number of characters. - SmallVector buffer; - buffer.set_size(numCharacters); + SmallVector buffer(numCharacters); // Fill the buffer left-to-right. for (unsigned stringIndex = 0; stringIndex != numCharacters; ++stringIndex) { diff --git a/test/CodeGenCXX/mangle-literal-suffix.cpp b/test/CodeGenCXX/mangle-literal-suffix.cpp index ab557d5a1b..d3ca9ffc37 100644 --- a/test/CodeGenCXX/mangle-literal-suffix.cpp +++ b/test/CodeGenCXX/mangle-literal-suffix.cpp @@ -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 void g3(char (&buffer)[sizeof(T() + 5.0)]) {} template void g3(char (&)[sizeof(double)]); @@ -6,7 +7,8 @@ template void g3(char (&)[sizeof(double)]); template void g4(char (&buffer)[sizeof(T() + 5.0L)]) {} template void g4(char (&)[sizeof(long double)]); -// CHECK: _Z2g4IiEvRAszplcvT__ELe4014000000000000E_c +// FP64: _Z2g4IiEvRAszplcvT__ELe4014000000000000E_c +// FP128: _Z2g4IiEvRAszplcvT__ELg00000000000000004014000000000000E_c template void g5(char (&buffer)[sizeof(T() + 5)]) {} template void g5(char (&)[sizeof(int)]);