@@ -22,7 +22,7 @@ use godot::obj::{Base, Gd, Inherits, InstanceId, NewAlloc, NewGd, RawGd, Singlet
2222use godot:: register:: { godot_api, GodotClass } ;
2323use godot:: sys:: { self , interface_fn, GodotFfi } ;
2424
25- use crate :: framework:: { expect_panic, itest, TestContext } ;
25+ use crate :: framework:: { expect_panic, expect_panic_or_ub , itest, TestContext } ;
2626
2727// TODO:
2828// * make sure that ptrcalls are used when possible (i.e. when type info available; maybe GDScript integration test)
@@ -171,7 +171,7 @@ fn object_instance_id_when_freed() {
171171 node. clone ( ) . free ( ) ; // destroys object without moving out of reference
172172 assert ! ( !node. is_instance_valid( ) ) ;
173173
174- expect_panic ( "instance_id() on dead object" , move || {
174+ expect_panic_or_ub ( "instance_id() on dead object" , move || {
175175 node. instance_id ( ) ;
176176 } ) ;
177177}
@@ -235,7 +235,7 @@ fn object_user_bind_after_free() {
235235 let copy = obj. clone ( ) ;
236236 obj. free ( ) ;
237237
238- expect_panic ( "bind() on dead user object" , move || {
238+ expect_panic_or_ub ( "bind() on dead user object" , move || {
239239 let _ = copy. bind ( ) ;
240240 } ) ;
241241}
@@ -247,7 +247,7 @@ fn object_user_free_during_bind() {
247247
248248 let copy = obj. clone ( ) ; // TODO clone allowed while bound?
249249
250- expect_panic ( "direct free() on user while it's bound" , move || {
250+ expect_panic_or_ub ( "direct free() on user while it's bound" , move || {
251251 copy. free ( ) ;
252252 } ) ;
253253
@@ -275,7 +275,7 @@ fn object_engine_freed_argument_passing(ctx: &TestContext) {
275275
276276 // Destroy object and then pass it to a Godot engine API.
277277 node. free ( ) ;
278- expect_panic ( "pass freed Gd<T> to Godot engine API (T=Node)" , || {
278+ expect_panic_or_ub ( "pass freed Gd<T> to Godot engine API (T=Node)" , || {
279279 tree. add_child ( & node2) ;
280280 } ) ;
281281}
@@ -288,10 +288,10 @@ fn object_user_freed_casts() {
288288
289289 // Destroy object and then pass it to a Godot engine API (upcast itself works, see other tests).
290290 obj. free ( ) ;
291- expect_panic ( "Gd<T>::upcast() on dead object (T=user)" , || {
291+ expect_panic_or_ub ( "Gd<T>::upcast() on dead object (T=user)" , || {
292292 let _ = obj2. upcast :: < Object > ( ) ;
293293 } ) ;
294- expect_panic ( "Gd<T>::cast() on dead object (T=user)" , || {
294+ expect_panic_or_ub ( "Gd<T>::cast() on dead object (T=user)" , || {
295295 let _ = base_obj. cast :: < ObjPayload > ( ) ;
296296 } ) ;
297297}
@@ -306,7 +306,7 @@ fn object_user_freed_argument_passing() {
306306
307307 // Destroy object and then pass it to a Godot engine API (upcast itself works, see other tests).
308308 obj. free ( ) ;
309- expect_panic ( "pass freed Gd<T> to Godot engine API (T=user)" , || {
309+ expect_panic_or_ub ( "pass freed Gd<T> to Godot engine API (T=user)" , || {
310310 engine. register_singleton ( "NeverRegistered" , & obj2) ;
311311 } ) ;
312312}
@@ -344,7 +344,7 @@ fn object_user_call_after_free() {
344344 let mut copy = obj. clone ( ) ;
345345 obj. free ( ) ;
346346
347- expect_panic ( "call() on dead user object" , move || {
347+ expect_panic_or_ub ( "call() on dead user object" , move || {
348348 let _ = copy. call ( "get_instance_id" , & [ ] ) ;
349349 } ) ;
350350}
@@ -355,7 +355,7 @@ fn object_engine_use_after_free() {
355355 let copy = node. clone ( ) ;
356356 node. free ( ) ;
357357
358- expect_panic ( "call method on dead engine object" , move || {
358+ expect_panic_or_ub ( "call method on dead engine object" , move || {
359359 copy. get_position ( ) ;
360360 } ) ;
361361}
@@ -366,7 +366,7 @@ fn object_engine_use_after_free_varcall() {
366366 let mut copy = node. clone ( ) ;
367367 node. free ( ) ;
368368
369- expect_panic ( "call method on dead engine object" , move || {
369+ expect_panic_or_ub ( "call method on dead engine object" , move || {
370370 copy. call_deferred ( "get_position" , & [ ] ) ;
371371 } ) ;
372372}
@@ -411,13 +411,13 @@ fn object_dead_eq() {
411411
412412 {
413413 let lhs = a. clone ( ) ;
414- expect_panic ( "Gd::eq() panics when one operand is dead" , move || {
414+ expect_panic_or_ub ( "Gd::eq() panics when one operand is dead" , move || {
415415 let _ = lhs == b;
416416 } ) ;
417417 }
418418 {
419419 let rhs = a. clone ( ) ;
420- expect_panic ( "Gd::ne() panics when one operand is dead" , move || {
420+ expect_panic_or_ub ( "Gd::ne() panics when one operand is dead" , move || {
421421 let _ = b2 != rhs;
422422 } ) ;
423423 }
@@ -826,7 +826,7 @@ fn object_engine_manual_double_free() {
826826 let node2 = node. clone ( ) ;
827827 node. free ( ) ;
828828
829- expect_panic ( "double free()" , move || {
829+ expect_panic_or_ub ( "double free()" , move || {
830830 node2. free ( ) ;
831831 } ) ;
832832}
@@ -845,7 +845,7 @@ fn object_user_double_free() {
845845 let obj2 = obj. clone ( ) ;
846846 obj. call ( "free" , & [ ] ) ;
847847
848- expect_panic ( "double free()" , move || {
848+ expect_panic_or_ub ( "double free()" , move || {
849849 obj2. free ( ) ;
850850 } ) ;
851851}
0 commit comments