From 34396c413ed2acfd0cd53cac24ffaeabd0a44c5c Mon Sep 17 00:00:00 2001 From: thradams Date: Tue, 23 Apr 2024 19:21:38 -0300 Subject: [PATCH] fix --- src/file.c | 26 +++++++++++++++++++------- src/object.c | 9 ++++++--- tests/unit-tests/test_17900.c | 23 +++++++++++++++++++++++ 3 files changed, 48 insertions(+), 10 deletions(-) create mode 100644 tests/unit-tests/test_17900.c diff --git a/src/file.c b/src/file.c index 630aaf63..957cd2da 100644 --- a/src/file.c +++ b/src/file.c @@ -1,12 +1,24 @@ #pragma ownership enable #pragma nullable enable -struct X { - char *_Owner name; +void free(void* _Owner _Opt ptr); +char* _Owner _Opt strdup(char const* _String); + +struct user +{ + int id; + char* _Owner name; }; -struct X * _Owner f(); -int main(){ - struct X * _Owner p = f(); - void * _Owner p2 = p; -} \ No newline at end of file +void set_id(struct user* p, int id){} + +int main() +{ + _Opt struct user user = {}; + user.name = strdup("a"); + char* _Owner _Opt name = user.name; + static_debug(user); + free(name); + //if (user.name) + set_id(&user, 1); //warning: object 'user.name' was moved +} diff --git a/src/object.c b/src/object.c index 78f0ee29..be0f2968 100644 --- a/src/object.c +++ b/src/object.c @@ -18,15 +18,18 @@ bool is_moved(enum object_state e) bool is_not_null(enum object_state e) { - return (!(e & OBJECT_STATE_NULL) && - (e & OBJECT_STATE_NOT_NULL)); + return ( + !(e & OBJECT_STATE_NULL) && + ((e & OBJECT_STATE_NOT_NULL) || (e & OBJECT_STATE_MOVED)) + ); } bool is_null(enum object_state e) { return ((e & OBJECT_STATE_NULL) && - !(e & OBJECT_STATE_NOT_NULL)); + !(e & OBJECT_STATE_NOT_NULL) && + !(e & OBJECT_STATE_MOVED)); } bool is_zero(enum object_state e) diff --git a/tests/unit-tests/test_17900.c b/tests/unit-tests/test_17900.c new file mode 100644 index 00000000..a6f6c047 --- /dev/null +++ b/tests/unit-tests/test_17900.c @@ -0,0 +1,23 @@ +#pragma ownership enable +#pragma nullable enable + +void free(void* _Owner _Opt ptr); +char* _Owner _Opt strdup(char const* _String); + +struct user +{ + int id; + char* _Owner name; +}; + +void set_id(struct user* p, int id){} + +int main() +{ + _Opt struct user user = {}; + user.name = strdup("a"); + char* _Owner _Opt name = user.name; + free(name); + if (user.name) + set_id(&user, 1); //warning: object 'user.name' was moved +}