On 05/28/09 11:42, Ian Lance Taylor wrote:
> Larry Evans <cppljev...@suddenlink.net> writes:
>
>> While attempting to debug the compiler on:
>>
>> http://gcc.gnu.org/bugzilla/show_bug.cgi?id=40092
>>
>> I'm having great difficulty understanding the output
>> of debug_c_tree or debug_tree because the child
>> tree's are not shown.
>
> Can you give an example of what you mean? debug_tree does show child
> trees as I understand it, although at each level down it shows less
> information. If you want more information about a particular child,
> then you can see the address in the shortened information, and you can
> call debug_tree on that address.
Thanks Ian. That helped.
>
>> Is there any such debug_tree function usable in
>> gdb or ddd which will show the actual tree
>> variant?
>
> Here again I don't understand what you mean.
>
From http://gcc.gnu.org/onlinedocs/gccint-html.tar.gz,
in Tree-overview.html#Tree-overview,
there's this:
The central data structure used by the internal representation is
the tree. These nodes, while all of the C type tree, are of many
varieties. A tree is a pointer type, but the object to which it
points may be of a variety of types.
A tree variant means one of these tree "varieties" mentioned in the
above quote. I'm guessing the value returned by macro, TREE_CODE, is
some tag indicating which variety of tree. What I meant by "show the
actual tree variant" is for the print function to decode the tag and
just print the particular variant for that tag. However, I guess
decode_tree does that, but just prints the address of the child trees.
The user must manually call debug_tree on those children to see what
type they are.
I've tried that but it's not helping much. The compiler is trying to
expand the pack expansion:
integral_c
< Integral
, Values
>...
in this template:
template<typename Integral, Integral... Values>
struct package_c
: package
< integral_c
< Integral
, Values
>...
>
{
};
at this instance:
typedef
package_c< int, 1,2,3>
ints_type
;
where:
template<typename Integral, Integral Value>
struct integral_c
{};
That works except when this is present:
template
< typename Package_C
>
struct impl_front
;
template
< typename Integral
, Integral Head
, Integral... Tail
>
struct impl_front
< package_c
< Integral
, Head
, Tail...
>
>
{
typedef
integral_c<Integral,Head>
type
;
};
So, I'm trying to see what the tree looks like. AFAICT, the tree
should, somehow, reflect a pattern expansion:
integral_c<Integral,Values>
and I was hoping, somehow, to see that or some error by using
debug_tree. I expected to see a tree with children
representing Integral and Values, where Values was
a parameter pack. However, all I get at:
Breakpoint 3, make_pack_expansion (arg=0x7f62797cfe40) at
<gccsrc>/gcc/cp/pt.c:2692
is the following:
(gdb) p arg
$1 = (tree) 0x7f62797cfe40
(gdb) pt arg
<record_type 0x7f62797cfe40 integral_c type_5 VOID
align 8 symtab 0 alias set -1 canonical type 0x7f62797c4cc0 context
<namespace_decl 0x7f62797c4a80 expbug>
no-binfo use_template=1 interface-unknown
chain <type_decl 0x7f62797cff00 integral_c>>
Then, using the call debug_tree on some addression shown above:
(gdb) call debug_tree(0x7f62797cff00)
<type_decl 0x7f62797cff00 integral_c
type <record_type 0x7f62797cfe40 integral_c type_5 VOID
align 8 symtab 0 alias set -1 canonical type 0x7f62797c4cc0
context <namespace_decl 0x7f62797c4a80 expbug>
no-binfo use_template=1 interface-unknown
chain <type_decl 0x7f62797cff00 integral_c>>
public ignored decl_2 VOID file nested_integral_c_expansion.bug.cpp
line 20 col 3
align 1 context <namespace_decl 0x7f62797c4a80 expbug>>
I can't tell from this whether this is an expansion pattern or not.
Further use of call debug_tree on other addresses shown is equally
uninformative :(
I may have to wait till the variadic template experts get around to
this.
Thanks anyway, Ian.
-regards,
Larry