Commit cc7b49a
committed
Fix vtable ICE on unsatisfied supertrait bounds
When a trait impl doesn't satisfy its supertrait bounds (for example,
`impl<T: Send> Bar for T` where `trait Bar: Droppable` but `T` has no
`Droppable` bound), the compiler emits E0277 and then then continues
compilation.
If a static initialiser then upcasts through this broken impl, const
evaluation builds the vtable and tries to resolve methods for the
unsatisfied supertrait (for example, `<bool as Droppable>::drop`).
One might think that the `impossible_predicates` guard in
`vtable_entries` should catch this, but it doesn't, because it calls
`predicates_of(method).instantiate_own()`, which only includes the
method's own where clauses, and the parent trait's `Self: Trait`
predicate lives on the trait definition, not the method, so the guard
passes and we fall through to `expect_resolve_for_vtable`, which hits a
`span_bug!` when resolution returns `Ok(None)`.
There was a previous attempt to fix this in issue 152287, which worked
by switching to `instantiate_and_check_impossible_predicates`, which
includes parent predicates and the trait ref. But unfortunately this is
unsound and was reverted because `impossible_predicates` has a
pre-existing unsoundness with coroutine witness types and opaque types
(see issue 153596).
Let's take a different approach that avoids `impossible_predicates`
entirely. Let's extract the core of `expect_resolve_for_vtable` into a
fallible `try_resolve_for_vtable` that returns `Result<Instance,
ErrorGuaranteed>`, and on resolution failure emit a `delayed_bug`.
`vtable_entries` then can use this and return `VtblEntry::Vacant` on the
error path.1 parent 86c839f commit cc7b49a
14 files changed
Lines changed: 215 additions & 43 deletions
File tree
- compiler
- rustc_middle/src/ty
- rustc_trait_selection/src/traits
- tests
- crashes
- ui
- limits
- traits/vtable
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
625 | 625 | | |
626 | 626 | | |
627 | 627 | | |
628 | | - | |
| 628 | + | |
| 629 | + | |
| 630 | + | |
| 631 | + | |
| 632 | + | |
| 633 | + | |
| 634 | + | |
629 | 635 | | |
630 | 636 | | |
631 | 637 | | |
632 | 638 | | |
633 | | - | |
634 | | - | |
635 | | - | |
| 639 | + | |
| 640 | + | |
636 | 641 | | |
637 | 642 | | |
638 | 643 | | |
639 | 644 | | |
640 | 645 | | |
641 | 646 | | |
642 | 647 | | |
643 | | - | |
| 648 | + | |
644 | 649 | | |
645 | 650 | | |
646 | | - | |
| 651 | + | |
| 652 | + | |
| 653 | + | |
| 654 | + | |
| 655 | + | |
| 656 | + | |
| 657 | + | |
647 | 658 | | |
648 | 659 | | |
649 | 660 | | |
| |||
700 | 711 | | |
701 | 712 | | |
702 | 713 | | |
703 | | - | |
| 714 | + | |
| 715 | + | |
| 716 | + | |
| 717 | + | |
| 718 | + | |
| 719 | + | |
| 720 | + | |
| 721 | + | |
| 722 | + | |
| 723 | + | |
| 724 | + | |
| 725 | + | |
| 726 | + | |
| 727 | + | |
| 728 | + | |
| 729 | + | |
| 730 | + | |
| 731 | + | |
| 732 | + | |
704 | 733 | | |
705 | 734 | | |
706 | 735 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
8 | 8 | | |
9 | 9 | | |
10 | 10 | | |
11 | | - | |
12 | 11 | | |
13 | 12 | | |
14 | 13 | | |
| |||
285 | 284 | | |
286 | 285 | | |
287 | 286 | | |
288 | | - | |
| 287 | + | |
289 | 288 | | |
290 | 289 | | |
291 | 290 | | |
292 | 291 | | |
293 | | - | |
294 | | - | |
295 | | - | |
296 | | - | |
| 292 | + | |
| 293 | + | |
| 294 | + | |
| 295 | + | |
| 296 | + | |
| 297 | + | |
| 298 | + | |
| 299 | + | |
| 300 | + | |
| 301 | + | |
| 302 | + | |
297 | 303 | | |
298 | 304 | | |
299 | 305 | | |
| |||
This file was deleted.
This file was deleted.
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | | - | |
| 1 | + | |
2 | 2 | | |
3 | 3 | | |
4 | 4 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
8 | 8 | | |
9 | 9 | | |
10 | 10 | | |
11 | | - | |
| 11 | + | |
| 12 | + | |
12 | 13 | | |
13 | 14 | | |
14 | 15 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
Lines changed: 22 additions & 0 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 | + | |
Lines changed: 35 additions & 0 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 | + | |
0 commit comments