diff --git a/src/parser/cxx/parser.cc b/src/parser/cxx/parser.cc index 9acbf33a..974f26fc 100644 --- a/src/parser/cxx/parser.cc +++ b/src/parser/cxx/parser.cc @@ -5368,6 +5368,28 @@ auto Parser::parse_init_declarator(InitDeclaratorAST*& yyast, if (auto var = symbol_cast(ast->symbol)) { var->setInitializer(initializer); + + if (auto ty = type_cast(ast->symbol->type())) { + BracedInitListAST* bracedInitList = nullptr; + + if (auto init = ast_cast(ast->initializer)) { + bracedInitList = init; + } else if (auto init = ast_cast(ast->initializer)) { + bracedInitList = ast_cast(init->expression); + } + + if (bracedInitList) { + const auto count = + std::ranges::distance(ListView{bracedInitList->expressionList}); + + if (count > 0) { + const auto arrayType = + control()->getBoundedArrayType(ty->elementType(), count); + + symbol->setType(arrayType); + } + } + } } return true; diff --git a/tests/unit_tests/ast/for_range_statement_02.cc b/tests/unit_tests/ast/for_range_statement_02.cc index 9cd48421..3bf74309 100644 --- a/tests/unit_tests/ast/for_range_statement_02.cc +++ b/tests/unit_tests/ast/for_range_statement_02.cc @@ -57,7 +57,7 @@ int main() { // CHECK-NEXT: identifier: key // CHECK-NEXT: name-id // CHECK-NEXT: identifier: value -// CHECK-NEXT: range-initializer: id-expression [lvalue int [][2]] +// CHECK-NEXT: range-initializer: id-expression [lvalue int [1][2]] // CHECK-NEXT: unqualified-id: name-id // CHECK-NEXT: identifier: map // CHECK-NEXT: statement: compound-statement diff --git a/tests/unit_tests/sema/sizeof_01.cc b/tests/unit_tests/sema/sizeof_01.cc index e31655fd..259574b6 100644 --- a/tests/unit_tests/sema/sizeof_01.cc +++ b/tests/unit_tests/sema/sizeof_01.cc @@ -22,3 +22,9 @@ static_assert(sizeof(long) == 4); static_assert(sizeof(unsigned long) == 4); static_assert(sizeof(long double) == 16); #endif + +int elements[] = {1, 2, 3, 4, 5}; +static_assert(sizeof(elements) == 5 * sizeof(int)); + +double d[]{1.0, 2.0, 3.0}; +static_assert(sizeof(d) == 3 * sizeof(double)); \ No newline at end of file