authorgravatar for evan@lagerdata.comEvan Haas <evan@lagerdata.com> 2021-03-05 12:09:57-08:00
committergravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2021-03-08 00:35:17+02:00
logd01bb211732f1d0aebf558c43825a52254d034ab
treef4f63c44a7c678ba13706c8fcb18190afe33ffb4
parent5d215cc76bcac12afbda7b10ec04bbf6c5b47910

translate-c: Explicitly cast decayed array to pointer with @ptrCast

This enables translation of code that uses pointer arithmetic with arrays

2 files changed, 8 insertions(+), 3 deletions(-)

src/translate_c.zig+4-3
...@@ -1493,7 +1493,8 @@ fn transImplicitCastExpr(...@@ -1493,7 +1493,8 @@ fn transImplicitCastExpr(
1493 }1493 }
14941494
1495 const addr = try Tag.address_of.create(c.arena, try transExpr(c, scope, sub_expr, .used));1495 const addr = try Tag.address_of.create(c.arena, try transExpr(c, scope, sub_expr, .used));
1496 return maybeSuppressResult(c, scope, result_used, addr);1496 const casted = try transCPtrCast(c, scope, expr.getBeginLoc(), dest_type, src_type, addr);
1497 return maybeSuppressResult(c, scope, result_used, casted);
1497 },1498 },
1498 .NullToPointer => {1499 .NullToPointer => {
1499 return Tag.null_literal.init();1500 return Tag.null_literal.init();
...@@ -3156,10 +3157,10 @@ fn transCPtrCast(...@@ -3156,10 +3157,10 @@ fn transCPtrCast(
3156 const src_child_type = src_ty.getPointeeType();3157 const src_child_type = src_ty.getPointeeType();
3157 const dst_type_node = try transType(c, scope, ty, loc);3158 const dst_type_node = try transType(c, scope, ty, loc);
31583159
3159 if ((src_child_type.isConstQualified() and3160 if (!src_ty.isArrayType() and ((src_child_type.isConstQualified() and
3160 !child_type.isConstQualified()) or3161 !child_type.isConstQualified()) or
3161 (src_child_type.isVolatileQualified() and3162 (src_child_type.isVolatileQualified() and
3162 !child_type.isVolatileQualified()))3163 !child_type.isVolatileQualified())))
3163 {3164 {
3164 // Casting away const or volatile requires us to use @intToPtr3165 // Casting away const or volatile requires us to use @intToPtr
3165 const ptr_to_int = try Tag.ptr_to_int.create(c.arena, expr);3166 const ptr_to_int = try Tag.ptr_to_int.create(c.arena, expr);
test/run_translated_c.zig+4
...@@ -1164,6 +1164,10 @@ pub fn addCases(cases: *tests.RunTranslatedCContext) void {...@@ -1164,6 +1164,10 @@ pub fn addCases(cases: *tests.RunTranslatedCContext) void {
1164 \\ y = (x -= idx);1164 \\ y = (x -= idx);
1165 \\ if (y != x || y != &array[5]) abort();1165 \\ if (y != x || y != &array[5]) abort();
1166 \\1166 \\
1167 \\ if (array + idx != &array[1] || array + 1 != &array[1]) abort();
1168 \\ idx = -1;
1169 \\ if (array - idx != &array[1]) abort();
1170 \\
1167 \\ return 0;1171 \\ return 0;
1168 \\}1172 \\}
1169 , "");1173 , "");