diff options
| author | nsfisis <nsfisis@gmail.com> | 2025-07-21 06:23:15 +0900 |
|---|---|---|
| committer | nsfisis <nsfisis@gmail.com> | 2025-08-15 10:04:23 +0900 |
| commit | 4113cec4ecaef37eaa5638592bdc80ad7783d530 (patch) | |
| tree | d3cf86ee97f9592191981dea4d3fed55c7ba0082 /main.c | |
| parent | 8dfdbc9cf84be2d82960784f70a2e00378fca5c5 (diff) | |
| download | ducc-4113cec4ecaef37eaa5638592bdc80ad7783d530.tar.gz ducc-4113cec4ecaef37eaa5638592bdc80ad7783d530.tar.zst ducc-4113cec4ecaef37eaa5638592bdc80ad7783d530.zip | |
feat: implement substraction between pointers
Diffstat (limited to 'main.c')
| -rw-r--r-- | main.c | 11 |
1 files changed, 9 insertions, 2 deletions
@@ -1459,8 +1459,15 @@ AstNode* parse_additive_expr(Parser* p) { next_token(p); rhs = parse_multiplicative_expr(p); if (lhs->ty->kind == TypeKind_ptr) { - lhs = ast_new_binary_expr( - op, lhs, ast_new_binary_expr(TokenKind_star, rhs, ast_new_int(type_sizeof(lhs->ty->to)))); + if (rhs->ty->kind == TypeKind_ptr) { + // (a - b) / sizeof(a) + lhs = ast_new_binary_expr(TokenKind_slash, ast_new_binary_expr(op, lhs, rhs), + ast_new_int(type_sizeof(lhs->ty->to))); + } else { + // a - b*sizeof(a) + lhs = ast_new_binary_expr( + op, lhs, ast_new_binary_expr(TokenKind_star, rhs, ast_new_int(type_sizeof(lhs->ty->to)))); + } } else { lhs = ast_new_binary_expr(op, lhs, rhs); } |
