Field access codegen works, properly converts to arrows
This commit is contained in:
25
ccodegen.cpp
25
ccodegen.cpp
@@ -116,29 +116,20 @@ gen_expr(Ast_Expr *ast){
|
|||||||
}
|
}
|
||||||
|
|
||||||
CASE(BINARY, Binary){
|
CASE(BINARY, Binary){
|
||||||
// if(node->op == TK_Dot){
|
if(node->op == TK_Dot){
|
||||||
// Sym *sym = resolved_get(node->left);
|
gen_expr(node->left);
|
||||||
// gen_expr(node->left);
|
if(node->type->kind == TYPE_POINTER) gen("->");
|
||||||
// if(sym->type->kind == TYPE_POINTER) gen("->");
|
else gen(".");
|
||||||
// else gen(".");
|
gen_expr(node->right);
|
||||||
// gen_expr(node->right);
|
return;
|
||||||
// }
|
}
|
||||||
// else if(node->op == TK_ColonAssign){
|
|
||||||
|
|
||||||
// Sym *sym = resolved_get(node);
|
|
||||||
// Ast_Atom *atom = (Ast_Atom *)node->left;
|
|
||||||
// assert(is_atom(atom));
|
|
||||||
// gen_simple_decl(sym->type, atom->intern_val);
|
|
||||||
// if(node->right){
|
|
||||||
// gen(" = ");
|
|
||||||
// gen_expr(node->right);
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
if(!token_is_assign(node->op)) gen("(");
|
if(!token_is_assign(node->op)) gen("(");
|
||||||
gen_expr(node->left);
|
gen_expr(node->left);
|
||||||
gen("%s", name(node->op));
|
gen("%s", name(node->op));
|
||||||
gen_expr(node->right);
|
gen_expr(node->right);
|
||||||
if(!token_is_assign(node->op)) gen(")");
|
if(!token_is_assign(node->op)) gen(")");
|
||||||
|
|
||||||
BREAK();
|
BREAK();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ test: Test
|
|||||||
member := test.len
|
member := test.len
|
||||||
|
|
||||||
enum_val: Memory.Allocator_Kind = Memory.Allocator_Kind.Heap
|
enum_val: Memory.Allocator_Kind = Memory.Allocator_Kind.Heap
|
||||||
|
other_enum_val: S64 = cast(enum_val: S64)
|
||||||
|
|
||||||
a_type :: S64
|
a_type :: S64
|
||||||
pointer_type :: *S64
|
pointer_type :: *S64
|
||||||
|
|||||||
@@ -16,6 +16,7 @@ String16 :: struct
|
|||||||
data: *void
|
data: *void
|
||||||
len : S64
|
len : S64
|
||||||
|
|
||||||
|
thing := arena_pointer.len
|
||||||
with_type: Arena = order2_arena
|
with_type: Arena = order2_arena
|
||||||
test_dot := with_type.len
|
test_dot := with_type.len
|
||||||
pointer := &with_type
|
pointer := &with_type
|
||||||
|
|||||||
@@ -504,6 +504,11 @@ resolve_cast(Ast_Cast *node){
|
|||||||
node->before_type = expr.type;
|
node->before_type = expr.type;
|
||||||
|
|
||||||
switch(expr.type->kind){
|
switch(expr.type->kind){
|
||||||
|
case TYPE_ENUM:{
|
||||||
|
if(is_int(type))
|
||||||
|
expr.type = type;
|
||||||
|
else goto failure;
|
||||||
|
}break;
|
||||||
case TYPE_POINTER:{
|
case TYPE_POINTER:{
|
||||||
if(is_pointer(type))
|
if(is_pointer(type))
|
||||||
expr = operand_rvalue(type);
|
expr = operand_rvalue(type);
|
||||||
|
|||||||
Reference in New Issue
Block a user