mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-03-18 14:30:42 +08:00
re PR c++/13086 (the location of the warning message is wrong when calling delete on incomplete type)
PR c++/13086 * init.c (build_delete): Emit a more informative error message in case of an incomplete type, and on the correct source line. From-SVN: r77289
This commit is contained in:
parent
6f3d0d2f8d
commit
b1e5b86c52
@ -1,3 +1,9 @@
|
||||
2004-02-04 Giovanni Bajo <giovannibajo@gcc.gnu.org>
|
||||
|
||||
PR c++/13086
|
||||
* init.c (build_delete): Emit a more informative error message in
|
||||
case of an incomplete type, and on the correct source line.
|
||||
|
||||
2004-02-04 Kazu Hirata <kazu@cs.umass.edu>
|
||||
|
||||
* error.c, search.c: Update copyright.
|
||||
|
@ -2020,12 +2020,12 @@ build_new_1 (tree exp)
|
||||
use_java_new = 1;
|
||||
if (!get_global_value_if_present (get_identifier (alloc_name),
|
||||
&alloc_decl))
|
||||
{
|
||||
{
|
||||
error ("call to Java constructor with `%s' undefined", alloc_name);
|
||||
return error_mark_node;
|
||||
}
|
||||
else if (really_overloaded_fn (alloc_decl))
|
||||
{
|
||||
{
|
||||
error ("`%D' should never be overloaded", alloc_decl);
|
||||
return error_mark_node;
|
||||
}
|
||||
@ -2856,23 +2856,35 @@ build_delete (tree type, tree addr, special_function_kind auto_delete,
|
||||
|
||||
if (TREE_CODE (type) == POINTER_TYPE)
|
||||
{
|
||||
bool complete_p = true;
|
||||
|
||||
type = TYPE_MAIN_VARIANT (TREE_TYPE (type));
|
||||
if (TREE_CODE (type) == ARRAY_TYPE)
|
||||
goto handle_array;
|
||||
|
||||
if (VOID_TYPE_P (type)
|
||||
/* We don't want to warn about delete of void*, only other
|
||||
incomplete types. Deleting other incomplete types
|
||||
invokes undefined behavior, but it is not ill-formed, so
|
||||
compile to something that would even do The Right Thing
|
||||
(TM) should the type have a trivial dtor and no delete
|
||||
operator. */
|
||||
|| !complete_type_or_diagnostic (type, addr, 1)
|
||||
|| !IS_AGGR_TYPE (type))
|
||||
/* We don't want to warn about delete of void*, only other
|
||||
incomplete types. Deleting other incomplete types
|
||||
invokes undefined behavior, but it is not ill-formed, so
|
||||
compile to something that would even do The Right Thing
|
||||
(TM) should the type have a trivial dtor and no delete
|
||||
operator. */
|
||||
if (!VOID_TYPE_P (type))
|
||||
{
|
||||
/* Call the builtin operator delete. */
|
||||
return build_builtin_delete_call (addr);
|
||||
complete_type (type);
|
||||
if (!COMPLETE_TYPE_P (type))
|
||||
{
|
||||
warning ("possible problem detected in invocation of "
|
||||
"delete operator:");
|
||||
cxx_incomplete_type_diagnostic (addr, type, 1);
|
||||
inform ("neither the destructor nor the class-specific "
|
||||
"operator delete will be called, even if they are "
|
||||
"declared when the class is defined.");
|
||||
complete_p = false;
|
||||
}
|
||||
}
|
||||
if (VOID_TYPE_P (type) || !complete_p || !IS_AGGR_TYPE (type))
|
||||
/* Call the builtin operator delete. */
|
||||
return build_builtin_delete_call (addr);
|
||||
if (TREE_SIDE_EFFECTS (addr))
|
||||
addr = save_expr (addr);
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user