52 lines · cpp
1// RUN: %clang_cc1 -emit-llvm -triple i686-mingw32 %s -o - | FileCheck %s2// RUN: %clang_cc1 -emit-llvm -triple x86_64-w64-mingw32 %s -o - | FileCheck %s3// RUN: %clang_cc1 -emit-llvm -triple i686-pc-cygwin %s -o - | FileCheck %s4// RUN: %clang_cc1 -emit-llvm -triple x86_64-pc-cygwin %s -o - | FileCheck %s5 6#define JOIN2(x, y) x##y7#define JOIN(x, y) JOIN2(x, y)8#define UNIQ(name) JOIN(name, __LINE__)9#define USEMEMFUNC(class, func) void (class::*UNIQ(use)())() { return &class::func; }10 11template <class T>12class c {13 void f() {}14};15 16template class __declspec(dllexport) c<int>;17 18// CHECK: define {{.*}} dllexport {{.*}} @_ZN1cIiE1fEv19 20extern template class __declspec(dllexport) c<char>;21template class c<char>;22 23// CHECK: define {{.*}} dllexport {{.*}} @_ZN1cIcE1fEv24 25extern template class c<double>;26template class __declspec(dllexport) c<double>;27 28// CHECK-NOT: define {{.*}} dllexport {{.*}} @_ZN1cIdE1fEv29 30template <class T>31struct outer {32 void f();33 struct inner {34 void f();35 };36};37 38template <class T> void outer<T>::f() {}39template <class T> void outer<T>::inner::f() {}40 41template class __declspec(dllexport) outer<int>;42 43// CHECK: define {{.*}} dllexport {{.*}} @_ZN5outerIiE1fEv44// CHECK-NOT: define {{.*}} dllexport {{.*}} @_ZN5outerIiE5inner1fEv45 46extern template class __declspec(dllimport) outer<char>;47USEMEMFUNC(outer<char>, f)48USEMEMFUNC(outer<char>::inner, f)49 50// CHECK: declare dllimport {{.*}} @_ZN5outerIcE1fEv51// CHECK: define {{.*}} @_ZN5outerIcE5inner1fEv52