]> gcc.gnu.org Git - gcc.git/commit
c++: Handle enumerator in C++20 alias CTAD. [PR96199]
authorJason Merrill <jason@redhat.com>
Thu, 6 Aug 2020 06:40:10 +0000 (02:40 -0400)
committerJason Merrill <jason@redhat.com>
Tue, 18 Aug 2020 20:21:54 +0000 (16:21 -0400)
commit7fc49a5777943aab11e227136d00a836f28f12b2
tree54b4f832d97535d644493ec5ab7a4f7a475c377b
parent6342cee8801f191466b71116d004e8ccb812caaa
c++: Handle enumerator in C++20 alias CTAD. [PR96199]

To form a deduction guide for an alias template, we substitute the template
arguments from the pattern into the deduction guide for the underlying
class.  In the case of B(A1<X>), that produces B(A1<B<T,1>::X>) -> B<T,1>.
But since an enumerator doesn't have its own template info, and B<T,1> is a
dependent scope, trying to look up B<T,1>::X fails and we crash.  So we need
to produce a SCOPE_REF instead.

And trying to use the members of the template class is wrong for other
members, as well, as it gives a nonsensical result if the class is
specialized.

gcc/cp/ChangeLog:

PR c++/96199
* pt.c (maybe_dependent_member_ref): New.
(tsubst_copy) [CONST_DECL]: Use it.
[VAR_DECL]: Likewise.
(tsubst_aggr_type): Handle nested type.

gcc/testsuite/ChangeLog:

PR c++/96199
* g++.dg/cpp2a/class-deduction-alias4.C: New test.
gcc/cp/pt.c
gcc/testsuite/g++.dg/cpp2a/class-deduction-alias4.C [new file with mode: 0644]
This page took 0.065697 seconds and 5 git commands to generate.