From ef0cb4dbdc1c036f70f94a905cbacae9be5abf5e Mon Sep 17 00:00:00 2001 From: nsfisis Date: Sat, 14 Feb 2026 23:30:18 +0900 Subject: refactor: shallow copy typedef-ed types to remove work-around --- src/ast.c | 6 ++++++ src/ast.h | 1 + src/parse.c | 8 +++----- 3 files changed, 10 insertions(+), 5 deletions(-) (limited to 'src') diff --git a/src/ast.c b/src/ast.c index 89c8aea..790eb81 100644 --- a/src/ast.c +++ b/src/ast.c @@ -88,6 +88,12 @@ Type* type_new(TypeKind kind) { return ty; } +Type* type_dup(Type* src) { + Type* ty = malloc(sizeof(Type)); + memcpy(ty, src, sizeof(Type)); + return ty; +} + Type* type_new_ptr(Type* base) { Type* ty = type_new(TypeKind_ptr); ty->base = base; diff --git a/src/ast.h b/src/ast.h index 79d58d0..0749420 100644 --- a/src/ast.h +++ b/src/ast.h @@ -65,6 +65,7 @@ typedef struct Type { } Type; Type* type_new(TypeKind kind); +Type* type_dup(Type* src); Type* type_new_ptr(Type* base); Type* type_new_array(Type* elem, int size); Type* type_new_static_string(int len); diff --git a/src/parse.c b/src/parse.c index aeafabd..494e4a2 100644 --- a/src/parse.c +++ b/src/parse.c @@ -1209,15 +1209,12 @@ static Type* parse_function_declarator_suffix(Parser* p, Type* ty) { next_token(p); // skip '(' AstNode* params; - // FIXME: save and restore ty->storage_class because it will be modified somewhere for some reason. - StorageClass FIXME_storage_class = ty->storage_class; if (consume_token_if(p, TokenKind_paren_r)) { params = ast_new_list(1); } else { params = parse_parameter_type_list(p); expect(p, TokenKind_paren_r); } - ty->storage_class = FIXME_storage_class; return type_new_func(ty, params); } @@ -1693,7 +1690,7 @@ static Type* parse_declaration_specifiers(Parser* p) { } next_token(p); int typedef_idx = find_typedef(p, tok->value.string); - ty = p->typedefs->as.list->items[typedef_idx].ty; + ty = type_dup(p->typedefs->as.list->items[typedef_idx].ty); type_specifiers += TypeSpecifierMask_typedef_name; } // type-specifier-qualifier > type-qualifier @@ -2047,7 +2044,7 @@ static Type* parse_specifier_qualifier_list(Parser* p) { } next_token(p); int typedef_idx = find_typedef(p, tok->value.string); - ty = p->typedefs->as.list->items[typedef_idx].ty; + ty = type_dup(p->typedefs->as.list->items[typedef_idx].ty); type_specifiers += TypeSpecifierMask_typedef_name; } // type-specifier-qualifier > type-qualifier @@ -2075,6 +2072,7 @@ static Type* parse_specifier_qualifier_list(Parser* p) { ty = ty_; } + ty->storage_class = StorageClass_unspecified; return ty; } -- cgit v1.3-1-g0d28