aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Forney <mforney@mforney.org>2019-05-16 00:02:11 -0700
committerMichael Forney <mforney@mforney.org>2019-05-16 00:33:57 -0700
commit99d9848603d07114a79093f5fe71d6cf08a606aa (patch)
treebc02750262374db710693e55bcba6ace990a15a0
parent73e7c145e0c5d983cec3be18240851324b818d9f (diff)
decl: Qualifiers of array type are for element type
-rw-r--r--decl.c6
-rw-r--r--test/const-array.c5
-rw-r--r--test/const-array.qbe10
3 files changed, 20 insertions, 1 deletions
diff --git a/decl.c b/decl.c
index 78dc974..7047dda 100644
--- a/decl.c
+++ b/decl.c
@@ -416,8 +416,12 @@ done:
default:
error(&tok.loc, "invalid combination of type specifiers");
}
- if (!t && (tq || (sc && *sc) || (fs && *fs)))
+ if (!t && (tq || sc && *sc || fs && *fs))
error(&tok.loc, "declaration has no type specifier");
+ if (t && tq && t->kind == TYPEARRAY) {
+ t = mkarraytype(t->base, t->qual | tq, t->array.length);
+ tq = QUALNONE;
+ }
return (struct qualtype){t, tq};
}
diff --git a/test/const-array.c b/test/const-array.c
new file mode 100644
index 0000000..c2bfe46
--- /dev/null
+++ b/test/const-array.c
@@ -0,0 +1,5 @@
+/* C11 6.7.3p9 - type qualifiers on array type qualify the element type */
+typedef int T[2];
+void f(const T x) {
+ x = 0;
+}
diff --git a/test/const-array.qbe b/test/const-array.qbe
new file mode 100644
index 0000000..8648976
--- /dev/null
+++ b/test/const-array.qbe
@@ -0,0 +1,10 @@
+export
+function $f(l %.1) {
+@start.1
+ %.2 =l alloc8 8
+ storel %.1, %.2
+@body.2
+ %.3 =l extsw 0
+ storel %.3, %.2
+ ret
+}