On Fri, 17 Jan 2025, Nathaniel Shead wrote: > Bootstrapped and regtested on x86_64-pc-linux-gnu, OK for trunk? > > -- >8 -- > > 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'.
Is this a regression caused by the PR114795 fix? Maybe we should backport this. > > 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 <nathanielosh...@gmail.com> > --- > gcc/cp/module.cc | 5 +++++ > gcc/testsuite/g++.dg/modules/auto-5_a.C | 10 ++++++++++ > gcc/testsuite/g++.dg/modules/auto-5_b.C | 14 ++++++++++++++ > gcc/testsuite/g++.dg/modules/auto-5_c.C | 4 ++++ > gcc/testsuite/g++.dg/modules/auto-6_a.H | 5 +++++ > gcc/testsuite/g++.dg/modules/auto-6_b.C | 6 ++++++ > 6 files changed, 44 insertions(+) > create mode 100644 gcc/testsuite/g++.dg/modules/auto-5_a.C > create mode 100644 gcc/testsuite/g++.dg/modules/auto-5_b.C > create mode 100644 gcc/testsuite/g++.dg/modules/auto-5_c.C > create mode 100644 gcc/testsuite/g++.dg/modules/auto-6_a.H > create mode 100644 gcc/testsuite/g++.dg/modules/auto-6_b.C > > diff --git a/gcc/cp/module.cc b/gcc/cp/module.cc > index 61116fe7669..6fe64bb538c 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 00000000000..fcab6f301e1 > --- /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 00000000000..f75ed2d0f0c > --- /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 00000000000..f351c2b1ae4 > --- /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 00000000000..3ad08ab81ce > --- /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 00000000000..aab7be4e530 > --- /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"; > -- > 2.47.0 > >