From c9ba1bd20a7d861feb3a3dd7bbe277c6646ebf47 Mon Sep 17 00:00:00 2001 From: Benjamin Kramer Date: Tue, 4 Aug 2015 13:34:50 +0000 Subject: [PATCH] [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 --- clang/lib/AST/ItaniumMangle.cpp | 3 +-- clang/test/CodeGenCXX/mangle-literal-suffix.cpp | 6 ++++-- 2 files changed, 5 insertions(+), 4 deletions(-) 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)]); -- 2.7.4