aboutsummaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorfreakmangd <53349189+freakmangd@users.noreply.github.com>2024-06-05 16:06:51 -0400
committerGitHub <noreply@github.com>2024-06-05 23:06:51 +0300
commit9bbfb09fc33366bff0a53c02cd78bdd14bed9f9b (patch)
tree4808fb1d3e1392b6f1c910b8d83a6d7b84c5193d /test
parent8f27fdb84e3788bf6ea9ae7c992f3cf667a4f9ed (diff)
downloadzig-9bbfb09fc33366bff0a53c02cd78bdd14bed9f9b.tar.gz
zig-9bbfb09fc33366bff0a53c02cd78bdd14bed9f9b.zip
translate-c: promote macros that reference var decls to inline functions
Diffstat (limited to 'test')
-rw-r--r--test/cases/translate_c/macro_referencing_var.c21
-rw-r--r--test/translate_c.zig28
2 files changed, 42 insertions, 7 deletions
diff --git a/test/cases/translate_c/macro_referencing_var.c b/test/cases/translate_c/macro_referencing_var.c
new file mode 100644
index 0000000000..5675d06eda
--- /dev/null
+++ b/test/cases/translate_c/macro_referencing_var.c
@@ -0,0 +1,21 @@
+extern float foo;
+#define FOO_TWICE foo * 2.0f
+#define FOO_NEGATIVE -foo
+
+#define BAR 10.0f
+#define BAR_TWICE BAR * 2.0f
+
+// translate-c
+// c_frontend=clang
+//
+// pub extern var foo: f32;
+//
+// pub inline fn FOO_TWICE() @TypeOf(foo * @as(f32, 2.0)) {
+// return foo * @as(f32, 2.0);
+// }
+//
+// pub inline fn FOO_NEGATIVE() @TypeOf(-foo) {
+// return -foo;
+// }
+// pub const BAR = @as(f32, 10.0);
+// pub const BAR_TWICE = BAR * @as(f32, 2.0);
diff --git a/test/translate_c.zig b/test/translate_c.zig
index 890f93a106..c07b29f772 100644
--- a/test/translate_c.zig
+++ b/test/translate_c.zig
@@ -223,7 +223,9 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
\\ | (*((unsigned char *)(p) + 1) << 8) \
\\ | (*((unsigned char *)(p) + 2) << 16))
, &[_][]const u8{
- \\pub const FOO = (foo + @as(c_int, 2)).*;
+ \\pub inline fn FOO() @TypeOf((foo + @as(c_int, 2)).*) {
+ \\ return (foo + @as(c_int, 2)).*;
+ \\}
,
\\pub const VALUE = ((((@as(c_int, 1) + (@as(c_int, 2) * @as(c_int, 3))) + (@as(c_int, 4) * @as(c_int, 5))) + @as(c_int, 6)) << @as(c_int, 7)) | @intFromBool(@as(c_int, 8) == @as(c_int, 9));
,
@@ -452,7 +454,9 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
\\#define FOO -\
\\BAR
, &[_][]const u8{
- \\pub const FOO = -BAR;
+ \\pub inline fn FOO() @TypeOf(-BAR) {
+ \\ return -BAR;
+ \\}
});
cases.add("struct with atomic field",
@@ -2453,9 +2457,13 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
\\ _ = c.*.b;
\\}
,
- \\pub const DOT = a.b;
+ \\pub inline fn ARROW() @TypeOf(a.*.b) {
+ \\ return a.*.b;
+ \\}
,
- \\pub const ARROW = a.*.b;
+ \\pub inline fn DOT() @TypeOf(a.b) {
+ \\ return a.b;
+ \\}
});
cases.add("array access",
@@ -2472,7 +2480,9 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
\\ return array[@as(c_uint, @intCast(index))];
\\}
,
- \\pub const ACCESS = array[@as(usize, @intCast(@as(c_int, 2)))];
+ \\pub inline fn ACCESS() @TypeOf(array[@as(usize, @intCast(@as(c_int, 2)))]) {
+ \\ return array[@as(usize, @intCast(@as(c_int, 2)))];
+ \\}
});
cases.add("cast signed array index to unsigned",
@@ -3130,7 +3140,9 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
\\ int a, b, c;
\\#define FOO a ? b : c
, &[_][]const u8{
- \\pub const FOO = if (a) b else c;
+ \\pub inline fn FOO() @TypeOf(if (a) b else c) {
+ \\ return if (a) b else c;
+ \\}
});
cases.add("do while as expr",
@@ -3624,7 +3636,9 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
\\#define FOO _
\\int _ = 42;
, &[_][]const u8{
- \\pub const FOO = @"_";
+ \\pub inline fn FOO() @TypeOf(@"_") {
+ \\ return @"_";
+ \\}
,
\\pub export var @"_": c_int = 42;
});