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-Tag: studio-1.4~910 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=c9ba1bd20a7d861feb3a3dd7bbe277c6646ebf47;p=platform%2Fupstream%2Fllvm.git [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. llvm-svn: 243979 --- diff --git a/clang/lib/AST/ItaniumMangle.cpp b/clang/lib/AST/ItaniumMangle.cpp index dac803e..e51aad9 100644 --- a/clang/lib/AST/ItaniumMangle.cpp +++ b/clang/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/clang/test/CodeGenCXX/mangle-literal-suffix.cpp b/clang/test/CodeGenCXX/mangle-literal-suffix.cpp index ab557d5..d3ca9ff 100644 --- a/clang/test/CodeGenCXX/mangle-literal-suffix.cpp +++ b/clang/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)]);