diff mbox series

c++/modules: alias CTAD and specializations table

Message ID 20231124180922.1302655-1-ppalka@redhat.com
State New
Headers show
Series c++/modules: alias CTAD and specializations table | expand

Commit Message

Patrick Palka Nov. 24, 2023, 6:09 p.m. UTC
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

Comments

Jason Merrill Dec. 9, 2023, 8:42 p.m. UTC | #1
On 11/24/23 13:09, Patrick Palka wrote:
> Bootstrapped and regtested on x86_64-pc-linux-gnu, does this look OK for
> trunk?

OK.

> -- >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 } }
diff mbox series

Patch

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 } }