diff --git a/src/analyze.cpp b/src/analyze.cpp index da01234844..f529c572a4 100644 --- a/src/analyze.cpp +++ b/src/analyze.cpp @@ -6903,9 +6903,9 @@ static void analyze_fn_body(CodeGen *g, FnTableEntry *fn_table_entry) { add_node_error(g, param_decl_node, buf_sprintf("noalias on non-pointer parameter")); } - if (fn_type->data.fn.fn_type_id.is_extern && type->id == TypeTableEntryIdStruct) { + if (fn_type->data.fn.fn_type_id.is_extern && handle_is_ptr(type)) { add_node_error(g, param_decl_node, - buf_sprintf("byvalue struct parameters not yet supported on extern functions")); + buf_sprintf("byvalue types not yet supported on extern function parameters")); } if (buf_len(param_decl->name) == 0) { @@ -6927,6 +6927,12 @@ static void analyze_fn_body(CodeGen *g, FnTableEntry *fn_table_entry) { } TypeTableEntry *expected_type = fn_type->data.fn.fn_type_id.return_type; + + if (fn_type->data.fn.fn_type_id.is_extern && handle_is_ptr(expected_type)) { + add_node_error(g, fn_proto_node->data.fn_proto.return_type, + buf_sprintf("byvalue types not yet supported on extern function return values")); + } + TypeTableEntry *block_return_type = analyze_expression(g, import, context, expected_type, node->data.fn_def.body); node->data.fn_def.implicit_return_type = block_return_type; diff --git a/std/compiler_rt.zig b/std/compiler_rt.zig index 0c8a04fb0c..a227d45a43 100644 --- a/std/compiler_rt.zig +++ b/std/compiler_rt.zig @@ -210,18 +210,6 @@ export fn __umoddi3(a: du_int, b: du_int) -> du_int { return r; } -struct AeabiUlDivModResult { - quot: u64, - rem: u64, -} -#debug_safety(false) -export fn __aeabi_uldivmod(numerator: u64, denominator: u64) -> AeabiUlDivModResult{ - var result: AeabiUlDivModResult = undefined; - result.quot = __udivmoddi4(numerator, denominator, &result.rem); - return result; -} - - #attribute("test") fn test_umoddi3() { test_one_umoddi3(0, 1, 0); diff --git a/test/run_tests.cpp b/test/run_tests.cpp index e909c171b9..aeab7566ab 100644 --- a/test/run_tests.cpp +++ b/test/run_tests.cpp @@ -884,10 +884,17 @@ var a : i32 = 1; var a : i32 = 2; )SOURCE", 1, ".tmp_source.zig:3:1: error: redeclaration of variable 'a'"); - add_compile_fail_case("byvalue struct on exported functions", R"SOURCE( + add_compile_fail_case("byvalue struct parameter in exported function", R"SOURCE( struct A { x : i32, } export fn f(a : A) {} - )SOURCE", 1, ".tmp_source.zig:3:13: error: byvalue struct parameters not yet supported on extern functions"); + )SOURCE", 1, ".tmp_source.zig:3:13: error: byvalue types not yet supported on extern function parameters"); + + add_compile_fail_case("byvalue struct return value in exported function", R"SOURCE( +struct A { x: i32, } +export fn f() -> A { + A {.x = 1234 } +} + )SOURCE", 1, ".tmp_source.zig:3:18: error: byvalue types not yet supported on extern function return values"); add_compile_fail_case("duplicate field in struct value expression", R"SOURCE( struct A {