Files
llvm-project/clang/test/CodeGenCXX/mangle-ms-templates-memptrs-2.cpp
David Majnemer 1023668bc2 [MS ABI] nullptr data member ptrs are mangled differently for classes vs fns
It turns out that nullptr pointers to data members act differently in
function templates vs class templates.  Class templates use a variable
width representation proportional to the number of fields needed to
materialize it.  Function templates always use a single '0' template
parameter.  However, using '0' all the time is problematic if the class
uses single or multiple inheritance.  In those cases, use -1.

llvm-svn: 241251
2015-07-02 09:43:11 +00:00

61 lines
1.3 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 {};
template <typename T, int T::* = nullptr>
struct K {};
struct __single_inheritance M;
J<M> m;
// CHECK-DAG: @"\01?m@@3U?$J@UM@@$0A@@@A"
K<M> m2;
// CHECK-DAG: @"\01?m2@@3U?$K@UM@@$0?0@@A"
struct __multiple_inheritance N;
J<N> n;
// CHECK-DAG: @"\01?n@@3U?$J@UN@@$HA@@@A"
K<N> n2;
// CHECK-DAG: @"\01?n2@@3U?$K@UN@@$0?0@@A"
struct __virtual_inheritance O;
J<O> o;
// CHECK-DAG: @"\01?o@@3U?$J@UO@@$IA@A@@@A"
K<O> o2;
// CHECK-DAG: @"\01?o2@@3U?$K@UO@@$FA@?0@@A"
struct P;
J<P> p;
// CHECK-DAG: @"\01?p@@3U?$J@UP@@$JA@A@?0@@A"
K<P> p2;
// CHECK-DAG: @"\01?p2@@3U?$K@UP@@$GA@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"