Commit de97305
committed
feat(check): diagnose lambda return body vs declared mismatch
Phase 7-and-a-half added lambda return-type inference but
silently honored the declared annotation when present: an
`fn(x) -> bool: return "hi"` passed every check, because the
returning expression was never compared against the bool the user
promised. The mismatch surfaced only at the call site (if at all),
and pointed at the wrong span.
Extend the returnStack frame to carry an `expected` return type
alongside the collected types. push/pop already happens per fn /
lambda body; the expected slot is populated from `Typing.ReturnT`
at push time. recordReturn now checks against `expected` at the
return-statement's own span when the type is concrete (not
Dynamic / ErrorType - those would cascade false-positives).
walkFnDef participates too: a hoisted fn declared `-> bool` whose
body returns "hi" now fires at the return, not at every later
call site. Mirror behavior for nested fns - they push their own
frame, so an inner fn's returns check against the inner
declaration, not the outer's. The NestedFnReturnIsolated
snapshot pins this.
Multiple returns are each checked independently. A fn that
returns int from one branch and str from another, declared
`-> bool`, fires twice with two distinct spans - the user can
fix them one at a time.
Severity is Hint, matching the rest of the assignability checks.
Promotion to Error happens in the future severity migration once
literal types fill the remaining fidelity gaps.
Five new snapshot cases in fn_value/declared_return.snap plus
the renamed/repurposed LambdaDeclaredReturnMismatchFiresAtReturn
case in structural_match.snap (was Honored, marked the gap;
now closes it).1 parent 451af1d commit de97305
3 files changed
Lines changed: 170 additions & 34 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
| 81 | + | |
| 82 | + | |
| 83 | + | |
| 84 | + | |
| 85 | + | |
| 86 | + | |
| 87 | + | |
| 88 | + | |
| 89 | + | |
| 90 | + | |
| 91 | + | |
| 92 | + | |
| 93 | + | |
| 94 | + | |
| 95 | + | |
| 96 | + | |
| 97 | + | |
| 98 | + | |
| 99 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
274 | 274 | | |
275 | 275 | | |
276 | 276 | | |
277 | | - | |
| 277 | + | |
278 | 278 | | |
279 | | - | |
280 | | - | |
281 | | - | |
282 | | - | |
283 | | - | |
284 | | - | |
285 | | - | |
| 279 | + | |
| 280 | + | |
| 281 | + | |
| 282 | + | |
| 283 | + | |
286 | 284 | | |
287 | 285 | | |
288 | 286 | | |
| |||
298 | 296 | | |
299 | 297 | | |
300 | 298 | | |
301 | | - | |
| 299 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
99 | 99 | | |
100 | 100 | | |
101 | 101 | | |
102 | | - | |
103 | | - | |
104 | | - | |
105 | | - | |
106 | | - | |
107 | | - | |
108 | | - | |
109 | | - | |
110 | | - | |
111 | | - | |
| 102 | + | |
| 103 | + | |
| 104 | + | |
| 105 | + | |
| 106 | + | |
| 107 | + | |
| 108 | + | |
| 109 | + | |
112 | 110 | | |
113 | 111 | | |
114 | | - | |
115 | | - | |
| 112 | + | |
| 113 | + | |
| 114 | + | |
| 115 | + | |
| 116 | + | |
| 117 | + | |
| 118 | + | |
116 | 119 | | |
117 | 120 | | |
118 | 121 | | |
119 | 122 | | |
120 | | - | |
| 123 | + | |
121 | 124 | | |
122 | 125 | | |
123 | 126 | | |
124 | 127 | | |
125 | 128 | | |
126 | | - | |
127 | | - | |
128 | | - | |
| 129 | + | |
| 130 | + | |
| 131 | + | |
| 132 | + | |
129 | 133 | | |
130 | 134 | | |
131 | 135 | | |
132 | 136 | | |
133 | | - | |
| 137 | + | |
| 138 | + | |
| 139 | + | |
| 140 | + | |
| 141 | + | |
| 142 | + | |
| 143 | + | |
| 144 | + | |
| 145 | + | |
| 146 | + | |
| 147 | + | |
| 148 | + | |
| 149 | + | |
| 150 | + | |
| 151 | + | |
| 152 | + | |
| 153 | + | |
| 154 | + | |
134 | 155 | | |
135 | 156 | | |
136 | 157 | | |
| |||
183 | 204 | | |
184 | 205 | | |
185 | 206 | | |
186 | | - | |
| 207 | + | |
187 | 208 | | |
188 | 209 | | |
189 | 210 | | |
| |||
293 | 314 | | |
294 | 315 | | |
295 | 316 | | |
296 | | - | |
297 | | - | |
| 317 | + | |
| 318 | + | |
| 319 | + | |
| 320 | + | |
| 321 | + | |
| 322 | + | |
| 323 | + | |
| 324 | + | |
298 | 325 | | |
299 | 326 | | |
300 | 327 | | |
| |||
2172 | 2199 | | |
2173 | 2200 | | |
2174 | 2201 | | |
2175 | | - | |
| 2202 | + | |
| 2203 | + | |
| 2204 | + | |
| 2205 | + | |
| 2206 | + | |
| 2207 | + | |
| 2208 | + | |
| 2209 | + | |
| 2210 | + | |
| 2211 | + | |
| 2212 | + | |
2176 | 2213 | | |
2177 | 2214 | | |
2178 | 2215 | | |
2179 | 2216 | | |
2180 | | - | |
2181 | | - | |
2182 | | - | |
| 2217 | + | |
| 2218 | + | |
| 2219 | + | |
| 2220 | + | |
| 2221 | + | |
2183 | 2222 | | |
2184 | 2223 | | |
2185 | 2224 | | |
2186 | 2225 | | |
2187 | 2226 | | |
2188 | | - | |
| 2227 | + | |
2189 | 2228 | | |
2190 | 2229 | | |
2191 | 2230 | | |
| |||
0 commit comments