c++: 'typename T::X' vs 'struct T::X' lookup [PR109420]
commit50dc52e853ff267ad1f4c98571c262017b0536f8
authorPatrick Palka <ppalka@redhat.com>
Thu, 13 Apr 2023 20:02:21 +0000 (13 16:02 -0400)
committerPatrick Palka <ppalka@redhat.com>
Thu, 13 Apr 2023 20:02:21 +0000 (13 16:02 -0400)
tree311b6c8f217974e3959d8a7da177f63964405261
parentf32f7881fb0db085479525b5a23db5dabd990c3b
c++: 'typename T::X' vs 'struct T::X' lookup [PR109420]

r13-6098-g46711ff8e60d64 made make_typename_type no longer ignore
non-types during the lookup, unless the TYPENAME_TYPE in question was
followed by the :: scope resolution operator.  But there is another
exception to this rule: we need to ignore non-types during the lookup
also if the TYPENAME_TYPE was named with a tag other than 'typename',
such as 'struct' or 'enum', since in that case we're dealing with an
elaborated-type-specifier and so [basic.lookup.elab] applies.  This
patch implements this additional exception.

PR c++/109420

gcc/cp/ChangeLog:

* decl.cc (make_typename_type): Also ignore non-types during the
lookup if tag_type corresponds to an elaborated-type-specifier.
* pt.cc (tsubst) <case TYPENAME_TYPE>: Pass class_type or
enum_type as tag_type to make_typename_type accordingly instead
of always passing typename_type.

gcc/testsuite/ChangeLog:

* g++.dg/template/typename27.C: New test.
gcc/cp/decl.cc
gcc/cp/pt.cc
gcc/testsuite/g++.dg/template/typename27.C [new file with mode: 0644]