| 1 | // Regression test for https://github.com/vlang/v/issues/27056 and |
| 2 | // https://github.com/vlang/v/issues/27006: returning `?T` / `!T` from a |
| 3 | // function whose return type is `?Alias` / `!Alias` (where `type Alias = T`) |
| 4 | // must compile, both for the direct alias case and for containers (`?[]Alias`, |
| 5 | // `![]Alias`, etc.). |
| 6 | |
| 7 | struct Bb { |
| 8 | s string |
| 9 | } |
| 10 | |
| 11 | type Aa = Bb |
| 12 | |
| 13 | fn returns_b_option() ?Bb { |
| 14 | return Bb{ |
| 15 | s: 'b' |
| 16 | } |
| 17 | } |
| 18 | |
| 19 | fn returns_b_result() !Bb { |
| 20 | return Bb{ |
| 21 | s: 'b' |
| 22 | } |
| 23 | } |
| 24 | |
| 25 | fn returns_bs_option() ?[]Bb { |
| 26 | return [Bb{ s: 'b' }] |
| 27 | } |
| 28 | |
| 29 | fn returns_bs_result() ![]Bb { |
| 30 | return [Bb{ s: 'b' }] |
| 31 | } |
| 32 | |
| 33 | fn case_a() !Aa { |
| 34 | return returns_b_result() |
| 35 | } |
| 36 | |
| 37 | fn case_b() ?Aa { |
| 38 | return returns_b_option() |
| 39 | } |
| 40 | |
| 41 | fn case_c() ?[]Aa { |
| 42 | return returns_bs_option() |
| 43 | } |
| 44 | |
| 45 | fn case_d() ![]Aa { |
| 46 | return returns_bs_result() |
| 47 | } |
| 48 | |
| 49 | fn case_e() !Aa { |
| 50 | return returns_b_result() |
| 51 | } |
| 52 | |
| 53 | fn case_f() ?Aa { |
| 54 | return returns_b_option() |
| 55 | } |
| 56 | |
| 57 | fn test_result_alias_direct() { |
| 58 | a := case_a() or { panic(err) } |
| 59 | assert a.s == 'b' |
| 60 | } |
| 61 | |
| 62 | fn test_option_alias_direct() { |
| 63 | b := case_b() or { panic(err) } |
| 64 | assert b.s == 'b' |
| 65 | } |
| 66 | |
| 67 | fn test_option_alias_array() { |
| 68 | c := case_c() or { panic(err) } |
| 69 | assert c.len == 1 |
| 70 | assert c[0].s == 'b' |
| 71 | } |
| 72 | |
| 73 | fn test_result_alias_array() { |
| 74 | d := case_d() or { panic(err) } |
| 75 | assert d.len == 1 |
| 76 | assert d[0].s == 'b' |
| 77 | } |
| 78 | |
| 79 | fn test_result_alias_paren_wrapped() { |
| 80 | e := case_e() or { panic(err) } |
| 81 | assert e.s == 'b' |
| 82 | } |
| 83 | |
| 84 | fn test_option_alias_paren_wrapped() { |
| 85 | f := case_f() or { panic('none') } |
| 86 | assert f.s == 'b' |
| 87 | } |
| 88 | |