diff options
| author | Luc Van Oostenryck <luc.vanoostenryck@gmail.com> | 2018-02-16 13:52:18 +0100 |
|---|---|---|
| committer | Luc Van Oostenryck <luc.vanoostenryck@gmail.com> | 2018-02-17 18:38:50 +0100 |
| commit | e0693cd68164948261e772a9081e155c9a95ec8f (patch) | |
| tree | eac1b92ef27b2cf9ba2e36922a45317d2cd6cee0 /validation | |
| parent | d2e557a42b55e1014219a3e0e5726fc74392a272 (diff) | |
| download | sparse-dev-e0693cd68164948261e772a9081e155c9a95ec8f.tar.gz | |
builtin: add typechecking of isnan(), isinf(), ...
These builtins should accept a single argument of any
floating-point type and should not do the usual promotion
of float to double.
Add the type and argument number check in the builtin's
evaluate method.
Signed-off-by: Luc Van Oostenryck <luc.vanoostenryck@gmail.com>
Diffstat (limited to 'validation')
| -rw-r--r-- | validation/builtin-fp-unop.c | 95 |
1 files changed, 95 insertions, 0 deletions
diff --git a/validation/builtin-fp-unop.c b/validation/builtin-fp-unop.c new file mode 100644 index 00000000..f42c587b --- /dev/null +++ b/validation/builtin-fp-unop.c @@ -0,0 +1,95 @@ +static void test_not_enough_args(void) +{ + __builtin_isfinite(); + __builtin_isinf(); + __builtin_isinf_sign(); + __builtin_isnan(); + __builtin_isnormal(); + __builtin_signbit(); +} + +static void test_too_many_args(double v) +{ + __builtin_isfinite(v, v); + __builtin_isinf(v, v); + __builtin_isinf_sign(v, v); + __builtin_isnan(v, v); + __builtin_isnormal(v, v); + __builtin_signbit(v, v); +} + +static void test_non_float(int v) +{ + __builtin_isfinite(v); + __builtin_isinf(v); + __builtin_isinf_sign(v); + __builtin_isnan(v); + __builtin_isnormal(v); + __builtin_signbit(v); +} + +static void test_float(float v) +{ + __builtin_isfinite(v); + __builtin_isinf(v); + __builtin_isinf_sign(v); + __builtin_isnan(v); + __builtin_isnormal(v); + __builtin_signbit(v); +} + +static void test_double(double v) +{ + __builtin_isfinite(v); + __builtin_isinf(v); + __builtin_isinf_sign(v); + __builtin_isnan(v); + __builtin_isnormal(v); + __builtin_signbit(v); +} + +static void test_ldouble(long double v) +{ + __builtin_isfinite(v); + __builtin_isinf(v); + __builtin_isinf_sign(v); + __builtin_isnan(v); + __builtin_isnormal(v); + __builtin_signbit(v); +} + +static void test_constant(void) +{ + __builtin_isfinite(0.0); + __builtin_isinf(0.0); + __builtin_isinf_sign(0.0); + __builtin_isnan(0.0); + __builtin_isnormal(0.0); + __builtin_signbit(0.0); +} + +/* + * check-name: builtin float-point unop + * check-command: sparse -Wno-decl $file + * + * check-error-start +builtin-fp-unop.c:3:27: error: not enough arguments for __builtin_isfinite +builtin-fp-unop.c:4:24: error: not enough arguments for __builtin_isinf +builtin-fp-unop.c:5:29: error: not enough arguments for __builtin_isinf_sign +builtin-fp-unop.c:6:24: error: not enough arguments for __builtin_isnan +builtin-fp-unop.c:7:27: error: not enough arguments for __builtin_isnormal +builtin-fp-unop.c:8:26: error: not enough arguments for __builtin_signbit +builtin-fp-unop.c:13:27: error: too many arguments for __builtin_isfinite +builtin-fp-unop.c:14:24: error: too many arguments for __builtin_isinf +builtin-fp-unop.c:15:29: error: too many arguments for __builtin_isinf_sign +builtin-fp-unop.c:16:24: error: too many arguments for __builtin_isnan +builtin-fp-unop.c:17:27: error: too many arguments for __builtin_isnormal +builtin-fp-unop.c:18:26: error: too many arguments for __builtin_signbit +builtin-fp-unop.c:23:27: error: non-floating-point argument in call to __builtin_isfinite() +builtin-fp-unop.c:24:24: error: non-floating-point argument in call to __builtin_isinf() +builtin-fp-unop.c:25:29: error: non-floating-point argument in call to __builtin_isinf_sign() +builtin-fp-unop.c:26:24: error: non-floating-point argument in call to __builtin_isnan() +builtin-fp-unop.c:27:27: error: non-floating-point argument in call to __builtin_isnormal() +builtin-fp-unop.c:28:26: error: non-floating-point argument in call to __builtin_signbit() + * check-error-end + */ |
