#include #include #include "analyzer-decls.h" extern void foo (); extern void bar (); void test_1 (int i) { if (i == 42) abort (); __analyzer_eval (i != 42); /* { dg-warning "TRUE" } */ } void test_2 (int i) { if (i) foo (); else bar (); foo (); if (i) foo (); else abort (); __analyzer_eval (i != 0); /* { dg-warning "TRUE" } */ } /**************************************************************************/ void calls_abort (const char *msg) { fprintf (stderr, "%s", msg); abort (); } void test_3 (void *ptr) { if (!ptr) calls_abort ("ptr was NULL"); __analyzer_eval (ptr != 0); /* { dg-warning "TRUE" } */ } /**************************************************************************/ extern void marked_noreturn (const char *msg) __attribute__ ((__noreturn__)); void test_4 (void *ptr) { if (!ptr) marked_noreturn ("ptr was NULL"); __analyzer_eval (ptr != 0); /* { dg-warning "TRUE" } */ } /**************************************************************************/ /* 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 , 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) { MY_ASSERT (i < 10); __analyzer_eval (i < 10); /* { dg-warning "TRUE" } */ }