PR/21391
authoraldyh <aldyh@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 5 May 2006 19:57:38 +0000 (19:57 +0000)
committeraldyh <aldyh@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 5 May 2006 19:57:38 +0000 (19:57 +0000)
        * c-parser.c (c_parser_cast_expression): Only insert casts into
        hash table if pointer.
        * function.c (used_types_insert_helper): Rename from
        used_types_insert.
        (used_types_insert): Call used_types_insert_helper.
        * function.h (used_types_insert): Accept only one argument.
        * cp/typeck.c (build_static_cast_1): Save casted types in used types
        hash table.
        (build_reinterpret_cast_1): Same.
        * cp/rtti.c (build_dynamic_cast_1): Same.
        * testsuite/g++.dg/other/unused1.C: New.

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

gcc/ChangeLog
gcc/c-parser.c
gcc/cp/ChangeLog
gcc/cp/rtti.c
gcc/cp/typeck.c
gcc/function.c
gcc/function.h
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/other/unused1.C [new file with mode: 0644]

index d0e6414..26281ed 100644 (file)
@@ -1,3 +1,13 @@
+2006-05-03  Aldy Hernandez  <aldyh@redhat.com>
+
+       PR/21391
+       * c-parser.c (c_parser_cast_expression): Only insert casts into
+       hash table if pointer.
+       * function.c (used_types_insert_helper): Rename from
+       used_types_insert.
+       (used_types_insert): Call used_types_insert_helper.
+       * function.h (used_types_insert): Accept only one argument.
+
 2006-05-05  David Edelsohn  <edesohn@gnu.org>
 
        * config/rs6000/rs6000.md: Mark all "X" constraints for clobbered
index 48edab7..aad1c6b 100644 (file)
@@ -4691,8 +4691,7 @@ c_parser_cast_expression (c_parser *parser, struct c_expr *after)
        }
 
       /* Save casted types in the function's used types hash table.  */
