Browse Source

Fix constant parameter passing

gingerBill 2 years ago
parent
commit
43ba2c6226
1 changed files with 27 additions and 17 deletions
  1. 27 17
      src/llvm_backend_proc.cpp

+ 27 - 17
src/llvm_backend_proc.cpp

@@ -3168,10 +3168,13 @@ gb_internal lbValue lb_build_call_expr_internal_with_arg_split_args(lbProcedure
 		if (e->kind == Entity_TypeName) {
 			array_add(&args, lb_const_nil(p->module, e->type));
 			continue;
-		} else if (e->kind != Entity_Variable) {
+		} else if (e->kind == Entity_Constant) {
+			array_add(&args, lb_const_value(p->module, e->type, e->Constant.value));
 			continue;
 		}
 
+		GB_ASSERT(e->kind == Entity_Variable);
+
 		if (pt->variadic && pt->variadic_index == i) {
 			lbValue variadic_args = lb_const_nil(p->module, e->type);
 			auto variadic = slice(split_args->positional, pt->variadic_index, split_args->positional.count);
@@ -3238,23 +3241,30 @@ gb_internal lbValue lb_build_call_expr_internal_with_arg_split_args(lbProcedure
 
 	TokenPos pos = ast_token(ce->proc).pos;
 
-	for_array(i, args) {
-		Entity *e = pt->params->Tuple.variables[i];
-		lbValue arg = args[i];
-		if (arg.value == nullptr) {
-			switch (e->kind) {
-			case Entity_TypeName:
-				args[i] = lb_const_nil(p->module, e->type);
-				break;
-			case Entity_Variable:
-				args[i] = lb_handle_param_value(p, e->type, e->Variable.param_value, pos);
-				break;
-			case Entity_Constant:
-				args[i] = lb_handle_param_value(p, e->type, e->Constant.param_value, pos);
-				break;
+
+	if (pt->params != nullptr)  {
+		for_array(arg_index, pt->params->Tuple.variables) {
+			Entity *e = pt->params->Tuple.variables[arg_index];
+
+			lbValue arg = args[arg_index];
+			if (arg.value == nullptr) {
+				switch (e->kind) {
+				case Entity_TypeName:
+					args[arg_index] = lb_const_nil(p->module, e->type);
+					break;
+				case Entity_Variable:
+					args[arg_index] = lb_handle_param_value(p, e->type, e->Variable.param_value, pos);
+					break;
+
+				case Entity_Constant:
+					args[arg_index] = lb_const_value(p->module, e->type, e->Constant.value);
+					break;
+				default:
+					GB_PANIC("Unknown entity kind %.*s\n", LIT(entity_strings[e->kind]));
+				}
+			} else {
+				args[arg_index] = lb_emit_conv(p, arg, e->type);
 			}
-		} else {
-			args[i] = lb_emit_conv(p, arg, e->type);
 		}
 	}