mirror of
https://github.com/ziglang/zig.git
synced 2024-11-27 07:32:44 +00:00
translate-c: fix translation of "ptr += uint"
The right-hand side was incorrectly cast to a pointer, since only signed ints were being interpreted correctly as pointer arithmetic. Fixes #20285.
This commit is contained in:
parent
7829be6ee0
commit
ffb1a6d9a7
@ -3824,8 +3824,9 @@ fn transCreateCompoundAssign(
|
||||
const lhs_qt = getExprQualType(c, lhs);
|
||||
const rhs_qt = getExprQualType(c, rhs);
|
||||
const is_signed = cIsSignedInteger(lhs_qt);
|
||||
const is_ptr_arithmetic = qualTypeIsPtr(lhs_qt) and cIsInteger(rhs_qt);
|
||||
const is_ptr_op_signed = qualTypeIsPtr(lhs_qt) and cIsSignedInteger(rhs_qt);
|
||||
const requires_cast = !lhs_qt.eq(rhs_qt) and !is_ptr_op_signed;
|
||||
const requires_cast = !lhs_qt.eq(rhs_qt) and !is_ptr_arithmetic;
|
||||
|
||||
if (used == .unused) {
|
||||
// common case
|
||||
|
@ -0,0 +1,21 @@
|
||||
int main() {
|
||||
const char *s = "forgreatjustice";
|
||||
unsigned int add = 1;
|
||||
|
||||
s += add;
|
||||
if (*s != 'o') return 1;
|
||||
|
||||
s += 1UL;
|
||||
if (*s != 'r') return 2;
|
||||
|
||||
const char *s2 = (s += add);
|
||||
if (*s2 != 'g') return 3;
|
||||
|
||||
s2 -= add;
|
||||
if (*s2 != 'r') return 4;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
// run-translated-c
|
||||
// c_frontend=clang
|
Loading…
Reference in New Issue
Block a user