The implementation of the no_fsanitize_address effective target was copied 
from asan-dg.exp without realizing that it does not work outside of this 
context (there is a comment explaining why).  As a consequence, it always 
returns 0, so for example the directive in gnat.dg/asan1.adb:

{ dg-skip-if "no address sanitizer" { no_fsanitize_address } }

does not work.  This led some people to add the nonsensical:

{ dg-require-effective-target no_fsanitize_address }

to sanitizer tests, e.g. g++.dg/warn/uninit-pr93100.C, thus disabling them 
everywhere instead of just for the problematic targets.

The attached patch cleans up the mess, reenabling a few tests on x86-64/Linux:

                === g++ Summary ===
 
-# of expected passes           219622
+# of expected passes           219650
 # of unexpected failures       3
 # of expected failures         1331
 # of unresolved testcases      2
-# of unsupported tests         9419
+# of unsupported tests         9415

                === gcc Summary ===
 
-# of expected passes           172571
+# of expected passes           172574
 # of unexpected failures       88
 # of unexpected successes      17
 # of expected failures         1011
-# of unsupported tests         2631
+# of unsupported tests         2628

and properly disabling them on SPARC64/Linux.

Applied on the mainline, 11 and 10 branches as obvious.


2021-09-21  Eric Botcazou  <ebotca...@adacore.com>

        * lib/target-supports.exp (no_fsanitize_address): Add missing bits.
        * gcc.dg/uninit-pr93100.c: Skip if no_fsanitize_address.
        * gcc.dg/pr91441.c: Likewise.
        * gcc.dg/pr96260.c: Likewise.
        * gcc.dg/pr96307.c: Likewise.
        * g++.dg/warn/uninit-pr93100.C: Likewise.
        * gnat.dg/asan1.adb: Likewise.

        * gcc.dg/Wstringop-overflow-70.c: Adjust for SPARC.
        * g++.dg/abi/anon4.C: Likewise.

-- 
Eric Botcazou
diff --git a/gcc/testsuite/g++.dg/abi/anon4.C b/gcc/testsuite/g++.dg/abi/anon4.C
index 088ba994019..8200f4bb270 100644
--- a/gcc/testsuite/g++.dg/abi/anon4.C
+++ b/gcc/testsuite/g++.dg/abi/anon4.C
@@ -1,4 +1,5 @@
 // PR c++/65209
+// { dg-additional-options "-fno-pie" { target sparc*-*-* } }
 // { dg-final { scan-assembler-not "comdat" } }
 
 // Everything involving the anonymous namespace bits should be private, not
diff --git a/gcc/testsuite/g++.dg/warn/uninit-pr93100.C b/gcc/testsuite/g++.dg/warn/uninit-pr93100.C
index 56dc8943798..e08a36d68a9 100644
--- a/gcc/testsuite/g++.dg/warn/uninit-pr93100.C
+++ b/gcc/testsuite/g++.dg/warn/uninit-pr93100.C
@@ -1,7 +1,7 @@
 /* PR tree-optimization/98508 - Sanitizer disable -Wall and -Wextra
    { dg-do compile }
-   { dg-require-effective-target no_fsanitize_address }
-   { dg-options "-O0 -Wall -fsanitize=address" } */
+   { dg-options "-O0 -Wall -fsanitize=address" }
+   { dg-skip-if "no address sanitizer" { no_fsanitize_address } } */
 
 struct S
 {
diff --git a/gcc/testsuite/gcc.dg/Wstringop-overflow-70.c b/gcc/testsuite/gcc.dg/Wstringop-overflow-70.c
index 82c4d9f2238..ccfe2cefd1c 100644
--- a/gcc/testsuite/gcc.dg/Wstringop-overflow-70.c
+++ b/gcc/testsuite/gcc.dg/Wstringop-overflow-70.c
@@ -17,8 +17,8 @@ void* warn_loop (void)
   char *p = __builtin_malloc (15);
   for (int i = 0; i != 16; ++i)
     /* The size of the write below depends on the target.  When vectorized
-       the vector size may be 4 or 16, otherwise it may be a series of byte
+       the vector size may be 4, 8 or 16, otherwise it may be a series of byte
        assignments.  */
-    p[i] = i;       // { dg-warning "writing (1|2|4|16) bytes? into a region of size (0|1|3|15)" }
+    p[i] = i;       // { dg-warning "writing (1|2|4|8|16) bytes? into a region of size (0|1|3|7|15)" }
   return p;
 }
diff --git a/gcc/testsuite/gcc.dg/pr91441.c b/gcc/testsuite/gcc.dg/pr91441.c
index 4f7a8fbec5e..4c785f61e59 100644
--- a/gcc/testsuite/gcc.dg/pr91441.c
+++ b/gcc/testsuite/gcc.dg/pr91441.c
@@ -1,11 +1,11 @@
 /* PR target/91441 */
 /* { dg-do compile  } */
