diff mbox series

[2/2] c++: duplicate "use of deleted fn" diagnostic [PR106880]

Message ID 20230323211803.396326-2-ppalka@redhat.com
State New
Headers show
Series [1/2] c++: improve "NTTP argument considered unused" fix [PR53164, PR105848] | expand

Commit Message

Patrick Palka March 23, 2023, 9:18 p.m. UTC
Here we're issuing a duplicate diagnostic for the use of the deleted
foo, first from the CALL_EXPR case of tsubst_copy_and_build (which
doesn't exit early upon failure), and again from from build_over_call
when rebuilding the substituted CALL_EXPR.

We can fix this by exiting early upon failure of the first call, but
this first call should always be redundant since build_over_call (or
another subroutine of finish_call_expr) ought to reliably call mark_used
for a suitable DECL_P callee anyway.

So this patch just gets rid of the first call to mark_used.

Bootstrapped and regtested on x86_64-pc-linux-gnu, does this look OK for
trunk?

	PR c++/106880

gcc/cp/ChangeLog:

	* pt.cc (tsubst_copy_and_build) <case CALL_EXPR>: Don't call
	mark_used.

gcc/testsuite/ChangeLog:

	* g++.dg/cpp0x/deleted16.C: New test.
---
 gcc/cp/pt.cc                           |  6 ------
 gcc/testsuite/g++.dg/cpp0x/deleted16.C | 11 +++++++++++
 2 files changed, 11 insertions(+), 6 deletions(-)
 create mode 100644 gcc/testsuite/g++.dg/cpp0x/deleted16.C

Comments

Jason Merrill March 30, 2023, 2:58 a.m. UTC | #1
On 3/23/23 17:18, Patrick Palka wrote:
> Here we're issuing a duplicate diagnostic for the use of the deleted
> foo, first from the CALL_EXPR case of tsubst_copy_and_build (which
> doesn't exit early upon failure), and again from from build_over_call
> when rebuilding the substituted CALL_EXPR.
> 
> We can fix this by exiting early upon failure of the first call, but
> this first call should always be redundant since build_over_call (or
> another subroutine of finish_call_expr) ought to reliably call mark_used
> for a suitable DECL_P callee anyway.
> 
> So this patch just gets rid of the first call to mark_used.
> 
> Bootstrapped and regtested on x86_64-pc-linux-gnu, does this look OK for
> trunk?

OK.

> 	PR c++/106880
> 
> gcc/cp/ChangeLog:
> 
> 	* pt.cc (tsubst_copy_and_build) <case CALL_EXPR>: Don't call
> 	mark_used.
> 
> gcc/testsuite/ChangeLog:
> 
> 	* g++.dg/cpp0x/deleted16.C: New test.
> ---
>   gcc/cp/pt.cc                           |  6 ------
>   gcc/testsuite/g++.dg/cpp0x/deleted16.C | 11 +++++++++++
>   2 files changed, 11 insertions(+), 6 deletions(-)
>   create mode 100644 gcc/testsuite/g++.dg/cpp0x/deleted16.C
> 
> diff --git a/gcc/cp/pt.cc b/gcc/cp/pt.cc
> index 9b3cc33331c..060d2d38504 100644
> --- a/gcc/cp/pt.cc
> +++ b/gcc/cp/pt.cc
> @@ -21176,12 +21176,6 @@ tsubst_copy_and_build (tree t,
>   	      }
>   	  }
>   
> -	/* Remember that there was a reference to this entity.  */
> -	if (function != NULL_TREE
> -	    && DECL_P (function)
> -	    && !mark_used (function, complain) && !(complain & tf_error))
> -	  RETURN (error_mark_node);
> -
>   	if (!maybe_fold_fn_template_args (function, complain))
>   	  return error_mark_node;
>   
> diff --git a/gcc/testsuite/g++.dg/cpp0x/deleted16.C b/gcc/testsuite/g++.dg/cpp0x/deleted16.C
> new file mode 100644
> index 00000000000..93cfb51eb3d
> --- /dev/null
> +++ b/gcc/testsuite/g++.dg/cpp0x/deleted16.C
> @@ -0,0 +1,11 @@
> +// PR c++/106880
> +// Verify we don't emit a "use of deleted function" diagnostic twice.
> +// { dg-do compile { target c++11 } }
> +
> +void foo() = delete;
> +
> +template<class T>
> +void f(T t) { foo(t); } // { dg-bogus "deleted function.*deleted function" }
> +                        // { dg-error "deleted function" "" { target *-*-*} .-1 }
> +
> +template void f(int);
diff mbox series

Patch

diff --git a/gcc/cp/pt.cc b/gcc/cp/pt.cc
index 9b3cc33331c..060d2d38504 100644
--- a/gcc/cp/pt.cc
+++ b/gcc/cp/pt.cc
@@ -21176,12 +21176,6 @@  tsubst_copy_and_build (tree t,
 	      }
 	  }
 
-	/* Remember that there was a reference to this entity.  */
-	if (function != NULL_TREE
-	    && DECL_P (function)
-	    && !mark_used (function, complain) && !(complain & tf_error))
-	  RETURN (error_mark_node);
-
 	if (!maybe_fold_fn_template_args (function, complain))
 	  return error_mark_node;
 
diff --git a/gcc/testsuite/g++.dg/cpp0x/deleted16.C b/gcc/testsuite/g++.dg/cpp0x/deleted16.C
new file mode 100644
index 00000000000..93cfb51eb3d
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp0x/deleted16.C
@@ -0,0 +1,11 @@ 
+// PR c++/106880
+// Verify we don't emit a "use of deleted function" diagnostic twice.
+// { dg-do compile { target c++11 } }
+
+void foo() = delete;
+
+template<class T>
+void f(T t) { foo(t); } // { dg-bogus "deleted function.*deleted function" }
+                        // { dg-error "deleted function" "" { target *-*-*} .-1 }
+
+template void f(int);