-      if (debug_info_level > DINFO_LEVEL_NONE)
-       used_types_insert (type_name->specs->type, cfun);
+      used_types_insert (type_name->specs->type);
 
       if (c_parser_next_token_is (parser, CPP_OPEN_BRACE))
        return c_parser_postfix_expression_after_paren_type (parser,
index d4a01fc..f423f4f 100644 (file)
@@ -1,3 +1,11 @@
+2006-05-03  Aldy Hernandez  <aldyh@redhat.com>
+
+       PR/21391
+       * typeck.c (build_static_cast_1): Save casted types in used types
+       hash table.
+       (build_reinterpret_cast_1): Same.
+       * rtti.c (build_dynamic_cast_1): Same.
+
 2006-05-04  Jakub Jelinek  <jakub@redhat.com>
 
        PR c++/27359
index 5c6d38d..6242e44 100644 (file)
@@ -464,6 +464,9 @@ build_dynamic_cast_1 (tree type, tree expr)
   tree old_expr = expr;
   const char *errstr = NULL;
 
+  /* Save casted types in the function's used types hash table.  */
+  used_types_insert (type);
+
   /* T shall be a pointer or reference to a complete class type, or
      `pointer to cv void''.  */
   switch (tc)
index 394a4ec..78e3a2b 100644 (file)
@@ -4759,6 +4759,9 @@ build_static_cast_1 (tree type, tree expr, bool c_cast_p,
 
   intype = TREE_TYPE (expr);
 
+  /* Save casted types in the function's used types hash table.  */
+  used_types_insert (type);
+
   /* Determine what to do when casting away constness.  */
   if (c_cast_p)
     {
@@ -5047,6 +5050,9 @@ build_reinterpret_cast_1 (tree type, tree expr, bool c_cast_p,
 
   intype = TREE_TYPE (expr);
 
+  /* Save casted types in the function's used types hash table.  */
+  used_types_insert (type);
+
   /* [expr.reinterpret.cast]
      An lvalue expression of type T1 can be cast to the type
      "reference to T2" if an expression of type "pointer to T1" can be
@@ -5242,6 +5248,9 @@ build_const_cast_1 (tree dst_type, tree expr, bool complain,
       return error_mark_node;
     }
 
+  /* Save casted types in the function's used types hash table.  */
+  used_types_insert (dst_type);
+
   src_type = TREE_TYPE (expr);
   /* Expressions do not really have reference types.  */
   if (TREE_CODE (src_type) == REFERENCE_TYPE)
index cc50f50..bb64801 100644 (file)
@@ -5590,23 +5590,34 @@ rest_of_handle_check_leaf_regs (void)
   return 0;
 }
 
-/* Insert a type into the used types hash table.  */
-void
-used_types_insert (tree t, struct function *func)
+/* Insert a TYPE into the used types hash table of CFUN.  */
+static void
+used_types_insert_helper (tree type, struct function *func)
 {
-  if (t != NULL && func != NULL)
+  if (type != NULL && func != NULL)
     {
       void **slot;
 
       if (func->used_types_hash == NULL)
        func->used_types_hash = htab_create_ggc (37, htab_hash_pointer,
-                                            htab_eq_pointer, NULL);
-      slot = htab_find_slot (func->used_types_hash, t, INSERT);
+                                                htab_eq_pointer, NULL);
+      slot = htab_find_slot (func->used_types_hash, type, INSERT);
       if (*slot == NULL)
-       *slot = t;
+       *slot = type;
     }
 }
 
+/* Given a type, insert it into the used hash table in cfun.  */
+void
+used_types_insert (tree t)
+{
+  while (POINTER_TYPE_P (t) || TREE_CODE (t) == ARRAY_TYPE)
+    t = TREE_TYPE (t);
+  t = TYPE_MAIN_VARIANT (t);
+  if (debug_info_level > DINFO_LEVEL_NONE)
+    used_types_insert_helper (t, cfun);
+}
+
 struct tree_opt_pass pass_leaf_regs =
 {
   NULL,                                 /* name */
index bce5290..6329525 100644 (file)
@@ -576,6 +576,6 @@ extern bool pass_by_reference (CUMULATIVE_ARGS *, enum machine_mode,
 extern bool reference_callee_copied (CUMULATIVE_ARGS *, enum machine_mode,
                                     tree, bool);
 
-extern void used_types_insert (tree, struct function *);
+extern void used_types_insert (tree);
 
 #endif  /* GCC_FUNCTION_H */
index 4b75dbe..c6683a9 100644 (file)
@@ -1,3 +1,8 @@
+2006-05-03  Aldy Hernandez  <aldyh@redhat.com>
+
+       PR/21391
+       * g++.dg/other/unused1.C: New.
+
 2006-05-05  Volker Reichelt  <reichelt@igpm.rwth-aachen.de>
 
        PR objc/27240
diff --git a/gcc/testsuite/g++.dg/other/unused1.C b/gcc/testsuite/g++.dg/other/unused1.C
new file mode 100644 (file)
index 0000000..e50ce38
--- /dev/null
@@ -0,0 +1,47 @@
+/* { dg-do compile } */
+/* { dg-options "-g" } */
+
+/* Make sure we didn't eliminate casted types because we thought they were
+   unused.  */
+
+void *voidp;
+
+struct foo { int i; };
+int bar (void)
+{
+    return ((struct foo *)0x1234)->i;
+}
+
+struct boo { int i; };
+int bar2 (void)
+{
+  return reinterpret_cast<struct boo *>(0xC0FFEE)->i;
+}
+
+struct cue { int i; };
+int bar3 (void)
+{
+  return static_cast<struct cue *>(voidp)->i;
+}
+
+class printer { public: int i; };
+const printer *dotmatrix;
+int bar4 (void)
+{
+  return const_cast<printer *>(dotmatrix)->i;
+}
+
+class class1 { virtual ~class1(); } *c1;
+class class2 : class1 { char j; };
+int bar5 (void)
+{
+  if (dynamic_cast <class2 *>(c1))
+    return 5;
+  else
+    return 6;
+}
+/* { dg-final { scan-assembler "foo" } } */
+/* { dg-final { scan-assembler "boo" } } */
+/* { dg-final { scan-assembler "cue" } } */
+/* { dg-final { scan-assembler "string\t\"class2\"" } } */
+/* { dg-final { scan-assembler "string\t\"printer\"" } } */