1762bb9d0ad20320b9f97a841dce57ba5e8e48b07Richard Smith// RUN: %clang_cc1 -fsyntax-only -verify %s -std=c++11
28e8fb3be5bd78f0564444eca02b404566a5f3b5dAndy Gibbs// expected-no-diagnostics
3347ba89dec89091868982434154c3508085b727aAnders Carlssonstruct T1 {
4347ba89dec89091868982434154c3508085b727aAnders Carlsson};
5347ba89dec89091868982434154c3508085b727aAnders Carlssonstatic_assert(__has_trivial_constructor(T1), "T1 has trivial constructor!");
6347ba89dec89091868982434154c3508085b727aAnders Carlsson
7347ba89dec89091868982434154c3508085b727aAnders Carlssonstruct T2 {
8347ba89dec89091868982434154c3508085b727aAnders Carlsson  T2();
9347ba89dec89091868982434154c3508085b727aAnders Carlsson};
10347ba89dec89091868982434154c3508085b727aAnders Carlssonstatic_assert(!__has_trivial_constructor(T2), "T2 has a user-declared constructor!");
11347ba89dec89091868982434154c3508085b727aAnders Carlsson
12347ba89dec89091868982434154c3508085b727aAnders Carlssonstruct T3 {
13347ba89dec89091868982434154c3508085b727aAnders Carlsson  virtual void f();
14347ba89dec89091868982434154c3508085b727aAnders Carlsson};
15347ba89dec89091868982434154c3508085b727aAnders Carlssonstatic_assert(!__has_trivial_constructor(T3), "T3 has a virtual function!");
16347ba89dec89091868982434154c3508085b727aAnders Carlsson
17347ba89dec89091868982434154c3508085b727aAnders Carlssonstruct T4 : virtual T3 {
18347ba89dec89091868982434154c3508085b727aAnders Carlsson};
19347ba89dec89091868982434154c3508085b727aAnders Carlssonstatic_assert(!__has_trivial_constructor(T4), "T4 has a virtual base class!");
20347ba89dec89091868982434154c3508085b727aAnders Carlsson
21347ba89dec89091868982434154c3508085b727aAnders Carlssonstruct T5 : T1 {
22347ba89dec89091868982434154c3508085b727aAnders Carlsson};
23347ba89dec89091868982434154c3508085b727aAnders Carlssonstatic_assert(__has_trivial_constructor(T5), "All the direct base classes of T5 have trivial constructors!");
24347ba89dec89091868982434154c3508085b727aAnders Carlsson
25347ba89dec89091868982434154c3508085b727aAnders Carlssonstruct T6 {
26347ba89dec89091868982434154c3508085b727aAnders Carlsson  T5 t5;
27347ba89dec89091868982434154c3508085b727aAnders Carlsson  T1 t1[2][2];
28347ba89dec89091868982434154c3508085b727aAnders Carlsson  static T2 t2;
29347ba89dec89091868982434154c3508085b727aAnders Carlsson};
30347ba89dec89091868982434154c3508085b727aAnders Carlssonstatic_assert(__has_trivial_constructor(T6), "All nonstatic data members of T6 have trivial constructors!");
31347ba89dec89091868982434154c3508085b727aAnders Carlsson
32347ba89dec89091868982434154c3508085b727aAnders Carlssonstruct T7 {
33347ba89dec89091868982434154c3508085b727aAnders Carlsson  T4 t4;
34347ba89dec89091868982434154c3508085b727aAnders Carlsson};
35347ba89dec89091868982434154c3508085b727aAnders Carlssonstatic_assert(!__has_trivial_constructor(T7), "t4 does not have a trivial constructor!");
36072abefcddea5fb65e435cea60921b3c21c1279dAnders Carlsson
37072abefcddea5fb65e435cea60921b3c21c1279dAnders Carlssonstruct T8 : T2 {
38072abefcddea5fb65e435cea60921b3c21c1279dAnders Carlsson};
39072abefcddea5fb65e435cea60921b3c21c1279dAnders Carlssonstatic_assert(!__has_trivial_constructor(T8), "The base class T2 does not have a trivial constructor!");
40