On 2/17/23 23:02, Alexandre Oliva wrote:
cp_build_binary_op, that issues -Waddress warnings, issues an extra
warning on arm targets, that g++.dg/warn/Waddress-5.C does not expect
when comparing a pointer-to-member-function literal with null.
The reason for the extra warning is that, on arm targets,
TARGET_PTRMEMFUNC_VBIT_LOCATION == ptrmemfunc_vbit_in_delta, which
causes a different path to be taken, that extracts the
pointer-to-function and the delta fields (minus the vbit) and compares
each one with zero. It's when comparing this pointer-to-function with
zero, in a recursive cp_build_binary_op, that another warning is
issued.
I suppose there should be a way to skip the warning in this recursive
call, without disabling other warnings that might be issued there, but
warning_sentinel ws (warn_address)
?
this patch only arranges for the test to tolerate the extra warning.
Regstrapped on x86_64-linux-gnu.
Tested on arm-vxworks7 (gcc-12) and arm-eabi (trunk). Ok to install?
OK
for gcc/testsuite/ChangeLog
* g++.dg/warn/Waddress-5.C: Tolerate extra -Waddress warning.
---
gcc/testsuite/g++.dg/warn/Waddress-5.C | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/gcc/testsuite/g++.dg/warn/Waddress-5.C
b/gcc/testsuite/g++.dg/warn/Waddress-5.C
index b1287b2fac316..1de88076f7767 100644
--- a/gcc/testsuite/g++.dg/warn/Waddress-5.C
+++ b/gcc/testsuite/g++.dg/warn/Waddress-5.C
@@ -23,7 +23,11 @@ void T (bool);
void warn_memptr_if ()
{
// Exercise warnings for addresses of nonstatic member functions.
- if (&A::f == 0) // { dg-warning "the address '&A::f'" }
+ // On targets with TARGET_PTRMEMFUNC_VBIT_LOCATION ==
+ // ptrmemfunc_vbit_in_delta, cp_build_binary_op recurses to compare
+ // the pfn from the ptrmemfunc with null, so we get two warnings.
+ // This matches both. ??? Should we disable one of them?
+ if (&A::f == 0) // { dg-warning "A::f" }
T (0);
if (&A::vf) // { dg-warning "-Waddress" }