Bug#512129: (no subject)
Package: g++-4.3
Version: 4.3.2-1.1
When compiling a program which used the C++ STL to contain instances of a class
of my own devising, I encountered spurious warnings. I have been able to reduce
the necessary code to a simple test case, which is included in this bug report
along with a transcript of the spurious warninngs seen when compiling it.
mormegil@fangasm:~/src/dungeonbash-2.0.0$ uname -a
Linux fangasm 2.6.26-1-686 #1 SMP Wed Nov 26 19:14:11 UTC 2008 i686 GNU/Linux
mormegil@fangasm:~/src/dungeonbash-2.0.0$ g++ --version
g++ (Debian 4.3.2-1.1) 4.3.2
Copyright (C) 2008 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
mormegil@fangasm:~/src/dungeonbash-2.0.0$ make coordtest
g++ -c -g -Wall -Wwrite-strings -Wredundant-decls -Wunreachable-code
-DMAJVERS=2 -DMINVERS=0 -DPATCHVERS=0 -c -o coordtest.o coordtest.cc
coordtest.cc: In member function â??T libmrl::basic_coord<T>::distance(const libmrl::basic_coord<T>&) const [with T = int]â??:
coordtest.cc:28: warning: will never be executed
coordtest.cc: In member function â??bool libmrl::basic_coord<T>::operator<(const libmrl::basic_coord<T>&) const [with T = int]â??:
coordtest.cc:20: warning: will never be executed
/usr/include/c++/4.3/bits/stl_tree.h: In member function â??std::_Rb_tree_node<_Val>* std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::_M_create_node(const _Val&) [with _Key = libmrl::basic_coord<int>, _Val = libmrl::basic_coord<int>, _KeyOfValue = std::_Identity<libmrl::basic_coord<int> >, _Compare = std::less<libmrl::basic_coord<int> >, _Alloc = std::allocator<libmrl::basic_coord<int> >]â??:
/usr/include/c++/4.3/bits/stl_tree.h:369: warning: will never be executed
/usr/include/c++/4.3/bits/stl_tree.h:372: warning: will never be executed
/usr/include/c++/4.3/bits/stl_tree.h:369: warning: will never be executed
g++ coordtest.o -o coordtest
mormegil@fangasm:~/src/dungeonbash-2.0.0$
mormegil@fangasm:~$ ls -l /lib/libc.so.6
lrwxrwxrwx 1 root root 11 2008-12-17 22:00 /lib/libc.so.6 -> libc-2.7.so
mormegil@fangasm:~$
The test case follows:
#include <cstdio>
#include <list>
#include <set>
namespace libmrl
{
template <typename T> class basic_coord
{
public:
T y;
T x;
basic_coord<T>& operator -=(basic_coord<T> const& right) throw()
{
y -= right.y; x -= right.x; return *this;
}
basic_coord<T>& operator +=(basic_coord<T> const& right) throw()
{
y += right.y; x += right.x; return *this;
}
bool operator < (basic_coord<T> const& right) const throw()
{
return (y < right.y) || ((y == right.y) && (x < right.x));
}
bool operator == (basic_coord<T> const& right) const throw()
{
return (y == right.y) && (x == right.x);
}
T distance(basic_coord<T> const& right) const throw()
{
T dy, dx;
dy = right.y - y;
dx = right.x - x;
if (dy < 0) dy = -dy;
if (dx < 0) dx = -dx;
return (dy > dx) ? dy : dx;
}
};
typedef basic_coord<int> Coord;
}
int main()
{
libmrl::Coord c = { 1, 2 };
libmrl::Coord d = { 3, 4 };
std::printf("%d %d to %d %d: distance %d or %d\n", c.y, c.x, d.y, d.x, c.distance(d), d.distance(c));
std::list<libmrl::Coord> oink;
oink.push_front(c);
oink.push_front(d);
std::printf("%d\n", oink.size());
std::set<libmrl::Coord> spang;
spang.insert(c);
spang.insert(d);
std::printf("%d\n", spang.size());
}
Reply to: