From 23dfaa1cef1eb1b47195408fdd456a238097ee9c Mon Sep 17 00:00:00 2001 From: John McCall Date: Tue, 1 May 2012 02:33:44 +0000 Subject: 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! llvm-svn: 155879 --- clang/lib/AST/MicrosoftMangle.cpp | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) (limited to 'clang/lib/AST/MicrosoftMangle.cpp') diff --git a/clang/lib/AST/MicrosoftMangle.cpp b/clang/lib/AST/MicrosoftMangle.cpp index ba9856a8432..6250f611986 100644 --- a/clang/lib/AST/MicrosoftMangle.cpp +++ b/clang/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(); -- cgit v1.2.3