| // RUN: %clang_cc1 -flto -triple x86_64-unknown-linux -std=c++11 -fms-extensions -fvisibility hidden -fwhole-program-vtables -emit-llvm -o - %s | FileCheck --check-prefix=ITANIUM %s |
| // RUN: %clang_cc1 -flto -triple x86_64-pc-windows-msvc -std=c++11 -fms-extensions -fwhole-program-vtables -emit-llvm -o - %s | FileCheck --check-prefix=MS --check-prefix=MS-STD %s |
| // RUN: %clang_cc1 -flto -triple x86_64-pc-windows-msvc -std=c++11 -fms-extensions -fwhole-program-vtables -flto-visibility-public-std -emit-llvm -o - %s | FileCheck --check-prefix=MS --check-prefix=MS-NOSTD %s |
| |
| struct C1 { |
| virtual void f(); |
| }; |
| |
| struct __attribute__((visibility("default"))) C2 { |
| virtual void f(); |
| }; |
| |
| struct __declspec(dllexport) C3 { |
| virtual void f(); |
| }; |
| |
| struct __declspec(dllimport) C4 { |
| virtual void f(); |
| }; |
| |
| struct [[clang::lto_visibility_public]] C5 { |
| virtual void f(); |
| }; |
| |
| struct __declspec(uuid("00000000-0000-0000-0000-000000000000")) C6 { |
| virtual void f(); |
| }; |
| |
| namespace std { |
| |
| struct C7 { |
| virtual void f(); |
| struct C8 { |
| virtual void f(); |
| }; |
| }; |
| |
| } |
| |
| extern "C++" { |
| |
| namespace stdext { |
| |
| struct C9 { |
| virtual void f(); |
| }; |
| |
| } |
| |
| } |
| |
| namespace other { |
| |
| struct C10 { |
| virtual void f(); |
| }; |
| |
| } |
| |
| namespace { |
| |
| struct C11 { |
| virtual void f(); |
| }; |
| |
| } |
| |
| void f(C1 *c1, C2 *c2, C3 *c3, C4 *c4, C5 *c5, C6 *c6, std::C7 *c7, |
| std::C7::C8 *c8, stdext::C9 *c9, other::C10 *c10) { |
| // ITANIUM: type.test{{.*}}!"_ZTS2C1" |
| // MS: type.test{{.*}}!"?AUC1@@" |
| c1->f(); |
| // ITANIUM-NOT: type.test{{.*}}!"_ZTS2C2" |
| // MS: type.test{{.*}}!"?AUC2@@" |
| c2->f(); |
| // ITANIUM: type.test{{.*}}!"_ZTS2C3" |
| // MS-NOT: type.test{{.*}}!"?AUC3@@" |
| c3->f(); |
| // ITANIUM: type.test{{.*}}!"_ZTS2C4" |
| // MS-NOT: type.test{{.*}}!"?AUC4@@" |
| c4->f(); |
| // ITANIUM-NOT: type.test{{.*}}!"_ZTS2C5" |
| // MS-NOT: type.test{{.*}}!"?AUC5@@" |
| c5->f(); |
| // ITANIUM-NOT: type.test{{.*}}!"_ZTS2C6" |
| // MS-NOT: type.test{{.*}}!"?AUC6@@" |
| c6->f(); |
| // ITANIUM: type.test{{.*}}!"_ZTSSt2C7" |
| // MS-STD: type.test{{.*}}!"?AUC7@std@@" |
| // MS-NOSTD-NOT: type.test{{.*}}!"?AUC7@std@@" |
| c7->f(); |
| // ITANIUM: type.test{{.*}}!"_ZTSNSt2C72C8E" |
| // MS-STD: type.test{{.*}}!"?AUC8@C7@std@@" |
| // MS-NOSTD-NOT: type.test{{.*}}!"?AUC8@C7@std@@" |
| c8->f(); |
| // ITANIUM: type.test{{.*}}!"_ZTSN6stdext2C9E" |
| // MS-STD: type.test{{.*}}!"?AUC9@stdext@@" |
| // MS-NOSTD-NOT: type.test{{.*}}!"?AUC9@stdext@@" |
| c9->f(); |
| // ITANIUM: type.test{{.*}}!"_ZTSN5other3C10E" |
| // MS: type.test{{.*}}!"?AUC10@other@@" |
| c10->f(); |
| // ITANIUM: type.test{{.*}}!{{[0-9]}} |
| // MS: type.test{{.*}}!{{[0-9]}} |
| C11 *c11; |
| c11->f(); |
| } |