1*67e74705SXin Li // RUN: %clang_cc1 -fsyntax-only -verify %s -std=c++11 2*67e74705SXin Li // expected-no-diagnostics 3*67e74705SXin Li struct T1 { 4*67e74705SXin Li }; 5*67e74705SXin Li static_assert(__has_trivial_destructor(T1), "T1 has trivial destructor!"); 6*67e74705SXin Li 7*67e74705SXin Li struct T2 { 8*67e74705SXin Li ~T2(); 9*67e74705SXin Li }; 10*67e74705SXin Li static_assert(!__has_trivial_destructor(T2), "T2 has a user-declared destructor!"); 11*67e74705SXin Li 12*67e74705SXin Li struct T3 { 13*67e74705SXin Li virtual void f(); 14*67e74705SXin Li }; 15*67e74705SXin Li static_assert(__has_trivial_destructor(T3), "T3 has a virtual function (but still a trivial destructor)!"); 16*67e74705SXin Li 17*67e74705SXin Li struct T4 : virtual T3 { 18*67e74705SXin Li }; 19*67e74705SXin Li static_assert(__has_trivial_destructor(T4), "T4 has a virtual base class! (but still a trivial destructor)!"); 20*67e74705SXin Li 21*67e74705SXin Li struct T5 : T1 { 22*67e74705SXin Li }; 23*67e74705SXin Li static_assert(__has_trivial_destructor(T5), "All the direct base classes of T5 have trivial destructors!"); 24*67e74705SXin Li 25*67e74705SXin Li struct T6 { 26*67e74705SXin Li T5 t5; 27*67e74705SXin Li T1 t1[2][2]; 28*67e74705SXin Li static T2 t2; 29*67e74705SXin Li }; 30*67e74705SXin Li static_assert(__has_trivial_destructor(T6), "All nonstatic data members of T6 have trivial destructors!"); 31*67e74705SXin Li 32*67e74705SXin Li struct T7 { 33*67e74705SXin Li T2 t2; 34*67e74705SXin Li }; 35*67e74705SXin Li static_assert(!__has_trivial_destructor(T7), "t2 does not have a trivial destructor!"); 36*67e74705SXin Li 37*67e74705SXin Li struct T8 : T2 { 38*67e74705SXin Li }; 39*67e74705SXin Li static_assert(!__has_trivial_destructor(T8), "The base class T2 does not have a trivial destructor!"); 40