16077.C: Adjust warnings.
* g++.old-deja/g++.benjamin/16077.C: Adjust warnings. * g++.old-deja/g++.warn/impint2.C: Likewise. * call.c (perform_overload_resolution): New function. (build_new_function_call): Use it. (build_operator_new_call): Likewise. (add_candidates): Add explicit_targs and template_only parameters. (build_new_op): Adjust accordingly. * cp-tree.h (build_operator_new_call): New function. (build_function_call_real): Remove. (build_function_call_maybe): Likewise. * init.c (build_new_1): Use build_operator_new_call. * typeck.c (build_function_call_real): Rename to ... (build_function_call): ... this. From-SVN: r64159
This commit is contained in:
parent
31ca36354c
commit
125e65945c
@ -1,7 +1,22 @@
|
|||||||
|
2003-03-10 Mark Mitchell <mark@codesourcery.com>
|
||||||
|
|
||||||
|
* call.c (perform_overload_resolution): New function.
|
||||||
|
(build_new_function_call): Use it.
|
||||||
|
(build_operator_new_call): Likewise.
|
||||||
|
(add_candidates): Add explicit_targs and template_only parameters.
|
||||||
|
(build_new_op): Adjust accordingly.
|
||||||
|
* cp-tree.h (build_operator_new_call): New function.
|
||||||
|
(build_function_call_real): Remove.
|
||||||
|
(build_function_call_maybe): Likewise.
|
||||||
|
* init.c (build_new_1): Use build_operator_new_call.
|
||||||
|
* typeck.c (build_function_call_real): Rename to ...
|
||||||
|
(build_function_call): ... this.
|
||||||
|
|
||||||
2003-03-10 Devang Patel <dpatel@apple.com>
|
2003-03-10 Devang Patel <dpatel@apple.com>
|
||||||
|
|
||||||
PR c++/9394
|
PR c++/9394
|
||||||
* g++spec.c (lang_specific_driver): Use DEFAULT_WORD_SWTCH_TAKES_ARG.
|
* g++spec.c (lang_specific_driver): Use DEFAULT_WORD_SWTCH_TAKES_ARG.
|
||||||
|
|
||||||
2003-03-10 Jason Merrill <jason@redhat.com>
|
2003-03-10 Jason Merrill <jason@redhat.com>
|
||||||
|
|
||||||
PR c++/9798
|
PR c++/9798
|
||||||
|
234
gcc/cp/call.c
234
gcc/cp/call.c
@ -104,7 +104,7 @@ static tree conditional_conversion (tree, tree);
|
|||||||
static char *name_as_c_string (tree, tree, bool *);
|
static char *name_as_c_string (tree, tree, bool *);
|
||||||
static tree call_builtin_trap (void);
|
static tree call_builtin_trap (void);
|
||||||
static tree prep_operand (tree);
|
static tree prep_operand (tree);
|
||||||
static void add_candidates (tree, tree, tree, tree,
|
static void add_candidates (tree, tree, tree, bool, tree, tree,
|
||||||
int, struct z_candidate **);
|
int, struct z_candidate **);
|
||||||
static tree merge_conversion_sequences (tree, tree);
|
static tree merge_conversion_sequences (tree, tree);
|
||||||
|
|
||||||
@ -2754,16 +2754,31 @@ resolve_args (tree args)
|
|||||||
return args;
|
return args;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Return an expression for a call to FN (a namespace-scope function,
|
/* Perform overload resolution on FN, which is called with the ARGS.
|
||||||
or a static member function) with the ARGS. */
|
|
||||||
|
Return the candidate function selected by overload resolution, or
|
||||||
tree
|
NULL if the event that overload resolution failed. In the case
|
||||||
build_new_function_call (tree fn, tree args)
|
that overload resolution fails, *CANDIDATES will be the set of
|
||||||
|
candidates considered, and ANY_VIABLE_P will be set to true or
|
||||||
|
false to indicate whether or not any of the candidates were
|
||||||
|
viable.
|
||||||
|
|
||||||
|
The ARGS should already have gone through RESOLVE_ARGS before this
|
||||||
|
function is called. */
|
||||||
|
|
||||||
|
static struct z_candidate *
|
||||||
|
perform_overload_resolution (tree fn,
|
||||||
|
tree args,
|
||||||
|
struct z_candidate **candidates,
|
||||||
|
bool *any_viable_p)
|
||||||
{
|
{
|
||||||
struct z_candidate *candidates = 0, *cand;
|
struct z_candidate *cand;
|
||||||
tree explicit_targs = NULL_TREE;
|
tree explicit_targs = NULL_TREE;
|
||||||
int template_only = 0;
|
int template_only = 0;
|
||||||
|
|
||||||
|
*candidates = NULL;
|
||||||
|
*any_viable_p = true;
|
||||||
|
|
||||||
/* Check FN and ARGS. */
|
/* Check FN and ARGS. */
|
||||||
my_friendly_assert (TREE_CODE (fn) == FUNCTION_DECL
|
my_friendly_assert (TREE_CODE (fn) == FUNCTION_DECL
|
||||||
|| TREE_CODE (fn) == TEMPLATE_DECL
|
|| TREE_CODE (fn) == TEMPLATE_DECL
|
||||||
@ -2780,63 +2795,146 @@ build_new_function_call (tree fn, tree args)
|
|||||||
template_only = 1;
|
template_only = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (really_overloaded_fn (fn)
|
/* Add the various candidate functions. */
|
||||||
|| TREE_CODE (fn) == TEMPLATE_DECL)
|
add_candidates (fn, args, explicit_targs, template_only,
|
||||||
|
/*conversion_path=*/NULL_TREE,
|
||||||
|
/*access_path=*/NULL_TREE,
|
||||||
|
LOOKUP_NORMAL,
|
||||||
|
candidates);
|
||||||
|
|
||||||
|
if (! any_viable (*candidates))
|
||||||
{
|
{
|
||||||
tree t1;
|
*any_viable_p = false;
|
||||||
|
return NULL;
|
||||||
args = resolve_args (args);
|
|
||||||
|
|
||||||
if (args == error_mark_node)
|
|
||||||
return error_mark_node;
|
|
||||||
|
|
||||||
for (t1 = fn; t1; t1 = OVL_NEXT (t1))
|
|
||||||
{
|
|
||||||
tree t = OVL_CURRENT (t1);
|
|
||||||
|
|
||||||
my_friendly_assert (!DECL_FUNCTION_MEMBER_P (t), 20020913);
|
|
||||||
|
|
||||||
if (TREE_CODE (t) == TEMPLATE_DECL)
|
|
||||||
add_template_candidate
|
|
||||||
(&candidates, t, NULL_TREE, explicit_targs, args,
|
|
||||||
NULL_TREE, /*access_path=*/NULL_TREE,
|
|
||||||
/*conversion_path=*/NULL_TREE,
|
|
||||||
LOOKUP_NORMAL, DEDUCE_CALL);
|
|
||||||
else if (! template_only)
|
|
||||||
add_function_candidate
|
|
||||||
(&candidates, t, NULL_TREE, args,
|
|
||||||
/*access_path=*/NULL_TREE,
|
|
||||||
/*conversion_path=*/NULL_TREE, LOOKUP_NORMAL);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (! any_viable (candidates))
|
|
||||||
{
|
|
||||||
if (candidates && ! candidates->next)
|
|
||||||
return build_function_call (candidates->fn, args);
|
|
||||||
error ("no matching function for call to `%D(%A)'",
|
|
||||||
DECL_NAME (OVL_CURRENT (fn)), args);
|
|
||||||
if (candidates)
|
|
||||||
print_z_candidates (candidates);
|
|
||||||
return error_mark_node;
|
|
||||||
}
|
|
||||||
candidates = splice_viable (candidates);
|
|
||||||
cand = tourney (candidates);
|
|
||||||
|
|
||||||
if (cand == 0)
|
|
||||||
{
|
|
||||||
error ("call of overloaded `%D(%A)' is ambiguous",
|
|
||||||
DECL_NAME (OVL_FUNCTION (fn)), args);
|
|
||||||
print_z_candidates (candidates);
|
|
||||||
return error_mark_node;
|
|
||||||
}
|
|
||||||
|
|
||||||
return build_over_call (cand, LOOKUP_NORMAL);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* This is not really overloaded. */
|
*candidates = splice_viable (*candidates);
|
||||||
fn = OVL_CURRENT (fn);
|
cand = tourney (*candidates);
|
||||||
|
|
||||||
return build_function_call (fn, args);
|
return cand;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Return an expression for a call to FN (a namespace-scope function,
|
||||||
|
or a static member function) with the ARGS. */
|
||||||
|
|
||||||
|
tree
|
||||||
|
build_new_function_call (tree fn, tree args)
|
||||||
|
{
|
||||||
|
struct z_candidate *candidates, *cand;
|
||||||
|
bool any_viable_p;
|
||||||
|
|
||||||
|
args = resolve_args (args);
|
||||||
|
if (args == error_mark_node)
|
||||||
|
return error_mark_node;
|
||||||
|
|
||||||
|
cand = perform_overload_resolution (fn, args, &candidates, &any_viable_p);
|
||||||
|
|
||||||
|
if (!cand)
|
||||||
|
{
|
||||||
|
if (!any_viable_p && candidates && ! candidates->next)
|
||||||
|
return build_function_call (candidates->fn, args);
|
||||||
|
if (TREE_CODE (fn) == TEMPLATE_ID_EXPR)
|
||||||
|
fn = TREE_OPERAND (fn, 0);
|
||||||
|
if (!any_viable_p)
|
||||||
|
error ("no matching function for call to `%D(%A)'",
|
||||||
|
DECL_NAME (OVL_CURRENT (fn)), args);
|
||||||
|
else
|
||||||
|
error ("call of overloaded `%D(%A)' is ambiguous",
|
||||||
|
DECL_NAME (OVL_FUNCTION (fn)), args);
|
||||||
|
if (candidates)
|
||||||
|
print_z_candidates (candidates);
|
||||||
|
return error_mark_node;
|
||||||
|
}
|
||||||
|
|
||||||
|
return build_over_call (cand, LOOKUP_NORMAL);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Build a call to a global operator new. FNNAME is the name of the
|
||||||
|
operator (either "operator new" or "operator new[]") and ARGS are
|
||||||
|
the arguments provided. *SIZE points to the total number of bytes
|
||||||
|
required by the allocation, and is updated if that is changed here.
|
||||||
|
*COOKIE_SIZE is non-NULL if a cookie should be used. If this
|
||||||
|
function determins that no cookie should be used, after all,
|
||||||
|
*COOKIE_SIZE is set to NULL_TREE. */
|
||||||
|
|
||||||
|
tree
|
||||||
|
build_operator_new_call (tree fnname, tree args, tree *size, tree *cookie_size)
|
||||||
|
{
|
||||||
|
tree fns;
|
||||||
|
struct z_candidate *candidates;
|
||||||
|
struct z_candidate *cand;
|
||||||
|
bool any_viable_p;
|
||||||
|
|
||||||
|
args = tree_cons (NULL_TREE, *size, args);
|
||||||
|
args = resolve_args (args);
|
||||||
|
if (args == error_mark_node)
|
||||||
|
return args;
|
||||||
|
|
||||||
|
fns = lookup_function_nonclass (fnname, args);
|
||||||
|
|
||||||
|
/* Figure out what function is being called. */
|
||||||
|
cand = perform_overload_resolution (fns, args, &candidates, &any_viable_p);
|
||||||
|
|
||||||
|
/* If no suitable function could be found, issue an error message
|
||||||
|
and give up. */
|
||||||
|
if (!cand)
|
||||||
|
{
|
||||||
|
if (!any_viable_p)
|
||||||
|
error ("no matching function for call to `%D(%A)'",
|
||||||
|
DECL_NAME (OVL_CURRENT (fns)), args);
|
||||||
|
else
|
||||||
|
error ("call of overlopaded `%D(%A)' is ambiguous",
|
||||||
|
DECL_NAME (OVL_FUNCTION (fns)), args);
|
||||||
|
if (candidates)
|
||||||
|
print_z_candidates (candidates);
|
||||||
|
return error_mark_node;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* If a cookie is required, add some extra space. Whether
|
||||||
|
or not a cookie is required cannot be determined until
|
||||||
|
after we know which function was called. */
|
||||||
|
if (*cookie_size)
|
||||||
|
{
|
||||||
|
bool use_cookie = true;
|
||||||
|
if (!abi_version_at_least (2))
|
||||||
|
{
|
||||||
|
tree placement = TREE_CHAIN (args);
|
||||||
|
/* In G++ 3.2, the check was implemented incorrectly; it
|
||||||
|
looked at the placement expression, rather than the
|
||||||
|
type of the function. */
|
||||||
|
if (placement && !TREE_CHAIN (placement)
|
||||||
|
&& same_type_p (TREE_TYPE (TREE_VALUE (placement)),
|
||||||
|
ptr_type_node))
|
||||||
|
use_cookie = false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
tree arg_types;
|
||||||
|
|
||||||
|
arg_types = TYPE_ARG_TYPES (TREE_TYPE (cand->fn));
|
||||||
|
/* Skip the size_t parameter. */
|
||||||
|
arg_types = TREE_CHAIN (arg_types);
|
||||||
|
/* Check the remaining parameters (if any). */
|
||||||
|
if (arg_types
|
||||||
|
&& TREE_CHAIN (arg_types) == void_list_node
|
||||||
|
&& same_type_p (TREE_VALUE (arg_types),
|
||||||
|
ptr_type_node))
|
||||||
|
use_cookie = false;
|
||||||
|
}
|
||||||
|
/* If we need a cookie, adjust the number of bytes allocated. */
|
||||||
|
if (use_cookie)
|
||||||
|
{
|
||||||
|
/* Update the total size. */
|
||||||
|
*size = size_binop (PLUS_EXPR, *size, *cookie_size);
|
||||||
|
/* Update the argument list to reflect the adjusted size. */
|
||||||
|
TREE_VALUE (args) = *size;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
*cookie_size = NULL_TREE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Build the CALL_EXPR. */
|
||||||
|
return build_over_call (cand, LOOKUP_NORMAL);
|
||||||
}
|
}
|
||||||
|
|
||||||
static tree
|
static tree
|
||||||
@ -3396,11 +3494,14 @@ prep_operand (tree operand)
|
|||||||
/* Add each of the viable functions in FNS (a FUNCTION_DECL or
|
/* Add each of the viable functions in FNS (a FUNCTION_DECL or
|
||||||
OVERLOAD) to the CANDIDATES, returning an updated list of
|
OVERLOAD) to the CANDIDATES, returning an updated list of
|
||||||
CANDIDATES. The ARGS are the arguments provided to the call,
|
CANDIDATES. The ARGS are the arguments provided to the call,
|
||||||
without any implicit object parameter. CONVERSION_PATH,
|
without any implicit object parameter. The EXPLICIT_TARGS are
|
||||||
|
explicit template arguments provided. TEMPLATE_ONLY is true if
|
||||||
|
only template fucntions should be considered. CONVERSION_PATH,
|
||||||
ACCESS_PATH, and FLAGS are as for add_function_candidate. */
|
ACCESS_PATH, and FLAGS are as for add_function_candidate. */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
add_candidates (tree fns, tree args,
|
add_candidates (tree fns, tree args,
|
||||||
|
tree explicit_targs, bool template_only,
|
||||||
tree conversion_path, tree access_path,
|
tree conversion_path, tree access_path,
|
||||||
int flags,
|
int flags,
|
||||||
struct z_candidate **candidates)
|
struct z_candidate **candidates)
|
||||||
@ -3419,7 +3520,7 @@ add_candidates (tree fns, tree args,
|
|||||||
|
|
||||||
fn = OVL_CURRENT (fns);
|
fn = OVL_CURRENT (fns);
|
||||||
/* Figure out which set of arguments to use. */
|
/* Figure out which set of arguments to use. */
|
||||||
if (TREE_CODE (TREE_TYPE (fn)) == METHOD_TYPE)
|
if (DECL_NONSTATIC_MEMBER_FUNCTION_P (fn))
|
||||||
{
|
{
|
||||||
/* If this function is a non-static member, prepend the implicit
|
/* If this function is a non-static member, prepend the implicit
|
||||||
object parameter. */
|
object parameter. */
|
||||||
@ -3437,14 +3538,14 @@ add_candidates (tree fns, tree args,
|
|||||||
add_template_candidate (candidates,
|
add_template_candidate (candidates,
|
||||||
fn,
|
fn,
|
||||||
ctype,
|
ctype,
|
||||||
NULL_TREE,
|
explicit_targs,
|
||||||
fn_args,
|
fn_args,
|
||||||
NULL_TREE,
|
NULL_TREE,
|
||||||
access_path,
|
access_path,
|
||||||
conversion_path,
|
conversion_path,
|
||||||
flags,
|
flags,
|
||||||
DEDUCE_CALL);
|
DEDUCE_CALL);
|
||||||
else
|
else if (!template_only)
|
||||||
add_function_candidate (candidates,
|
add_function_candidate (candidates,
|
||||||
fn,
|
fn,
|
||||||
ctype,
|
ctype,
|
||||||
@ -3527,7 +3628,7 @@ build_new_op (enum tree_code code, int flags, tree arg1, tree arg2, tree arg3)
|
|||||||
/* Add namespace-scope operators to the list of functions to
|
/* Add namespace-scope operators to the list of functions to
|
||||||
consider. */
|
consider. */
|
||||||
add_candidates (lookup_function_nonclass (fnname, arglist),
|
add_candidates (lookup_function_nonclass (fnname, arglist),
|
||||||
arglist, NULL_TREE, NULL_TREE,
|
arglist, NULL_TREE, false, NULL_TREE, NULL_TREE,
|
||||||
flags, &candidates);
|
flags, &candidates);
|
||||||
/* Add class-member operators to the candidate set. */
|
/* Add class-member operators to the candidate set. */
|
||||||
if (CLASS_TYPE_P (TREE_TYPE (arg1)))
|
if (CLASS_TYPE_P (TREE_TYPE (arg1)))
|
||||||
@ -3539,6 +3640,7 @@ build_new_op (enum tree_code code, int flags, tree arg1, tree arg2, tree arg3)
|
|||||||
return fns;
|
return fns;
|
||||||
if (fns)
|
if (fns)
|
||||||
add_candidates (BASELINK_FUNCTIONS (fns), arglist,
|
add_candidates (BASELINK_FUNCTIONS (fns), arglist,
|
||||||
|
NULL_TREE, false,
|
||||||
BASELINK_BINFO (fns),
|
BASELINK_BINFO (fns),
|
||||||
TYPE_BINFO (TREE_TYPE (arg1)),
|
TYPE_BINFO (TREE_TYPE (arg1)),
|
||||||
flags, &candidates);
|
flags, &candidates);
|
||||||
|
@ -3564,6 +3564,7 @@ extern tree type_decays_to (tree);
|
|||||||
extern tree resolve_scoped_fn_name (tree, tree);
|
extern tree resolve_scoped_fn_name (tree, tree);
|
||||||
extern tree build_user_type_conversion (tree, tree, int);
|
extern tree build_user_type_conversion (tree, tree, int);
|
||||||
extern tree build_new_function_call (tree, tree);
|
extern tree build_new_function_call (tree, tree);
|
||||||
|
extern tree build_operator_new_call (tree, tree, tree *, tree *);
|
||||||
extern tree build_new_method_call (tree, tree, tree, tree, int);
|
extern tree build_new_method_call (tree, tree, tree, tree, int);
|
||||||
extern tree build_special_member_call (tree, tree, tree, tree, int);
|
extern tree build_special_member_call (tree, tree, tree, tree, int);
|
||||||
extern tree build_new_op (enum tree_code, int, tree, tree, tree);
|
extern tree build_new_op (enum tree_code, int, tree, tree, tree);
|
||||||
@ -4324,8 +4325,6 @@ extern tree build_x_indirect_ref (tree, const char *);
|
|||||||
extern tree build_indirect_ref (tree, const char *);
|
extern tree build_indirect_ref (tree, const char *);
|
||||||
extern tree build_array_ref (tree, tree);
|
extern tree build_array_ref (tree, tree);
|
||||||
extern tree get_member_function_from_ptrfunc (tree *, tree);
|
extern tree get_member_function_from_ptrfunc (tree *, tree);
|
||||||
extern tree build_function_call_real (tree, tree, int, int);
|
|
||||||
extern tree build_function_call_maybe (tree, tree);
|
|
||||||
extern tree convert_arguments (tree, tree, tree, int);
|
extern tree convert_arguments (tree, tree, tree, int);
|
||||||
extern tree build_x_binary_op (enum tree_code, tree, tree);
|
extern tree build_x_binary_op (enum tree_code, tree, tree);
|
||||||
extern tree build_x_unary_op (enum tree_code, tree);
|
extern tree build_x_unary_op (enum tree_code, tree);
|
||||||
|
@ -2167,7 +2167,6 @@ build_new_1 (exp)
|
|||||||
/* Nonzero if the user wrote `::new' rather than just `new'. */
|
/* Nonzero if the user wrote `::new' rather than just `new'. */
|
||||||
int globally_qualified_p;
|
int globally_qualified_p;
|
||||||
int use_java_new = 0;
|
int use_java_new = 0;
|
||||||
bool check_cookie = false;
|
|
||||||
/* If non-NULL, the number of extra bytes to allocate at the
|
/* If non-NULL, the number of extra bytes to allocate at the
|
||||||
beginning of the storage allocated for an array-new expression in
|
beginning of the storage allocated for an array-new expression in
|
||||||
order to store the number of elements. */
|
order to store the number of elements. */
|
||||||
@ -2272,14 +2271,14 @@ build_new_1 (exp)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* Use a global operator new. */
|
/* Use a global operator new. */
|
||||||
/* Create the argument list. */
|
/* See if a cookie might be required. */
|
||||||
args = tree_cons (NULL_TREE, size, placement);
|
if (has_array && TYPE_VEC_NEW_USES_COOKIE (true_type))
|
||||||
/* Call the function. */
|
cookie_size = get_cookie_size (true_type);
|
||||||
alloc_call
|
else
|
||||||
= build_new_function_call (lookup_function_nonclass (fnname, args),
|
cookie_size = NULL_TREE;
|
||||||
args);
|
|
||||||
/* We may need to add a cookie. */
|
alloc_call = build_operator_new_call (fnname, placement,
|
||||||
check_cookie = true;
|
&size, &cookie_size);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2295,52 +2294,6 @@ build_new_1 (exp)
|
|||||||
alloc_fn = get_callee_fndecl (t);
|
alloc_fn = get_callee_fndecl (t);
|
||||||
my_friendly_assert (alloc_fn != NULL_TREE, 20020325);
|
my_friendly_assert (alloc_fn != NULL_TREE, 20020325);
|
||||||
|
|
||||||
/* If we postponed deciding whether or not to use a cookie until
|
|
||||||
after we knew what function was being called, that time is
|
|
||||||
now. */
|
|
||||||
if (check_cookie)
|
|
||||||
{
|
|
||||||
/* If a cookie is required, add some extra space. Whether
|
|
||||||
or not a cookie is required cannot be determined until
|
|
||||||
after we know which function was called. */
|
|
||||||
if (has_array && TYPE_VEC_NEW_USES_COOKIE (true_type))
|
|
||||||
{
|
|
||||||
bool use_cookie = true;
|
|
||||||
if (!abi_version_at_least (2))
|
|
||||||
{
|
|
||||||
/* In G++ 3.2, the check was implemented incorrectly; it
|
|
||||||
looked at the placement expression, rather than the
|
|
||||||
type of the function. */
|
|
||||||
if (placement && !TREE_CHAIN (placement)
|
|
||||||
&& same_type_p (TREE_TYPE (TREE_VALUE (placement)),
|
|
||||||
ptr_type_node))
|
|
||||||
use_cookie = false;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
tree arg_types;
|
|
||||||
|
|
||||||
arg_types = TYPE_ARG_TYPES (TREE_TYPE (alloc_fn));
|
|
||||||
/* Skip the size_t parameter. */
|
|
||||||
arg_types = TREE_CHAIN (arg_types);
|
|
||||||
/* Check the remaining parameters (if any). */
|
|
||||||
if (arg_types
|
|
||||||
&& !TREE_CHAIN (arg_types)
|
|
||||||
&& same_type_p (TREE_TYPE (TREE_VALUE (arg_types)),
|
|
||||||
ptr_type_node))
|
|
||||||
use_cookie = false;
|
|
||||||
}
|
|
||||||
/* If we need a cookie, adjust the number of bytes allocated. */
|
|
||||||
if (use_cookie)
|
|
||||||
{
|
|
||||||
cookie_size = get_cookie_size (true_type);
|
|
||||||
size = size_binop (PLUS_EXPR, size, cookie_size);
|
|
||||||
/* Update the argument list to reflect the adjusted size. */
|
|
||||||
TREE_VALUE (args) = cookie_size;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Now, check to see if this function is actually a placement
|
/* Now, check to see if this function is actually a placement
|
||||||
allocation function. This can happen even when PLACEMENT is NULL
|
allocation function. This can happen even when PLACEMENT is NULL
|
||||||
because we might have something like:
|
because we might have something like:
|
||||||
|
@ -2655,9 +2655,8 @@ get_member_function_from_ptrfunc (instance_ptrptr, function)
|
|||||||
}
|
}
|
||||||
|
|
||||||
tree
|
tree
|
||||||
build_function_call_real (function, params, require_complete, flags)
|
build_function_call (function, params)
|
||||||
tree function, params;
|
tree function, params;
|
||||||
int require_complete, flags;
|
|
||||||
{
|
{
|
||||||
register tree fntype, fndecl;
|
register tree fntype, fndecl;
|
||||||
register tree value_type;
|
register tree value_type;
|
||||||
@ -2731,20 +2730,10 @@ build_function_call_real (function, params, require_complete, flags)
|
|||||||
/* Convert the parameters to the types declared in the
|
/* Convert the parameters to the types declared in the
|
||||||
function prototype, or apply default promotions. */
|
function prototype, or apply default promotions. */
|
||||||
|
|
||||||
if (flags & LOOKUP_COMPLAIN)
|
coerced_params = convert_arguments (TYPE_ARG_TYPES (fntype),
|
||||||
coerced_params = convert_arguments (TYPE_ARG_TYPES (fntype),
|
params, fndecl, LOOKUP_NORMAL);
|
||||||
params, fndecl, LOOKUP_NORMAL);
|
|
||||||
else
|
|
||||||
coerced_params = convert_arguments (TYPE_ARG_TYPES (fntype),
|
|
||||||
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. */
|
||||||
|
|
||||||
@ -2770,23 +2759,13 @@ build_function_call_real (function, params, require_complete, flags)
|
|||||||
result = fold (build_call (function, coerced_params));
|
result = fold (build_call (function, coerced_params));
|
||||||
value_type = TREE_TYPE (result);
|
value_type = TREE_TYPE (result);
|
||||||
|
|
||||||
if (require_complete)
|
if (TREE_CODE (value_type) == VOID_TYPE)
|
||||||
{
|
return result;
|
||||||
if (TREE_CODE (value_type) == VOID_TYPE)
|
result = require_complete_type (result);
|
||||||
return result;
|
|
||||||
result = require_complete_type (result);
|
|
||||||
}
|
|
||||||
if (IS_AGGR_TYPE (value_type))
|
if (IS_AGGR_TYPE (value_type))
|
||||||
result = build_cplus_new (value_type, result);
|
result = build_cplus_new (value_type, result);
|
||||||
return convert_from_reference (result);
|
return convert_from_reference (result);
|
||||||
}
|
}
|
||||||
|
|
||||||
tree
|
|
||||||
build_function_call (function, params)
|
|
||||||
tree function, params;
|
|
||||||
{
|
|
||||||
return build_function_call_real (function, params, 1, LOOKUP_NORMAL);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Convert the actual parameter expressions in the list VALUES
|
/* Convert the actual parameter expressions in the list VALUES
|
||||||
to the types in the list TYPELIST.
|
to the types in the list TYPELIST.
|
||||||
|
@ -1,3 +1,8 @@
|
|||||||
|
2003-03-10 Mark Mitchell <mark@codesourcery.com>
|
||||||
|
|
||||||
|
* g++.old-deja/g++.benjamin/16077.C: Adjust warnings.
|
||||||
|
* g++.old-deja/g++.warn/impint2.C: Likewise.
|
||||||
|
|
||||||
2003-03-10 Devang Patel <dpatel@apple.com>
|
2003-03-10 Devang Patel <dpatel@apple.com>
|
||||||
|
|
||||||
* g++.dg/cpp/c++_cmd_1.C: New test.
|
* g++.dg/cpp/c++_cmd_1.C: New test.
|
||||||
|
@ -17,7 +17,7 @@ public:
|
|||||||
operator colombia();
|
operator colombia();
|
||||||
};
|
};
|
||||||
|
|
||||||
void peace(const colombia&); // WARNING - // WARNING -
|
void peace(const colombia&);
|
||||||
|
|
||||||
void foo(nicaragua& b) {
|
void foo(nicaragua& b) {
|
||||||
peace(b); // WARNING - // WARNING -
|
peace(b); // WARNING - // WARNING -
|
||||||
|
@ -13,7 +13,7 @@ struct X
|
|||||||
X (int const &, int const &);
|
X (int const &, int const &);
|
||||||
};
|
};
|
||||||
|
|
||||||
void foo (int const &); // WARNING - in passing
|
void foo (int const &);
|
||||||
void wibble (int const &);
|
void wibble (int const &);
|
||||||
void wibble (int const &, int const &);
|
void wibble (int const &, int const &);
|
||||||
void punk (int const & = 3.5f); // WARNING - in passing
|
void punk (int const & = 3.5f); // WARNING - in passing
|
||||||
|
Loading…
Reference in New Issue
Block a user