xref: /aosp_15_r20/external/clang/test/Parser/cxx-member-initializers.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s
2*67e74705SXin Li 
3*67e74705SXin Li struct x {
4*67e74705SXin Li   x() : a(4) ; // expected-error {{expected '{'}}
5*67e74705SXin Li };
6*67e74705SXin Li 
7*67e74705SXin Li struct y {
8*67e74705SXin Li   int a;
9*67e74705SXin Li   y() : a(4) ; // expected-error {{expected '{'}}
10*67e74705SXin Li };
11*67e74705SXin Li 
12*67e74705SXin Li struct z {
13*67e74705SXin Li   int a;
14*67e74705SXin Li   z() : a {}
15*67e74705SXin Li }; // expected-error {{expected '{'}}
16*67e74705SXin Li 
17*67e74705SXin Li namespace PR16480 {
18*67e74705SXin Li   template<int n> struct X {
19*67e74705SXin Li     X();
20*67e74705SXin Li     X(int);
21*67e74705SXin Li   };
22*67e74705SXin Li 
23*67e74705SXin Li   struct A : X<0> {
APR16480::A24*67e74705SXin Li     A() : X<a<b>{0}.n>() {}
25*67e74705SXin Li 
26*67e74705SXin Li     template<int> struct a {
27*67e74705SXin Li       int n;
28*67e74705SXin Li     };
29*67e74705SXin Li 
30*67e74705SXin Li     static const int b = 1;
31*67e74705SXin Li   };
32*67e74705SXin Li 
33*67e74705SXin Li   struct B : X<0> {
BPR16480::B34*67e74705SXin Li     B() : X<a<b>{0} {}
35*67e74705SXin Li 
36*67e74705SXin Li     static const int a = 0, b = 0;
37*67e74705SXin Li   };
38*67e74705SXin Li 
39*67e74705SXin Li   template<int> struct a {
aPR16480::a40*67e74705SXin Li     constexpr a(int) {}
operator intPR16480::a41*67e74705SXin Li     constexpr operator int() const { return 0; }
42*67e74705SXin Li   };
43*67e74705SXin Li 
44*67e74705SXin Li   struct C : X<0> {
CPR16480::C45*67e74705SXin Li     C() : X<a<b>(0)>() {}
46*67e74705SXin Li 
47*67e74705SXin Li     static const int b = 0;
48*67e74705SXin Li   };
49*67e74705SXin Li 
50*67e74705SXin Li   struct D : X<0> {
DPR16480::D51*67e74705SXin Li     D() : X<a<b>(0) {}
52*67e74705SXin Li 
53*67e74705SXin Li     static const int a = 0, b = 0;
54*67e74705SXin Li   };
55*67e74705SXin Li 
56*67e74705SXin Li   template<typename T> struct E : X<0> {
EPR16480::E57*67e74705SXin Li     E(X<0>) : X<(0)>{} {}
EPR16480::E58*67e74705SXin Li     E(X<1>) : X<int{}>{} {}
EPR16480::E59*67e74705SXin Li     E(X<2>) : X<(0)>() {}
EPR16480::E60*67e74705SXin Li     E(X<3>) : X<int{}>() {}
61*67e74705SXin Li   };
62*67e74705SXin Li 
63*67e74705SXin Li   // FIXME: This should be valid in the union of C99 and C++11.
64*67e74705SXin Li   struct F : X<0> {
FPR16480::F65*67e74705SXin Li     F() : X<A<T>().n + (T){}.n>{} {} // expected-error +{{}}
66*67e74705SXin Li 
67*67e74705SXin Li     struct T { int n; };
68*67e74705SXin Li     template<typename> struct A { int n; };
69*67e74705SXin Li   };
70*67e74705SXin Li 
71*67e74705SXin Li   // FIXME: This is valid now, but may be made ill-formed by DR1607.
72*67e74705SXin Li   struct G : X<0> {
__anonda669e730302PR16480::G73*67e74705SXin Li     G() : X<0 && [](){return 0;}()>{} // expected-error +{{}}
74*67e74705SXin Li   };
75*67e74705SXin Li 
76*67e74705SXin Li   struct Errs : X<0> {
ErrsPR16480::Errs77*67e74705SXin Li     Errs(X<0>) : decltype X<0>() {} // expected-error {{expected '(' after 'decltype'}}
ErrsPR16480::Errs78*67e74705SXin Li     Errs(X<1>) : what is this () {} // expected-error {{expected '(' or '{'}}
79*67e74705SXin Li     Errs(X<2>) : decltype(X<0> // expected-note {{to match this '('}}
80*67e74705SXin Li   }; // expected-error {{expected ')'}}
81*67e74705SXin Li }
82*67e74705SXin Li 
83*67e74705SXin Li template <class U, class V> struct C {
84*67e74705SXin Li   int f() { return 4; }
85*67e74705SXin Li   class C1 {};
86*67e74705SXin Li };
87*67e74705SXin Li 
88*67e74705SXin Li class D {};
89*67e74705SXin Li namespace N {
90*67e74705SXin Li struct E {
91*67e74705SXin Li   class F {};
92*67e74705SXin Li };
93*67e74705SXin Li }
94*67e74705SXin Li 
95*67e74705SXin Li class G {
96*67e74705SXin Li   // These are all valid:
97*67e74705SXin Li   void f(int x = C<int, D>().f()) {}
98*67e74705SXin Li   void g(int x = C<int, ::D>().f()) {}
99*67e74705SXin Li   void h(int x = C<int, N::E>().f()) {}
100*67e74705SXin Li   void i(int x = C<int, ::N::E>().f()) {}
101*67e74705SXin Li   void j(int x = C<int, decltype(N::E())::F>().f()) {}
102*67e74705SXin Li   void k(int x = C<int, C<int, int>>().f()) {}
103*67e74705SXin Li   void l(int x = C<int, C<int, int>::C1>().f()) {}
104*67e74705SXin Li 
105*67e74705SXin Li   // This isn't, but it shouldn't crash. The diagnostics don't matter much.
106*67e74705SXin Li   void m(int x = C<int, union int>().f()) {} // expected-error {{declaration of anonymous union must be a definition}} expected-error {{expected a type}}
107*67e74705SXin Li };
108