aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNathaniel Shead <nathanieloshead@gmail.com>2025-01-17 21:29:08 +1100
committerNathaniel Shead <nathanieloshead@gmail.com>2025-01-18 00:26:53 +1100
commitf054c36c4fcb693e04411dc691ef4172479143d6 (patch)
treec658514df3386d51d8c178271bc18864a51930e6
parent5e91be6f8ce978e1d30c8a958072545002168ed1 (diff)
downloadgcc-f054c36c4fcb693e04411dc691ef4172479143d6.zip
gcc-f054c36c4fcb693e04411dc691ef4172479143d6.tar.gz
gcc-f054c36c4fcb693e04411dc691ef4172479143d6.tar.bz2
c++/modules: Propagate FNDECL_USED_AUTO when propagating deduced return types [PR118049]
In the linked testcase, we're erroring because the declared return types of the functions do not appear to match. This is because when merging the deduced return types for 'foo' in 'auto-5_b.C', we overwrote the return type for the declaration with the deduced return type from 'auto-5_a.C' but neglected to track that we were originally declared with 'auto'. As a drive-by improvement to QOI, also add checks for if the deduced return types do not match; this is currently useful because we do not check the equivalence of the bodies of functions yet. PR c++/118049 gcc/cp/ChangeLog: * module.cc (trees_in::is_matching_decl): Propagate FNDECL_USED_AUTO as well. gcc/testsuite/ChangeLog: * g++.dg/modules/auto-5_a.C: New test. * g++.dg/modules/auto-5_b.C: New test. * g++.dg/modules/auto-5_c.C: New test. * g++.dg/modules/auto-6_a.H: New test. * g++.dg/modules/auto-6_b.C: New test. Signed-off-by: Nathaniel Shead <nathanieloshead@gmail.com>
-rw-r--r--gcc/cp/module.cc5
-rw-r--r--gcc/testsuite/g++.dg/modules/auto-5_a.C10
-rw-r--r--gcc/testsuite/g++.dg/modules/auto-5_b.C14
-rw-r--r--gcc/testsuite/g++.dg/modules/auto-5_c.C4
-rw-r--r--gcc/testsuite/g++.dg/modules/auto-6_a.H5
-rw-r--r--gcc/testsuite/g++.dg/modules/auto-6_b.C6
6 files changed, 44 insertions, 0 deletions
diff --git a/gcc/cp/module.cc b/gcc/cp/module.cc
index 61116fe..6fe64bb 100644
--- a/gcc/cp/module.cc
+++ b/gcc/cp/module.cc
@@ -11902,8 +11902,13 @@ trees_in::is_matching_decl (tree existing, tree decl, bool is_typedef)
{
dump (dumper::MERGE)
&& dump ("Propagating deduced return type to %N", existing);
+ FNDECL_USED_AUTO (e_inner) = true;
+ DECL_SAVED_AUTO_RETURN_TYPE (existing) = TREE_TYPE (e_type);
TREE_TYPE (existing) = change_return_type (TREE_TYPE (d_type), e_type);
}
+ else if (type_uses_auto (d_ret)
+ && !same_type_p (TREE_TYPE (d_type), TREE_TYPE (e_type)))
+ goto mismatch;
}
else if (is_typedef)
{
diff --git a/gcc/testsuite/g++.dg/modules/auto-5_a.C b/gcc/testsuite/g++.dg/modules/auto-5_a.C
new file mode 100644
index 0000000..fcab6f3
--- /dev/null
+++ b/gcc/testsuite/g++.dg/modules/auto-5_a.C
@@ -0,0 +1,10 @@
+// PR c++/118049
+// { dg-additional-options "-fmodules -Wno-global-module" }
+// { dg-module-cmi A }
+
+module;
+template <typename T> struct S {
+ auto foo() {}
+};
+export module A;
+template struct S<char>;
diff --git a/gcc/testsuite/g++.dg/modules/auto-5_b.C b/gcc/testsuite/g++.dg/modules/auto-5_b.C
new file mode 100644
index 0000000..f75ed2d
--- /dev/null
+++ b/gcc/testsuite/g++.dg/modules/auto-5_b.C
@@ -0,0 +1,14 @@
+// PR c++/118049
+// { dg-additional-options "-fmodules -Wno-global-module" }
+// { dg-module-cmi B }
+
+module;
+template <typename T> struct S {
+ auto foo() {}
+};
+template struct S<char>;
+export module B;
+import A;
+template <typename> void x() {
+ S<char>{}.foo();
+}
diff --git a/gcc/testsuite/g++.dg/modules/auto-5_c.C b/gcc/testsuite/g++.dg/modules/auto-5_c.C
new file mode 100644
index 0000000..f351c2b
--- /dev/null
+++ b/gcc/testsuite/g++.dg/modules/auto-5_c.C
@@ -0,0 +1,4 @@
+// PR c++/118049
+// { dg-additional-options "-fmodules -fno-module-lazy -fdump-lang-module-alias" }
+
+import B;
diff --git a/gcc/testsuite/g++.dg/modules/auto-6_a.H b/gcc/testsuite/g++.dg/modules/auto-6_a.H
new file mode 100644
index 0000000..3ad08ab
--- /dev/null
+++ b/gcc/testsuite/g++.dg/modules/auto-6_a.H
@@ -0,0 +1,5 @@
+// { dg-additional-options "-fmodule-header" }
+
+inline auto foo() {
+ return 1;
+}
diff --git a/gcc/testsuite/g++.dg/modules/auto-6_b.C b/gcc/testsuite/g++.dg/modules/auto-6_b.C
new file mode 100644
index 0000000..aab7be4
--- /dev/null
+++ b/gcc/testsuite/g++.dg/modules/auto-6_b.C
@@ -0,0 +1,6 @@
+// { dg-additional-options "-fmodules-ts -fno-module-lazy" }
+
+inline auto foo() { // { dg-error "conflicting" }
+ return 1.0;
+}
+import "auto-6_a.H";