c++/modules: Handle partial specialisations in GMF [PR113405]

Message ID 65aaf98a.a70a0220.d7023.9f0b@mx.google.com
State Accepted
Headers
Series c++/modules: Handle partial specialisations in GMF [PR113405] |

Checks

Context Check Description
snail/gcc-patch-check success Github commit url

Commit Message

Nathaniel Shead Jan. 19, 2024, 10:36 p.m. UTC
  Bootstrapped and regtested on x86_64-pc-linux-gnu, OK for trunk?

-- >8 --

Currently, when exporting names from the GMF, or within header modules,
for a set of constrained partial specialisations we only emit the first
one. This is because the 'type_specialization' list only includes a
single specialization per template+argument list; constraints are not
considered here.

The existing code uses a separate 'partial_specializations' list to
track this instead, but currently it's only used for declarations in the
module purview. This patch makes use of this list for all declarations.

	PR c++/113405

gcc/cp/ChangeLog:

	* module.cc (set_defining_module): Track partial specialisations
	for all declarations.

gcc/testsuite/ChangeLog:

	* g++.dg/modules/concept-9.h: New test.
	* g++.dg/modules/concept-9_a.C: New test.
	* g++.dg/modules/concept-9_b.C: New test.
	* g++.dg/modules/concept-10_a.H: New test.
	* g++.dg/modules/concept-10_b.C: New test.

Signed-off-by: Nathaniel Shead <nathanieloshead@gmail.com>
---
 gcc/cp/module.cc                            |  5 ++++-
 gcc/testsuite/g++.dg/modules/concept-10_a.H | 25 +++++++++++++++++++++
 gcc/testsuite/g++.dg/modules/concept-10_b.C |  8 +++++++
 gcc/testsuite/g++.dg/modules/concept-9.h    | 18 +++++++++++++++
 gcc/testsuite/g++.dg/modules/concept-9_a.C  | 13 +++++++++++
 gcc/testsuite/g++.dg/modules/concept-9_b.C  |  8 +++++++
 6 files changed, 76 insertions(+), 1 deletion(-)
 create mode 100644 gcc/testsuite/g++.dg/modules/concept-10_a.H
 create mode 100644 gcc/testsuite/g++.dg/modules/concept-10_b.C
 create mode 100644 gcc/testsuite/g++.dg/modules/concept-9.h
 create mode 100644 gcc/testsuite/g++.dg/modules/concept-9_a.C
 create mode 100644 gcc/testsuite/g++.dg/modules/concept-9_b.C
  

Comments

Jason Merrill Jan. 24, 2024, 8:42 p.m. UTC | #1
On 1/19/24 17:36, Nathaniel Shead wrote:
> Bootstrapped and regtested on x86_64-pc-linux-gnu, OK for trunk?

OK.

