1 // 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 2 // 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 3 // 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 4 5 struct C1 { 6 virtual void f(); 7 }; 8 9 struct __attribute__((visibility("default"))) C2 { 10 virtual void f(); 11 }; 12 13 struct __declspec(dllexport) C3 { 14 virtual void f(); 15 }; 16 17 struct __declspec(dllimport) C4 { 18 virtual void f(); 19 }; 20 21 struct [[clang::lto_visibility_public]] C5 { 22 virtual void f(); 23 }; 24 25 struct __declspec(uuid("00000000-0000-0000-0000-000000000000")) C6 { 26 virtual void f(); 27 }; 28 29 namespace std { 30 31 struct C7 { 32 virtual void f(); 33 struct C8 { 34 virtual void f(); 35 }; 36 }; 37 38 } 39 40 extern "C++" { 41 42 namespace stdext { 43 44 struct C9 { 45 virtual void f(); 46 }; 47 48 } 49 50 } 51 52 namespace other { 53 54 struct C10 { 55 virtual void f(); 56 }; 57 58 } 59 60 namespace { 61 62 struct C11 { 63 virtual void f(); 64 }; 65 66 } 67 68 void f(C1 *c1, C2 *c2, C3 *c3, C4 *c4, C5 *c5, C6 *c6, std::C7 *c7, 69 std::C7::C8 *c8, stdext::C9 *c9, other::C10 *c10) { 70 // ITANIUM: type.test{{.*}}!"_ZTS2C1" 71 // MS: type.test{{.*}}!"?AUC1@@" 72 c1->f(); 73 // ITANIUM-NOT: type.test{{.*}}!"_ZTS2C2" 74 // MS: type.test{{.*}}!"?AUC2@@" 75 c2->f(); 76 // ITANIUM: type.test{{.*}}!"_ZTS2C3" 77 // MS-NOT: type.test{{.*}}!"?AUC3@@" 78 c3->f(); 79 // ITANIUM: type.test{{.*}}!"_ZTS2C4" 80 // MS-NOT: type.test{{.*}}!"?AUC4@@" 81 c4->f(); 82 // ITANIUM-NOT: type.test{{.*}}!"_ZTS2C5" 83 // MS-NOT: type.test{{.*}}!"?AUC5@@" 84 c5->f(); 85 // ITANIUM-NOT: type.test{{.*}}!"_ZTS2C6" 86 // MS-NOT: type.test{{.*}}!"?AUC6@@" 87 c6->f(); 88 // ITANIUM: type.test{{.*}}!"_ZTSSt2C7" 89 // MS-STD: type.test{{.*}}!"?AUC7@std@@" 90 // MS-NOSTD-NOT: type.test{{.*}}!"?AUC7@std@@" 91 c7->f(); 92 // ITANIUM: type.test{{.*}}!"_ZTSNSt2C72C8E" 93 // MS-STD: type.test{{.*}}!"?AUC8@C7@std@@" 94 // MS-NOSTD-NOT: type.test{{.*}}!"?AUC8@C7@std@@" 95 c8->f(); 96 // ITANIUM: type.test{{.*}}!"_ZTSN6stdext2C9E" 97 // MS-STD: type.test{{.*}}!"?AUC9@stdext@@" 98 // MS-NOSTD-NOT: type.test{{.*}}!"?AUC9@stdext@@" 99 c9->f(); 100 // ITANIUM: type.test{{.*}}!"_ZTSN5other3C10E" 101 // MS: type.test{{.*}}!"?AUC10@other@@" 102 c10->f(); 103 // ITANIUM: type.test{{.*}}!{{[0-9]}} 104 // MS: type.test{{.*}}!{{[0-9]}} 105 C11 *c11; 106 c11->f(); 107 } 108