120 lines · cpp
1// RUN: %clang_cc1 -triple powerpc-ibm-aix %s -emit-llvm -o - | \2// RUN: FileCheck -check-prefixes=CHECK,UNSPECIFIED-DEF,EXPLICIT-DEF %s3// RUN: %clang_cc1 -triple powerpc-ibm-aix %s -mdefault-visibility-export-mapping=none -emit-llvm -o - | \4// RUN: FileCheck -check-prefixes=CHECK,UNSPECIFIED-DEF,EXPLICIT-DEF %s5// RUN: %clang_cc1 -triple powerpc-ibm-aix %s -mdefault-visibility-export-mapping=explicit -emit-llvm -o - | \6// RUN: FileCheck -check-prefixes=CHECK,UNSPECIFIED-DEF,EXPLICIT-EXP %s7// RUN: %clang_cc1 -triple powerpc-ibm-aix %s -mdefault-visibility-export-mapping=all -emit-llvm -o - | \8// RUN: FileCheck -check-prefixes=CHECK,UNSPECIFIED-EXP,EXPLICIT-EXP %s9 10struct A {};11 12template <class T>13class B {14public:15 T x;16 B(T _x) : x(_x) {}17 ~B() {}18 void func(T x) {}19};20 21template <class T>22class __attribute__((visibility("default"))) C {23public:24 T x;25 C(T _x) : x(_x) {}26 ~C() {}27 void func(T x) {}28};29 30class D {31public:32 ~D();33};34 35D::~D() {}36 37extern template class B<int>;38extern template class C<int>;39 40void func() {41 B<A> x({});42 C<A> y({});43 x.func({});44 y.func({});45 B<int> xi(0);46 C<int> yi(0);47 xi.func(0);48 yi.func(0);49 D z;50}51 52// D::~D() (base object destructor)53// UNSPECIFIED-DEF: define void @_ZN1DD2Ev(54// UNSPECIFIED-EXP: define dllexport void @_ZN1DD2Ev(55 56// D::~D() (complete object destructor)57// UNSPECIFIED-DEF: define void @_ZN1DD1Ev(58// UNSPECIFIED-EXP: define dllexport void @_ZN1DD1Ev(59 60// UNSPECIFIED-DEF: define void @_Z4funcv(61// UNSPECIFIED-EXP: define dllexport void @_Z4funcv(62 63// B<A>::B(A) (complete object constructor)64// UNSPECIFIED-DEF: define linkonce_odr void @_ZN1BI1AEC1ES0_(65// UNSPECIFIED-EXP: define linkonce_odr dllexport void @_ZN1BI1AEC1ES0_(66 67// C<A>::C(A) (complete object constructor)68// EXPLICIT-DEF: define linkonce_odr void @_ZN1CI1AEC1ES0_(69// EXPLICIT-EXP: define linkonce_odr dllexport void @_ZN1CI1AEC1ES0_(70 71// B<A>::func(A)72// UNSPECIFIED-DEF: define linkonce_odr void @_ZN1BI1AE4funcES0_(73// UNSPECIFIED-EXP: define linkonce_odr dllexport void @_ZN1BI1AE4funcES0_(74 75// C<A>::func(A)76// EXPLICIT-DEF: define linkonce_odr void @_ZN1CI1AE4funcES0_(77// EXPLICIT-EXP: define linkonce_odr dllexport void @_ZN1CI1AE4funcES0_(78 79// B<int>::B(int) (complete object constructor)80// CHECK: declare void @_ZN1BIiEC1Ei81 82// C<int>::C(int) (complete object constructor)83// CHECK: declare void @_ZN1CIiEC1Ei84 85// B<int>::func(int)86// CHECK: declare void @_ZN1BIiE4funcEi87 88// C<int>::func(int)89// CHECK: declare void @_ZN1CIiE4funcEi90 91// C<int>::~C() (complete object destructor)92// CHECK: declare void @_ZN1CIiED1Ev93 94// B<int>::~B() (complete object destructor)95// CHECK: declare void @_ZN1BIiED1Ev96 97// C<A>::~c() (complete object destructor)98// EXPLICIT-DEF: define linkonce_odr void @_ZN1CI1AED1Ev(99// EXPLICIT-EXP: define linkonce_odr dllexport void @_ZN1CI1AED1Ev(100 101// B<A>::~B() (complete object destructor)102// UNSPECIFIED-DEF: define linkonce_odr void @_ZN1BI1AED1Ev(103// UNSPECIFIED-EXP: define linkonce_odr dllexport void @_ZN1BI1AED1Ev(104 105// B<A>::B(A) (base object constructor)106// UNSPECIFIED-DEF: define linkonce_odr void @_ZN1BI1AEC2ES0_(107// UNSPECIFIED-EXP: define linkonce_odr dllexport void @_ZN1BI1AEC2ES0_(108 109// B<A>::~B() (base object destructor)110// UNSPECIFIED-DEF: define linkonce_odr void @_ZN1BI1AED2Ev(111// UNSPECIFIED-EXP: define linkonce_odr dllexport void @_ZN1BI1AED2Ev(112 113// C<A>::C(A) (base object constructor)114// EXPLICIT-DEF: define linkonce_odr void @_ZN1CI1AEC2ES0_(115// EXPLICIT-EXP: define linkonce_odr dllexport void @_ZN1CI1AEC2ES0_(116 117// C<A>::~C() (base object destructor)118// EXPLICIT-DEF: define linkonce_odr void @_ZN1CI1AED2Ev(119// EXPLICIT-EXP: define linkonce_odr dllexport void @_ZN1CI1AED2Ev(120