aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authornsfisis <nsfisis@gmail.com>2026-02-07 19:08:21 +0900
committernsfisis <nsfisis@gmail.com>2026-02-07 19:08:37 +0900
commit3752b69fe3424b949bcb61c222265ee6a435c994 (patch)
treeb878d0e67fe71c48db3dd45d4f2962d3413b4040
parent0ae64ed2c00f66c7f3ddec8689169bacafff87ea (diff)
downloadducc-3752b69fe3424b949bcb61c222265ee6a435c994.tar.gz
ducc-3752b69fe3424b949bcb61c222265ee6a435c994.tar.zst
ducc-3752b69fe3424b949bcb61c222265ee6a435c994.zip
feat: workaround to compile Lua 5.5
-rw-r--r--src/codegen.c6
-rw-r--r--src/parse.c15
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 &&