r243979 - [AST] Really allocate a SmallVector to the right size.
Benjamin Kramer
benny.kra at googlemail.com
Tue Aug 4 06:34:50 PDT 2015
Author: d0k
Date: Tue Aug 4 08:34:50 2015
New Revision: 243979
URL: http://llvm.org/viewvc/llvm-project?rev=243979&view=rev
Log:
[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.
Modified:
cfe/trunk/lib/AST/ItaniumMangle.cpp
cfe/trunk/test/CodeGenCXX/mangle-literal-suffix.cpp
Modified: cfe/trunk/lib/AST/ItaniumMangle.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ItaniumMangle.cpp?rev=243979&r1=243978&r2=243979&view=diff
==============================================================================
--- cfe/trunk/lib/AST/ItaniumMangle.cpp (original)
+++ cfe/trunk/lib/AST/ItaniumMangle.cpp Tue Aug 4 08:34:50 2015
@@ -700,8 +700,7 @@ void CXXNameMangler::mangleFloat(const l
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) {
Modified: cfe/trunk/test/CodeGenCXX/mangle-literal-suffix.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/mangle-literal-suffix.cpp?rev=243979&r1=243978&r2=243979&view=diff
==============================================================================
--- cfe/trunk/test/CodeGenCXX/mangle-literal-suffix.cpp (original)
+++ cfe/trunk/test/CodeGenCXX/mangle-literal-suffix.cpp Tue Aug 4 08:34:50 2015
@@ -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(do
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)]);
More information about the cfe-commits
mailing list