summaryrefslogtreecommitdiff
path: root/tests/test-verify.c
diff options
context:
space:
mode:
authorJörg Frings-Fürst <debian@jff.email>2022-01-08 11:53:52 +0100
committerJörg Frings-Fürst <debian@jff.email>2022-01-08 11:53:52 +0100
commitfa838e76139763f902c7d27cb9e1d393ed6a15e4 (patch)
tree7d0ae09775ea950056193eaa2ca93844299d46f1 /tests/test-verify.c
parentc78359d9542c86b972aac373efcf7bc7a8a560e5 (diff)
parent2959e59fab3bab834368adefd90bd4b1b094366b (diff)
Merge branch 'feature/upstream' into develop
Diffstat (limited to 'tests/test-verify.c')
-rw-r--r--tests/test-verify.c64
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);
}