| // { dg-do run } |
| // g++ 1.37.1 bug 900520_06 |
| |
| // When an object of a class type is passed into a formal parameter of the |
| // same class type (in a function call) the language definition calls for |
| // this action to be treated like any other form of an initialization of |
| // an object of the given class type. |
| |
| // g++ fails however to invoke the (compiler-supplied) copy constructor for |
| // the class type when a parameter of the class type is passed as an |
| // actual parameter. |
| |
| // This causes the following program to exit with a nonzero exit status. |
| |
| // cfront 2.0 passes this test. |
| |
| int base_copy_ctor_called = 0; |
| int member_copy_ctor_called = 0; |
| |
| struct struct_0 { |
| struct_0 (); |
| struct_0 (const struct_0&); |
| }; |
| |
| struct_0::struct_0 () |
| { |
| } |
| |
| struct_0::struct_0 (const struct_0&) |
| { |
| base_copy_ctor_called++; |
| } |
| |
| struct struct_1 { |
| struct_1 (); |
| struct_1 (const struct_1&); |
| }; |
| |
| struct_1::struct_1 () |
| { |
| } |
| |
| struct_1::struct_1 (const struct_1&) |
| { |
| member_copy_ctor_called++; |
| } |
| |
| struct struct_2 : public struct_0 { |
| struct_2 (); |
| struct_1 struct_1_member; |
| #ifdef MAKE_COPY_CONSTRUCTOR_EXPLICIT |
| struct_2 (const struct_2&); |
| #endif |
| }; |
| |
| struct_2::struct_2 () |
| { |
| } |
| |
| #ifdef MAKE_COPY_CONSTRUCTOR_EXPLICIT |
| struct_2::struct_2 (const struct_2& arg) : |
| struct_0 ((struct_0&)arg), |
| struct_1_member (arg.struct_1_member) |
| { |
| } |
| #endif |
| |
| void take_struct_2 (struct_2 arg) |
| { |
| } |
| |
| int test () |
| { |
| struct_2 struct_2_object0; |
| take_struct_2 (struct_2_object0); |
| return (base_copy_ctor_called != 1 || member_copy_ctor_called != 1); |
| } |
| |
| int main () { return test (); } |