Bug 1814798 - pt 1. Add bool to enable/disable PHC at runtime r=glandium
[gecko.git] / build / clang-plugin / tests / TestNonTrivialTypeInFfi.cpp
blobe491122b991a2b73a75b32b8e44f7450684017e4
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"
7 struct Opaque;
8 struct Trivial {
9 int foo;
10 char bar;
11 Opaque* baz;
14 template <typename T>
15 struct TrivialT {
16 int foo;
17 char bar;
18 T* baz;
21 struct NonTrivial {
22 ~NonTrivial() {
25 Opaque* ptr;
28 template <typename T>
29 struct NonTrivialT {
30 ~NonTrivialT() {
31 delete ptr;
34 T* ptr;
37 struct TransitivelyNonTrivial {
38 NonTrivial nontrivial;
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}}
47 extern "C" NonTrivial* Foo5();
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();
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}}
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}}
63 template struct TrivialT<int>;
65 #pragma GCC diagnostic pop