aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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
+}