c++: Fix template parm with dependent type in concepts.
authorJason Merrill <jason@redhat.com>
Tue, 24 Mar 2020 22:25:17 +0000 (18:25 -0400)
committerJason Merrill <jason@redhat.com>
Tue, 24 Mar 2020 22:25:18 +0000 (18:25 -0400)
While looking at PR94186 I also noticed this regression; if a non-type
template parameter uses a type parameter in its type, we need to map both
template parameters.

gcc/cp/ChangeLog
2020-03-24  Jason Merrill  <jason@redhat.com>

* pt.c (any_template_parm_r): Look into the type of a non-type
template parm.

gcc/cp/ChangeLog
gcc/cp/pt.c
gcc/testsuite/g++.dg/cpp2a/concepts-nonbool2.C [new file with mode: 0644]

index 7ae4128a3a871727d83b5a400a23c1e5560e5ada..a4b132d6961367c9255630afd4045785507f1b8a 100644 (file)
@@ -1,3 +1,8 @@
+2020-03-24  Jason Merrill  <jason@redhat.com>
+
+       * pt.c (any_template_parm_r): Look into the type of a non-type
+       template parm.
+
 2020-03-24  Jason Merrill  <jason@redhat.com>
 
        * cp-tree.h (cp_expr): When constructing from an expr and a
index 03a8dfbd37cac2cceae2b754ce7e8816b1bac896..3c96eeca1912399f32a2cd3d6178c6f69e9a7d6b 100644 (file)
@@ -10431,6 +10431,7 @@ any_template_parm_r (tree t, void *data)
       WALK_SUBTREE (TREE_OPERAND (t, 1));
       break;
 
+    case TEMPLATE_PARM_INDEX:
     case PARM_DECL:
       /* A parameter or constraint variable may also depend on a template
         parameter without explicitly naming it.  */
diff --git a/gcc/testsuite/g++.dg/cpp2a/concepts-nonbool2.C b/gcc/testsuite/g++.dg/cpp2a/concepts-nonbool2.C
new file mode 100644 (file)
index 0000000..ebede46
--- /dev/null
@@ -0,0 +1,11 @@
+// { dg-do compile { target concepts } }
+
+template<class X, X x>
+concept C = requires {
+    requires x;                        // { dg-error "bool" }
+  };
+
+int main() {
+  C<int, 0>;
+  return 0;
+}