diff options
-rw-r--r-- | evaluate.c | 4 | ||||
-rw-r--r-- | validation/eval/array-quals-node.c | 29 | ||||
-rw-r--r-- | validation/eval/array-quals0.c | 6 | ||||
-rw-r--r-- | validation/eval/array-quals1.c | 49 |
4 files changed, 86 insertions, 2 deletions
@@ -1444,8 +1444,8 @@ static int check_assignment_types(struct symbol *target, struct expression **rp, } b1 = examine_pointer_target(t); b2 = examine_pointer_target(s); - mod1 = target_qualifiers(t); - mod2 = target_qualifiers(s); + mod1 = t->ctype.modifiers & MOD_IGN; + mod2 = s->ctype.modifiers & MOD_IGN; if (whitelist_pointers(b1, b2)) { /* * assignments to/from void * are OK, provided that diff --git a/validation/eval/array-quals-node.c b/validation/eval/array-quals-node.c new file mode 100644 index 00000000..99a4db13 --- /dev/null +++ b/validation/eval/array-quals-node.c @@ -0,0 +1,29 @@ +struct s { + int a; + int b[3]; + int c[2][3]; +}; + +struct c { + const struct s s; +}; + +extern struct c v; + +void f(void) +{ + v.s.a = 0; + *v.s.b = 0; + **v.s.c = 0; +} + +/* + * check-name: array-quals-node + * check-known-to-fail + * + * check-error-start +eval/array-quals-node.c:15:14: error: assignment to const expression +eval/array-quals-node.c:16:14: error: assignment to const expression +eval/array-quals-node.c:17:14: error: assignment to const expression + * check-error-end + */ diff --git a/validation/eval/array-quals0.c b/validation/eval/array-quals0.c new file mode 100644 index 00000000..30727490 --- /dev/null +++ b/validation/eval/array-quals0.c @@ -0,0 +1,6 @@ +static int a[2][3]; +static const int (*p)[3] = a; + +/* + * check-name: array-quals0 + */ diff --git a/validation/eval/array-quals1.c b/validation/eval/array-quals1.c new file mode 100644 index 00000000..d3e54f3e --- /dev/null +++ b/validation/eval/array-quals1.c @@ -0,0 +1,49 @@ +typedef const int ci_t; +typedef int ia_t[2]; +typedef const int cia_t[2]; + +static const int ci__a[2]; +static ci_t cit_a[2]; +static const ia_t c_iat; +static cia_t ciat_; +static cia_t ciata[2]; + +static const void *const ok_ci__a = &ci__a; +static void *const ko_ci__a = &ci__a; +static const void *const ok_cit_a = &cit_a; +static void *const ko_cit_a = &cit_a; +static const void *const ok_c_iat = &c_iat; +static void *const ko_c_iat = &c_iat; +static const void *const ok_ciat_ = &ciat_; +static void *const ko_ciat_ = &ciat_; +static const void *const ok_ciata = &ciata; +static void *const ko_ciata = &ciata; + +static volatile int vi__a[2]; +static volatile void *const ok_vi__a = &vi__a; +static void *const ko_vi__a = &vi__a; + +/* + * check-name: array-quals1 + * + * check-error-start +eval/array-quals1.c:12:38: warning: incorrect type in initializer (different modifiers) +eval/array-quals1.c:12:38: expected void *static const [toplevel] ko_ci__a +eval/array-quals1.c:12:38: got int const ( * )[2] +eval/array-quals1.c:14:38: warning: incorrect type in initializer (different modifiers) +eval/array-quals1.c:14:38: expected void *static const [toplevel] ko_cit_a +eval/array-quals1.c:14:38: got int const [usertype] ( * )[2] +eval/array-quals1.c:16:38: warning: incorrect type in initializer (different modifiers) +eval/array-quals1.c:16:38: expected void *static const [toplevel] ko_c_iat +eval/array-quals1.c:16:38: got int const ( * )[2] +eval/array-quals1.c:18:38: warning: incorrect type in initializer (different modifiers) +eval/array-quals1.c:18:38: expected void *static const [toplevel] ko_ciat_ +eval/array-quals1.c:18:38: got int const ( * )[2] +eval/array-quals1.c:20:38: warning: incorrect type in initializer (different modifiers) +eval/array-quals1.c:20:38: expected void *static const [toplevel] ko_ciata +eval/array-quals1.c:20:38: got int const [usertype] ( * )[2][2] +eval/array-quals1.c:24:41: warning: incorrect type in initializer (different modifiers) +eval/array-quals1.c:24:41: expected void *static const [toplevel] ko_vi__a +eval/array-quals1.c:24:41: got int volatile ( * )[2] + * check-error-end + */ |