diff options
| author | nsfisis <nsfisis@gmail.com> | 2026-02-07 19:08:21 +0900 |
|---|---|---|
| committer | nsfisis <nsfisis@gmail.com> | 2026-02-07 19:08:37 +0900 |
| commit | 3752b69fe3424b949bcb61c222265ee6a435c994 (patch) | |
| tree | b878d0e67fe71c48db3dd45d4f2962d3413b4040 | |
| parent | 0ae64ed2c00f66c7f3ddec8689169bacafff87ea (diff) | |
| download | ducc-3752b69fe3424b949bcb61c222265ee6a435c994.tar.gz ducc-3752b69fe3424b949bcb61c222265ee6a435c994.tar.zst ducc-3752b69fe3424b949bcb61c222265ee6a435c994.zip | |
feat: workaround to compile Lua 5.5
| -rw-r--r-- | src/codegen.c | 6 | ||||
| -rw-r--r-- | src/parse.c | 15 |
2 files changed, 17 insertions, 4 deletions
diff --git a/src/codegen.c b/src/codegen.c index 91baef8..bc1e3d3 100644 --- a/src/codegen.c +++ b/src/codegen.c @@ -832,6 +832,12 @@ static void codegen_func(CodeGen* g, AstNode* ast) { } static void codegen_global_var(CodeGen* g, AstNode* var) { + if (var->ty->storage_class == StorageClass_extern) { + return; + } + if (var->ty->storage_class != StorageClass_static) { + fprintf(g->out, ".globl %s\n", var->as.gvar_decl->name); + } fprintf(g->out, " %s:\n", var->as.gvar_decl->name); if (!var->as.gvar_decl->expr) { fprintf(g->out, " .zero %d\n", type_sizeof(var->ty)); diff --git a/src/parse.c b/src/parse.c index 51a85ff..aeafabd 100644 --- a/src/parse.c +++ b/src/parse.c @@ -604,7 +604,8 @@ static bool is_type_token(Parser* p, Token* tok) { tok->kind == TokenKind_keyword_typeof_unqual || tok->kind == TokenKind_keyword_const || tok->kind == TokenKind_keyword_restrict || tok->kind == TokenKind_keyword_volatile || tok->kind == TokenKind_keyword__Atomic || tok->kind == TokenKind_keyword_alignas || - tok->kind == TokenKind_keyword_inline || tok->kind == TokenKind_keyword__Noreturn) { + tok->kind == TokenKind_keyword_inline || tok->kind == TokenKind_keyword__Noreturn || + tok->kind == TokenKind_keyword_static) { return true; } if (tok->kind != TokenKind_ident) { @@ -1303,6 +1304,9 @@ static AstNode* parse_init_declarator_list(Parser* p, Type* ty) { // declaration: // declaration-specifiers init-declarator-list ';' static AstNode* parse_var_decl(Parser* p) { + // TODO + consume_token_if(p, TokenKind_keyword_static); + Type* base_ty = parse_type_name(p); AstNode* decls = parse_init_declarator_list(p, base_ty); expect(p, TokenKind_semicolon); @@ -1379,15 +1383,18 @@ static void declare_func_or_var(Parser* p, AstNode* decl) { } } else { if (find_gvar(p, name) != -1) { - fatal_error("declare_func_or_var: %s redeclared", name); + // TODO + // fatal_error("declare_func_or_var: %s redeclared", name); } // TODO: refactor Type* base_ty = decl->ty; while (base_ty->base) { base_ty = base_ty->base; } - decl->ty->storage_class = base_ty->storage_class; - base_ty->storage_class = StorageClass_unspecified; + if (base_ty != decl->ty) { + decl->ty->storage_class = base_ty->storage_class; + base_ty->storage_class = StorageClass_unspecified; + } // TODO: refactor if (decl->ty->kind == TypeKind_array && decl->ty->array_size == -1 && decl->as.declarator && |
