TestTrivialDtor.cpp (1396B)
1 #define MOZ_TRIVIAL_DTOR __attribute__((annotate("moz_trivial_dtor"))) 2 3 struct MOZ_TRIVIAL_DTOR EmptyClass{}; 4 5 template <class T> 6 struct MOZ_TRIVIAL_DTOR TemplateEmptyClass{}; 7 8 struct MOZ_TRIVIAL_DTOR NonEmptyClass { 9 void *m; 10 }; 11 12 template <class T> 13 struct MOZ_TRIVIAL_DTOR TemplateNonEmptyClass { 14 T* m; 15 }; 16 17 struct MOZ_TRIVIAL_DTOR BadUserDefinedDtor { // expected-error {{class 'BadUserDefinedDtor' must have a trivial destructor}} 18 ~BadUserDefinedDtor() {} 19 }; 20 21 struct MOZ_TRIVIAL_DTOR BadVirtualDtor { // expected-error {{class 'BadVirtualDtor' must have a trivial destructor}} 22 virtual ~BadVirtualDtor() {} 23 }; 24 25 struct MOZ_TRIVIAL_DTOR OkVirtualMember { 26 virtual void f(); 27 }; 28 29 void foo(); 30 struct MOZ_TRIVIAL_DTOR BadNonEmptyCtorDtor { // expected-error {{class 'BadNonEmptyCtorDtor' must have a trivial destructor}} 31 BadNonEmptyCtorDtor() { foo(); } 32 ~BadNonEmptyCtorDtor() { foo(); } 33 }; 34 35 struct NonTrivialDtor { 36 ~NonTrivialDtor() { foo(); } 37 }; 38 39 struct VirtualMember { 40 virtual void f(); 41 }; 42 43 struct MOZ_TRIVIAL_DTOR BadNonTrivialDtorInBase : NonTrivialDtor { // expected-error {{class 'BadNonTrivialDtorInBase' must have a trivial destructor}} 44 }; 45 46 struct MOZ_TRIVIAL_DTOR BadNonTrivialDtorInMember { // expected-error {{class 'BadNonTrivialDtorInMember' must have a trivial destructor}} 47 NonTrivialDtor m; 48 }; 49 50 struct MOZ_TRIVIAL_DTOR OkVirtualMemberInMember { 51 VirtualMember m; 52 };