aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNathaniel Shead <nathanieloshead@gmail.com>2025-05-24 00:51:49 +1000
committerNathaniel Shead <nathanieloshead@gmail.com>2025-05-24 08:57:37 +1000
commit2486d94bc45a9815395a36cc6dc1e9e3219a74b7 (patch)
tree4c890e53506bfd5b4694537e0c6795a21356c561
parentfd2a11eb2deb4be498a9d000c0a41446c14672df (diff)
downloadgcc-2486d94bc45a9815395a36cc6dc1e9e3219a74b7.zip
gcc-2486d94bc45a9815395a36cc6dc1e9e3219a74b7.tar.gz
gcc-2486d94bc45a9815395a36cc6dc1e9e3219a74b7.tar.bz2
c++/modules: Fix stream-in of member using-decls [PR120414]
When streaming in a reference to a data member, we have an oversight where we did not consider USING_DECLs, despite otherwise handling them here the same as fields. This patch corrects that mistake. PR c++/120414 gcc/cp/ChangeLog: * module.cc (trees_in::tree_node): Allow reading a USING_DECL when streaming tt_data_member. gcc/testsuite/ChangeLog: * g++.dg/modules/using-31_a.C: New test. * g++.dg/modules/using-31_b.C: New test. Signed-off-by: Nathaniel Shead <nathanieloshead@gmail.com> Reviewed-by: Jason Merrill <jason@redhat.com> (cherry picked from commit 43dddeef7a870ce4db7407f73660504b67a0a919)
-rw-r--r--gcc/cp/module.cc3
-rw-r--r--gcc/testsuite/g++.dg/modules/using-31_a.C18
-rw-r--r--gcc/testsuite/g++.dg/modules/using-31_b.C5
3 files changed, 25 insertions, 1 deletions
diff --git a/gcc/cp/module.cc b/gcc/cp/module.cc
index f8fa7f1..e66f725 100644
--- a/gcc/cp/module.cc
+++ b/gcc/cp/module.cc
@@ -10522,7 +10522,8 @@ trees_in::tree_node (bool is_use)
res = lookup_field_ident (ctx, u ());
if (!res
- || TREE_CODE (res) != FIELD_DECL
+ || (TREE_CODE (res) != FIELD_DECL
+ && TREE_CODE (res) != USING_DECL)
|| DECL_CONTEXT (res) != ctx)
res = NULL_TREE;
}
diff --git a/gcc/testsuite/g++.dg/modules/using-31_a.C b/gcc/testsuite/g++.dg/modules/using-31_a.C
new file mode 100644
index 0000000..75bd872
--- /dev/null
+++ b/gcc/testsuite/g++.dg/modules/using-31_a.C
@@ -0,0 +1,18 @@
+// PR c++/120414
+// { dg-additional-options "-fmodules" }
+// { dg-module-cmi m }
+
+export module m;
+
+template <int n>
+struct Base {
+ static constexpr int base_static_mbr_n = n;
+};
+
+template <int n>
+struct Derived : Base<n> {
+ using Base<n>::base_static_mbr_n;
+ static constexpr int go(int x = base_static_mbr_n) { return x; }
+};
+
+template struct Derived<1>;
diff --git a/gcc/testsuite/g++.dg/modules/using-31_b.C b/gcc/testsuite/g++.dg/modules/using-31_b.C
new file mode 100644
index 0000000..e913a77
--- /dev/null
+++ b/gcc/testsuite/g++.dg/modules/using-31_b.C
@@ -0,0 +1,5 @@
+// PR c++/120414
+// { dg-additional-options "-fmodules" }
+
+module m;
+static_assert(Derived<1>::go() == 1);