diff options
-rw-r--r-- | decl.c | 6 | ||||
-rw-r--r-- | test/const-array.c | 5 | ||||
-rw-r--r-- | test/const-array.qbe | 10 |
3 files changed, 20 insertions, 1 deletions
@@ -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 +} |