> -- >8 --
> 
> Currently, when exporting names from the GMF, or within header modules,
> for a set of constrained partial specialisations we only emit the first
> one. This is because the 'type_specialization' list only includes a
> single specialization per template+argument list; constraints are not
> considered here.
> 
> The existing code uses a separate 'partial_specializations' list to
> track this instead, but currently it's only used for declarations in the
> module purview. This patch makes use of this list for all declarations.
> 
> 	PR c++/113405
> 
> gcc/cp/ChangeLog:
> 
> 	* module.cc (set_defining_module): Track partial specialisations
> 	for all declarations.
> 
> gcc/testsuite/ChangeLog:
> 
> 	* g++.dg/modules/concept-9.h: New test.
> 	* g++.dg/modules/concept-9_a.C: New test.
> 	* g++.dg/modules/concept-9_b.C: New test.
> 	* g++.dg/modules/concept-10_a.H: New test.
> 	* g++.dg/modules/concept-10_b.C: New test.
> 
> Signed-off-by: Nathaniel Shead <nathanieloshead@gmail.com>
> ---
>   gcc/cp/module.cc                            |  5 ++++-
>   gcc/testsuite/g++.dg/modules/concept-10_a.H | 25 +++++++++++++++++++++
>   gcc/testsuite/g++.dg/modules/concept-10_b.C |  8 +++++++
>   gcc/testsuite/g++.dg/modules/concept-9.h    | 18 +++++++++++++++
>   gcc/testsuite/g++.dg/modules/concept-9_a.C  | 13 +++++++++++
>   gcc/testsuite/g++.dg/modules/concept-9_b.C  |  8 +++++++
>   6 files changed, 76 insertions(+), 1 deletion(-)
>   create mode 100644 gcc/testsuite/g++.dg/modules/concept-10_a.H
>   create mode 100644 gcc/testsuite/g++.dg/modules/concept-10_b.C
>   create mode 100644 gcc/testsuite/g++.dg/modules/concept-9.h
>   create mode 100644 gcc/testsuite/g++.dg/modules/concept-9_a.C
>   create mode 100644 gcc/testsuite/g++.dg/modules/concept-9_b.C
> 
> diff --git a/gcc/cp/module.cc b/gcc/cp/module.cc
> index 8db662c0267..249d0816169 100644
> --- a/gcc/cp/module.cc
> +++ b/gcc/cp/module.cc
> @@ -18860,8 +18860,11 @@ set_defining_module (tree decl)
>     gcc_checking_assert (!DECL_LANG_SPECIFIC (decl)
>   		       || !DECL_MODULE_IMPORT_P (decl));
>   
> -  if (module_has_cmi_p ())
> +  if (module_p ())
>       {
> +      /* We need to track all declarations within a module, not just those
> +	 in the module purview, because we don't necessarily know yet if
> +	 this module will require a CMI while in the global fragment.  */
>         tree ctx = DECL_CONTEXT (decl);
>         if (ctx
>   	  && (TREE_CODE (ctx) == RECORD_TYPE || TREE_CODE (ctx) == UNION_TYPE)
> diff --git a/gcc/testsuite/g++.dg/modules/concept-10_a.H b/gcc/testsuite/g++.dg/modules/concept-10_a.H
> new file mode 100644
> index 00000000000..c3a5fa727a7
> --- /dev/null
> +++ b/gcc/testsuite/g++.dg/modules/concept-10_a.H
> @@ -0,0 +1,25 @@
> +// Also test header modules
> +// PR c++/113405
> +// { dg-additional-options "-fmodule-header" }
> +// { dg-require-effective-target c++20 }
> +// { dg-module-cmi {} }
> +
> +template <typename>
> +concept foo = false;
> +
> +template <typename>
> +concept bar = true;
> +
> +template <typename T>
> +struct corge {};
> +
> +template <foo F>
> +struct corge<F> {};
> +
> +template <bar B>
> +struct corge<B> {
> +  using alias = int;
> +};
> +
> +template <typename T>
> +using corge_alias = corge<T>::alias;
> diff --git a/gcc/testsuite/g++.dg/modules/concept-10_b.C b/gcc/testsuite/g++.dg/modules/concept-10_b.C
> new file mode 100644
> index 00000000000..67be13d5995
> --- /dev/null
> +++ b/gcc/testsuite/g++.dg/modules/concept-10_b.C
> @@ -0,0 +1,8 @@
> +// PR c++/113405
> +// { dg-additional-options "-fmodules-ts" }
> +// { dg-require-effective-target c++20 }
> +
> +import "concept-10_a.H";
> +
> +struct test {};
> +using quux = corge_alias<test>;
> diff --git a/gcc/testsuite/g++.dg/modules/concept-9.h b/gcc/testsuite/g++.dg/modules/concept-9.h
> new file mode 100644
> index 00000000000..1c7f003228c
> --- /dev/null
> +++ b/gcc/testsuite/g++.dg/modules/concept-9.h
> @@ -0,0 +1,18 @@
> +// PR c++/113405
> +
> +template <typename>
> +concept foo = false;
> +
> +template <typename>
> +concept bar = true;
> +
> +template <typename T>
> +struct corge {};
> +
> +template <foo F>
> +struct corge<F> {};
> +
> +template <bar B>
> +struct corge<B> {
> +  using alias = int;
> +};
> diff --git a/gcc/testsuite/g++.dg/modules/concept-9_a.C b/gcc/testsuite/g++.dg/modules/concept-9_a.C
> new file mode 100644
> index 00000000000..9a055b6dcc9
> --- /dev/null
> +++ b/gcc/testsuite/g++.dg/modules/concept-9_a.C
> @@ -0,0 +1,13 @@
> +// PR c++/113405
> +// { dg-additional-options "-fmodules-ts" }
> +// { dg-require-effective-target c++20 }
> +// { dg-module-cmi M }
> +
> +module;
> +
> +#include "concept-9.h"
> +
> +export module M;
> +
> +export template<class T>
> +using corge_alias = corge<T>::alias;
> diff --git a/gcc/testsuite/g++.dg/modules/concept-9_b.C b/gcc/testsuite/g++.dg/modules/concept-9_b.C
> new file mode 100644
> index 00000000000..55a64a9a413
> --- /dev/null
> +++ b/gcc/testsuite/g++.dg/modules/concept-9_b.C
> @@ -0,0 +1,8 @@
> +// PR c++/113405
> +// { dg-additional-options "-fmodules-ts" }
> +// { dg-require-effective-target c++20 }
> +
> +import M;
> +
> +struct test {};
> +using quux = corge_alias<test>;
  

Patch

diff --git a/gcc/cp/module.cc b/gcc/cp/module.cc
index 8db662c0267..249d0816169 100644
--- a/gcc/cp/module.cc
+++ b/gcc/cp/module.cc
@@ -18860,8 +18860,11 @@  set_defining_module (tree decl)
   gcc_checking_assert (!DECL_LANG_SPECIFIC (decl)
 		       || !DECL_MODULE_IMPORT_P (decl));
 
-  if (module_has_cmi_p ())
+  if (module_p ())
     {
+      /* We need to track all declarations within a module, not just those
+	 in the module purview, because we don't necessarily know yet if
+	 this module will require a CMI while in the global fragment.  */
       tree ctx = DECL_CONTEXT (decl);
       if (ctx
 	  && (TREE_CODE (ctx) == RECORD_TYPE || TREE_CODE (ctx) == UNION_TYPE)
diff --git a/gcc/testsuite/g++.dg/modules/concept-10_a.H b/gcc/testsuite/g++.dg/modules/concept-10_a.H
new file mode 100644
index 00000000000..c3a5fa727a7
--- /dev/null
+++ b/gcc/testsuite/g++.dg/modules/concept-10_a.H
@@ -0,0 +1,25 @@ 
+// Also test header modules
+// PR c++/113405
+// { dg-additional-options "-fmodule-header" }
+// { dg-require-effective-target c++20 }
+// { dg-module-cmi {} }
+
+template <typename>
+concept foo = false;
+
+template <typename>
+concept bar = true;
+
+template <typename T>
+struct corge {};
+
+template <foo F>
+struct corge<F> {};
+
+template <bar B>
+struct corge<B> {
+  using alias = int;
+};
+
+template <typename T>
+using corge_alias = corge<T>::alias;
diff --git a/gcc/testsuite/g++.dg/modules/concept-10_b.C b/gcc/testsuite/g++.dg/modules/concept-10_b.C
new file mode 100644
index 00000000000..67be13d5995
--- /dev/null
+++ b/gcc/testsuite/g++.dg/modules/concept-10_b.C
@@ -0,0 +1,8 @@ 
+// PR c++/113405
+// { dg-additional-options "-fmodules-ts" }
+// { dg-require-effective-target c++20 }
+
+import "concept-10_a.H";
+
+struct test {};
+using quux = corge_alias<test>;
diff --git a/gcc/testsuite/g++.dg/modules/concept-9.h b/gcc/testsuite/g++.dg/modules/concept-9.h
new file mode 100644
index 00000000000..1c7f003228c
--- /dev/null
+++ b/gcc/testsuite/g++.dg/modules/concept-9.h
@@ -0,0 +1,18 @@ 
+// PR c++/113405
+
+template <typename>
+concept foo = false;
+
+template <typename>
+concept bar = true;
+
+template <typename T>
+struct corge {};
+
+template <foo F>
+struct corge<F> {};
+
+template <bar B>
+struct corge<B> {
+  using alias = int;
+};
diff --git a/gcc/testsuite/g++.dg/modules/concept-9_a.C b/gcc/testsuite/g++.dg/modules/concept-9_a.C
new file mode 100644
index 00000000000..9a055b6dcc9
--- /dev/null
+++ b/gcc/testsuite/g++.dg/modules/concept-9_a.C
@@ -0,0 +1,13 @@ 
+// PR c++/113405
+// { dg-additional-options "-fmodules-ts" }
+// { dg-require-effective-target c++20 }
+// { dg-module-cmi M }
+
+module;
+
+#include "concept-9.h"
+
+export module M;
+
+export template<class T>
+using corge_alias = corge<T>::alias;
diff --git a/gcc/testsuite/g++.dg/modules/concept-9_b.C b/gcc/testsuite/g++.dg/modules/concept-9_b.C
new file mode 100644
index 00000000000..55a64a9a413
--- /dev/null
+++ b/gcc/testsuite/g++.dg/modules/concept-9_b.C
@@ -0,0 +1,8 @@ 
+// PR c++/113405
+// { dg-additional-options "-fmodules-ts" }
+// { dg-require-effective-target c++20 }
+
+import M;
+
+struct test {};
+using quux = corge_alias<test>;