This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [C++ Patch] PR 57543
- From: Paolo Carlini <paolo dot carlini at oracle dot com>
- To: Jason Merrill <jason at redhat dot com>, "gcc-patches at gcc dot gnu dot org" <gcc-patches at gcc dot gnu dot org>
- Date: Wed, 28 May 2014 17:38:23 +0200
- Subject: Re: [C++ Patch] PR 57543
- Authentication-results: sourceware.org; auth=none
- References: <5384935D dot 5020406 at oracle dot com> <5384C817 dot 9010004 at redhat dot com> <5385064C dot 9020203 at oracle dot com> <53850C1F dot 7020902 at oracle dot com> <5385B756 dot 8070707 at oracle dot com> <5385FD69 dot 6020000 at redhat dot com>
Hi,
On 05/28/2014 05:14 PM, Jason Merrill wrote:
On 05/28/2014 06:15 AM, Paolo Carlini wrote:
+ bool do_inject = (!current_class_ref
+ && TREE_CODE (t) == METHOD_TYPE
+ && TREE_CODE (TREE_TYPE (t)) == DECLTYPE_TYPE);
Let's do this for any METHOD_TYPE; the decltype could be nested as a
template argument. And current_class_ref might be for the wrong class.
Ok.
+ /* DR 1207: 'this' is in scope in the trailing return type. */
+ tree this_type = (current_class_type
+ ? current_class_type
+ : TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (t))));
And here let's use class_of_this_parm unconditionally.
But unconditionally doesn't work, without doing something more. For
example for the first test, as reported: when current_class_type is set
and equal to "struct X<int>", class_of_this_parm is "struct X<
<template-parameter-1-1> >". I'm trying to paste below the trees:
(gdb) p debug_tree(class_of_this_parm(t))
<record_type 0x7ffff6819a80 X type_0 type_5 type_6 VOID
size <integer_cst 0x7ffff66d58a0 type <integer_type 0x7ffff66d7150
bitsizetype> constant 0>
unit size <integer_cst 0x7ffff66d5858 type <integer_type
0x7ffff66d70a8 sizetype> constant 0>
align 8 symtab 0 alias set -1 canonical type 0x7ffff6819a80
fields <type_decl 0x7ffff6813b80 X
type <record_type 0x7ffff6819b28 X type_0 type_5 type_6 VOID
size <integer_cst 0x7ffff66d58a0 0> unit size <integer_cst 0x7ffff66d5858 0>
align 8 symtab 0 alias set -1 canonical type 0x7ffff6819a80
fields <type_decl 0x7ffff6813b80 X> context <translation_unit_decl
0x7ffff66e0170 D.1>
full-name "struct X< <template-parameter-1-1> >"
n_parents=0 use_template=0 interface-unknown
chain <type_decl 0x7ffff6813a10 X>>
used nonlocal decl_4 VOID file 57543_1.C line 5 col 1
align 1 context <record_type 0x7ffff6819a80 X> result
<record_type 0x7ffff6819a80 X>
> context <translation_unit_decl 0x7ffff66e0170 D.1>
full-name "struct X< <template-parameter-1-1> >"
n_parents=0 use_template=0 interface-unknown
pointer_to_this <pointer_type 0x7ffff6819d20> chain <type_decl
0x7ffff6813a10 X>>
$3 = void
(gdb) p current_class_type
$4 = (tree) 0x7ffff682a2a0
(gdb) p debug_tree(current_class_type)
<record_type 0x7ffff682a2a0 X type_5 type_6 VOID
align 8 symtab 0 alias set -1 canonical type 0x7ffff682a2a0
fields <type_decl 0x7ffff682c0b8 X
type <record_type 0x7ffff682a348 X used type_5 type_6 VOID
align 8 symtab 0 alias set -1 canonical type 0x7ffff682a2a0
context <translation_unit_decl 0x7ffff66e0170 D.1>
full-name "struct X<int>"
n_parents=0 use_template=1 interface-unknown
chain <type_decl 0x7ffff6813f18 X>>
used external nonlocal suppress-debug decl_4 VOID file
57543_1.C line 5 col 1
align 8 context <record_type 0x7ffff682a2a0 X> result
<record_type 0x7ffff682a2a0 X>
> context <translation_unit_decl 0x7ffff66e0170 D.1>
full-name "struct X<int>"
n_parents=0 use_template=1 interface-unknown
pointer_to_this <pointer_type 0x7ffff682a3f0> chain <type_decl
0x7ffff6813f18 X>>