On Fri, Jan 17, 2025 at 11:35:19AM -0500, Patrick Palka wrote:
> 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.
> 

I don't think it's a regression, rather just a case that was missed by
the original fix; the testcase doesn't work without PR114795 fix either.
That said backporting could be reasonable as I feel this is a pretty
safe change.

> > 
> > 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
> > 
> > 
> 

Reply via email to