diff --git a/clang/lib/CodeGen/MicrosoftCXXABI.cpp b/clang/lib/CodeGen/MicrosoftCXXABI.cpp index a8fd0b0c2dd9..960b1fe77a09 100644 --- a/clang/lib/CodeGen/MicrosoftCXXABI.cpp +++ b/clang/lib/CodeGen/MicrosoftCXXABI.cpp @@ -1015,6 +1015,11 @@ void MicrosoftCXXNameMangler::mangleType(const PointerType *T) { if (PointeeTy->isArrayType()) { // Pointers to arrays are mangled like arrays. mangleExtraDimensions(T->getPointeeType()); + } else if (PointeeTy->isFunctionType()) { + // Function pointers are special. + Out << '6'; + mangleType(static_cast(PointeeTy.getTypePtr()), + NULL, false, false); } else { if (!PointeeTy.hasQualifiers()) // Lack of qualifiers is mangled as 'A'. diff --git a/clang/test/CodeGenCXX/mangle-ms.cpp b/clang/test/CodeGenCXX/mangle-ms.cpp index 47dedfe27a40..e2214100f179 100644 --- a/clang/test/CodeGenCXX/mangle-ms.cpp +++ b/clang/test/CodeGenCXX/mangle-ms.cpp @@ -9,6 +9,7 @@ // CHECK: @"\01?g@bar@@2HA" // CHECK: @"\01?h@@3QAHA" // CHECK: @"\01?i@@3PAY0BD@HA" +// CHECK: @"\01?j@@3P6GHCE@ZA" int a; @@ -58,6 +59,8 @@ extern int * const h = &a; int i[10][20]; +int (__stdcall *j)(signed char, unsigned char); + // Static functions are mangled, too. // Also make sure calling conventions, arglists, and throw specs work. static void __stdcall alpha(float a, double b) throw() {}