tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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