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
This commit is contained in:
Jason Merrill 2003-05-15 18:25:51 -04:00
parent 8f4b394d02
commit 9cefd2cac4
4 changed files with 32 additions and 18 deletions

View File

@ -1,3 +1,14 @@
2003-05-15 Jason Merrill <jason@redhat.com>
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 <mark@codesourcery.com>
* call.c (build_op_delete_call): Avoid creating unnecessary types.
@ -98,10 +109,10 @@
2003-05-07 Richard Henderson <rth@redhat.com>
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 <jason@redhat.com>

View File

@ -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

View File

@ -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

View File

@ -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