1 // RUN: %clang_cc1 -emit-llvm -triple i686-windows-itanium -fdeclspec %s -o - | FileCheck %s 2 3 #define JOIN2(x, y) x##y 4 #define JOIN(x, y) JOIN2(x, y) 5 #define UNIQ(name) JOIN(name, __LINE__) 6 #define USEMEMFUNC(class, func) void (class::*UNIQ(use)())() { return &class::func; } 7 8 struct __declspec(dllexport) s { f()9 void f() {} 10 }; 11 12 // CHECK: define {{.*}} dllexport {{.*}} @_ZN1saSERKS_ 13 // CHECK: define {{.*}} dllexport {{.*}} @_ZN1s1fEv 14 15 template <class T> 16 class c { f()17 void f() {} 18 }; 19 20 template class __declspec(dllexport) c<int>; 21 22 // CHECK: define {{.*}} dllexport {{.*}} @_ZN1cIiEaSERKS0_ 23 // CHECK: define {{.*}} dllexport {{.*}} @_ZN1cIiE1fEv 24 25 extern template class c<char>; 26 template class __declspec(dllexport) c<char>; 27 28 // CHECK: define {{.*}} dllexport {{.*}} @_ZN1cIcEaSERKS0_ 29 // CHECK: define {{.*}} dllexport {{.*}} @_ZN1cIcE1fEv 30 31 c<double> g; 32 template class __declspec(dllexport) c<double>; 33 34 // CHECK: define {{.*}} dllexport {{.*}} @_ZN1cIdEaSERKS0_ 35 // CHECK: define {{.*}} dllexport {{.*}} @_ZN1cIdE1fEv 36 37 template <class T> 38 struct outer { fouter39 void f() {} 40 struct inner { fouter::inner41 void f() {} 42 }; 43 }; 44 45 template class __declspec(dllexport) outer<int>; 46 47 // CHECK: define {{.*}} dllexport {{.*}} @_ZN5outerIiE1fEv 48 // CHECK-NOT: define {{.*}} dllexport {{.*}} @_ZN5outerIiE5inner1fEv 49 50 extern template class __declspec(dllimport) outer<char>; 51 USEMEMFUNC(outer<char>, f) 52 USEMEMFUNC(outer<char>::inner, f) 53 54 // CHECK: declare dllimport {{.*}} @_ZN5outerIcE1fEv 55 // CHECK: define {{.*}} @_ZN5outerIcE5inner1fEv 56