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