Commit 2b3f63c
fix(#559): implement + wire trait coherence checking
Trait.check_coherence was a no-op stub ("TODO: Check for overlapping
impls") and was never called, so two impls of the same trait for the same
(or unifiable) self type were silently accepted and method resolution
picked whichever impl came first — an unsoundness.
- Implement check_coherence: two impls overlap iff their self types unify
after each is instantiated with fresh vars for its own type params (reuses
fresh_impl_self_ty + Unify.unify; the existing OverlappingImpl error).
- Add check_all_coherence over every registered trait.
- Wire it into Typecheck.check_program after the forward pass registers all
impls; surface via a new, clearly-named TraitCoherenceError type_error.
- Tests (E2E Trait Coherence #559): duplicate concrete impl → rejected;
impls for distinct types → accepted; distinct generic args
(Pair[Int,Bool] vs Pair[Bool,Int]) → accepted (no over-reject).
Known follow-up (documented in-test): generic-subsumption overlap
(impl[T] for Box[T] vs impl for Box[Int]) is not yet detected — it rides on
generic-impl handling that has separate pre-existing immaturities; the
soundness hole #559 named (silent acceptance of overlapping concrete impls)
is closed. 525 tests green.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>1 parent bc061ad commit 2b3f63c
3 files changed
Lines changed: 144 additions & 7 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
420 | 420 | | |
421 | 421 | | |
422 | 422 | | |
423 | | - | |
| 423 | + | |
| 424 | + | |
| 425 | + | |
| 426 | + | |
| 427 | + | |
| 428 | + | |
| 429 | + | |
| 430 | + | |
| 431 | + | |
| 432 | + | |
| 433 | + | |
| 434 | + | |
| 435 | + | |
| 436 | + | |
424 | 437 | | |
425 | 438 | | |
426 | 439 | | |
427 | 440 | | |
428 | | - | |
429 | | - | |
| 441 | + | |
| 442 | + | |
| 443 | + | |
| 444 | + | |
| 445 | + | |
430 | 446 | | |
431 | 447 | | |
432 | | - | |
433 | | - | |
434 | | - | |
435 | | - | |
| 448 | + | |
| 449 | + | |
| 450 | + | |
| 451 | + | |
| 452 | + | |
| 453 | + | |
| 454 | + | |
| 455 | + | |
| 456 | + | |
| 457 | + | |
| 458 | + | |
| 459 | + | |
| 460 | + | |
436 | 461 | | |
437 | 462 | | |
438 | 463 | | |
| 464 | + | |
| 465 | + | |
| 466 | + | |
| 467 | + | |
| 468 | + | |
| 469 | + | |
| 470 | + | |
| 471 | + | |
| 472 | + | |
439 | 473 | | |
440 | 474 | | |
441 | 475 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
123 | 123 | | |
124 | 124 | | |
125 | 125 | | |
| 126 | + | |
| 127 | + | |
| 128 | + | |
| 129 | + | |
126 | 130 | | |
127 | 131 | | |
128 | 132 | | |
| |||
198 | 202 | | |
199 | 203 | | |
200 | 204 | | |
| 205 | + | |
| 206 | + | |
| 207 | + | |
| 208 | + | |
| 209 | + | |
| 210 | + | |
201 | 211 | | |
202 | 212 | | |
203 | 213 | | |
| |||
2438 | 2448 | | |
2439 | 2449 | | |
2440 | 2450 | | |
| 2451 | + | |
| 2452 | + | |
| 2453 | + | |
| 2454 | + | |
| 2455 | + | |
| 2456 | + | |
| 2457 | + | |
2441 | 2458 | | |
2442 | 2459 | | |
2443 | 2460 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
2315 | 2315 | | |
2316 | 2316 | | |
2317 | 2317 | | |
| 2318 | + | |
| 2319 | + | |
| 2320 | + | |
| 2321 | + | |
| 2322 | + | |
| 2323 | + | |
| 2324 | + | |
| 2325 | + | |
| 2326 | + | |
| 2327 | + | |
| 2328 | + | |
| 2329 | + | |
| 2330 | + | |
| 2331 | + | |
| 2332 | + | |
| 2333 | + | |
| 2334 | + | |
| 2335 | + | |
| 2336 | + | |
| 2337 | + | |
| 2338 | + | |
| 2339 | + | |
| 2340 | + | |
| 2341 | + | |
| 2342 | + | |
| 2343 | + | |
| 2344 | + | |
| 2345 | + | |
| 2346 | + | |
| 2347 | + | |
| 2348 | + | |
| 2349 | + | |
| 2350 | + | |
| 2351 | + | |
| 2352 | + | |
| 2353 | + | |
| 2354 | + | |
| 2355 | + | |
| 2356 | + | |
| 2357 | + | |
| 2358 | + | |
| 2359 | + | |
| 2360 | + | |
| 2361 | + | |
| 2362 | + | |
| 2363 | + | |
| 2364 | + | |
| 2365 | + | |
| 2366 | + | |
| 2367 | + | |
| 2368 | + | |
| 2369 | + | |
| 2370 | + | |
| 2371 | + | |
| 2372 | + | |
| 2373 | + | |
| 2374 | + | |
| 2375 | + | |
| 2376 | + | |
| 2377 | + | |
| 2378 | + | |
| 2379 | + | |
| 2380 | + | |
| 2381 | + | |
| 2382 | + | |
| 2383 | + | |
| 2384 | + | |
| 2385 | + | |
| 2386 | + | |
| 2387 | + | |
| 2388 | + | |
| 2389 | + | |
| 2390 | + | |
| 2391 | + | |
| 2392 | + | |
| 2393 | + | |
| 2394 | + | |
| 2395 | + | |
| 2396 | + | |
| 2397 | + | |
| 2398 | + | |
| 2399 | + | |
| 2400 | + | |
| 2401 | + | |
| 2402 | + | |
2318 | 2403 | | |
2319 | 2404 | | |
2320 | 2405 | | |
| |||
5652 | 5737 | | |
5653 | 5738 | | |
5654 | 5739 | | |
| 5740 | + | |
5655 | 5741 | | |
5656 | 5742 | | |
5657 | 5743 | | |
| |||
0 commit comments