]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
c++: requires and using-decl [PR113498]
authorJason Merrill <jason@redhat.com>
Fri, 19 Jan 2024 18:11:05 +0000 (13:11 -0500)
committerJason Merrill <jason@redhat.com>
Fri, 19 Jan 2024 19:21:14 +0000 (14:21 -0500)
get_template_info was crashing because it assumed that any decl with
DECL_LANG_SPECIFIC could use DECL_TEMPLATE_INFO.  It's more complicated than
that.

PR c++/113498

gcc/cp/ChangeLog:

* pt.cc (decl_template_info): New fn.
(get_template_info): Use it.

gcc/testsuite/ChangeLog:

* g++.dg/cpp2a/concepts-using4.C: New test.

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

index fbbca4692199decc8ec7fa7c11a07e0d9d399eff..74013533b0f6761cf80ceba141ec18e94057a046 100644 (file)
@@ -339,6 +339,32 @@ build_template_info (tree template_decl, tree template_args)
   return result;
 }
 
+/* DECL_TEMPLATE_INFO, if applicable, or NULL_TREE.  */
+
+static tree
+decl_template_info (const_tree decl)
+{
+  /* This needs to match template_info_decl_check.  */
+  if (DECL_LANG_SPECIFIC (decl))
+    switch (TREE_CODE (decl))
+      {
+      case FUNCTION_DECL:
+       if (DECL_THUNK_P (decl))
+         break;
+       gcc_fallthrough ();
+      case VAR_DECL:
+      case FIELD_DECL:
+      case TYPE_DECL:
+      case CONCEPT_DECL:
+      case TEMPLATE_DECL:
+       return DECL_TEMPLATE_INFO (decl);
+
+      default:
+       break;
+      }
+  return NULL_TREE;
+}
+
 /* Return the template info node corresponding to T, whatever T is.  */
 
 tree
@@ -353,8 +379,8 @@ get_template_info (const_tree t)
       || TREE_CODE (t) == PARM_DECL)
     return NULL;
 
-  if (DECL_P (t) && DECL_LANG_SPECIFIC (t))
-    tinfo = DECL_TEMPLATE_INFO (t);
+  if (DECL_P (t))
+    tinfo = decl_template_info (t);
 
   if (!tinfo && DECL_IMPLICIT_TYPEDEF_P (t))
     t = TREE_TYPE (t);
diff --git a/gcc/testsuite/g++.dg/cpp2a/concepts-using4.C b/gcc/testsuite/g++.dg/cpp2a/concepts-using4.C
new file mode 100644 (file)
index 0000000..a39a7c0
--- /dev/null
@@ -0,0 +1,24 @@
+// PR c++/113498
+// { dg-do compile { target c++20 } }
+
+template<int d>
+struct S_Base
+{
+    static constexpr int D = d;
+};
+
+template<int d>
+struct S : public S_Base<d>
+{
+    using S_Base<d>::D;
+    constexpr void f() const
+        requires(D > 0) {}
+
+};
+
+int main(int, char**)
+{
+    S<1> s;
+    s.f();
+    return 0;
+}