1762bb9d0ad20320b9f97a841dce57ba5e8e48b07Richard Smith// RUN: %clang_cc1 -fsyntax-only -verify %s -std=c++11 28e8fb3be5bd78f0564444eca02b404566a5f3b5dAndy Gibbs// expected-no-diagnostics 3072abefcddea5fb65e435cea60921b3c21c1279dAnders Carlssonstruct T1 { 4072abefcddea5fb65e435cea60921b3c21c1279dAnders Carlsson}; 5072abefcddea5fb65e435cea60921b3c21c1279dAnders Carlssonstatic_assert(__has_trivial_destructor(T1), "T1 has trivial destructor!"); 6072abefcddea5fb65e435cea60921b3c21c1279dAnders Carlsson 7072abefcddea5fb65e435cea60921b3c21c1279dAnders Carlssonstruct T2 { 8072abefcddea5fb65e435cea60921b3c21c1279dAnders Carlsson ~T2(); 9072abefcddea5fb65e435cea60921b3c21c1279dAnders Carlsson}; 10072abefcddea5fb65e435cea60921b3c21c1279dAnders Carlssonstatic_assert(!__has_trivial_destructor(T2), "T2 has a user-declared destructor!"); 11072abefcddea5fb65e435cea60921b3c21c1279dAnders Carlsson 12072abefcddea5fb65e435cea60921b3c21c1279dAnders Carlssonstruct T3 { 13072abefcddea5fb65e435cea60921b3c21c1279dAnders Carlsson virtual void f(); 14072abefcddea5fb65e435cea60921b3c21c1279dAnders Carlsson}; 15072abefcddea5fb65e435cea60921b3c21c1279dAnders Carlssonstatic_assert(__has_trivial_destructor(T3), "T3 has a virtual function (but still a trivial destructor)!"); 16072abefcddea5fb65e435cea60921b3c21c1279dAnders Carlsson 17072abefcddea5fb65e435cea60921b3c21c1279dAnders Carlssonstruct T4 : virtual T3 { 18072abefcddea5fb65e435cea60921b3c21c1279dAnders Carlsson}; 19072abefcddea5fb65e435cea60921b3c21c1279dAnders Carlssonstatic_assert(__has_trivial_destructor(T4), "T4 has a virtual base class! (but still a trivial destructor)!"); 20072abefcddea5fb65e435cea60921b3c21c1279dAnders Carlsson 21072abefcddea5fb65e435cea60921b3c21c1279dAnders Carlssonstruct T5 : T1 { 22072abefcddea5fb65e435cea60921b3c21c1279dAnders Carlsson}; 23072abefcddea5fb65e435cea60921b3c21c1279dAnders Carlssonstatic_assert(__has_trivial_destructor(T5), "All the direct base classes of T5 have trivial destructors!"); 24072abefcddea5fb65e435cea60921b3c21c1279dAnders Carlsson 25072abefcddea5fb65e435cea60921b3c21c1279dAnders Carlssonstruct T6 { 26072abefcddea5fb65e435cea60921b3c21c1279dAnders Carlsson T5 t5; 27072abefcddea5fb65e435cea60921b3c21c1279dAnders Carlsson T1 t1[2][2]; 28072abefcddea5fb65e435cea60921b3c21c1279dAnders Carlsson static T2 t2; 29072abefcddea5fb65e435cea60921b3c21c1279dAnders Carlsson}; 30072abefcddea5fb65e435cea60921b3c21c1279dAnders Carlssonstatic_assert(__has_trivial_destructor(T6), "All nonstatic data members of T6 have trivial destructors!"); 31072abefcddea5fb65e435cea60921b3c21c1279dAnders Carlsson 32072abefcddea5fb65e435cea60921b3c21c1279dAnders Carlssonstruct T7 { 33072abefcddea5fb65e435cea60921b3c21c1279dAnders Carlsson T2 t2; 34072abefcddea5fb65e435cea60921b3c21c1279dAnders Carlsson}; 35072abefcddea5fb65e435cea60921b3c21c1279dAnders Carlssonstatic_assert(!__has_trivial_destructor(T7), "t2 does not have a trivial destructor!"); 36072abefcddea5fb65e435cea60921b3c21c1279dAnders Carlsson 37072abefcddea5fb65e435cea60921b3c21c1279dAnders Carlssonstruct T8 : T2 { 38072abefcddea5fb65e435cea60921b3c21c1279dAnders Carlsson}; 39072abefcddea5fb65e435cea60921b3c21c1279dAnders Carlssonstatic_assert(!__has_trivial_destructor(T8), "The base class T2 does not have a trivial destructor!"); 40