diff --git a/test/stage1/behavior.zig b/test/stage1/behavior.zig index d4dc641ad6cc06a3d7b3403fbb02e0509e027766..a420fd6886c7e2f7ea7a6fb69675cef0431fef7d 100644 --- a/test/stage1/behavior.zig +++ b/test/stage1/behavior.zig @@ -40,7 +40,7 @@ comptime { _ = @import("behavior/bugs/3384.zig"); _ = @import("behavior/bugs/3586.zig"); _ = @import("behavior/bugs/3742.zig"); - _ = @import("behavior/bugs/4328_5305.zig"); + _ = @import("behavior/bugs/4328.zig"); _ = @import("behavior/bugs/4560.zig"); _ = @import("behavior/bugs/4769_a.zig"); _ = @import("behavior/bugs/4769_b.zig"); diff --git a/test/stage1/behavior/bugs/4328.zig b/test/stage1/behavior/bugs/4328.zig new file mode 100644 index 0000000000000000000000000000000000000000..0196af1748d972798b65c745d6c02df5e063a83a --- /dev/null +++ b/test/stage1/behavior/bugs/4328.zig @@ -0,0 +1,71 @@ +const expectEqual = @import("std").testing.expectEqual; + +const FILE = extern struct { + dummy_field: u8, +}; + +extern fn printf([*c]const u8, ...) c_int; +extern fn fputs([*c]const u8, noalias [*c]FILE) c_int; +extern fn ftell([*c]FILE) c_long; +extern fn fopen([*c]const u8, [*c]const u8) [*c]FILE; + +const S = extern struct { + state: c_short, + + extern fn s_do_thing([*c]S, b: c_int) c_short; +}; + +test "Extern function calls in @TypeOf" { + const Test = struct { + fn test_fn_1(a: var, b: var) @TypeOf(printf("%d %s\n", a, b)) { + return 0; + } + + fn test_fn_2(a: var) @TypeOf((S{ .state = 0 }).s_do_thing(a)) { + return 1; + } + + fn doTheTest() void { + expectEqual(c_int, @TypeOf(test_fn_1(0, 42))); + expectEqual(c_short, @TypeOf(test_fn_2(0))); + } + }; + + Test.doTheTest(); + comptime Test.doTheTest(); +} + +test "Peer resolution of extern function calls in @TypeOf" { + const Test = struct { + fn test_fn() @TypeOf(ftell(null), fputs(null, null)) { + return 0; + } + + fn doTheTest() void { + expectEqual(c_long, @TypeOf(test_fn())); + } + }; + + Test.doTheTest(); + comptime Test.doTheTest(); +} + +test "Extern function calls, dereferences and field access in @TypeOf" { + const Test = struct { + fn test_fn_1(a: c_long) @TypeOf(fopen("test", "r").*) { + return .{ .dummy_field = 0 }; + } + + fn test_fn_2(a: var) @TypeOf(fopen("test", "r").*.dummy_field) { + return 255; + } + + fn doTheTest() void { + expectEqual(FILE, @TypeOf(test_fn_1(0))); + expectEqual(u8, @TypeOf(test_fn_2(0))); + } + }; + + Test.doTheTest(); + comptime Test.doTheTest(); +} \ No newline at end of file diff --git a/test/stage1/behavior/bugs/4328_5305.zig b/test/stage1/behavior/bugs/4328_5305.zig deleted file mode 100644 index 0196af1748d972798b65c745d6c02df5e063a83a..0000000000000000000000000000000000000000 --- a/test/stage1/behavior/bugs/4328_5305.zig +++ /dev/null @@ -1,71 +0,0 @@ -const expectEqual = @import("std").testing.expectEqual; - -const FILE = extern struct { - dummy_field: u8, -}; - -extern fn printf([*c]const u8, ...) c_int; -extern fn fputs([*c]const u8, noalias [*c]FILE) c_int; -extern fn ftell([*c]FILE) c_long; -extern fn fopen([*c]const u8, [*c]const u8) [*c]FILE; - -const S = extern struct { - state: c_short, - - extern fn s_do_thing([*c]S, b: c_int) c_short; -}; - -test "Extern function calls in @TypeOf" { - const Test = struct { - fn test_fn_1(a: var, b: var) @TypeOf(printf("%d %s\n", a, b)) { - return 0; - } - - fn test_fn_2(a: var) @TypeOf((S{ .state = 0 }).s_do_thing(a)) { - return 1; - } - - fn doTheTest() void { - expectEqual(c_int, @TypeOf(test_fn_1(0, 42))); - expectEqual(c_short, @TypeOf(test_fn_2(0))); - } - }; - - Test.doTheTest(); - comptime Test.doTheTest(); -} - -test "Peer resolution of extern function calls in @TypeOf" { - const Test = struct { - fn test_fn() @TypeOf(ftell(null), fputs(null, null)) { - return 0; - } - - fn doTheTest() void { - expectEqual(c_long, @TypeOf(test_fn())); - } - }; - - Test.doTheTest(); - comptime Test.doTheTest(); -} - -test "Extern function calls, dereferences and field access in @TypeOf" { - const Test = struct { - fn test_fn_1(a: c_long) @TypeOf(fopen("test", "r").*) { - return .{ .dummy_field = 0 }; - } - - fn test_fn_2(a: var) @TypeOf(fopen("test", "r").*.dummy_field) { - return 255; - } - - fn doTheTest() void { - expectEqual(FILE, @TypeOf(test_fn_1(0))); - expectEqual(u8, @TypeOf(test_fn_2(0))); - } - }; - - Test.doTheTest(); - comptime Test.doTheTest(); -} \ No newline at end of file