c++: 'this' injection and static member functions [PR97399]
authorPatrick Palka <ppalka@redhat.com>
Sat, 23 Jan 2021 05:24:17 +0000 (00:24 -0500)
committerPatrick Palka <ppalka@redhat.com>
Sat, 23 Jan 2021 05:24:17 +0000 (00:24 -0500)
commita8cef3cba6945730c69e15dcdad726e74b50fe58
tree3917c7c5a471207cb6f2deeec15c3e4a4608fdc3
parenteb9883c1312c3801e5c25e763729d011343b22c3
c++: 'this' injection and static member functions [PR97399]

In the testcase pr97399.C below, finish_qualified_id_expr at parse time
adds an implicit 'this->' to the expression tmp::integral<T> (because
it's type-dependent, and also current_class_ptr is set at this point)
within the trailing return type.  Later when substituting into this
trailing return type we crash because we can't resolve the 'this', since
tsubst_function_type does inject_this_parm only for non-static member
functions, which tmp::func is not.

This patch fixes this issue by removing the type-dependence check
in finish_qualified_id_expr added by r9-5972, and instead relaxes
shared_member_p to handle dependent USING_DECLs:

> I think I was wrong in my assertion around Alex's patch that
> shared_member_p should abort on a dependent USING_DECL; it now seems
> appropriate for it to return false if we don't know, we just need to
> adjust the comment to say that.

And when parsing a friend function declaration, we shouldn't be setting
current_class_ptr at all, so this patch additionally suppresses
inject_this_parm in this case.

Finally, the self-contained change to cp_parser_init_declarator is so
that we properly communicate static-ness to cp_parser_direct_declarator
when parsing a member function template.  This lets us reject the
explicit use of 'this' in the testcase this2.C below.

gcc/cp/ChangeLog:

PR c++/97399
* cp-tree.h (shared_member_p): Adjust declaration.
* parser.c (cp_parser_init_declarator): If the storage class
specifier is sc_static, pass true for static_p to
cp_parser_declarator.
(cp_parser_direct_declarator): Don't do inject_this_parm when
the declarator is a friend.
* search.c (shared_member_p): Change return type to bool and
adjust function body accordingly.  Return false for a dependent
USING_DECL instead of aborting.
* semantics.c (finish_qualified_id_expr): Rely on shared_member_p
even when type-dependent.

gcc/testsuite/ChangeLog:

PR c++/88548
PR c++/97399
* g++.dg/cpp0x/this2.C: New test.
* g++.dg/template/pr97399.C: New test.
gcc/cp/cp-tree.h
gcc/cp/parser.c
gcc/cp/search.c
gcc/cp/semantics.c
gcc/testsuite/g++.dg/cpp0x/this2.C [new file with mode: 0644]
gcc/testsuite/g++.dg/template/pr97399.C [new file with mode: 0644]