Adding lvalue rvalue concept, Cleanup
This commit is contained in:
@@ -149,6 +149,7 @@ function Ast_Expr *parse_expr(S64 rbp = 0);
|
|||||||
function Ast_Expr *
|
function Ast_Expr *
|
||||||
parse_init_stmt(Ast_Expr *expr){
|
parse_init_stmt(Ast_Expr *expr){
|
||||||
Token *token = token_get();
|
Token *token = token_get();
|
||||||
|
if(token->kind == TK_ColonAssign && expr->kind != AST_IDENT) parsing_error(expr->pos, "Binding with [:=] to something that is not an identifier");
|
||||||
if(token_is_assign(token)){
|
if(token_is_assign(token)){
|
||||||
token_next();
|
token_next();
|
||||||
Ast_Expr *value = parse_expr();
|
Ast_Expr *value = parse_expr();
|
||||||
|
|||||||
@@ -404,13 +404,13 @@ resolve_expr(Ast_Expr *ast, Ast_Resolved_Type *expected_type, Sym *lambda_to_res
|
|||||||
Operand result = {};
|
Operand result = {};
|
||||||
switch(node->op){
|
switch(node->op){
|
||||||
case TK_ColonAssign:{
|
case TK_ColonAssign:{
|
||||||
|
// @note: This is actually a statement so it doesn't need to return Operand
|
||||||
assert(is_flag_set(node->flags, AST_STMT));
|
assert(is_flag_set(node->flags, AST_STMT));
|
||||||
// Operand left = resolve_expr(node->left); // needs to be lvalue
|
|
||||||
Operand right = resolve_expr(node->right);
|
|
||||||
assert(node->left->kind == AST_IDENT);
|
assert(node->left->kind == AST_IDENT);
|
||||||
Ast_Atom *atom = (Ast_Atom *)node->left; // @todo use left operand
|
|
||||||
Sym *sym = sym_new_resolved(SYM_VAR, atom->intern_val, right.type, right.value, node);
|
Operand right = resolve_expr(node->right);
|
||||||
sym_insert(sym);
|
Ast_Atom *atom = (Ast_Atom *)node->left;
|
||||||
|
sym_insert(SYM_VAR, atom->intern_val, right.type, right.value, node);
|
||||||
}break;
|
}break;
|
||||||
case TK_Dot: {
|
case TK_Dot: {
|
||||||
B32 required_to_be_const = false;
|
B32 required_to_be_const = false;
|
||||||
|
|||||||
Reference in New Issue
Block a user