[Bug c++/81932] New: Template arguments of type unsigned generate incorrect debugging information
psmith at gnu dot org
gcc-bugzilla@gcc.gnu.org
Wed Aug 23 01:03:00 GMT 2017
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=81932
Bug ID: 81932
Summary: Template arguments of type unsigned generate incorrect
debugging information
Product: gcc
Version: 7.2.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: psmith at gnu dot org
Target Milestone: ---
I've upgraded from GCC 6.2/binutils 2.27 to GCC 7.2/binutils 2.29 (compiled
myself), running on GNU/Linux on x86_64. Everything is fine except that GDB
(I've tried both 7.11 and 8.0) can no longer correctly print objects of one of
my templated classes, which I have created a Python printer for.
My template is complex but it's basically:
template<typename T, unsigned int LEAF_SIZE_POW = 6>
class TreeVector
{
...
class Tree
{
...
private:
uint const _depth;
};
...
Tree* tree;
uint64 _maxIndex;
...
};
When I compile with GCC 6.2, I'm able to see the type of my object via GDB
Python macros:
(gdb) ptype tv
type = class TreeVector<Pod, 2u> [with T = Pod] {
private:
TreeVector<T, 2u>::Tree *tree;
volatile uint64 _maxIndex;
...
(gdb) ptype tv.tree
type = class TreeVector<Pod, 2u>::Tree {
private:
const uint _depth;
...
(gdb) python
>class tv(gdb.Function):
> def __init__(self):
> gdb.Function.__init__(self, "tv")
> def invoke(self, vector):
> gdb.write("vector: %s\n" % (str(vector.type)))
> gdb.write("tree: %s\n" % (str(vector['tree'].type)))
> gdb.write("depth: %d\n" % (vector['tree']['_depth']))
> tt = gdb.lookup_type("TreeVector<Pod, 2u>::Tree")
> return 0
>tv()
>^D
(gdb) p $tv(tv)
vector: TreeVector<Pod, 2u>
tree: TreeVector<Pod, 2u>::Tree *
depth: 3
$1 = 0
Note here how the value for the second template argument is "2u" and everything
works.
Now I compile this same code with GCC 7.2/binutils 2.29 and use the same GDB,
and my results are different:
(gdb) ptype tv
type = class TreeVector<Pod, 2> [with T = Pod] {
private:
TreeVector<T, 2>::Tree *tree;
volatile uint64 _maxIndex;
...
(gdb) ptype tv.tree
type = class TreeVector<Pod, 2>::Tree {
private:
const uint _depth;
...
(gdb) p $tv(tv)
vector: TreeVector<Pod, 2>
tree: TreeVector<Pod, 2>::Tree *
warning: RTTI symbol not found for class 'TreeVector<Pod, 2u>::Tree'
depth: 3
Python Exception <class 'gdb.error'> No type named TreeVector<Pod,
2u>::Tree.:
Error occurred in Python convenience function: No type named TreeVector<Pod,
2u>::Tree.
Note how the value in the template is just "2", not "2u". But, when GDB shows
the RTTI warning it's still looking for the "2u" in the type. However that
type definitely doesn't exist (we get an error trying to look it up).
If I change my template to use "int" instead of "unsigned int", then everything
works in both versions of GCC (removing the now-invalid gdb.lookup_type call):
(gdb) ptype tv
type = class TreeVector<Pod, 2> [with T = Pod] {
...
(gdb) p $tv(tv)
vector: TreeVector<Pod, 2>
tree: TreeVector<Pod, 2>::Tree *
depth: 3
$1 = 0
More information about the Gcc-bugs
mailing list