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_constructor(T1), "T1 has trivial constructor!"); 6*67e74705SXin Li 7*67e74705SXin Li struct T2 { 8*67e74705SXin Li T2(); 9*67e74705SXin Li }; 10*67e74705SXin Li static_assert(!__has_trivial_constructor(T2), "T2 has a user-declared constructor!"); 11*67e74705SXin Li 12*67e74705SXin Li struct T3 { 13*67e74705SXin Li virtual void f(); 14*67e74705SXin Li }; 15*67e74705SXin Li static_assert(!__has_trivial_constructor(T3), "T3 has a virtual function!"); 16*67e74705SXin Li 17*67e74705SXin Li struct T4 : virtual T3 { 18*67e74705SXin Li }; 19*67e74705SXin Li static_assert(!__has_trivial_constructor(T4), "T4 has a virtual base class!"); 20*67e74705SXin Li 21*67e74705SXin Li struct T5 : T1 { 22*67e74705SXin Li }; 23*67e74705SXin Li static_assert(__has_trivial_constructor(T5), "All the direct base classes of T5 have trivial constructors!"); 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_constructor(T6), "All nonstatic data members of T6 have trivial constructors!"); 31*67e74705SXin Li 32*67e74705SXin Li struct T7 { 33*67e74705SXin Li T4 t4; 34*67e74705SXin Li }; 35*67e74705SXin Li static_assert(!__has_trivial_constructor(T7), "t4 does not have a trivial constructor!"); 36*67e74705SXin Li 37*67e74705SXin Li struct T8 : T2 { 38*67e74705SXin Li }; 39*67e74705SXin Li static_assert(!__has_trivial_constructor(T8), "The base class T2 does not have a trivial constructor!"); 40