// RUN: %clang_cc1 -triple powerpc-ibm-aix %s -S -emit-llvm -o - | \ // RUN: FileCheck -check-prefixes=CHECK,UNSPECIFIED-DEF,EXPLICIT-DEF %s // RUN: %clang_cc1 -triple powerpc-ibm-aix %s -mdefault-visibility-export-mapping=none -S -emit-llvm -o - | \ // RUN: FileCheck -check-prefixes=CHECK,UNSPECIFIED-DEF,EXPLICIT-DEF %s // RUN: %clang_cc1 -triple powerpc-ibm-aix %s -mdefault-visibility-export-mapping=explicit -S -emit-llvm -o - | \ // RUN: FileCheck -check-prefixes=CHECK,UNSPECIFIED-DEF,EXPLICIT-EXP %s // RUN: %clang_cc1 -triple powerpc-ibm-aix %s -mdefault-visibility-export-mapping=all -S -emit-llvm -o - | \ // RUN: FileCheck -check-prefixes=CHECK,UNSPECIFIED-EXP,EXPLICIT-EXP %s struct A {}; template class B { public: T x; B(T _x) : x(_x) {} ~B() {} void func(T x) {} }; template class __attribute__((visibility("default"))) C { public: T x; C(T _x) : x(_x) {} ~C() {} void func(T x) {} }; class D { public: ~D(); }; D::~D() {} extern template class B; extern template class C; void func() { B x({}); C y({}); x.func({}); y.func({}); B xi(0); C yi(0); xi.func(0); yi.func(0); D z; } // D::~D() (base object destructor) // UNSPECIFIED-DEF: define void @_ZN1DD2Ev( // UNSPECIFIED-EXP: define dllexport void @_ZN1DD2Ev( // D::~D() (complete object destructor) // UNSPECIFIED-DEF: define void @_ZN1DD1Ev( // UNSPECIFIED-EXP: define dllexport void @_ZN1DD1Ev( // UNSPECIFIED-DEF: define void @_Z4funcv( // UNSPECIFIED-EXP: define dllexport void @_Z4funcv( // B::B(A) (complete object constructor) // UNSPECIFIED-DEF: define linkonce_odr void @_ZN1BI1AEC1ES0_( // UNSPECIFIED-EXP: define linkonce_odr dllexport void @_ZN1BI1AEC1ES0_( // C::C(A) (complete object constructor) // EXPLICIT-DEF: define linkonce_odr void @_ZN1CI1AEC1ES0_( // EXPLICIT-EXP: define linkonce_odr dllexport void @_ZN1CI1AEC1ES0_( // B::func(A) // UNSPECIFIED-DEF: define linkonce_odr void @_ZN1BI1AE4funcES0_( // UNSPECIFIED-EXP: define linkonce_odr dllexport void @_ZN1BI1AE4funcES0_( // C::func(A) // EXPLICIT-DEF: define linkonce_odr void @_ZN1CI1AE4funcES0_( // EXPLICIT-EXP: define linkonce_odr dllexport void @_ZN1CI1AE4funcES0_( // B::B(int) (complete object constructor) // CHECK: declare void @_ZN1BIiEC1Ei // C::C(int) (complete object constructor) // CHECK: declare void @_ZN1CIiEC1Ei // B::func(int) // CHECK: declare void @_ZN1BIiE4funcEi // C::func(int) // CHECK: declare void @_ZN1CIiE4funcEi // C::~C() (complete object destructor) // CHECK: declare void @_ZN1CIiED1Ev // B::~B() (complete object destructor) // CHECK: declare void @_ZN1BIiED1Ev // C::~c() (complete object destructor) // EXPLICIT-DEF: define linkonce_odr void @_ZN1CI1AED1Ev( // EXPLICIT-EXP: define linkonce_odr dllexport void @_ZN1CI1AED1Ev( // B::~B() (complete object destructor) // UNSPECIFIED-DEF: define linkonce_odr void @_ZN1BI1AED1Ev( // UNSPECIFIED-EXP: define linkonce_odr dllexport void @_ZN1BI1AED1Ev( // B::B(A) (base object constructor) // UNSPECIFIED-DEF: define linkonce_odr void @_ZN1BI1AEC2ES0_( // UNSPECIFIED-EXP: define linkonce_odr dllexport void @_ZN1BI1AEC2ES0_( // B::~B() (base object destructor) // UNSPECIFIED-DEF: define linkonce_odr void @_ZN1BI1AED2Ev( // UNSPECIFIED-EXP: define linkonce_odr dllexport void @_ZN1BI1AED2Ev( // C::C(A) (base object constructor) // EXPLICIT-DEF: define linkonce_odr void @_ZN1CI1AEC2ES0_( // EXPLICIT-EXP: define linkonce_odr dllexport void @_ZN1CI1AEC2ES0_( // C::~C() (base object destructor) // EXPLICIT-DEF: define linkonce_odr void @_ZN1CI1AED2Ev( // EXPLICIT-EXP: define linkonce_odr dllexport void @_ZN1CI1AED2Ev(