TestNonTrivialTypeInFfi.cpp (3057B)
1 // clang warns for some of these on its own, but we're not testing that, plus 2 // some of them (TrivialT<int>) is a false positive (clang doesn't realize the 3 // type is fully specialized below). 4 #pragma GCC diagnostic push 5 #pragma GCC diagnostic ignored "-Wreturn-type-c-linkage" 6 7 struct Opaque; 8 struct Trivial { 9 int foo; 10 char bar; 11 Opaque* baz; 12 }; 13 14 template <typename T> 15 struct TrivialT { 16 int foo; 17 char bar; 18 T* baz; 19 }; 20 21 struct NonTrivial { 22 ~NonTrivial() { 23 } 24 25 Opaque* ptr; 26 }; 27 28 template <typename T> 29 struct NonTrivialT { 30 ~NonTrivialT() { 31 delete ptr; 32 } 33 34 T* ptr; 35 }; 36 37 struct TransitivelyNonTrivial { 38 NonTrivial nontrivial; 39 }; 40 41 extern "C" void Foo(); 42 extern "C" Trivial Foo1(); 43 extern "C" NonTrivial Foo2(); // expected-error {{Type 'NonTrivial' must not be used as return type of extern "C" function}} expected-note {{Please consider using a pointer or reference instead}} 44 extern "C" NonTrivialT<int> Foo3(); // expected-error {{Type 'NonTrivialT<int>' must not be used as return type of extern "C" function}} expected-note {{Please consider using a pointer or reference, or explicitly instantiating the template instead}} 45 extern "C" NonTrivialT<float> Foo4(); // expected-error {{Type 'NonTrivialT<float>' must not be used as return type of extern "C" function}} expected-note {{Please consider using a pointer or reference, or explicitly instantiating the template instead}} 46 47 extern "C" NonTrivial* Foo5(); 48 49 extern "C" TrivialT<int> Foo6(); 50 extern "C" TrivialT<float> Foo7(); // expected-error {{Type 'TrivialT<float>' must not be used as return type of extern "C" function}} expected-note {{Please consider using a pointer or reference, or explicitly instantiating the template instead}} 51 extern "C" Trivial* Foo8(); 52 53 extern "C" void Foo9(Trivial); 54 extern "C" void Foo10(NonTrivial); // expected-error {{Type 'NonTrivial' must not be used as parameter to extern "C" function}} expected-note {{Please consider using a pointer or reference instead}} 55 extern "C" void Foo11(NonTrivial*); 56 extern "C" void Foo12(NonTrivialT<int>); // expected-error {{Type 'NonTrivialT<int>' must not be used as parameter to extern "C" function}} expected-note {{Please consider using a pointer or reference, or explicitly instantiating the template instead}} 57 extern "C" void Foo13(TrivialT<int>); 58 extern "C" void Foo14(TrivialT<float>); // expected-error {{Type 'TrivialT<float>' must not be used as parameter to extern "C" function}} expected-note {{Please consider using a pointer or reference, or explicitly instantiating the template instead}} 59 60 extern "C" TransitivelyNonTrivial Foo15(); // expected-error {{Type 'TransitivelyNonTrivial' must not be used as return type of extern "C" function}} expected-note {{Please consider using a pointer or reference instead}} 61 extern "C" void Foo16(TransitivelyNonTrivial); // expected-error {{Type 'TransitivelyNonTrivial' must not be used as parameter to extern "C" function}} expected-note {{Please consider using a pointer or reference instead}} 62 63 template struct TrivialT<int>; 64 65 #pragma GCC diagnostic pop