Skip to content

Commit

Permalink
R13575: Fix USR mangling for function pointer types
Browse files Browse the repository at this point in the history
Differential Revision: https://reviews.llvm.org/D38707

llvm-svn: 315255
  • Loading branch information
jkorous-apple committed Oct 10, 2017
1 parent dcb312b commit e6a0242
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 1 deletion.
6 changes: 5 additions & 1 deletion clang/lib/Index/USRGeneration.cpp
Expand Up @@ -754,8 +754,12 @@ void USRGenerator::VisitType(QualType T) {
if (const FunctionProtoType *FT = T->getAs<FunctionProtoType>()) {
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;
Expand Down
18 changes: 18 additions & 0 deletions clang/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)# |

0 comments on commit e6a0242

Please sign in to comment.