80 lines
1.5 KiB
C
80 lines
1.5 KiB
C
// { 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 (); }
|