-/* { dg-require-effective-target no_fsanitize_address }*/
 /* { dg-options "--param asan-stack=1 -fsanitize=kernel-address" } */
+/* { dg-skip-if "no address sanitizer" { no_fsanitize_address } } */
 
 int *bar(int *);
 int *f( int a)
 {
   return bar(&a);
 }
-/* { dg-warning ".'-fsanitize=kernel-address' with stack protection is not supported without '-fasan-shadow-offset=' for this target" "" { target *-*-* } 0 } */
+/* { dg-warning ".'-fsanitize=kernel-address' with stack protection is not supported without '-fasan-shadow-offset=' for this target" "" { target riscv*-*-* } 0 } */
diff --git a/gcc/testsuite/gcc.dg/pr96260.c b/gcc/testsuite/gcc.dg/pr96260.c
index 734832f021e..587afb76116 100644
--- a/gcc/testsuite/gcc.dg/pr96260.c
+++ b/gcc/testsuite/gcc.dg/pr96260.c
@@ -1,7 +1,7 @@
 /* PR target/96260 */
 /* { dg-do compile } */
-/* { dg-require-effective-target no_fsanitize_address }*/
 /* { dg-options "--param asan-stack=1 -fsanitize=kernel-address -fasan-shadow-offset=0x100000" } */
+/* { dg-skip-if "no address sanitizer" { no_fsanitize_address } } */
 
 int *bar(int *);
 int *f( int a)
diff --git a/gcc/testsuite/gcc.dg/pr96307.c b/gcc/testsuite/gcc.dg/pr96307.c
index cd1c17c9661..89002b85c8e 100644
--- a/gcc/testsuite/gcc.dg/pr96307.c
+++ b/gcc/testsuite/gcc.dg/pr96307.c
@@ -1,7 +1,7 @@
 /* PR target/96307 */
 /* { dg-do compile } */
-/* { dg-require-effective-target no_fsanitize_address }*/
 /* { dg-additional-options "-fsanitize=kernel-address --param=asan-instrumentation-with-call-threshold=8" } */
+/* { dg-skip-if "no address sanitizer" { no_fsanitize_address } } */
 
 #include <limits.h>
 enum a {test1, test2, test3=INT_MAX};
diff --git a/gcc/testsuite/gcc.dg/uninit-pr93100.c b/gcc/testsuite/gcc.dg/uninit-pr93100.c
index 531a5c3aa50..7cb02227bff 100644
--- a/gcc/testsuite/gcc.dg/uninit-pr93100.c
+++ b/gcc/testsuite/gcc.dg/uninit-pr93100.c
@@ -1,7 +1,7 @@
 /* PR tree-optimization/93100 - gcc -fsanitize=address inhibits -Wuninitialized
    { dg-do compile }
    { dg-options "-Wall -fsanitize=address" }
-   { dg-skip-if "sanitize address" { "powerpc-ibm-aix*" } } */
+   { dg-skip-if "no address sanitizer" { no_fsanitize_address } } */
 
 struct A
 {
diff --git a/gcc/testsuite/gnat.dg/asan1.adb b/gcc/testsuite/gnat.dg/asan1.adb
index a4bc59a9a21..26bc1a40447 100644
--- a/gcc/testsuite/gnat.dg/asan1.adb
+++ b/gcc/testsuite/gnat.dg/asan1.adb
@@ -1,7 +1,7 @@
 --  { dg-do compile }
 --  { dg-additional-sources asan1_pkg.ads }
 --  { dg-options "-fsanitize=address" }
---  { dg-skip-if "" no_fsanitize_address }
+--  { dg-skip-if "no address sanitizer" { no_fsanitize_address } }
 
 with Asan1_Pkg;
 
diff --git a/gcc/testsuite/lib/target-supports.exp b/gcc/testsuite/lib/target-supports.exp
index f11c4e60a6e..9ebca7ac007 100644
--- a/gcc/testsuite/lib/target-supports.exp
+++ b/gcc/testsuite/lib/target-supports.exp
@@ -11251,14 +11251,15 @@ proc check_effective_target_movdir { } {
     } "-mmovdiri -mmovdir64b" ]
 }
 
-# Return 1 if target is not support address sanitize, 1 otherwise.
+# Return 1 if the target does not support address sanitizer, 0 otherwise
 
 proc check_effective_target_no_fsanitize_address {} {
     if ![check_no_compiler_messages fsanitize_address executable {
 	int main (void) { return 0; }
-    }] {
+    } "-fsanitize=address" ] {
 	return 1;
     }
+
     return 0;
 }
 

Reply via email to