OSDN Git Service

PR c++/13086
authorgiovannibajo <giovannibajo@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 5 Feb 2004 02:48:31 +0000 (02:48 +0000)
committergiovannibajo <giovannibajo@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 5 Feb 2004 02:48:31 +0000 (02:48 +0000)
* init.c (build_delete): Emit a more informative error message in
case of an incomplete type, and on the correct source line.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@77289 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/cp/ChangeLog
gcc/cp/init.c

index ae4493a..083bebe 100644 (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.
index 2c89996..e380444 100644 (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))
-       {\r
+       {
          error ("call to Java constructor with `%s' undefined", alloc_name);
          return error_mark_node;
        }
       else if (really_overloaded_fn (alloc_decl))
-       {\r
+       {
          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 "\r
+                     "operator delete will be called, even if they are "\r
+                     "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);