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