* [PATCH] c++: covariant reference return type [PR99664]
@ 2021-07-15 16:37 Patrick Palka
2021-07-16 17:15 ` Jason Merrill
0 siblings, 1 reply; 2+ messages in thread
From: Patrick Palka @ 2021-07-15 16:37 UTC (permalink / raw)
To: gcc-patches
This implements the wording changes of DR 960 which clarifies that two
reference types are covariant only if they're both lvalue references
or both rvalue references.
Bootstrapped and regtested on x86_64-pc-linux-gnu, does this look
OK for trunk?
DR 960
PR c++/99664
gcc/cp/ChangeLog:
* search.c (check_final_overrider): Compare TYPE_REF_IS_RVALUE
when the return types are references.
gcc/testsuite/ChangeLog:
* g++.dg/inherit/covariant23.C: New test.
---
gcc/cp/search.c | 8 +++++++-
gcc/testsuite/g++.dg/inherit/covariant23.C | 14 ++++++++++++++
2 files changed, 21 insertions(+), 1 deletion(-)
create mode 100644 gcc/testsuite/g++.dg/inherit/covariant23.C
diff --git a/gcc/cp/search.c b/gcc/cp/search.c
index af41bfe5835..943671acff8 100644
--- a/gcc/cp/search.c
+++ b/gcc/cp/search.c
@@ -1948,7 +1948,13 @@ check_final_overrider (tree overrider, tree basefn)
fail = !INDIRECT_TYPE_P (base_return);
if (!fail)
{
- fail = cp_type_quals (base_return) != cp_type_quals (over_return);
+ if (cp_type_quals (base_return) != cp_type_quals (over_return))
+ fail = 1;
+
+ if (TYPE_REF_P (base_return)
+ && (TYPE_REF_IS_RVALUE (base_return)
+ != TYPE_REF_IS_RVALUE (over_return)))
+ fail = 1;
base_return = TREE_TYPE (base_return);
over_return = TREE_TYPE (over_return);
diff --git a/gcc/testsuite/g++.dg/inherit/covariant23.C b/gcc/testsuite/g++.dg/inherit/covariant23.C
new file mode 100644
index 00000000000..b27be15ef45
--- /dev/null
+++ b/gcc/testsuite/g++.dg/inherit/covariant23.C
@@ -0,0 +1,14 @@
+// PR c++/99664
+// { dg-do compile { target c++11 } }
+
+struct Res { };
+
+struct A {
+ virtual Res &&f();
+ virtual Res &g();
+};
+
+struct B : A {
+ Res &f() override; // { dg-error "return type" }
+ Res &&g() override; // { dg-error "return type" }
+};
--
2.32.0.264.g75ae10bc75
^ permalink raw reply [flat|nested] 2+ messages in thread
* Re: [PATCH] c++: covariant reference return type [PR99664]
2021-07-15 16:37 [PATCH] c++: covariant reference return type [PR99664] Patrick Palka
@ 2021-07-16 17:15 ` Jason Merrill
0 siblings, 0 replies; 2+ messages in thread
From: Jason Merrill @ 2021-07-16 17:15 UTC (permalink / raw)
To: Patrick Palka, gcc-patches
On 7/15/21 12:37 PM, Patrick Palka wrote:
> This implements the wording changes of DR 960 which clarifies that two
> reference types are covariant only if they're both lvalue references
> or both rvalue references.
>
> Bootstrapped and regtested on x86_64-pc-linux-gnu, does this look
> OK for trunk?
OK.
> DR 960
> PR c++/99664
>
> gcc/cp/ChangeLog:
>
> * search.c (check_final_overrider): Compare TYPE_REF_IS_RVALUE
> when the return types are references.
>
> gcc/testsuite/ChangeLog:
>
> * g++.dg/inherit/covariant23.C: New test.
> ---
> gcc/cp/search.c | 8 +++++++-
> gcc/testsuite/g++.dg/inherit/covariant23.C | 14 ++++++++++++++
> 2 files changed, 21 insertions(+), 1 deletion(-)
> create mode 100644 gcc/testsuite/g++.dg/inherit/covariant23.C
>
> diff --git a/gcc/cp/search.c b/gcc/cp/search.c
> index af41bfe5835..943671acff8 100644
> --- a/gcc/cp/search.c
> +++ b/gcc/cp/search.c
> @@ -1948,7 +1948,13 @@ check_final_overrider (tree overrider, tree basefn)
> fail = !INDIRECT_TYPE_P (base_return);
> if (!fail)
> {
> - fail = cp_type_quals (base_return) != cp_type_quals (over_return);
> + if (cp_type_quals (base_return) != cp_type_quals (over_return))
> + fail = 1;
> +
> + if (TYPE_REF_P (base_return)
> + && (TYPE_REF_IS_RVALUE (base_return)
> + != TYPE_REF_IS_RVALUE (over_return)))
> + fail = 1;
>
> base_return = TREE_TYPE (base_return);
> over_return = TREE_TYPE (over_return);
> diff --git a/gcc/testsuite/g++.dg/inherit/covariant23.C b/gcc/testsuite/g++.dg/inherit/covariant23.C
> new file mode 100644
> index 00000000000..b27be15ef45
> --- /dev/null
> +++ b/gcc/testsuite/g++.dg/inherit/covariant23.C
> @@ -0,0 +1,14 @@
> +// PR c++/99664
> +// { dg-do compile { target c++11 } }
> +
> +struct Res { };
> +
> +struct A {
> + virtual Res &&f();
> + virtual Res &g();
> +};
> +
> +struct B : A {
> + Res &f() override; // { dg-error "return type" }
> + Res &&g() override; // { dg-error "return type" }
> +};
>
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2021-07-16 17:15 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-07-15 16:37 [PATCH] c++: covariant reference return type [PR99664] Patrick Palka
2021-07-16 17:15 ` Jason Merrill
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).