From d3a6f174543816600b1f472997d492088e4e396a Mon Sep 17 00:00:00 2001 From: Alex Coplan Date: Wed, 22 Mar 2023 15:20:49 +0000 Subject: [PATCH] c++: Avoid duplicate diagnostic calling unavailable function [PR109177] As the PR shows, we currently emit duplicate diagnostics for calls to functions marked with __attribute__((unavailable)). This patch fixes that. gcc/cp/ChangeLog: PR c++/109177 * call.cc (build_over_call): Use make_temp_override to suppress both unavailable and deprecated warnings when calling build_addr_func. gcc/testsuite/ChangeLog: PR c++/109177 * g++.dg/ext/pr109177.C: New test. --- gcc/cp/call.cc | 10 ++++++---- gcc/testsuite/g++.dg/ext/pr109177.C | 6 ++++++ 2 files changed, 12 insertions(+), 4 deletions(-) create mode 100644 gcc/testsuite/g++.dg/ext/pr109177.C diff --git a/gcc/cp/call.cc b/gcc/cp/call.cc index c52a09b..d5e8ccc 100644 --- a/gcc/cp/call.cc +++ b/gcc/cp/call.cc @@ -41,6 +41,7 @@ along with GCC; see the file COPYING3. If not see #include "internal-fn.h" #include "stringpool.h" #include "attribs.h" +#include "decl.h" #include "gcc-rich-location.h" /* The various kinds of conversion. */ @@ -10413,10 +10414,11 @@ build_over_call (struct z_candidate *cand, int flags, tsubst_flags_t complain) } else { - /* If FN is marked deprecated, then we've already issued a deprecated-use - warning from mark_used above, so avoid redundantly issuing another one - from build_addr_func. */ - warning_sentinel w (warn_deprecated_decl); + /* If FN is marked deprecated or unavailable, then we've already + issued a diagnostic from mark_used above, so avoid redundantly + issuing another one from build_addr_func. */ + auto w = make_temp_override (deprecated_state, + UNAVAILABLE_DEPRECATED_SUPPRESS); fn = build_addr_func (fn, complain); if (fn == error_mark_node) diff --git a/gcc/testsuite/g++.dg/ext/pr109177.C b/gcc/testsuite/g++.dg/ext/pr109177.C new file mode 100644 index 0000000..cc322f6 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/pr109177.C @@ -0,0 +1,6 @@ +// { dg-do compile } +void foo() __attribute__((unavailable)); +void bar () { + foo (); // { dg-bogus "is unavailable.*is unavailable" } + // { dg-error "is unavailable" "" { target *-*-* } .-1 } +} -- 2.7.4