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:
Giovanni Bajo 2004-02-05 02:48:31 +00:00
parent 6f3d0d2f8d
commit b1e5b86c52
2 changed files with 31 additions and 13 deletions

View File

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

View File

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