Files
clang-p2996/clang/test/CodeGenCXX/mangle-ms-templates-memptrs-2.cpp
David Majnemer 6a729c64e0 MS ABI: Mangle null pointer-to-member-functions compatibly
Summary:
Previously, we would mangle nullptr pointer-to-member-functions in class
templates with a mangling we invented because contemporary versions of
MSVC would crash when trying to compile such code.

However, VS "14" can successfully compile these sorts of template
instantiations.  This commit updates our mangling to be compatible with
theirs.

Reviewers: rnk

Reviewed By: rnk

Subscribers: cfe-commits

Differential Revision: http://reviews.llvm.org/D4059

llvm-svn: 210637
2014-06-11 04:55:08 +00:00

46 lines
1.0 KiB
C++

// RUN: %clang_cc1 -Wno-microsoft -fms-extensions -fno-rtti -std=c++11 -emit-llvm %s -o - -triple=i386-pc-win32 | FileCheck %s
template <typename T, int (T::*)() = nullptr>
struct J {};
struct __single_inheritance M;
J<M> m;
// CHECK-DAG: @"\01?m@@3U?$J@UM@@$0A@@@A"
struct __multiple_inheritance N;
J<N> n;
// CHECK-DAG: @"\01?n@@3U?$J@UN@@$HA@@@A"
struct __virtual_inheritance O;
J<O> o;
// CHECK-DAG: @"\01?o@@3U?$J@UO@@$IA@A@@@A"
struct P;
J<P> p;
// CHECK-DAG: @"\01?p@@3U?$J@UP@@$JA@A@?0@@A"
#pragma pointers_to_members(full_generality, virtual_inheritance)
struct S {
int a, b;
void f();
virtual void g();
};
struct GeneralBase {
virtual void h();
};
struct MostGeneral : S, virtual GeneralBase {
virtual void h();
};
template <void (MostGeneral::*MP)()>
struct ClassTemplate {
ClassTemplate() {}
};
template struct ClassTemplate<&MostGeneral::h>;
// Test that we mangle in the vbptr offset, which is 12 here.
//
// CHECK: define weak_odr x86_thiscallcc %struct.ClassTemplate* @"\01??0?$ClassTemplate@$J??_9MostGeneral@@$BA@AEA@M@3@@QAE@XZ"