fn ret(s string) string { return s } fn raise() ?string { return none } fn xx() { s := ret(raise() or { return }) println(s) } fn test_nested_or() { xx() } fn xx_prop() ?string { s := ret(raise()?) return s } fn test_nested_propagation() { a := xx_prop() or { 'propagated' } assert a == 'propagated' } struct St { mut: z f64 } fn (mut s St) raise() ?f64 { return none } fn retf(f f64) f64 { return f } fn (mut s St) aa() { f := retf(s.raise() or { return }) s.z = 7.5 println(f) } fn test_nested_or_method_call() { mut x := St{ z: 2.25 } x.aa() assert x.z == 2.25 } fn (mut s St) aa_propagate() ? { f := retf(s.raise()?) s.z = 7.5 println(f) } fn test_nested_propagation_method() { mut x := St{ z: 2.25 } x.aa_propagate() or { x.z = 13.0625 } assert x.z == 13.0625 }