diff options
author | Jörg Frings-Fürst <debian@jff.email> | 2022-01-08 11:53:52 +0100 |
---|---|---|
committer | Jörg Frings-Fürst <debian@jff.email> | 2022-01-08 11:53:52 +0100 |
commit | fa838e76139763f902c7d27cb9e1d393ed6a15e4 (patch) | |
tree | 7d0ae09775ea950056193eaa2ca93844299d46f1 /tests/test-verify.c | |
parent | c78359d9542c86b972aac373efcf7bc7a8a560e5 (diff) | |
parent | 2959e59fab3bab834368adefd90bd4b1b094366b (diff) |
Merge branch 'feature/upstream' into develop
Diffstat (limited to 'tests/test-verify.c')
-rw-r--r-- | tests/test-verify.c | 64 |
1 files changed, 57 insertions, 7 deletions
diff --git a/tests/test-verify.c b/tests/test-verify.c index af970768..cb3af718 100644 --- a/tests/test-verify.c +++ b/tests/test-verify.c @@ -1,6 +1,6 @@ /* Test the "verify" module. - Copyright (C) 2005, 2009-2018 Free Software Foundation, Inc. + Copyright (C) 2005, 2009-2022 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -25,13 +25,15 @@ # define EXP_FAIL 0 #endif -int x; -enum { a, b, c }; +/* ======================= Test verify, verify_expr ======================= */ + +int gx; +enum { A, B, C }; #if EXP_FAIL == 1 -verify (x >= 0); /* should give ERROR: non-constant expression */ +verify (gx >= 0); /* should give ERROR: non-constant expression */ #endif -verify (c == 2); /* should be ok */ +verify (C == 2); /* should be ok */ #if EXP_FAIL == 2 verify (1 + 1 == 3); /* should give ERROR */ #endif @@ -39,7 +41,7 @@ verify (1 == 1); verify (1 == 1); /* should be ok */ enum { - item = verify_true (1 == 1) * 0 + 17 /* should be ok */ + item = verify_expr (1 == 1, 10 * 0 + 17) /* should be ok */ }; static int @@ -48,7 +50,7 @@ function (int n) #if EXP_FAIL == 3 verify (n >= 0); /* should give ERROR: non-constant expression */ #endif - verify (c == 2); /* should be ok */ + verify (C == 2); /* should be ok */ #if EXP_FAIL == 4 verify (1 + 1 == 3); /* should give ERROR */ #endif @@ -62,8 +64,56 @@ function (int n) return 0; } +/* ============================== Test assume ============================== */ + +static int +f (int a) +{ + return a; +} + +typedef struct { unsigned int context : 4; unsigned int halt : 1; } state; + +void test_assume_expressions (state *s); +int test_assume_optimization (int x); +_Noreturn void test_assume_noreturn (void); + +void +test_assume_expressions (state *s) +{ + /* Check that 'assume' accepts a function call, even of a non-const + function. */ + assume (f (1)); + /* Check that 'assume' accepts a bit-field expression. */ + assume (s->halt); +} + +int +test_assume_optimization (int x) +{ + /* Check that the compiler uses 'assume' for optimization. + This function, when compiled with optimization, should have code + equivalent to + return x + 3; + Use 'objdump --disassemble test-verify.o' to verify this. */ + assume (x >= 4); + return (x > 1 ? x + 3 : 2 * x + 10); +} + +_Noreturn void +test_assume_noreturn (void) +{ + /* Check that the compiler's data-flow analysis recognizes 'assume (0)'. + This function should not elicit a warning. */ + assume (0); +} + +/* ============================== Main ===================================== */ int main (void) { + state s = { 0, 1 }; + test_assume_expressions (&s); + test_assume_optimization (5); return !(function (0) == 0 && function (1) == 8); } |