aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn McCall <rjmccall@apple.com>2012-05-01 02:33:44 +0000
committerJohn McCall <rjmccall@apple.com>2012-05-01 02:33:44 +0000
commit3a8ac07956ac63bd202cdd3b9e4a2c6cefa888da (patch)
tree3c8c25cc4d4ae65609651816efb16e18471b2664
parent198ff65aff048b969db85a02ea52bd8b73637bbe (diff)
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! git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@155879 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/AST/MicrosoftMangle.cpp14
-rw-r--r--test/CodeGenCXX/mangle-ms.cpp14
2 files changed, 23 insertions, 5 deletions
diff --git a/lib/AST/MicrosoftMangle.cpp b/lib/AST/MicrosoftMangle.cpp
index ba9856a843..6250f61198 100644
--- a/lib/AST/MicrosoftMangle.cpp
+++ b/lib/AST/MicrosoftMangle.cpp
@@ -763,12 +763,16 @@ void MicrosoftCXXNameMangler::mangleType(const FunctionType *T,
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();
diff --git a/test/CodeGenCXX/mangle-ms.cpp b/test/CodeGenCXX/mangle-ms.cpp
index fe5fde1a1b..ceaa669f19 100644
--- a/test/CodeGenCXX/mangle-ms.cpp
+++ b/test/CodeGenCXX/mangle-ms.cpp
@@ -103,3 +103,17 @@ void epsilon(int a[][10][20]) {}
void zeta(int (^)(int, int)) {}
// CHECK: @"\01?zeta@@YAXP_EAHHH@Z@Z"
+void operator_new_delete() {
+ char *ptr = new char;
+// CHECK: @"\01??2@YAPAXI@Z"
+
+ delete ptr;
+// CHECK: @"\01??3@YAXPAX@Z"
+
+ char *array = new char[42];
+// CHECK: @"\01??_U@YAPAXI@Z"
+
+ // FIXME: enable once PR12333 is fixed
+ // delete [] array;
+// Should be: @"\01??_V@YAXPAX@Z"
+}