Folding constant enum access into constant int value

This commit is contained in:
Krzosa Karol
2022-05-31 13:10:56 +02:00
parent 627e2bad88
commit 437a776d78
5 changed files with 71 additions and 17 deletions

View File

@@ -103,10 +103,15 @@ gen_expr(Ast_Expr *ast){
CASE(BINARY, Binary){
if(node->op == TK_Dot){
Sym *sym = resolved_get(node->left);
gen_expr(node->left);
if(sym->type->kind == TYPE_POINTER) gen("->");
else gen(".");
gen_expr(node->right);
if(sym->kind == SYM_CONST){
gen("%lld", sym->int_val);
}
else{
gen_expr(node->left);
if(sym->type->kind == TYPE_POINTER) gen("->");
else gen(".");
gen_expr(node->right);
}
}
else{
gen("(");
@@ -305,6 +310,9 @@ gen_ast(Ast *ast){
else if(sym->type == type_string){
gen("String %s = LIT(\"%s\");", node->name.str, sym->intern_val.str);
}
else if(sym->type->kind == TYPE_ENUM){
gen("enum { %s = %lld };", node->name.str, sym->int_val);
}
else if(sym->type == type_type){
if(sym->type_val->kind == TYPE_STRUCT){
Ast_Struct *agg = (Ast_Struct *)sym->type_val->ast;