From d989cbffe5b6deca29ce233dc975f47b5cce1796 Mon Sep 17 00:00:00 2001 From: Charlie Gordon Date: Sun, 18 Oct 2026 12:53:23 +0200 Subject: [PATCH] Analyser: accept countof on aliased array types * fix `Generator.emitAliasType` and bootstrap array length order * fix `getArrayTypeOrNil` and bootstrap for alias types --- ast/qualtype.c2 | 3 ++- bootstrap/bootstrap.c | 4 ++-- test/builtins/elemsof_array_alias.c2 | 8 ++++++++ 3 files changed, 12 insertions(+), 3 deletions(-) create mode 100644 test/builtins/elemsof_array_alias.c2 diff --git a/ast/qualtype.c2 b/ast/qualtype.c2 index 1047c1cf4..8625947d1 100644 --- a/ast/qualtype.c2 +++ b/ast/qualtype.c2 @@ -367,7 +367,8 @@ public fn PointerType* QualType.getPointerTypeOrNil(const QualType qt) { */ public fn ArrayType* QualType.getArrayTypeOrNil(const QualType qt) { - const Type* t = qt.getTypeOrNil(); + QualType canon = qt.getCanonicalType(); + const Type* t = canon.getTypeOrNil(); if (t && t.isArrayType()) return (ArrayType*)t; return nil; } diff --git a/bootstrap/bootstrap.c b/bootstrap/bootstrap.c index 95044e696..ee9633ba6 100644 --- a/bootstrap/bootstrap.c +++ b/bootstrap/bootstrap.c @@ -15795,7 +15795,7 @@ static ast_StructType* ast_QualType_getStructTypeOrNil(const ast_QualType qt) static ast_ArrayType* ast_QualType_getArrayTypeOrNil(const ast_QualType qt) { - const ast_Type* t = ast_QualType_getTypeOrNil(qt); + const ast_Type* t = ast_QualType_getTypeOrNil(ast_QualType_getCanonicalType(qt)); if (t && ast_Type_isArrayType(t)) return (ast_ArrayType*)t; return NULL; } @@ -34109,9 +34109,9 @@ static void c_generator_Generator_emitAliasType(c_generator_Generator* gen, stri qt = ast_QualType_getCanonicalType(qt); string_buffer_Buf_add(out, "typedef "); c_generator_Generator_emitTypePre(gen, out, qt, false); - c_generator_Generator_emitTypePost(gen, out, qt); string_buffer_Buf_space(out); c_generator_Generator_emitCName(gen, out, d); + c_generator_Generator_emitTypePost(gen, out, qt); string_buffer_Buf_add(out, ";\n"); } diff --git a/test/builtins/elemsof_array_alias.c2 b/test/builtins/elemsof_array_alias.c2 new file mode 100644 index 000000000..bb009365f --- /dev/null +++ b/test/builtins/elemsof_array_alias.c2 @@ -0,0 +1,8 @@ +// @warnings{no-unused} +module test; + +type Array i32[20]; +Array a; + +static_assert(20, countof(Array)); +static_assert(20, countof(a));