diff options
| -rw-r--r-- | evaluate.c | 6 | ||||
| -rw-r--r-- | validation/bool-cast-bad.c | 3 | ||||
| -rw-r--r-- | validation/bool-cast-implicit.c | 3 | ||||
| -rw-r--r-- | validation/bool-cast-restricted.c | 25 |
4 files changed, 31 insertions, 6 deletions
@@ -1345,6 +1345,12 @@ static int check_assignment_types(struct symbol *target, struct expression **rp, return 1; } else if (!(sclass & TYPE_RESTRICT)) goto Cast; + if (t == &bool_ctype) { + if (is_fouled_type(s)) + warning((*rp)->pos, "%s degrades to integer", + show_typename(s->ctype.base_type)); + goto Cast; + } *typediff = "different base types"; return 0; } diff --git a/validation/bool-cast-bad.c b/validation/bool-cast-bad.c index b7e7c058..a0b091e1 100644 --- a/validation/bool-cast-bad.c +++ b/validation/bool-cast-bad.c @@ -15,9 +15,6 @@ static _Bool fstse(struct s a) { return (_Bool)a; } * check-command: sparse $file * * check-error-start -bool-cast-bad.c:8:41: warning: incorrect type in return expression (different base types) -bool-cast-bad.c:8:41: expected bool -bool-cast-bad.c:8:41: got restricted le16 [usertype] a bool-cast-bad.c:9:42: warning: cast from restricted le16 bool-cast-bad.c:10:41: warning: incorrect type in return expression (different base types) bool-cast-bad.c:10:41: expected bool diff --git a/validation/bool-cast-implicit.c b/validation/bool-cast-implicit.c index ee8b705b..9d89443b 100644 --- a/validation/bool-cast-implicit.c +++ b/validation/bool-cast-implicit.c @@ -21,8 +21,5 @@ static _Bool fres(le16 a) { return a; } * check-output-excludes: cast\\. * * check-error-start -bool-cast-implicit.c:15:36: warning: incorrect type in return expression (different base types) -bool-cast-implicit.c:15:36: expected bool -bool-cast-implicit.c:15:36: got restricted le16 [usertype] a * check-error-end */ diff --git a/validation/bool-cast-restricted.c b/validation/bool-cast-restricted.c new file mode 100644 index 00000000..f6776b05 --- /dev/null +++ b/validation/bool-cast-restricted.c @@ -0,0 +1,25 @@ +typedef unsigned int __attribute__((bitwise)) large_t; +#define LBIT ((__attribute__((force)) large_t) 1) + +_Bool lfoo(large_t x) { return x; } +_Bool lbar(large_t x) { return ~x; } +_Bool lbaz(large_t x) { return !x; } +_Bool lqux(large_t x) { return x & LBIT; } + + +typedef unsigned short __attribute__((bitwise)) small_t; +#define SBIT ((__attribute__((force)) small_t) 1) + +_Bool sfoo(small_t x) { return x; } +_Bool sbar(small_t x) { return ~x; } +_Bool sbaz(small_t x) { return !x; } +_Bool squx(small_t x) { return x & SBIT; } + +/* + * check-name: bool-cast-restricted.c + * check-command: sparse -Wno-decl $file + * + * check-error-start +bool-cast-restricted.c:14:32: warning: restricted small_t degrades to integer + * check-error-end + */ |
