[cfe-commits] r155879 - in /cfe/trunk: lib/AST/MicrosoftMangle.cpp test/CodeGenCXX/mangle-ms.cpp

John McCall rjmccall at apple.com
Mon Apr 30 19:33:44 PDT 2012


Author: rjmccall
Date: Mon Apr 30 21:33:44 2012
New Revision: 155879

URL: http://llvm.org/viewvc/llvm-project?rev=155879&view=rev
Log:
When mangling a synthetic function declaration, we might not have
type-source information for its parameters.  Don't crash when
mangling them in the MS C++ ABI.  Patch by Timur Iskhodzhanov!

Modified:
    cfe/trunk/lib/AST/MicrosoftMangle.cpp
    cfe/trunk/test/CodeGenCXX/mangle-ms.cpp

Modified: cfe/trunk/lib/AST/MicrosoftMangle.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/MicrosoftMangle.cpp?rev=155879&r1=155878&r2=155879&view=diff
==============================================================================
--- cfe/trunk/lib/AST/MicrosoftMangle.cpp (original)
+++ cfe/trunk/lib/AST/MicrosoftMangle.cpp Mon Apr 30 21:33:44 2012
@@ -763,12 +763,16 @@
     Out << 'X';
   } else {
     if (D) {
-      // If we got a decl, use the "types-as-written" to make sure arrays
-      // get mangled right.
+      // If we got a decl, use the type-as-written to make sure arrays
+      // get mangled right.  Note that we can't rely on the TSI
+      // existing if (for example) the parameter was synthesized.
       for (FunctionDecl::param_const_iterator Parm = D->param_begin(),
-           ParmEnd = D->param_end();
-           Parm != ParmEnd; ++Parm)
-        mangleType((*Parm)->getTypeSourceInfo()->getType());
+             ParmEnd = D->param_end(); Parm != ParmEnd; ++Parm) {
+        if (TypeSourceInfo *typeAsWritten = (*Parm)->getTypeSourceInfo())
+          mangleType(typeAsWritten->getType());
+        else
+          mangleType((*Parm)->getType());
+      }
     } else {
       for (FunctionProtoType::arg_type_iterator Arg = Proto->arg_type_begin(),
            ArgEnd = Proto->arg_type_end();

Modified: cfe/trunk/test/CodeGenCXX/mangle-ms.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/mangle-ms.cpp?rev=155879&r1=155878&r2=155879&view=diff
==============================================================================
--- cfe/trunk/test/CodeGenCXX/mangle-ms.cpp (original)
+++ cfe/trunk/test/CodeGenCXX/mangle-ms.cpp Mon Apr 30 21:33:44 2012
@@ -103,3 +103,17 @@
 void zeta(int (^)(int, int)) {}
 // CHECK: @"\01?zeta@@YAXP_EAHHH at Z@Z"
 
+void operator_new_delete() {
+  char *ptr = new char;
+// CHECK: @"\01??2 at YAPAXI@Z"
+
+  delete ptr;
+// CHECK: @"\01??3 at YAXPAX@Z"
+
+  char *array = new char[42];
+// CHECK: @"\01??_U at YAPAXI@Z"
+
+  // FIXME: enable once PR12333 is fixed
+  // delete [] array;
+// Should be: @"\01??_V at YAXPAX@Z"
+}





More information about the cfe-commits mailing list