-Wnon-virtual-dtor should't complain of protected dtor
>Submitter-Id: net
>Originator: Cesar Eduardo Barros
>Organization:
>Confidential: no
>Synopsis: -Wnon-virtual-dtor should't complain of protected dtor
>Severity: non-critical
>Priority: low
>Category: c++
>Class: sw-bug
>Release: 3.1.1 20020703 (Debian prerelease) (Debian testing/unstable)
>Environment:
System: Linux flower 2.4.18-preempt #1 Mon Jun 17 14:21:46 BRT 2002 i686 unknown
Architecture: i686
host: i386-pc-linux-gnu
build: i386-pc-linux-gnu
target: i386-pc-linux-gnu
configured with: /mnt/data/gcc-3.1/gcc-3.1-3.1.1ds2/src/configure -v --enable-languages=c,c++,java,f77,proto,objc,ada --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-gxx-include-dir=/usr/include/g++-v3-3.1 --enable-shared --with-system-zlib --enable-long-long --enable-nls --without-included-gettext --enable-clocale=gnu --enable-__cxa_atexit --enable-threads=posix --enable-java-gc=boehm --enable-objc-gc i386-linux
>Description:
-Wnon-virtual-dtor warns even when the destructor is protected and the
class has only pure virtual members and no friends.
In that case, there's no way the destructor can be called incorrectly.
The class can't call it, since there are no methods other than the
destructor itself. There are no friends who could call it. And if you
inherit from it without making the derived class' destructor virtual,
it would complain about it in the derived class, since it has virtual
functions and a non-virtual destructor (unless it also has no non-pure
members, no friends and a non-public destructor).
>How-To-Repeat:
Input file:
=== x.cc ===
class x
{
public:
virtual void y () = 0;
protected:
~x () { }
};
void f (x* p)
{
p->y();
delete p;
}
======
Command line:
======
g++-3.1 -Wnon-virtual-dtor -O2 -v -save-temps x.cc -o x
======
Compiler output:
======
Reading specs from /usr/lib/gcc-lib/i386-linux/3.1.1/specs
Configured with: /mnt/data/gcc-3.1/gcc-3.1-3.1.1ds2/src/configure -v --enable-languages=c,c++,java,f77,proto,objc,ada --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-gxx-include-dir=/usr/include/g++-v3-3.1 --enable-shared --with-system-zlib --enable-long-long --enable-nls --without-included-gettext --enable-clocale=gnu --enable-__cxa_atexit --enable-threads=posix --enable-java-gc=boehm --enable-objc-gc i386-linux
Thread model: posix
gcc version 3.1.1 20020703 (Debian prerelease)
/usr/lib/gcc-lib/i386-linux/3.1.1/cpp0 -lang-c++ -D__GNUG__=3 -D__DEPRECATED -D__EXCEPTIONS -D__GXX_ABI_VERSION=100 -v -D__GNUC__=3 -D__GNUC_MINOR__=1 -D__GNUC_PATCHLEVEL__=1 -D__ELF__ -Dunix -D__gnu_linux__ -Dlinux -D__ELF__ -D__unix__ -D__gnu_linux__ -D__linux__ -D__unix -D__linux -Asystem=posix -D__OPTIMIZE__ -D__STDC_HOSTED__=1 -D_GNU_SOURCE -Acpu=i386 -Amachine=i386 -Di386 -D__i386 -D__i386__ -D__tune_i386__ x.cc -Wnon-virtual-dtor x.ii
GNU CPP version 3.1.1 20020703 (Debian prerelease) (cpplib) (i386 Linux/ELF)
ignoring nonexistent directory "/usr/i386-linux/include"
#include "..." search starts here:
#include <...> search starts here:
/usr/include/g++-v3-3.1
/usr/include/g++-v3-3.1/i386-linux
/usr/include/g++-v3-3.1/backward
/usr/local/include
/usr/lib/gcc-lib/i386-linux/3.1.1/include
/usr/include
End of search list.
/usr/lib/gcc-lib/i386-linux/3.1.1/cc1plus -fpreprocessed x.ii -quiet -dumpbase x.cc -O2 -Wnon-virtual-dtor -version -o x.s
GNU CPP version 3.1.1 20020703 (Debian prerelease) (cpplib) (i386 Linux/ELF)
GNU C++ version 3.1.1 20020703 (Debian prerelease) (i386-linux)
compiled by GNU C version 3.1.1 20020703 (Debian prerelease).
x.cc:2: warning: `class x' has virtual functions but non-virtual destructor
x.cc: In function `void f(x*)':
x.cc:7: `x::~x()' is protected
x.cc:13: within this context
======
The warning at line 2 is the bogus one. The error at line 13 is on purpose, to
show you can't delete it (and so that the warning is bogus).
>Fix:
If a class has only pure virtual members besides the destructor and
has no friends, and the destructor is protected or private, then the
warning shouldn't be shown.
--
To UNSUBSCRIBE, email to debian-gcc-request@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listmaster@lists.debian.org
Reply to: