blob: e2460d99bd0580bfc882ada43cf025681c4eaffb [file] [log] [blame]
// { dg-do assemble }
// g++ 1.37.1 bug 900514_03
// g++ fails to flag ERRORs on the following erroneous code.
// In Section 12.3.2 it says "Defining conversion by both a constructor and
// a conversion function can lead to ambiguities." However in the case below,
// the explicit cast syntax disambiguates the constructor as one which
// invokes the type conversion operator rather than the conversion.
// NO, IT DOESN'T. It's still ambiguous. --jason 2002-12-03
// cfront 2.0 passes this test.
// keywords: user-defined type conversion operator, constructor
struct t_0_st_0;
struct t_0_st_1 { // { dg-message "initializing" }
int member;
t_0_st_1 (t_0_st_0&);// { dg-message "note" }
t_0_st_1 ();
};
struct t_0_st_0 {
int member;
operator t_0_st_1 ();// { dg-message "note" }
};
t_0_st_0 t_0_st_0_obj0; // { dg-message "candidate" }
void t_0_assignment ()
{
t_0_st_1 t_0_st_1_obj0;
t_0_st_1 t_0_st_1_obj1;
t_0_st_1 t_0_st_1_obj2;
t_0_st_1_obj0 = t_0_st_0_obj0; // { dg-error "ambiguous" } caught
t_0_st_1_obj1 = t_0_st_1 (t_0_st_0_obj0);
}
void t_0_local_init ()
{
t_0_st_1 t_0_st_1_obj0 = t_0_st_0_obj0; // { dg-error "ambiguous" }
t_0_st_1 t_0_st_1_obj1 = t_0_st_1 (t_0_st_0_obj0);
}
struct t_1_st_0;
struct t_1_st_1 {
int member;
t_1_st_1 (t_1_st_0&); // { dg-message "note" }
t_1_st_1 ();
void operator= (t_1_st_1&); // { dg-message "operator=|no known conversion" }
};
struct t_1_st_0 {
int member;
operator t_1_st_1 (); // { dg-message "note" }
};
t_1_st_0 t_1_st_0_obj0; // { dg-message "candidate" }
void t_1_assignment ()
{
t_1_st_1 t_1_st_1_obj0;
t_1_st_1 t_1_st_1_obj1;
t_1_st_1 t_1_st_1_obj2;
t_1_st_1_obj0 = t_1_st_0_obj0; // { dg-error "no match" }
// { dg-message "candidate" "candidate note" { target *-*-* } 74 }
t_1_st_1_obj1 = t_1_st_1 (t_1_st_0_obj0); // { dg-error "no match" }
// { dg-message "candidate" "candidate note" { target *-*-* } 76 }
}
void t_1_local_init ()
{
t_1_st_1 t_1_st_1_obj0 = t_1_st_0_obj0; // { dg-error "ambiguous" }
t_1_st_1 t_1_st_1_obj1 = t_1_st_1 (t_1_st_0_obj0);
}
struct t_2_st_0;
struct t_2_st_1 { // { dg-message "initializing" }
int member;
t_2_st_1 (t_2_st_0); // { dg-message "note" }
t_2_st_1 ();
};
struct t_2_st_0 {
int member;
operator t_2_st_1 (); // { dg-message "note" }
};
t_2_st_0 t_2_st_0_obj0; // { dg-message "candidate" }
void t_2_assignment ()
{
t_2_st_1 t_2_st_1_obj0;
t_2_st_1 t_2_st_1_obj1;
t_2_st_1 t_2_st_1_obj2;
t_2_st_1_obj0 = t_2_st_0_obj0; // { dg-error "ambiguous" } caught
t_2_st_1_obj1 = t_2_st_1 (t_2_st_0_obj0);
}
void t_2_local_init ()
{
t_2_st_1 t_2_st_1_obj0 = t_2_st_0_obj0; // { dg-error "ambiguous" }
t_2_st_1 t_2_st_1_obj1 = t_2_st_1 (t_2_st_0_obj0);
}