Re: [PATCH] c++: Fix propagating reference qualifier from function type to member function pointer type [PR70097]

Eczbek <[email protected]>
Newsgroups gmane.comp.gcc.patches
Message-ID <[email protected]>
On 2026-05-25 18:58:09, Eczbek wrote:
> Bootstrapped/regtested on x86_64-pc-linux-gnu 

While I'm still waiting for copyright assignment, can this small patch be accepted in the meanwhile?

-- >8 --
 
> When forming a member function pointer type to a ref-qualified function
> type, the reference qualifier is incorrectly dropped.
> 
> 	PR c++/70097
> 
> gcc/cp/ChangeLog:
> 
> 	* decl.cc (grokdeclarator): If rqual is REF_QUAL_NONE, set it to
> 	result of type_memfn_rqual before passing to build_memfn_type.
> 
> gcc/testsuite/ChangeLog:
> 
> 	* g++.dg/cpp0x/ref-qual22.C: New test.
> ---
>  gcc/cp/decl.cc                          |  2 ++
>  gcc/testsuite/g++.dg/cpp0x/ref-qual22.C | 18 ++++++++++++++++++
>  2 files changed, 20 insertions(+)
>  create mode 100644 gcc/testsuite/g++.dg/cpp0x/ref-qual22.C
> 
> diff --git a/gcc/cp/decl.cc b/gcc/cp/decl.cc
> index f0f37560dec..546602f143f 100644
> --- a/gcc/cp/decl.cc
> +++ b/gcc/cp/decl.cc
> @@ -15669,6 +15669,8 @@ grokdeclarator (const cp_declarator *declarator,
>  	      && TREE_CODE (type) == FUNCTION_TYPE)
>  	    {
>  	      memfn_quals |= type_memfn_quals (type);
> +	      if (rqual == REF_QUAL_NONE)
> +		  rqual = type_memfn_rqual (type);
>  	      type = build_memfn_type (type,
>  				       declarator->u.pointer.class_type,
>  				       memfn_quals,
> diff --git a/gcc/testsuite/g++.dg/cpp0x/ref-qual22.C b/gcc/testsuite/g++.dg/cpp0x/ref-qual22.C
> new file mode 100644
> index 00000000000..4859d20053b
> --- /dev/null
> +++ b/gcc/testsuite/g++.dg/cpp0x/ref-qual22.C
> @@ -0,0 +1,18 @@
> +// PR c++/70097
> +// { dg-do compile { target c++11 } }
> +
> +struct T {
> +	void f() & {}
> +	void g() && {}
> +};
> +using F = void() &;
> +using G = void() &&;
> +
> +F T::* f = &T::f;
> +G T::* g = &T::g;
> +
> +template<typename> struct U;
> +template<> struct U<void(T::*)() &> {};
> +template<> struct U<void(T::*)() &&> {};
> +U<F T::*> u;
> +U<G T::*> v;
> 
> base-commit: b1987874feead5e98f1ea005bd1ce5ff515eda7a
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.