Summary
Here’s the repro
using { /Fortnite.com/Devices }
using { /Verse.org/Simulation }
test_device := class(creative_device):
StartFail()<suspends>:void=
Print("StartFail")
defer:
Print("StartFail Ended (from suspending scope)") # Never prints
race:
Sleep(Inf)
Sleep(Inf)
Sleep(Inf)
StartSucceed()<suspends>:void=
Print("StartSucceed")
defer:
Print("StartSucceed Ended (from suspending scope)") # Prints correctly
# race:
# Sleep(Inf)
# Sleep(Inf)
Sleep(Inf)
OnBegin<override>()<suspends>:void=
race:
Sleep(1.0)
StartFail()
StartSucceed() # Not required to repro
Prints
[2024.10.20-13.59.20:863][673]LogVerse: : StartFail
[2024.10.20-13.59.20:864][673]LogVerse: : StartSucceed
[2024.10.20-13.59.21:854][790]LogVerse: : StartSucceed Ended (from suspending scope)
(As you can see the StartFail defer never fires, this is an issue when trying to build complex async structures)
Please select what you are reporting on:
Verse
What Type of Bug are you experiencing?
Verse
Steps to Reproduce
See summary
Expected Result
See summary
Observed Result
See summary
Platform(s)
PC
Enebz
(Enebz)
December 6, 2024, 5:31am
4
I’d love to see this fixed!
3 Likes
Konerds
(Konerds)
June 3, 2025, 11:04pm
5
It’s not fixed yet. I got the same issue. This is critical when using composed pattern with concurrency.
1 Like
FORT-807923 has been ‘Backlogged’. This is an issue that is in a queue to be addressed.
Previous Enebz did not know about Verse, tell em
EnebzVerse
(EnebzVerse)
September 8, 2026, 8:26pm
9
This gets fixed with the new VM. No plans to fix in BPVM.
2 Likes
AtAshTag
(At AshTag)
September 8, 2026, 10:53pm
10
Do we have a date for that or not seems very hush hush ?
im_a_lama
(LAMA)
September 8, 2026, 11:04pm
11
You can check the roadmap
AtAshTag
(At AshTag)
September 8, 2026, 11:07pm
12
Doesn’t say a date. that said Q1 initially so i aint believing anything unless i see it or its confirmed.
im_a_lama
(LAMA)
September 9, 2026, 12:26am
13
It says Q3 Confidence: High, it should be coming soon at this point
Sprintermax
(Sprintermax)
September 10, 2026, 3:29pm
14
Due to that behavior difference, we can do this xD
# Besides being suspends, it returns instantly on the same tick (has syncronous behavior):
IsVerseVM<public>()<suspends>:logic =
var Result : logic = false
race:
block:
defer. set Result = true
race { Sleep(Inf); Sleep(Inf) }
Sleep(-1.0)
return Result
If you prefer, there is also this approach, which does the exact same. It just does not have the suspends effect
vvm_test_class<internal> := class<allocates>:
var<private> Result<internal> : logic -= false
CheckForVerseVM<internal>()<suspends>:void = race:
block:
defer. set Self.Result = true
race { Sleep(Inf); Sleep(Inf) }
Sleep(-1.0)
IsVerseVM<public>():logic =
TestClass := vvm_test_class{}
spawn. TestClass.CheckForVerseVM()
return TestClass.Result