aboutsummaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorEvan Haas <evan@lagerdata.com>2022-07-25 09:53:40 -0700
committerVeikka Tuominen <git@vexu.eu>2022-07-27 14:03:08 +0300
commit7ba1f9bfb52a1f6fa776eeafb45790331be4388f (patch)
treee893b174fc9b7e88ea15190f75e05753b315e940 /test
parentc8c798685f3a7d6454bc06d5f47531ad6f615eb5 (diff)
downloadzig-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.h8
-rw-r--r--test/behavior/translate_c_macros.zig14
-rw-r--r--test/run_translated_c.zig14
-rw-r--r--test/translate_c.zig2
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)));
\\}
});