mirror of https://github.com/microsoft/clang.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. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@243979 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
95d534b966
commit
6bcb1609b9
|
@ -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) {
|
||||
|
|
|
@ -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)]);
|
||||
|
|
Loading…
Reference in New Issue