diff options
| author | Evan Haas <evan@lagerdata.com> | 2022-07-25 09:53:40 -0700 |
|---|---|---|
| committer | Veikka Tuominen <git@vexu.eu> | 2022-07-27 14:03:08 +0300 |
| commit | 7ba1f9bfb52a1f6fa776eeafb45790331be4388f (patch) | |
| tree | e893b174fc9b7e88ea15190f75e05753b315e940 /test | |
| parent | c8c798685f3a7d6454bc06d5f47531ad6f615eb5 (diff) | |
| download | zig-7ba1f9bfb52a1f6fa776eeafb45790331be4388f.tar.gz zig-7ba1f9bfb52a1f6fa776eeafb45790331be4388f.zip | |
translate-c: take address of functions before passing them to @ptrToInt
Fixes #12194
Diffstat (limited to 'test')
| -rw-r--r-- | test/behavior/translate_c_macros.h | 8 | ||||
| -rw-r--r-- | test/behavior/translate_c_macros.zig | 14 | ||||
| -rw-r--r-- | test/run_translated_c.zig | 14 | ||||
| -rw-r--r-- | test/translate_c.zig | 2 |
4 files changed, 37 insertions, 1 deletions
diff --git a/test/behavior/translate_c_macros.h b/test/behavior/translate_c_macros.h index 547194d35a..526ab32abc 100644 --- a/test/behavior/translate_c_macros.h +++ b/test/behavior/translate_c_macros.h @@ -40,3 +40,11 @@ union U { #define CAST_OR_CALL_WITH_PARENS(type_or_fn, val) ((type_or_fn)(val)) #define NESTED_COMMA_OPERATOR (1, (2, 3)) + +#include <stdint.h> +#if !defined(__UINTPTR_MAX__) +typedef _Bool uintptr_t; +#endif + +#define CAST_TO_BOOL(X) (_Bool)(X) +#define CAST_TO_UINTPTR(X) (uintptr_t)(X) diff --git a/test/behavior/translate_c_macros.zig b/test/behavior/translate_c_macros.zig index 96676b5b78..705c60aa4e 100644 --- a/test/behavior/translate_c_macros.zig +++ b/test/behavior/translate_c_macros.zig @@ -99,3 +99,17 @@ test "nested comma operator" { try expectEqual(@as(c_int, 3), h.NESTED_COMMA_OPERATOR); } + +test "cast functions" { + if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO + + const S = struct { + fn foo() void {} + }; + try expectEqual(true, h.CAST_TO_BOOL(S.foo)); + try expect(h.CAST_TO_UINTPTR(S.foo) != 0); +} diff --git a/test/run_translated_c.zig b/test/run_translated_c.zig index 1e8f081c11..cfd7f2d15e 100644 --- a/test/run_translated_c.zig +++ b/test/run_translated_c.zig @@ -1861,4 +1861,18 @@ pub fn addCases(cases: *tests.RunTranslatedCContext) void { \\ return 0; \\} , ""); + + // The C standard does not require function pointers to be convertible to any integer type. + // However, POSIX requires that function pointers have the same representation as `void *` + // so that dlsym() can work + cases.add("Function to integral", + \\#include <stdint.h> + \\int main(void) { + \\#if defined(__UINTPTR_MAX__) && __has_include(<unistd.h>) + \\ uintptr_t x = main; + \\ x = (uintptr_t)main; + \\#endif + \\ return 0; + \\} + , ""); } diff --git a/test/translate_c.zig b/test/translate_c.zig index a1a1736b2b..5a640c5b4b 100644 --- a/test/translate_c.zig +++ b/test/translate_c.zig @@ -3435,7 +3435,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void { \\ var x = arg_x; \\ var a: bool = @as(c_int, @boolToInt(x)) != @as(c_int, 1); \\ var b: bool = @as(c_int, @boolToInt(a)) != @as(c_int, 0); - \\ var c: bool = @ptrToInt(foo) != 0; + \\ var c: bool = @ptrToInt(&foo) != 0; \\ return foo(@as(c_int, @boolToInt(c)) != @as(c_int, @boolToInt(b))); \\} }); |
