aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorPatrick Palka <ppalka@redhat.com>2024-02-13 14:26:40 -0500
committerPatrick Palka <ppalka@redhat.com>2024-02-13 14:26:40 -0500
commitcb76d7e47693364861e63ea3bb274b1b5295a943 (patch)
tree9b8e802c807ae2491b5bd68dfd338ea1fad73b09 /gcc
parentce67b75e918bcbd31ed32bc820f5233c72670feb (diff)
downloadgcc-cb76d7e47693364861e63ea3bb274b1b5295a943.zip
gcc-cb76d7e47693364861e63ea3bb274b1b5295a943.tar.gz
gcc-cb76d7e47693364861e63ea3bb274b1b5295a943.tar.bz2
c++/modules: ICEs with modular fmtlib
Building modular fmtlib triggered two small modules bugs in C++23 and C++26 mode respectively (due to libstdc++ header differences). The first is that a TEMPLATE_DECL having DECL_LANG_SPECIFIC doesn't necessarily imply that its DECL_TEMPLATE_RESULT has DECL_LANG_SPECIFIC. So in add_specializations we need to use STRIP_TEMPLATE consistently; this is a follow-up to r12-7187-gdb84f382ae3dc2. The second is that get_originating_module_decl was ICEing on class-scope enumerators injected via using-enum. I suppose we should handle them like a class-scope entity rather than a non-using-enum enumerator. gcc/cp/ChangeLog: * module.cc (depset::hash::add_specializations): Use STRIP_TEMPLATE consistently. (get_originating_module_decl): Handle class-scope CONST_DECL. gcc/testsuite/ChangeLog: * g++.dg/modules/friend-6_a.C: New test. * g++.dg/modules/using-enum-3_a.C: New test. * g++.dg/modules/using-enum-3_b.C: New test. Reviewed-by: Jason Merill <jason@redhat.com>
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/module.cc5
-rw-r--r--gcc/testsuite/g++.dg/modules/friend-6_a.C11
-rw-r--r--gcc/testsuite/g++.dg/modules/using-enum-3_a.C11
-rw-r--r--gcc/testsuite/g++.dg/modules/using-enum-3_b.C6
4 files changed, 31 insertions, 2 deletions
diff --git a/gcc/cp/module.cc b/gcc/cp/module.cc
index 560d8f3..34fafe7 100644
--- a/gcc/cp/module.cc
+++ b/gcc/cp/module.cc
@@ -13256,7 +13256,7 @@ depset::hash::add_specializations (bool decl_p)
if (use_tpl == 1)
/* Implicit instantiations only walked if we reach them. */
needs_reaching = true;
- else if (!DECL_LANG_SPECIFIC (spec)
+ else if (!DECL_LANG_SPECIFIC (STRIP_TEMPLATE (spec))
|| !DECL_MODULE_PURVIEW_P (STRIP_TEMPLATE (spec)))
/* Likewise, GMF explicit or partial specializations. */
needs_reaching = true;
@@ -18716,7 +18716,8 @@ get_originating_module_decl (tree decl)
&& (TREE_CODE (DECL_CONTEXT (decl)) == ENUMERAL_TYPE))
decl = TYPE_NAME (DECL_CONTEXT (decl));
else if (TREE_CODE (decl) == FIELD_DECL
- || TREE_CODE (decl) == USING_DECL)
+ || TREE_CODE (decl) == USING_DECL
+ || CONST_DECL_USING_P (decl))
{
decl = DECL_CONTEXT (decl);
if (TREE_CODE (decl) != FUNCTION_DECL)
diff --git a/gcc/testsuite/g++.dg/modules/friend-6_a.C b/gcc/testsuite/g++.dg/modules/friend-6_a.C
new file mode 100644
index 0000000..7493e8f
--- /dev/null
+++ b/gcc/testsuite/g++.dg/modules/friend-6_a.C
@@ -0,0 +1,11 @@
+// { dg-additional-options "-fmodules-ts -Wno-pedantic" }
+// { dg-module-cmi friend_6 }
+
+module;
+# 1 "" 1
+template <typename> struct Trans_NS___cxx11_basic_string {
+ template <typename> friend class basic_stringbuf;
+};
+template struct Trans_NS___cxx11_basic_string<char>;
+# 6 "" 2
+export module friend_6;
diff --git a/gcc/testsuite/g++.dg/modules/using-enum-3_a.C b/gcc/testsuite/g++.dg/modules/using-enum-3_a.C
new file mode 100644
index 0000000..10671ee
--- /dev/null
+++ b/gcc/testsuite/g++.dg/modules/using-enum-3_a.C
@@ -0,0 +1,11 @@
+// { dg-do compile { target c++20 } }
+// { dg-additional-options "-fmodules-ts" }
+// { dg-module-cmi using_enum_3 }
+
+export module using_enum_3;
+
+export
+struct text_encoding {
+ enum class id { CP50220 };
+ using enum id;
+};
diff --git a/gcc/testsuite/g++.dg/modules/using-enum-3_b.C b/gcc/testsuite/g++.dg/modules/using-enum-3_b.C
new file mode 100644
index 0000000..8ac6e39
--- /dev/null
+++ b/gcc/testsuite/g++.dg/modules/using-enum-3_b.C
@@ -0,0 +1,6 @@
+// { dg-do compile { target c++20 } }
+// { dg-additional-options "-fmodules-ts" }
+
+import using_enum_3;
+
+static_assert(text_encoding::id::CP50220 == text_encoding::CP50220);