Bootstrapped and regtested on x86_64-pc-linux-gnu, does this look OK for
trunk?

-- >8 --

A rewritten guide for alias CTAD isn't really a specialization of the
original guide, so we shouldn't register it as such.  This avoids an ICE
in the below modules testcase which otherwise tries to inspect the
rewritten guide's empty DECL_CONTEXT.  It also preemptively avoids an
ICE in modules/concept-6 in C++23 mode with the inherited CTAD patch.

        * pt.cc (alias_ctad_tweaks): Pass use_spec_table=false to
        tsubst_decl.

gcc/testsuite/ChangeLog:

        * g++.dg/modules/concept-8.h: New test.
        * g++.dg/modules/concept-8_a.H: New test.
        * g++.dg/modules/concept-8_b.C: New test.
---
 gcc/cp/pt.cc                               |  3 ++-
 gcc/testsuite/g++.dg/modules/concept-8.h   | 14 ++++++++++++++
 gcc/testsuite/g++.dg/modules/concept-8_a.H |  5 +++++
 gcc/testsuite/g++.dg/modules/concept-8_b.C |  8 ++++++++
 4 files changed, 29 insertions(+), 1 deletion(-)
 create mode 100644 gcc/testsuite/g++.dg/modules/concept-8.h
 create mode 100644 gcc/testsuite/g++.dg/modules/concept-8_a.H
 create mode 100644 gcc/testsuite/g++.dg/modules/concept-8_b.C

diff --git a/gcc/cp/pt.cc b/gcc/cp/pt.cc
index 4f93150c5d7..2cfe1da5e07 100644
--- a/gcc/cp/pt.cc
+++ b/gcc/cp/pt.cc
@@ -30015,7 +30015,8 @@ alias_ctad_tweaks (tree tmpl, tree uguides)
              /* Parms are to have DECL_CHAIN tsubsted, which would be skipped
                 if cp_unevaluated_operand.  */
              cp_evaluated ev;
-             g = tsubst_decl (DECL_TEMPLATE_RESULT (f), targs, complain);
+             g = tsubst_decl (DECL_TEMPLATE_RESULT (f), targs, complain,
+                              /*use_spec_table=*/false);
            }
          if (g == error_mark_node)
            continue;
diff --git a/gcc/testsuite/g++.dg/modules/concept-8.h 
b/gcc/testsuite/g++.dg/modules/concept-8.h
new file mode 100644
index 00000000000..a25f9b752fd
--- /dev/null
+++ b/gcc/testsuite/g++.dg/modules/concept-8.h
@@ -0,0 +1,14 @@
+// A version of concept-6.h using an alias template + alias CTAD
+
+template<typename _Callable>
+struct Base
+{
+  Base (const _Callable &)
+    requires true
+  {}
+};
+
+template<typename _Callable> requires true
+using Derived = Base<_Callable>;
+
+inline Derived all = [] (auto&& __r) {};
diff --git a/gcc/testsuite/g++.dg/modules/concept-8_a.H 
b/gcc/testsuite/g++.dg/modules/concept-8_a.H
new file mode 100644
index 00000000000..da0467781c1
--- /dev/null
+++ b/gcc/testsuite/g++.dg/modules/concept-8_a.H
@@ -0,0 +1,5 @@
+// { dg-require-effective-target c++20 }
+// { dg-additional-options "-fmodule-header -fconcepts" }
+// { dg-module-cmi {} }
+
+#include "concept-8.h"
diff --git a/gcc/testsuite/g++.dg/modules/concept-8_b.C 
b/gcc/testsuite/g++.dg/modules/concept-8_b.C
new file mode 100644
index 00000000000..9a9f014ee09
--- /dev/null
+++ b/gcc/testsuite/g++.dg/modules/concept-8_b.C
@@ -0,0 +1,8 @@
+// { dg-require-effective-target c++20 }
+// { dg-additional-options "-fmodules-ts -fconcepts -fdump-lang-module-alias 
-fno-module-lazy" }
+
+#include "concept-8.h"
+import "concept-8_a.H";
+
+// { dg-final { scan-lang-dump-times {named merge key \(matched\) 
function_decl:'::Base<::._anon_0>::__ct '} 2 module } }
+// { dg-final { scan-lang-dump-not {merge key \(new\)} module } }
-- 
2.43.0.rc1

Reply via email to