1*c87b03e5Sespie // Copyright (C) 1999 Free Software Foundation, Inc.
2*c87b03e5Sespie // Contributed by Nathan Sidwell 20 May 1999 <nathan@acm.org>
3*c87b03e5Sespie 
4*c87b03e5Sespie // Although anon unions cannot have user defined member functions
5*c87b03e5Sespie // [class.union/2].  They should have implicitly defined copy ctors and
6*c87b03e5Sespie // and the like [class.copy/4].  Make sure we generate one of the correct
7*c87b03e5Sespie // signature and that it works ok.
8*c87b03e5Sespie 
9*c87b03e5Sespie extern "C" void abort();
10*c87b03e5Sespie 
11*c87b03e5Sespie struct A
12*c87b03e5Sespie {
13*c87b03e5Sespie   union
14*c87b03e5Sespie   {
15*c87b03e5Sespie     int a;
16*c87b03e5Sespie   };
17*c87b03e5Sespie };
18*c87b03e5Sespie union B
19*c87b03e5Sespie {
20*c87b03e5Sespie   int a;
21*c87b03e5Sespie };
22*c87b03e5Sespie 
Ctor(A const & src)23*c87b03e5Sespie static A Ctor(A const &src)
24*c87b03e5Sespie {
25*c87b03e5Sespie   A result(src);  // this should not cause a const violation
26*c87b03e5Sespie 
27*c87b03e5Sespie   result = src;   // and neither should this
28*c87b03e5Sespie 
29*c87b03e5Sespie   return result;
30*c87b03e5Sespie }
31*c87b03e5Sespie 
32*c87b03e5Sespie typedef __SIZE_TYPE__ size_t;
33*c87b03e5Sespie 
new(size_t,void * ptr)34*c87b03e5Sespie void *operator new(size_t, void *ptr)
35*c87b03e5Sespie {
36*c87b03e5Sespie   return ptr;
37*c87b03e5Sespie }
38*c87b03e5Sespie 
39*c87b03e5Sespie // check copy ctor and assignment for plain union
check_union()40*c87b03e5Sespie void check_union()
41*c87b03e5Sespie {
42*c87b03e5Sespie   B b1;
43*c87b03e5Sespie   B b2;
44*c87b03e5Sespie 
45*c87b03e5Sespie   b1.a = 5;
46*c87b03e5Sespie   b2.a = 6;
47*c87b03e5Sespie   b2 = b1;
48*c87b03e5Sespie   if(b2.a != 5)
49*c87b03e5Sespie     abort();
50*c87b03e5Sespie 
51*c87b03e5Sespie   b2.a = 6;
52*c87b03e5Sespie   new (&b2) B(b1);
53*c87b03e5Sespie   if(b2.a != 5)
54*c87b03e5Sespie     abort();
55*c87b03e5Sespie 
56*c87b03e5Sespie   return;
57*c87b03e5Sespie }
58*c87b03e5Sespie 
59*c87b03e5Sespie // check copy ctor and assignment for class containing anon-union
check_union_member()60*c87b03e5Sespie void check_union_member()
61*c87b03e5Sespie {
62*c87b03e5Sespie   A a1;
63*c87b03e5Sespie   A a2;
64*c87b03e5Sespie 
65*c87b03e5Sespie   a1.a = 5;
66*c87b03e5Sespie   a2.a = 6;
67*c87b03e5Sespie   a2 = a1;
68*c87b03e5Sespie   if(a2.a != 5)
69*c87b03e5Sespie     abort();
70*c87b03e5Sespie 
71*c87b03e5Sespie   a2.a = 6;
72*c87b03e5Sespie   new (&a2) A(a1);
73*c87b03e5Sespie   if(a2.a != 5)
74*c87b03e5Sespie     abort();
75*c87b03e5Sespie 
76*c87b03e5Sespie   return;
77*c87b03e5Sespie }
78*c87b03e5Sespie 
main()79*c87b03e5Sespie int main()
80*c87b03e5Sespie {
81*c87b03e5Sespie   check_union();
82*c87b03e5Sespie   check_union_member();
83*c87b03e5Sespie 
84*c87b03e5Sespie   return 0;
85*c87b03e5Sespie }
86