From 360fde205647a63765ac191464602422d9355b15 Mon Sep 17 00:00:00 2001 From: Ian Piumarta Date: Mon, 27 Jan 2025 09:38:27 +0900 Subject: [PATCH] improve error message for invalid assignments --- demofiles/invalid-pointer.c | 18 +++++++++++++----- main.leg | 14 ++++++++++---- 2 files changed, 23 insertions(+), 9 deletions(-) diff --git a/demofiles/invalid-pointer.c b/demofiles/invalid-pointer.c index ffad489..9d6f65b 100644 --- a/demofiles/invalid-pointer.c +++ b/demofiles/invalid-pointer.c @@ -4,9 +4,17 @@ #include int main() { - int *ptr = (int *)(intptr_t)0xDeadD0d0; - printf("%p\n",ptr); - *ptr = 42; // illegal memory access - printf("%d\n", *ptr); - return 0; + int i, *ptr; + + ptr = &i; + printf("%p\n",ptr); + *ptr = 42; // legal memory access + printf("%d\n", *ptr); + + ptr = (int *)(intptr_t)0xDeadD0d0; + printf("%p\n",ptr); + *ptr = 42; // illegal memory access + printf("%d\n", *ptr); + + return 0; } diff --git a/main.leg b/main.leg index bcfef6b..7272b92 100644 --- a/main.leg +++ b/main.leg @@ -1,6 +1,6 @@ # main.leg -- C parser + interpreter # -# Last edited: 2025-01-26 21:27:29 by piumarta on zora +# Last edited: 2025-01-27 09:37:11 by piumarta on zora %{ ; @@ -2163,7 +2163,8 @@ oop eval(oop exp, oop env) break; } case Assign: { - oop lhs = get(exp, Assign,lhs); + oop dst = get(exp, Assign,lhs); + oop lhs = dst; oop rhs = eval(get(exp, Assign,rhs), nil); switch (getType(lhs)) { case Symbol: { @@ -2185,9 +2186,14 @@ oop eval(oop exp, oop env) } break; } - default: break; + default: + break; } - fatal("cannot assign to: %s", toString(lhs)); + if (dst == lhs) + fatal("cannot assign to: %s", toString(lhs)); + else + fatal("invalid rvalue '%s' assigning to: %s", + toString(lhs), toString(dst)); break; } case Cast: {