c++: Set the constraints of a class type sooner [PR96229]
authorPatrick Palka <ppalka@redhat.com>
Thu, 8 Oct 2020 04:05:36 +0000 (00:05 -0400)
committerPatrick Palka <ppalka@redhat.com>
Thu, 8 Oct 2020 04:05:36 +0000 (00:05 -0400)
commit6b1b5c255f859e75a2d74ae58a011e846d87a277
treeeb259997aeae06d9b51c4865f31db565fd04b5d5
parent6caec77e3be8e2989f723ac7f522885dded6bcfc
c++: Set the constraints of a class type sooner [PR96229]

In the testcase below, during processing (at parse time) of Y's base
class X<Y>, convert_template_argument calls is_compatible_template_arg
to check if the template argument Y is no more constrained than the
parameter P.  But at this point we haven't yet set Y's constraints, so
get_normalized_constraints_from_decl yields NULL_TREE as the normal form
and caches this result into the normalized_map.

We set Y's constraints later in cp_parser_class_specifier_1 but the
stale normal form in the normalized_map remains.  This ultimately causes
us to miss the constraint failure for Y<Z> because according to the
cached normal form, Y is not constrained.

This patch fixes this issue by moving up the call to
associate_classtype_constraints so that we set constraints before we
start processing a class's bases.

gcc/cp/ChangeLog:

PR c++/96229
* parser.c (cp_parser_class_specifier_1): Move call to
associate_classtype_constraints from here to ...
(cp_parser_class_head): ... here.
* pt.c (is_compatible_template_arg): Correct documentation to
say "argument is _no_ more constrained than the parameter".

gcc/testsuite/ChangeLog:

PR c++/96229
* g++.dg/cpp2a/concepts-class2.C: New test.
gcc/cp/parser.c
gcc/cp/pt.c
gcc/testsuite/g++.dg/cpp2a/concepts-class2.C [new file with mode: 0644]