mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-03-10 02:36:56 +08:00
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:
parent
8f4b394d02
commit
9cefd2cac4
@ -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>
|
||||
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user