analyzer: avoid relying on system <assert.h> in testsuite (PR 93367)
authorDavid Malcolm <dmalcolm@redhat.com>
Thu, 23 Jan 2020 22:46:12 +0000 (17:46 -0500)
committerDavid Malcolm <dmalcolm@redhat.com>
Fri, 24 Jan 2020 01:47:34 +0000 (20:47 -0500)
PR analyzer/93367 reports a testsuite failure in abort.c on
hppa64-hp-hpux11.11 when detecting if the analyzer "knows" that the
condition holds after the assert.

The root cause is that the assertion failure function in that
configuration's <assert.h> is not marked with
__attribute__ ((__noreturn__)).

This patch reworks the test to avoid <assert.h> in favor of a custom
implementation of assert, so that the test demonstrates the idea without
relying on properties of <assert.h>.

gcc/testsuite/ChangeLog:
PR analyzer/93367
* gcc.dg/analyzer/abort.c: Remove include of <assert.h>.
Replace use of assert with a custom assertion implementation.

gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/analyzer/abort.c

index 85e2fbbb64526102b58f6373e30174a5707d8ccf..df547bcc2ae675743390f88bd4c512894df05d62 100644 (file)
@@ -1,3 +1,9 @@
+2020-01-23  David Malcolm  <dmalcolm@redhat.com>
+
+       PR analyzer/93367
+       * gcc.dg/analyzer/abort.c: Remove include of <assert.h>.
+       Replace use of assert with a custom assertion implementation.
+
 2020-01-23  Jakub Jelinek  <jakub@redhat.com>
 
        PR inline-asm/93027
index ea1756e47cb0c8a29581c8f36b1e63b9e2a0ff4e..9497ae30b469a4ad0b8132ecb6671b7203551ede 100644 (file)
@@ -1,4 +1,3 @@
-#include <assert.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include "analyzer-decls.h"
@@ -62,11 +61,20 @@ void test_4 (void *ptr)
 
 /**************************************************************************/
 
+/* Verify that we discover conditions from assertions if the assert macro
+   isn't disabled, and that it has its failure-handler labelled with
+   __attribute__ ((__noreturn__)).
+   This attribute isn't present for all implementations of <assert.h>, so
+   we have to test the idea using our own assert macro.  */
+
+extern void my_assert_fail (const char *expr, const char *file, int line)
+  __attribute__ ((__noreturn__));
+
+#define MY_ASSERT(EXPR) \
+  do { if (!(EXPR)) my_assert_fail (#EXPR, __FILE__, __LINE__); } while (0)
+
 void test_5 (int i)
 {
-  assert (i < 10);
-
-  /* We have not defined NDEBUG, so this will call __assert_fail if
-     i >= 10, which is labelled with __attribute__ ((__noreturn__)).  */
+  MY_ASSERT (i < 10);
   __analyzer_eval (i < 10); /* { dg-warning "TRUE" } */
 }