diff --git a/stdlib/ast_transformation.krak b/stdlib/ast_transformation.krak index 44dbbcc..fe40d91 100644 --- a/stdlib/ast_transformation.krak +++ b/stdlib/ast_transformation.krak @@ -1092,6 +1092,8 @@ fun make_operator_call(func: string, params: vector<*ast_node>): *ast_node { return ast_function_call_ptr(get_builtin_function(func, params.map(fun(p:*ast_node): *type return get_ast_type(p);)), params) } fun get_builtin_function(name: string, param_types: vector<*type>): *ast_node { + // none of the builtin functions should take in references + param_types = param_types.map(fun(t: *type): *type return t->clone_without_ref();) if (name == "==" || name == "!=" || name == ">" || name == "<" || name == "<=" || name == ">" || name == ">=" || name == "&&" || name == "||" || name == "!") return ast_function_ptr(name, type_ptr(param_types, type_ptr(base_type::boolean())), vector<*ast_node>()) if (name == "." || name == "->") diff --git a/stdlib/c_generator.krak b/stdlib/c_generator.krak index 82ab3dc..8d32a0d 100644 --- a/stdlib/c_generator.krak +++ b/stdlib/c_generator.krak @@ -568,7 +568,10 @@ obj c_generator (Object) { // if we're returning a ref, we need to account for that in the temp type // note the temp type is a pointer, not a ref so we don't have the deref/ref thing on return - var temp_ident_type = return_value_type + + // now use the function_return_type instead so we don't make a ref + // var temp_ident_type = return_value_type + var temp_ident_type = function_return_type if (function_return_type->is_ref) temp_ident_type = temp_ident_type->clone_with_increased_indirection() var temp_ident = ast_identifier_ptr(string("temporary_return")+get_id(), temp_ident_type, null())