[PATCH 02/10] Fix g++.dg/cpp0x/nsdmi-template14.C
David Malcolm
dmalcolm@redhat.com
Thu Dec 3 21:43:00 GMT 2015
On Thu, 2015-12-03 at 15:33 -0500, Jason Merrill wrote:
> On 12/03/2015 09:55 AM, David Malcolm wrote:
> > This patch adds bulletproofing to detect purged tokens, and avoid using
> > them.
> >
> > Alternatively, is it OK to access purged tokens for this kind of thing?
> > If so, would it make more sense to instead leave their locations untouched
> > when purging them?
>
> I think cp_lexer_previous_token should skip past purged tokens.
Sorry if this is a silly question, but should I limit the iteration e.g.
by detecting a sentinel value? e.g.
parser->lexer->buffer->address () ?
Or is there guaranteed to be an unpurged token somewhere beforehand?
Out of interest, the prior tokens here are:
(gdb) p end_tok[0]
$25 = {type = CPP_GREATER, keyword = RID_MAX, flags = 0 '\000',
pragma_kind = PRAGMA_NONE, implicit_extern_c = 0,
error_reported = 0, purged_p = 1, location = 0, u = {tree_check_value
= 0x0, value = <tree 0x0>}}
(gdb) p end_tok[-1]
$26 = {type = CPP_NAME, keyword = RID_MAX, flags = 0 '\000', pragma_kind
= PRAGMA_NONE, implicit_extern_c = 0,
error_reported = 0, purged_p = 1, location = 0, u = {tree_check_value
= 0x0, value = <tree 0x0>}}
(gdb) p end_tok[-2]
$27 = {type = CPP_LESS, keyword = RID_MAX, flags = 0 '\000', pragma_kind
= PRAGMA_NONE, implicit_extern_c = 0,
error_reported = 0, purged_p = 1, location = 0, u = {tree_check_value
= 0x0, value = <tree 0x0>}}
(gdb) p end_tok[-3]
$28 = {type = 86, keyword = RID_MAX, flags = 1 '\001', pragma_kind =
PRAGMA_NONE, implicit_extern_c = 0, error_reported = 0,
purged_p = 0, location = 202016, u = {tree_check_value =
0x7ffff19dfd98, value = <bdver1-direct,bdver1-agu 0x7ffff19dfd98>}}
(gdb) p end_tok[-4]
$29 = {type = CPP_KEYWORD, keyword = RID_NEW, flags = 1 '\001',
pragma_kind = PRAGMA_NONE, implicit_extern_c = 0,
error_reported = 0, purged_p = 0, location = 201890, u =
{tree_check_value = 0x7ffff18a8318,
value = <identifier_node 0x7ffff18a8318 new>}}
where the previous unpurged token is:
(gdb) p end_tok[-3].purged_p
$31 = 0
(gdb) call inform (end_tok[-3].location, "")
../../src/gcc/testsuite/g++.dg/cpp0x/nsdmi-template14.C:11:14: note:
B* p = new B<N>;
^
which would give a range of:
B* p = new B<N>;
^~~~~
for the erroneous new expression, rather than:
B* p = new B<N>;
^~~~~~~~
if we used the location of the purged token (the CPP_GREATER).
I prefer the latter, hence my suggestion about not zero-ing out the
locations of tokens when purging them.
More information about the Gcc-patches
mailing list