Commit 878cd289 by Mike Stump

73rd Cygnus<->FSF merge

From-SVN: r9826
parent 73b73053
...@@ -17,8 +17,66 @@ Mon May 22 17:38:48 1995 Richard Kenner (kenner@vlsi1.ultra.nyu.edu) ...@@ -17,8 +17,66 @@ Mon May 22 17:38:48 1995 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
(c++.mostlyclean, stage[1-4]): Use $(objext) in object file names. (c++.mostlyclean, stage[1-4]): Use $(objext) in object file names.
* Makefile.in (../cc1plus): Use $(exeext) in name of executable. * Makefile.in (../cc1plus): Use $(exeext) in name of executable.
Wed May 24 01:39:03 1995 Jason Merrill <jason@deneb.cygnus.com>
* call.c (build_method_call): parms can be null, duh.
Tue May 23 01:32:09 1995 Jason Merrill <jason@deneb.cygnus.com>
* call.c (build_method_call): If convert_arguments failed, just bail.
Fri May 19 10:31:11 1995 Jason Merrill <jason@phydeaux.cygnus.com>
* cvt.c (convert_force): Pass LOOKUP_NORMAL to cp_convert.
* tree.c (copy_to_permanent): Oops.
Fri May 19 10:01:07 1995 Brendan Kehoe (brendan@lisa.cygnus.com)
* cp-tree.h (break_out_target_exprs): Add decl.
Thu May 18 13:02:30 1995 Jason Merrill <jason@phydeaux.cygnus.com>
* decl.c (start_function): Move *all* interface handling stuff after
the pushdecl.
* tree.c (mapcar): Renamed from make_deep_copy and generalized.
(perm_manip): Return t if permanent, otherwise 0.
(copy_to_permanent): Use them.
(bot_manip): Helper for break_out_target_exprs.
(break_out_target_exprs): New function. Uses mapcar.
* typeck.c (convert_arguments): Use it.
* method.c (hack_identifier): Use convert_from_reference to
dereference a reference.
Wed May 17 17:54:54 1995 Mike Stump <mrs@cygnus.com>
* call.c (convert_harshness): Move reference bashing before pointer
to member bashing.
Wed May 17 16:57:53 1995 Mike Stump <mrs@cygnus.com>
* cvt.c (convert_to_reference): Only complain, if complaints are
wanted.
typeck.c (build_function_call_real): Ditto. If LOOKUP_SPECULATIVELY
is set and something won't work, return NULL_TREE.
cvt.c (cp_convert): Ditto. Pass flags down to build_method_call.
(convert): Pass LOOKUP_NORMAL to cp_convert.
typeck.c (convert_for_assignment): Ditto.
(convert_force): Pass LOOKUP_COMPLAIN to cp_convert.
typeck.c (convert_arguments): Get out early if we get an
error_mark_node.
(convert_for_initialization): Use cp_convert instead of convert so
that we can pass flags down.
* cp-tree.h (LOOKUP_SPECULATIVELY): Added documentation.
Wed May 17 01:43:58 1995 Jason Merrill <jason@phydeaux.cygnus.com> Wed May 17 01:43:58 1995 Jason Merrill <jason@phydeaux.cygnus.com>
* typeck2.c (store_init_value): Don't take the MAIN_VARIANT of the
decl type.
* class.c (finish_struct): Don't complain about a class with no * class.c (finish_struct): Don't complain about a class with no
user-defined constructors but with a member that has no default user-defined constructors but with a member that has no default
constructor, as this is OK for aggregates. constructor, as this is OK for aggregates.
......
...@@ -129,11 +129,6 @@ convert_harshness (type, parmtype, parm) ...@@ -129,11 +129,6 @@ convert_harshness (type, parmtype, parm)
n_convert_harshness++; n_convert_harshness++;
#endif #endif
if (TYPE_PTRMEMFUNC_P (type))
type = TYPE_PTRMEMFUNC_FN_TYPE (type);
if (TYPE_PTRMEMFUNC_P (parmtype))
parmtype = TYPE_PTRMEMFUNC_FN_TYPE (parmtype);
if (TREE_CODE (parmtype) == REFERENCE_TYPE) if (TREE_CODE (parmtype) == REFERENCE_TYPE)
{ {
if (parm) if (parm)
...@@ -146,6 +141,11 @@ convert_harshness (type, parmtype, parm) ...@@ -146,6 +141,11 @@ convert_harshness (type, parmtype, parm)
else else
lvalue = 0; lvalue = 0;
if (TYPE_PTRMEMFUNC_P (type))
type = TYPE_PTRMEMFUNC_FN_TYPE (type);
if (TYPE_PTRMEMFUNC_P (parmtype))
parmtype = TYPE_PTRMEMFUNC_FN_TYPE (parmtype);
codel = TREE_CODE (type); codel = TREE_CODE (type);
coder = TREE_CODE (parmtype); coder = TREE_CODE (parmtype);
...@@ -2635,6 +2635,10 @@ build_method_call (instance, name, parms, basetype_path, flags) ...@@ -2635,6 +2635,10 @@ build_method_call (instance, name, parms, basetype_path, flags)
} }
#endif #endif
if (parms == error_mark_node
|| (parms && TREE_CHAIN (parms) == error_mark_node))
return error_mark_node;
if (need_vtbl == needed) if (need_vtbl == needed)
{ {
function = build_vfn_ref (&TREE_VALUE (parms), instance, function = build_vfn_ref (&TREE_VALUE (parms), instance,
......
...@@ -1825,6 +1825,9 @@ extern tree current_class_type; /* _TYPE: the type of the current class */ ...@@ -1825,6 +1825,9 @@ extern tree current_class_type; /* _TYPE: the type of the current class */
LOOKUP_HAS_IN_CHARGE means that the "in charge" variable is already LOOKUP_HAS_IN_CHARGE means that the "in charge" variable is already
in the parameter list. in the parameter list.
LOOKUP_ONLYCONVERTING means that non-conversion constructors are not tried. LOOKUP_ONLYCONVERTING means that non-conversion constructors are not tried.
LOOKUP_SPECULATIVELY means return NULL_TREE if we cannot find what we are
after. Note, LOOKUP_COMPLAIN is checked and error messages printed
before LOOKUP_SPECULATIVELY is checked.
LOOKUP_NO_CONVERSION means that user-defined conversions are not LOOKUP_NO_CONVERSION means that user-defined conversions are not
permitted. Built-in conversions are permitted. permitted. Built-in conversions are permitted.
LOOKUP_DESTRUCTOR means explicit call to destructor. */ LOOKUP_DESTRUCTOR means explicit call to destructor. */
...@@ -2361,6 +2364,7 @@ extern void print_lang_statistics PROTO((void)); ...@@ -2361,6 +2364,7 @@ extern void print_lang_statistics PROTO((void));
/* skip __eprintf */ /* skip __eprintf */
extern tree array_type_nelts_total PROTO((tree)); extern tree array_type_nelts_total PROTO((tree));
extern tree array_type_nelts_top PROTO((tree)); extern tree array_type_nelts_top PROTO((tree));
extern tree break_out_target_exprs PROTO((tree));
/* in typeck.c */ /* in typeck.c */
extern tree condition_conversion PROTO((tree)); extern tree condition_conversion PROTO((tree));
......
...@@ -836,12 +836,12 @@ convert_to_reference (reftype, expr, convtype, flags, decl) ...@@ -836,12 +836,12 @@ convert_to_reference (reftype, expr, convtype, flags, decl)
my_friendly_assert (TREE_CODE (intype) != OFFSET_TYPE, 189); my_friendly_assert (TREE_CODE (intype) != OFFSET_TYPE, 189);
if (flags & LOOKUP_COMPLAIN)
cp_error ("cannot convert type `%T' to type `%T'", intype, reftype);
if (flags & LOOKUP_SPECULATIVELY) if (flags & LOOKUP_SPECULATIVELY)
return NULL_TREE; return NULL_TREE;
else if (flags & LOOKUP_COMPLAIN)
cp_error ("cannot convert type `%T' to type `%T'", intype, reftype);
return error_mark_node; return error_mark_node;
} }
...@@ -1190,6 +1190,10 @@ convert_pointer_to_vbase (binfo, expr) ...@@ -1190,6 +1190,10 @@ convert_pointer_to_vbase (binfo, expr)
return NULL_TREE; return NULL_TREE;
} }
/* Conversion...
FLAGS indicates how we should behave. */
tree tree
cp_convert (type, expr, convtype, flags) cp_convert (type, expr, convtype, flags)
tree type, expr; tree type, expr;
...@@ -1259,7 +1263,10 @@ cp_convert (type, expr, convtype, flags) ...@@ -1259,7 +1263,10 @@ cp_convert (type, expr, convtype, flags)
rval = build_type_conversion (CONVERT_EXPR, type, e, 1); rval = build_type_conversion (CONVERT_EXPR, type, e, 1);
if (rval) if (rval)
return rval; return rval;
cp_error ("`%#T' used where a `%T' was expected", intype, type); if (flags & LOOKUP_COMPLAIN)
cp_error ("`%#T' used where a `%T' was expected", intype, type);
if (flags & LOOKUP_SPECULATIVELY)
return NULL_TREE;
return error_mark_node; return error_mark_node;
} }
if (code == BOOLEAN_TYPE) if (code == BOOLEAN_TYPE)
...@@ -1278,8 +1285,9 @@ cp_convert (type, expr, convtype, flags) ...@@ -1278,8 +1285,9 @@ cp_convert (type, expr, convtype, flags)
if (rval) if (rval)
return rval; return rval;
else else
cp_error ("`%#T' used where a floating point value was expected", if (flags & LOOKUP_COMPLAIN)
TREE_TYPE (e)); cp_error ("`%#T' used where a floating point value was expected",
TREE_TYPE (e));
} }
return fold (convert_to_real (type, e)); return fold (convert_to_real (type, e));
} }
...@@ -1331,7 +1339,8 @@ cp_convert (type, expr, convtype, flags) ...@@ -1331,7 +1339,8 @@ cp_convert (type, expr, convtype, flags)
if (conversion == error_mark_node) if (conversion == error_mark_node)
{ {
error ("ambiguous pointer conversion"); if (flags & LOOKUP_COMPLAIN)
error ("ambiguous pointer conversion");
return conversion; return conversion;
} }
...@@ -1339,19 +1348,25 @@ cp_convert (type, expr, convtype, flags) ...@@ -1339,19 +1348,25 @@ cp_convert (type, expr, convtype, flags)
ctor = build_method_call (NULL_TREE, constructor_name_full (type), ctor = build_method_call (NULL_TREE, constructor_name_full (type),
build_tree_list (NULL_TREE, e), build_tree_list (NULL_TREE, e),
TYPE_BINFO (type), TYPE_BINFO (type),
LOOKUP_NORMAL | LOOKUP_SPECULATIVELY (flags & LOOKUP_NORMAL) | LOOKUP_SPECULATIVELY
| (convtype&CONV_NONCONVERTING ? 0 : LOOKUP_ONLYCONVERTING) | (convtype&CONV_NONCONVERTING ? 0 : LOOKUP_ONLYCONVERTING)
| (conversion ? LOOKUP_NO_CONVERSION : 0)); | (conversion ? LOOKUP_NO_CONVERSION : 0));
if (ctor == error_mark_node) if (ctor == error_mark_node)
{ {
cp_error ("in conversion to type `%T'", type); if (flags & LOOKUP_COMPLAIN)
cp_error ("in conversion to type `%T'", type);
if (flags & LOOKUP_SPECULATIVELY)
return NULL_TREE;
return error_mark_node; return error_mark_node;
} }
if (conversion && ctor) if (conversion && ctor)
{ {
error ("both constructor and type conversion operator apply"); if (flags & LOOKUP_COMPLAIN)
error ("both constructor and type conversion operator apply");
if (flags & LOOKUP_SPECULATIVELY)
return NULL_TREE;
return error_mark_node; return error_mark_node;
} }
else if (conversion) else if (conversion)
...@@ -1408,8 +1423,11 @@ cp_convert (type, expr, convtype, flags) ...@@ -1408,8 +1423,11 @@ cp_convert (type, expr, convtype, flags)
&& index_type_equal (TYPE_DOMAIN (TREE_TYPE (e)), TYPE_DOMAIN (type))) && index_type_equal (TYPE_DOMAIN (TREE_TYPE (e)), TYPE_DOMAIN (type)))
return e; return e;
cp_error ("conversion from `%T' to non-scalar type `%T' requested", if (flags & LOOKUP_COMPLAIN)
TREE_TYPE (expr), type); cp_error ("conversion from `%T' to non-scalar type `%T' requested",
TREE_TYPE (expr), type);
if (flags & LOOKUP_SPECULATIVELY)
return NULL_TREE;
return error_mark_node; return error_mark_node;
} }
...@@ -1423,7 +1441,7 @@ tree ...@@ -1423,7 +1441,7 @@ tree
convert (type, expr) convert (type, expr)
tree type, expr; tree type, expr;
{ {
return cp_convert (type, expr, CONV_OLD_CONVERT, 0); return cp_convert (type, expr, CONV_OLD_CONVERT, LOOKUP_NORMAL);
} }
/* Like convert, except permit conversions to take place which /* Like convert, except permit conversions to take place which
...@@ -1459,7 +1477,7 @@ convert_force (type, expr, convtype) ...@@ -1459,7 +1477,7 @@ convert_force (type, expr, convtype)
return build_ptrmemfunc (TYPE_PTRMEMFUNC_FN_TYPE (type), e, 1); return build_ptrmemfunc (TYPE_PTRMEMFUNC_FN_TYPE (type), e, 1);
} }
return cp_convert (type, e, CONV_C_CAST|convtype, 0); return cp_convert (type, e, CONV_C_CAST|convtype, LOOKUP_NORMAL);
} }
/* Subroutine of build_type_conversion. */ /* Subroutine of build_type_conversion. */
......
...@@ -11129,6 +11129,19 @@ start_function (declspecs, declarator, raises, pre_parsed_p) ...@@ -11129,6 +11129,19 @@ start_function (declspecs, declarator, raises, pre_parsed_p)
(This does not mean `static' in the C sense!) */ (This does not mean `static' in the C sense!) */
TREE_STATIC (decl1) = 1; TREE_STATIC (decl1) = 1;
/* Record the decl so that the function name is defined.
If we already have a decl for this name, and it is a FUNCTION_DECL,
use the old decl. */
if (pre_parsed_p == 0)
{
current_function_decl = decl1 = pushdecl (decl1);
DECL_MAIN_VARIANT (decl1) = decl1;
fntype = TREE_TYPE (decl1);
}
else
current_function_decl = decl1;
if (DECL_INTERFACE_KNOWN (decl1)) if (DECL_INTERFACE_KNOWN (decl1))
{ {
if (DECL_NOT_REALLY_EXTERN (decl1)) if (DECL_NOT_REALLY_EXTERN (decl1))
...@@ -11154,27 +11167,15 @@ start_function (declspecs, declarator, raises, pre_parsed_p) ...@@ -11154,27 +11167,15 @@ start_function (declspecs, declarator, raises, pre_parsed_p)
So clear DECL_EXTERNAL. */ So clear DECL_EXTERNAL. */
DECL_EXTERNAL (decl1) = 0; DECL_EXTERNAL (decl1) = 0;
if (DECL_C_STATIC (decl1)) if (DECL_THIS_INLINE (decl1) && ! DECL_INTERFACE_KNOWN (decl1))
TREE_PUBLIC (decl1) = 0; DECL_DEFER_OUTPUT (decl1) = 1;
} else
{
/* Record the decl so that the function name is defined. DECL_INTERFACE_KNOWN (decl1) = 1;
If we already have a decl for this name, and it is a FUNCTION_DECL, if (DECL_C_STATIC (decl1))
use the old decl. */ TREE_PUBLIC (decl1) = 0;
}
if (pre_parsed_p == 0)
{
current_function_decl = decl1 = pushdecl (decl1);
DECL_MAIN_VARIANT (decl1) = decl1;
fntype = TREE_TYPE (decl1);
} }
else
current_function_decl = decl1;
if (DECL_THIS_INLINE (decl1) && ! DECL_INTERFACE_KNOWN (decl1))
DECL_DEFER_OUTPUT (decl1) = 1;
else
DECL_INTERFACE_KNOWN (decl1) = 1;
if (ctype != NULL_TREE && DECL_STATIC_FUNCTION_P (decl1)) if (ctype != NULL_TREE && DECL_STATIC_FUNCTION_P (decl1))
{ {
......
...@@ -1567,8 +1567,7 @@ hack_identifier (value, name, yychar) ...@@ -1567,8 +1567,7 @@ hack_identifier (value, name, yychar)
my_friendly_assert (TREE_CODE (value) == VAR_DECL my_friendly_assert (TREE_CODE (value) == VAR_DECL
|| TREE_CODE (value) == PARM_DECL || TREE_CODE (value) == PARM_DECL
|| TREE_CODE (value) == RESULT_DECL, 252); || TREE_CODE (value) == RESULT_DECL, 252);
if (DECL_REFERENCE_SLOT (value)) return convert_from_reference (value);
return DECL_REFERENCE_SLOT (value);
} }
return value; return value;
} }
......
...@@ -1614,15 +1614,21 @@ build_exception_variant (ctype, type, raises) ...@@ -1614,15 +1614,21 @@ build_exception_variant (ctype, type, raises)
Assuming T is a node build bottom-up, make it all exist on Assuming T is a node build bottom-up, make it all exist on
permanent obstack, if it is not permanent already. */ permanent obstack, if it is not permanent already. */
static tree
make_deep_copy (t) tree
mapcar (t, func)
tree t; tree t;
tree (*func)();
{ {
enum tree_code code; enum tree_code code;
tree tmp;
if (t == NULL_TREE || TREE_PERMANENT (t)) if (t == NULL_TREE)
return t; return t;
if (tmp = func (t), tmp != NULL_TREE)
return tmp;
switch (code = TREE_CODE (t)) switch (code = TREE_CODE (t))
{ {
case ERROR_MARK: case ERROR_MARK:
...@@ -1637,10 +1643,10 @@ make_deep_copy (t) ...@@ -1637,10 +1643,10 @@ make_deep_copy (t)
{ {
tree chain = TREE_CHAIN (t); tree chain = TREE_CHAIN (t);
t = copy_node (t); t = copy_node (t);
TREE_CHAIN (t) = make_deep_copy (chain); TREE_CHAIN (t) = mapcar (chain, func);
TREE_TYPE (t) = make_deep_copy (TREE_TYPE (t)); TREE_TYPE (t) = mapcar (TREE_TYPE (t), func);
DECL_INITIAL (t) = make_deep_copy (DECL_INITIAL (t)); DECL_INITIAL (t) = mapcar (DECL_INITIAL (t), func);
DECL_SIZE (t) = make_deep_copy (DECL_SIZE (t)); DECL_SIZE (t) = mapcar (DECL_SIZE (t), func);
return t; return t;
} }
...@@ -1648,9 +1654,9 @@ make_deep_copy (t) ...@@ -1648,9 +1654,9 @@ make_deep_copy (t)
{ {
tree chain = TREE_CHAIN (t); tree chain = TREE_CHAIN (t);
t = copy_node (t); t = copy_node (t);
TREE_PURPOSE (t) = make_deep_copy (TREE_PURPOSE (t)); TREE_PURPOSE (t) = mapcar (TREE_PURPOSE (t), func);
TREE_VALUE (t) = make_deep_copy (TREE_VALUE (t)); TREE_VALUE (t) = mapcar (TREE_VALUE (t), func);
TREE_CHAIN (t) = make_deep_copy (chain); TREE_CHAIN (t) = mapcar (chain, func);
return t; return t;
} }
...@@ -1660,7 +1666,7 @@ make_deep_copy (t) ...@@ -1660,7 +1666,7 @@ make_deep_copy (t)
t = copy_node (t); t = copy_node (t);
while (len--) while (len--)
TREE_VEC_ELT (t, len) = make_deep_copy (TREE_VEC_ELT (t, len)); TREE_VEC_ELT (t, len) = mapcar (TREE_VEC_ELT (t, len), func);
return t; return t;
} }
...@@ -1673,14 +1679,14 @@ make_deep_copy (t) ...@@ -1673,14 +1679,14 @@ make_deep_copy (t)
case TARGET_EXPR: case TARGET_EXPR:
case NEW_EXPR: case NEW_EXPR:
t = copy_node (t); t = copy_node (t);
TREE_OPERAND (t, 0) = make_deep_copy (TREE_OPERAND (t, 0)); TREE_OPERAND (t, 0) = mapcar (TREE_OPERAND (t, 0), func);
TREE_OPERAND (t, 1) = make_deep_copy (TREE_OPERAND (t, 1)); TREE_OPERAND (t, 1) = mapcar (TREE_OPERAND (t, 1), func);
TREE_OPERAND (t, 2) = make_deep_copy (TREE_OPERAND (t, 2)); TREE_OPERAND (t, 2) = mapcar (TREE_OPERAND (t, 2), func);
return t; return t;
case SAVE_EXPR: case SAVE_EXPR:
t = copy_node (t); t = copy_node (t);
TREE_OPERAND (t, 0) = make_deep_copy (TREE_OPERAND (t, 0)); TREE_OPERAND (t, 0) = mapcar (TREE_OPERAND (t, 0), func);
return t; return t;
case MODIFY_EXPR: case MODIFY_EXPR:
...@@ -1718,8 +1724,8 @@ make_deep_copy (t) ...@@ -1718,8 +1724,8 @@ make_deep_copy (t)
case POSTINCREMENT_EXPR: case POSTINCREMENT_EXPR:
case CALL_EXPR: case CALL_EXPR:
t = copy_node (t); t = copy_node (t);
TREE_OPERAND (t, 0) = make_deep_copy (TREE_OPERAND (t, 0)); TREE_OPERAND (t, 0) = mapcar (TREE_OPERAND (t, 0), func);
TREE_OPERAND (t, 1) = make_deep_copy (TREE_OPERAND (t, 1)); TREE_OPERAND (t, 1) = mapcar (TREE_OPERAND (t, 1), func);
return t; return t;
case CONVERT_EXPR: case CONVERT_EXPR:
...@@ -1731,36 +1737,36 @@ make_deep_copy (t) ...@@ -1731,36 +1737,36 @@ make_deep_copy (t)
case NOP_EXPR: case NOP_EXPR:
case COMPONENT_REF: case COMPONENT_REF:
t = copy_node (t); t = copy_node (t);
TREE_OPERAND (t, 0) = make_deep_copy (TREE_OPERAND (t, 0)); TREE_OPERAND (t, 0) = mapcar (TREE_OPERAND (t, 0), func);
return t; return t;
case POINTER_TYPE: case POINTER_TYPE:
return build_pointer_type (make_deep_copy (TREE_TYPE (t))); return build_pointer_type (mapcar (TREE_TYPE (t), func));
case REFERENCE_TYPE: case REFERENCE_TYPE:
return build_reference_type (make_deep_copy (TREE_TYPE (t))); return build_reference_type (mapcar (TREE_TYPE (t), func));
case FUNCTION_TYPE: case FUNCTION_TYPE:
return build_function_type (make_deep_copy (TREE_TYPE (t)), return build_function_type (mapcar (TREE_TYPE (t), func),
make_deep_copy (TYPE_ARG_TYPES (t))); mapcar (TYPE_ARG_TYPES (t), func));
case ARRAY_TYPE: case ARRAY_TYPE:
return build_array_type (make_deep_copy (TREE_TYPE (t)), return build_array_type (mapcar (TREE_TYPE (t), func),
make_deep_copy (TYPE_DOMAIN (t))); mapcar (TYPE_DOMAIN (t), func));
case INTEGER_TYPE: case INTEGER_TYPE:
return build_index_type (make_deep_copy (TYPE_MAX_VALUE (t))); return build_index_type (mapcar (TYPE_MAX_VALUE (t), func));
case OFFSET_TYPE: case OFFSET_TYPE:
return build_offset_type (make_deep_copy (TYPE_OFFSET_BASETYPE (t)), return build_offset_type (mapcar (TYPE_OFFSET_BASETYPE (t), func),
make_deep_copy (TREE_TYPE (t))); mapcar (TREE_TYPE (t), func));
case METHOD_TYPE: case METHOD_TYPE:
return build_method_type return build_method_type
(make_deep_copy (TYPE_METHOD_BASETYPE (t)), (mapcar (TYPE_METHOD_BASETYPE (t), func),
build_function_type build_function_type
(make_deep_copy (TREE_TYPE (t)), (mapcar (TREE_TYPE (t), func),
make_deep_copy (TREE_CHAIN (TYPE_ARG_TYPES (t))))); mapcar (TREE_CHAIN (TYPE_ARG_TYPES (t)), func)));
case RECORD_TYPE: case RECORD_TYPE:
if (TYPE_PTRMEMFUNC_P (t)) if (TYPE_PTRMEMFUNC_P (t))
return build_ptrmemfunc_type return build_ptrmemfunc_type
(make_deep_copy (TYPE_PTRMEMFUNC_FN_TYPE (t))); (mapcar (TYPE_PTRMEMFUNC_FN_TYPE (t), func));
/* else fall through */ /* else fall through */
/* This list is incomplete, but should suffice for now. /* This list is incomplete, but should suffice for now.
...@@ -1776,6 +1782,15 @@ make_deep_copy (t) ...@@ -1776,6 +1782,15 @@ make_deep_copy (t)
return NULL_TREE; return NULL_TREE;
} }
static tree
perm_manip (t)
tree t;
{
if (TREE_PERMANENT (t))
return t;
return NULL_TREE;
}
/* Assuming T is a node built bottom-up, make it all exist on /* Assuming T is a node built bottom-up, make it all exist on
permanent obstack, if it is not permanent already. */ permanent obstack, if it is not permanent already. */
tree tree
...@@ -1793,7 +1808,7 @@ copy_to_permanent (t) ...@@ -1793,7 +1808,7 @@ copy_to_permanent (t)
current_obstack = saveable_obstack; current_obstack = saveable_obstack;
resume = suspend_momentary (); resume = suspend_momentary ();
t = make_deep_copy (t); t = mapcar (t, perm_manip);
resume_momentary (resume); resume_momentary (resume);
current_obstack = ambient_obstack; current_obstack = ambient_obstack;
...@@ -1866,3 +1881,24 @@ array_type_nelts_total (type) ...@@ -1866,3 +1881,24 @@ array_type_nelts_total (type)
} }
return sz; return sz;
} }
static
tree
bot_manip (t)
tree t;
{
if (TREE_CODE (t) != TREE_LIST && ! TREE_SIDE_EFFECTS (t))
return t;
else if (TREE_CODE (t) == TARGET_EXPR)
return build_cplus_new (TREE_TYPE (t),
break_out_target_exprs (TREE_OPERAND (t, 1)), 0);
return NULL_TREE;
}
/* Actually, we'll just clean out the target exprs for the moment. */
tree
break_out_target_exprs (t)
tree t;
{
return mapcar (t, bot_manip);
}
...@@ -2453,7 +2453,10 @@ build_function_call_real (function, params, require_complete, flags) ...@@ -2453,7 +2453,10 @@ build_function_call_real (function, params, require_complete, flags)
params, fndecl, 0); params, fndecl, 0);
if (coerced_params == error_mark_node) if (coerced_params == error_mark_node)
return error_mark_node; if (flags & LOOKUP_SPECULATIVELY)
return NULL_TREE;
else
return error_mark_node;
/* Check for errors in format strings. */ /* Check for errors in format strings. */
...@@ -2689,6 +2692,10 @@ convert_arguments (return_loc, typelist, values, fndecl, flags) ...@@ -2689,6 +2692,10 @@ convert_arguments (return_loc, typelist, values, fndecl, flags)
parmval = default_conversion (parmval); parmval = default_conversion (parmval);
#endif #endif
} }
if (parmval == error_mark_node)
return error_mark_node;
result = tree_cons (NULL_TREE, parmval, result); result = tree_cons (NULL_TREE, parmval, result);
} }
else else
...@@ -2736,7 +2743,7 @@ convert_arguments (return_loc, typelist, values, fndecl, flags) ...@@ -2736,7 +2743,7 @@ convert_arguments (return_loc, typelist, values, fndecl, flags)
for (; typetail != void_list_node; ++i) for (; typetail != void_list_node; ++i)
{ {
tree type = TREE_VALUE (typetail); tree type = TREE_VALUE (typetail);
tree val = TREE_PURPOSE (typetail); tree val = break_out_target_exprs (TREE_PURPOSE (typetail));
tree parmval; tree parmval;
if (val == NULL_TREE) if (val == NULL_TREE)
...@@ -2763,6 +2770,9 @@ convert_arguments (return_loc, typelist, values, fndecl, flags) ...@@ -2763,6 +2770,9 @@ convert_arguments (return_loc, typelist, values, fndecl, flags)
#endif #endif
} }
if (parmval == error_mark_node)
return error_mark_node;
if (flag_gc if (flag_gc
&& type_needs_gc_entry (TREE_TYPE (parmval)) && type_needs_gc_entry (TREE_TYPE (parmval))
&& ! value_safe_from_gc (NULL_TREE, parmval)) && ! value_safe_from_gc (NULL_TREE, parmval))
...@@ -6526,7 +6536,7 @@ convert_for_assignment (type, rhs, errtype, fndecl, parmnum) ...@@ -6526,7 +6536,7 @@ convert_for_assignment (type, rhs, errtype, fndecl, parmnum)
|| (coder == ENUMERAL_TYPE || (coder == ENUMERAL_TYPE
&& (INTEGRAL_CODE_P (codel) || codel == REAL_TYPE))) && (INTEGRAL_CODE_P (codel) || codel == REAL_TYPE)))
{ {
return cp_convert (type, rhs, CONV_IMPLICIT, 0); return cp_convert (type, rhs, CONV_IMPLICIT, LOOKUP_NORMAL);
} }
/* Conversions among pointers */ /* Conversions among pointers */
else if (codel == POINTER_TYPE else if (codel == POINTER_TYPE
...@@ -6898,7 +6908,9 @@ convert_for_assignment (type, rhs, errtype, fndecl, parmnum) ...@@ -6898,7 +6908,9 @@ convert_for_assignment (type, rhs, errtype, fndecl, parmnum)
latter (X(X&)). latter (X(X&)).
If using constructor make sure no conversion operator exists, if one does If using constructor make sure no conversion operator exists, if one does
exist, an ambiguity exists. */ exist, an ambiguity exists.
If flags doesn't include LOOKUP_COMPLAIN, don't complain about anything. */
tree tree
convert_for_initialization (exp, type, rhs, flags, errtype, fndecl, parmnum) convert_for_initialization (exp, type, rhs, flags, errtype, fndecl, parmnum)
tree exp, type, rhs; tree exp, type, rhs;
...@@ -7069,7 +7081,7 @@ convert_for_initialization (exp, type, rhs, flags, errtype, fndecl, parmnum) ...@@ -7069,7 +7081,7 @@ convert_for_initialization (exp, type, rhs, flags, errtype, fndecl, parmnum)
return rhs; return rhs;
} }
return convert (type, rhs); return cp_convert (type, rhs, CONV_OLD_CONVERT, flags);
} }
if (type == TREE_TYPE (rhs)) if (type == TREE_TYPE (rhs))
......
...@@ -537,8 +537,11 @@ store_init_value (decl, init) ...@@ -537,8 +537,11 @@ store_init_value (decl, init)
if (TREE_CODE (type) == ERROR_MARK) if (TREE_CODE (type) == ERROR_MARK)
return NULL_TREE; return NULL_TREE;
#if 0
/* This breaks arrays, and should not have any effect for other decls. */
/* Take care of C++ business up here. */ /* Take care of C++ business up here. */
type = TYPE_MAIN_VARIANT (type); type = TYPE_MAIN_VARIANT (type);
#endif
if (IS_AGGR_TYPE (type)) if (IS_AGGR_TYPE (type))
{ {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment