From: Jason Merrill Date: Thu, 15 May 2003 22:25:51 +0000 (-0400) Subject: re PR c++/5388 (Incorrect message "operands to ?: have different types") X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=9cefd2cac4d33953331ee31b96553e0baca0d898;p=gcc.git re PR c++/5388 (Incorrect message "operands to ?: have different types") PR c++/5388 * call.c (conditional_conversion): Don't consider implicit conversions if T2 is a base of T1. * cp-tree.h (DERIVED_FROM_P, UNIQUELY_DERIVED_FROM_P): Make boolean. (ACCESSIBLY_UNIQUELY_DERIVED_P, PUBLICLY_UNIQUELY_DERIVED_P): Likewise. * parser.c (cp_parser_primary_expression): Convert a static data member from reference. From-SVN: r66844 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 8e8d3e9a76a..403c7fede1d 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,14 @@ +2003-05-15 Jason Merrill + + PR c++/5388 + * call.c (conditional_conversion): Don't consider implicit + conversions if T2 is a base of T1. + * cp-tree.h (DERIVED_FROM_P, UNIQUELY_DERIVED_FROM_P): Make boolean. + (ACCESSIBLY_UNIQUELY_DERIVED_P, PUBLICLY_UNIQUELY_DERIVED_P): Likewise. + + * parser.c (cp_parser_primary_expression): Convert a static data + member from reference. + 2003-05-15 Mark Mitchell * call.c (build_op_delete_call): Avoid creating unnecessary types. @@ -98,10 +109,10 @@ 2003-05-07 Richard Henderson - PR c++/10570 - * cfns.gperf: Comment out POSIX thread cancellation points, - plus abort and raise. - * cfns.h: Regenerate. + PR c++/10570 + * cfns.gperf: Comment out POSIX thread cancellation points, + plus abort and raise. + * cfns.h: Regenerate. 2003-05-07 Jason Merrill diff --git a/gcc/cp/call.c b/gcc/cp/call.c index 1d40e425107..d40a60cc7a1 100644 --- a/gcc/cp/call.c +++ b/gcc/cp/call.c @@ -3161,6 +3161,7 @@ conditional_conversion (tree e1, tree e2) tree t1 = non_reference (TREE_TYPE (e1)); tree t2 = non_reference (TREE_TYPE (e2)); tree conv; + bool good_base; /* [expr.cond] @@ -3192,10 +3193,9 @@ conditional_conversion (tree e1, tree e2) FIXME we can't express an rvalue that refers to the original object; we have to create a new one. */ if (CLASS_TYPE_P (t1) && CLASS_TYPE_P (t2) - && same_or_base_type_p (TYPE_MAIN_VARIANT (t2), - TYPE_MAIN_VARIANT (t1))) + && ((good_base = DERIVED_FROM_P (t2, t1)) || DERIVED_FROM_P (t1, t2))) { - if (at_least_as_qualified_p (t2, t1)) + if (good_base && at_least_as_qualified_p (t2, t1)) { conv = build1 (IDENTITY_CONV, t1, e1); if (!same_type_p (TYPE_MAIN_VARIANT (t1), @@ -3211,13 +3211,13 @@ conditional_conversion (tree e1, tree e2) else return NULL_TREE; } + else + /* [expr.cond] - /* [expr.cond] - - E1 can be converted to match E2 if E1 can be implicitly converted - to the type that expression E2 would have if E2 were converted to - an rvalue (or the type it has, if E2 is an rvalue). */ - return implicit_conversion (t2, t1, e1, LOOKUP_NORMAL); + Otherwise: E1 can be converted to match E2 if E1 can be implicitly + converted to the type that expression E2 would have if E2 were + converted to an rvalue (or the type it has, if E2 is an rvalue). */ + return implicit_conversion (t2, t1, e1, LOOKUP_NORMAL); } /* Implement [expr.cond]. ARG1, ARG2, and ARG3 are the three diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h index 78568edec2b..6bb2e0ddc51 100644 --- a/gcc/cp/cp-tree.h +++ b/gcc/cp/cp-tree.h @@ -992,18 +992,19 @@ enum languages { lang_c, lang_cplusplus, lang_java }; /* Nonzero iff TYPE is derived from PARENT. Ignores accessibility and ambiguity issues. */ #define DERIVED_FROM_P(PARENT, TYPE) \ - lookup_base ((TYPE), PARENT, ba_any, NULL) + (lookup_base ((TYPE), PARENT, ba_any, NULL) != NULL_TREE) /* Nonzero iff TYPE is uniquely derived from PARENT. Ignores accessibility. */ #define UNIQUELY_DERIVED_FROM_P(PARENT, TYPE) \ - lookup_base ((TYPE), (PARENT), ba_ignore | ba_quiet, NULL) + (lookup_base ((TYPE), (PARENT), ba_ignore | ba_quiet, NULL) != NULL_TREE) /* Nonzero iff TYPE is accessible in the current scope and uniquely derived from PARENT. */ #define ACCESSIBLY_UNIQUELY_DERIVED_P(PARENT, TYPE) \ - lookup_base ((TYPE), (PARENT), ba_check | ba_quiet, NULL) + (lookup_base ((TYPE), (PARENT), ba_check | ba_quiet, NULL) != NULL_TREE) /* Nonzero iff TYPE is publicly & uniquely derived from PARENT. */ #define PUBLICLY_UNIQUELY_DERIVED_P(PARENT, TYPE) \ - lookup_base ((TYPE), (PARENT), ba_not_special | ba_quiet, NULL) + (lookup_base ((TYPE), (PARENT), ba_not_special | ba_quiet, NULL) \ + != NULL_TREE) /* This is a few header flags for 'struct lang_type'. Actually, all but the first are used only for lang_type_class; they @@ -3364,7 +3365,7 @@ enum overload_flags { NO_SPECIAL = 0, DTOR_FLAG, OP_FLAG, TYPENAME_FLAG }; type is derived from the pointed to by the first. */ #define COMPARE_RELAXED 2 /* Like COMPARE_DERIVED, but in - reverse. Also treat enmeration + reverse. Also treat enumeration types as the same as integer types of the same width. */ #define COMPARE_REDECLARATION 4 /* The comparsion is being done when diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index 1d0ab40b4cf..cf768e0ac8d 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -2800,6 +2800,8 @@ cp_parser_primary_expression (cp_parser *parser, (decl, parser->scope, current_class_type)); if (TREE_CODE (decl) == FIELD_DECL || BASELINK_P (decl)) *qualifying_class = parser->scope; + else if (!processing_template_decl) + decl = convert_from_reference (decl); } else /* Transform references to non-static data members into