aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--evaluate.c4
-rw-r--r--validation/eval/array-quals-node.c29
-rw-r--r--validation/eval/array-quals0.c6
-rw-r--r--validation/eval/array-quals1.c49
4 files changed, 86 insertions, 2 deletions
diff --git a/evaluate.c b/evaluate.c
index f515ce6f..dddea761 100644
--- a/evaluate.c
+++ b/evaluate.c
@@ -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
+ */