This is the mail archive of the gcc-bugs@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: c++/9165: [3.3/3.4 regression] false "defined but not used"warnings




--On Monday, January 06, 2003 03:01:36 PM -0800 Joe Buck <jbuck@synopsys.com> wrote:

On Mon, Jan 06, 2003 at 02:43:44PM -0800, Janis Johnson wrote:
The regression showed up with this patch:


Thanks, Janis.  Mark, could you have a look at this when you get a chance?
It seems that the error arises because, after inlining, nothing touches
the Cleanup object (since the body of the destructor calls a function
that does not take the Cleanup object as an argument).
Fixed with this patch.

Tested on i686-pc-linux-gnu, applied on the mainline and on the 3.3
branch.

--
Mark Mitchell                mark@codesourcery.com
CodeSourcery, LLC            http://www.codesourcery.com

2003-01-06  Mark Mitchell  <mark@codesourcery.com>

	PR c++/9165
	* decl2.c (build_cleanup): Mark the object as used.

2003-01-06  Mark Mitchell  <mark@codesourcery.com>

	PR c++/9165
	* g++.dg/warn/Wunused-3.C: New test.

Index: testsuite/g++.dg/warn/Wunused-3.C
===================================================================
RCS file: testsuite/g++.dg/warn/Wunused-3.C
diff -N testsuite/g++.dg/warn/Wunused-3.C
*** /dev/null	1 Jan 1970 00:00:00 -0000
--- testsuite/g++.dg/warn/Wunused-3.C	7 Jan 2003 02:31:09 -0000
***************
*** 0 ****
--- 1,11 ----
+ // { dg-do compile }
+ // { dg-options "-Wunused -O" }
+
+ void do_cleanups();
+
+ class Cleanup {
+ public:
+     ~Cleanup() { do_cleanups();}
+ };
+
+ static Cleanup dummy;
Index: cp/decl2.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/cp/decl2.c,v
retrieving revision 1.591
diff -c -5 -p -r1.591 decl2.c
*** cp/decl2.c	7 Jan 2003 01:34:37 -0000	1.591
--- cp/decl2.c	7 Jan 2003 02:31:14 -0000
*************** import_export_tinfo (tree decl, tree typ
*** 1863,1877 ****
--- 1863,1889 ----
     DECL_COMDAT (decl) = 0;

   DECL_INTERFACE_KNOWN (decl) = 1;
 }

+ /* Return an expression that performs the destruction of DECL, which
+    must be a VAR_DECL whose type has a non-trivial destructor, or is
+    an array whose (innermost) elements have a non-trivial destructor.  */
+
 tree
 build_cleanup (tree decl)
 {
   tree temp;
   tree type = TREE_TYPE (decl);
+
+   /* This function should only be called for declarations that really
+      require cleanups.  */
+   my_friendly_assert (!TYPE_HAS_TRIVIAL_DESTRUCTOR (type), 20030106);
+
+   /* Treat all objects with destructors as used; the destructor may do
+      something substantive.  */
+   mark_used (decl);

   if (TREE_CODE (type) == ARRAY_TYPE)
     temp = decl;
   else
     {


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]