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*c87b03e5Sespiestatic 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*c87b03e5Sespievoid *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*c87b03e5Sespievoid 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*c87b03e5Sespievoid 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*c87b03e5Sespieint main() 80*c87b03e5Sespie { 81*c87b03e5Sespie check_union(); 82*c87b03e5Sespie check_union_member(); 83*c87b03e5Sespie 84*c87b03e5Sespie return 0; 85*c87b03e5Sespie } 86