[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
This commit is contained in:
Benjamin Kramer 2015-08-04 13:34:50 +00:00
parent 95d534b966
commit 6bcb1609b9
2 changed files with 5 additions and 4 deletions

View 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) {

View 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)]);