From: Jan Korous Date: Tue, 10 Oct 2017 00:35:16 +0000 (+0000) Subject: R13575: Fix USR mangling for function pointer types X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=066f684bedf20db459703ca47bb87adfe867187a;p=clang R13575: Fix USR mangling for function pointer types Differential Revision: https://reviews.llvm.org/D38707 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@315255 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Index/USRGeneration.cpp b/lib/Index/USRGeneration.cpp index 81e143858e..3a06554b25 100644 --- a/lib/Index/USRGeneration.cpp +++ b/lib/Index/USRGeneration.cpp @@ -754,8 +754,12 @@ void USRGenerator::VisitType(QualType T) { if (const FunctionProtoType *FT = T->getAs()) { Out << 'F'; VisitType(FT->getReturnType()); - for (const auto &I : FT->param_types()) + Out << '('; + for (const auto &I : FT->param_types()) { + Out << '#'; VisitType(I); + } + Out << ')'; if (FT->isVariadic()) Out << '.'; return; diff --git a/test/Index/USR/func-type.cpp b/test/Index/USR/func-type.cpp new file mode 100644 index 0000000000..ff1cd37a7f --- /dev/null +++ b/test/Index/USR/func-type.cpp @@ -0,0 +1,18 @@ +// RUN: c-index-test core -print-source-symbols -- %s | FileCheck %s + +// Functions taking function pointer parameters with different signatures should result in unique USRs. + +typedef void (*_VoidToVoidPtr_)(); +typedef void (*_IntToVoidPtr_)( int ); +typedef _VoidToVoidPtr_ (*IntTo_VoidToVoidPtr_Ptr)( int ); +typedef _IntToVoidPtr_ (*VoidTo_IntToVoidPtr_Ptr)(); + +void Func( IntTo_VoidToVoidPtr_Ptr ); +// CHECK: {{[0-9]+}}:6 | function/C | Func | c:@F@Func#*F*Fv()(#I)# | +void Func( VoidTo_IntToVoidPtr_Ptr ); +// CHECK: {{[0-9]+}}:6 | function/C | Func | c:@F@Func#*F*Fv(#I)()# | + +void Func( void (* (*)(int, int))(int, int) ); +// CHECK: {{[0-9]+}}:6 | function/C | Func | c:@F@Func#*F*Fv(#I#I)(#I#I)# | +void Func( void (* (*)(int, int, int))(int) ); +// CHECK: {{[0-9]+}}:6 | function/C | Func | c:@F@Func#*F*Fv(#I)(#I#I#I)# |