Commit a5d25fabda

John Schmidt <3405586+schmee@users.noreply.github.com>
2023-02-10 14:46:29
translate_c: fix typedeffed pointer subtraction
Closes #14560.
1 parent d24ebf1
Changed files (2)
src/translate_c.zig
@@ -1748,7 +1748,8 @@ fn transBinaryOperator(
         const lhs_expr = stmt.getLHS();
         const lhs_qt = getExprQualType(c, lhs_expr);
         const lhs_qt_translated = try transQualType(c, scope, lhs_qt, lhs_expr.getBeginLoc());
-        const elem_type = lhs_qt_translated.castTag(.c_pointer).?.data.elem_type;
+        const c_pointer = getContainer(c, lhs_qt_translated).?;
+        const elem_type = c_pointer.castTag(.c_pointer).?.data.elem_type;
         const sizeof = try Tag.sizeof.create(c.arena, elem_type);
 
         const bitcast = try Tag.bit_cast.create(c.arena, .{ .lhs = ptrdiff_type, .rhs = infixOpNode });
test/translate_c.zig
@@ -3916,4 +3916,36 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
         \\    }) != 0) {}
         \\}
     });
+
+    if (builtin.os.tag == .windows) {
+        cases.add("Pointer subtraction with typedef",
+            \\typedef char* S;
+            \\void foo() {
+            \\    S a, b;
+            \\    long long c = a - b;
+            \\}
+        , &[_][]const u8{
+            \\pub export fn foo() void {
+            \\    var a: S = undefined;
+            \\    var b: S = undefined;
+            \\    var c: c_longlong = @divExact(@bitCast(c_longlong, @ptrToInt(a) -% @ptrToInt(b)), @sizeOf(u8));
+            \\    _ = @TypeOf(c);
+            \\}
+        });
+    } else {
+        cases.add("Pointer subtraction with typedef",
+            \\typedef char* S;
+            \\void foo() {
+            \\    S a, b;
+            \\    long c = a - b;
+            \\}
+        , &[_][]const u8{
+            \\pub export fn foo() void {
+            \\    var a: S = undefined;
+            \\    var b: S = undefined;
+            \\    var c: c_long = @divExact(@bitCast(c_long, @ptrToInt(a) -% @ptrToInt(b)), @sizeOf(u8));
+            \\    _ = @TypeOf(c);
+            \\}
+        });
+    }
 }