This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
Re: c++/9165: [3.3/3.4 regression] false "defined but not used"warnings
- From: Mark Mitchell <mark at codesourcery dot com>
- To: Joe Buck <jbuck at synopsys dot com>, Janis Johnson <janis187 at us dot ibm dot com>
- Cc: "gcc-bugs at gcc dot gnu dot org" <gcc-bugs at gcc dot gnu dot org>
- Date: Mon, 06 Jan 2003 18:35:44 -0800
- Subject: 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
{