diff options
author | Patrick Palka <ppalka@redhat.com> | 2022-04-01 14:56:20 -0400 |
---|---|---|
committer | Patrick Palka <ppalka@redhat.com> | 2022-04-01 14:56:20 -0400 |
commit | 95533fe4f014c10dd18de649927668aba6117daf (patch) | |
tree | 0b223d19b1c4bb27635bbea774bc99652fe3f9f0 | |
parent | e9ea121da7d0c6ee7214ca74f861fa5f4bc16913 (diff) | |
download | gcc-95533fe4f014c10dd18de649927668aba6117daf.zip gcc-95533fe4f014c10dd18de649927668aba6117daf.tar.gz gcc-95533fe4f014c10dd18de649927668aba6117daf.tar.bz2 |
c++: deducing from class type of NTTP [PR105110]
Here when attempting to deduce T in the NTTP type A<T> from the argument
type 'const A<int>', we give up due to the const:
types ‘A<T>’ and ‘const A<int>’ have incompatible cv-qualifiers
But since the type of an NTTP cannot be cv-qualified, it seems natural
to ignore cv-qualifiers on the argument type before attempting to unify
the two types.
PR c++/105110
gcc/cp/ChangeLog:
* pt.cc (unify) <case TEMPLATE_PARM_INDEX>: Drop cv-quals from
the argument type of an NTTP before deducing from it.
gcc/testsuite/ChangeLog:
* g++.dg/cpp2a/nontype-class52.C: New test.
-rw-r--r-- | gcc/cp/pt.cc | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp2a/nontype-class52.C | 13 |
2 files changed, 16 insertions, 2 deletions
diff --git a/gcc/cp/pt.cc b/gcc/cp/pt.cc index bdba5cf..75ed9a3 100644 --- a/gcc/cp/pt.cc +++ b/gcc/cp/pt.cc @@ -24266,8 +24266,9 @@ unify (tree tparms, tree targs, tree parm, tree arg, int strict, && !(strict & UNIFY_ALLOW_INTEGER) && TEMPLATE_PARM_LEVEL (parm) <= TMPL_ARGS_DEPTH (targs)) { - /* Deduce it from the non-type argument. */ - tree atype = TREE_TYPE (arg); + /* Deduce it from the non-type argument. As above, ignore + top-level quals here too. */ + tree atype = cv_unqualified (TREE_TYPE (arg)); RECUR_AND_CHECK_FAILURE (tparms, targs, tparm, atype, UNIFY_ALLOW_NONE, explain_p); diff --git a/gcc/testsuite/g++.dg/cpp2a/nontype-class52.C b/gcc/testsuite/g++.dg/cpp2a/nontype-class52.C new file mode 100644 index 0000000..5616337 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp2a/nontype-class52.C @@ -0,0 +1,13 @@ +// PR c++/105110 +// { dg-do compile { target c++20 } } + +template<class> struct A { }; + +template<auto> struct B { }; + +template<class T, A<T> V> void f(B<V>); + +int main() { + constexpr A<int> a; + f(B<a>{}); +} |