summary refs log tree commit diff
path: root/compiler/rustc_trait_selection/src/solve
AgeCommit message (Collapse)AuthorLines
2024-07-18valtree construction: keep track of which type was valtree-incompatibleRalf Jung-2/+2
2024-07-09Split out overflow handling into its own moduleMichael Goulet-1/+1
2024-07-08Move trait selection error reporting to its own top-level moduleMichael Goulet-1/+1
2024-07-08Rollup merge of #127439 - compiler-errors:uplift-elaborate, r=lcnr许杰友 Jieyou Xu (Joe)-8/+0
Uplift elaboration into `rustc_type_ir` Allows us to deduplicate and consolidate elaboration (including these stupid elaboration duplicate fns i added for pretty printing like 3 years ago) so I'm pretty hyped about this change :3 r? lcnr
2024-07-07Finish uplifting supertraitsMichael Goulet-8/+0
2024-07-07Get rid of trait_ref_is_knowable from delegateMichael Goulet-10/+0
2024-07-05Split SolverDelegate back out from InferCtxtLikeMichael Goulet-169/+2
2024-06-21Rename a bunch of thingsMichael Goulet-6/+6
2024-06-18Fix transmute goalMichael Goulet-1/+27
2024-06-18Fix impl for SolverDelegateMichael Goulet-76/+297
2024-06-18Uplift the new trait solverMichael Goulet-7260/+0
2024-06-18SolverDelegateMichael Goulet-148/+339
2024-06-18Make SearchGraph fully genericMichael Goulet-73/+49
2024-06-16Uplift OpaqueTypeKey too, use it in responseMichael Goulet-9/+3
2024-06-16Uplift ExternalConstraintDataMichael Goulet-15/+27
2024-06-16Make ExternalConstraints just carry outlivesMichael Goulet-18/+22
2024-06-16Stop using AssocKind in new solverMichael Goulet-13/+11
2024-06-16Move InferCtxtSelectExt out of eval_ctxt moduleMichael Goulet-3/+3
2024-06-16Auto merge of #126505 - compiler-errors:no-vtable, r=lcnrbors-60/+21
Only compute vtable information during codegen This PR removes vtable information from the `Object` and `TraitUpcasting` candidate sources in the trait solvers, and defers the computation of relevant information to `Instance::resolve`. This is because vtables really aren't a thing in the trait world -- they're an implementation detail in codegen. Previously it was just easiest to tangle this information together since we were already doing the work of looking at all the supertraits in the trait solver, and specifically because we use traits to represent when it's possible to call a method via a vtable (`Object` candidate) and do upcasting (`Unsize` candidate). but I am somewhat suspicious we're doing a *lot* of extra work, especially in polymorphic contexts, so let's see what perf says.
2024-06-15Rollup merge of #126496 - compiler-errors:more-generics, r=lcnrGuillaume Gomez-143/+151
Make proof tree probing and `Candidate`/`CandidateSource` generic over interner `<TyCtxt<'tcx>>` is ugly, but will become `<I>` when things actually become generic. r? lcnr
2024-06-15Rollup merge of #126404 - compiler-errors:alias-relate-terms, r=lcnrGuillaume Gomez-1/+40
Check that alias-relate terms are WF if reporting an error in alias-relate Check that each of the left/right term is WF when deriving a best error obligation for an alias-relate goal. This will make sure that given `<i32 as NotImplemented>::Assoc = ()` will drill down into `i32: NotImplemented` since we currently treat the projection as rigid. r? lcnr
2024-06-15Rollup merge of #126354 - compiler-errors:variance, r=lcnrMatthias Krüger-4/+4
Use `Variance` glob imported variants everywhere Fully commit to using the globbed variance. Could be convinced the other way, and change this PR to not use the globbed variants anywhere, but I'd rather we do one or the other. r? lcnr
2024-06-14Only compute vtable information during codegenMichael Goulet-60/+21
2024-06-14Correctly consider depth when visiting WF goalsMichael Goulet-3/+18
2024-06-14Add TyCtxt::is_lang_itemMichael Goulet-38/+36
2024-06-14Make proof tree probing genericMichael Goulet-38/+45
2024-06-14Make Candidate generic over internerMichael Goulet-106/+107
2024-06-13Address nitsMichael Goulet-23/+30
- Remove the ValuePairs glob import - Make DummyPairs -> ValuePairs::Dummy and make it bug more - Fix WC - Make interner return `impl IntoIterator`s
2024-06-13Fix some TODOsMichael Goulet-5/+4
2024-06-13Finish uplifting all of structural_traitsMichael Goulet-187/+156
2024-06-13Rework most of structural_traits to be Interner-agnosticMichael Goulet-103/+114
2024-06-13LangItem-ify Coroutine trait in solversMichael Goulet-5/+8
2024-06-13Check that alias-relate terms are WF if reporting an error in alias-relateMichael Goulet-0/+24
2024-06-12Also passthrough for projection clausesMichael Goulet-1/+3
2024-06-12Walk into alias-eq nested goals even if normalization failsMichael Goulet-7/+15
2024-06-12Use Variance glob import everywhereMichael Goulet-4/+4
2024-06-11Try not to make obligations in handle_opaque_typeMichael Goulet-8/+7
2024-06-06Uplift TypeRelation and RelateMichael Goulet-4/+4
2024-06-05Fully implement `ConstArgHasType`Boxy-17/+24
2024-06-05Add `Ty` to `ConstKind::Value`Boxy-3/+10
2024-06-05Basic removal of `Ty` from places (boring)Boxy-28/+17
2024-06-04Rollup merge of #125750 - compiler-errors:expect, r=lcnr许杰友 Jieyou Xu (Joe)-2/+2
Align `Term` methods with `GenericArg` methods, add `Term::expect_*` * `Term::ty` -> `Term::as_type`. * `Term::ct` -> `Term::as_const`. * Adds `Term::expect_type` and `Term::expect_const`, and uses them in favor of `.ty().unwrap()`, etc. I could also shorten these to `as_ty` and then do `GenericArg::as_ty` as well, but I do think the `as_` is important to signal that this is a conversion method, and not a getter, like `Const::ty` is. r? types
2024-06-04Auto merge of #125380 - compiler-errors:wc-obj-safety, r=oli-obkbors-3/+3
Make `WHERE_CLAUSES_OBJECT_SAFETY` a regular object safety violation #### The issue In #50781, we have known about unsound `where` clauses in function arguments: ```rust trait Impossible {} trait Foo { fn impossible(&self) where Self: Impossible; } impl Foo for &() { fn impossible(&self) where Self: Impossible, {} } // `where` clause satisfied for the object, meaning that the function now *looks* callable. impl Impossible for dyn Foo {} fn main() { let x: &dyn Foo = &&(); x.impossible(); } ``` ... which currently segfaults at runtime because we try to call a method in the vtable that doesn't exist. :( #### What did u change This PR removes the `WHERE_CLAUSES_OBJECT_SAFETY` lint and instead makes it a regular object safety violation. I choose to make this into a hard error immediately rather than a `deny` because of the time that has passed since this lint was authored, and the single (1) regression (see below). That means that it's OK to mention `where Self: Trait` where clauses in your trait, but making such a trait into a `dyn Trait` object will report an object safety violation just like `where Self: Sized`, etc. ```rust trait Impossible {} trait Foo { fn impossible(&self) where Self: Impossible; // <~ This definition is valid, just not object-safe. } impl Foo for &() { fn impossible(&self) where Self: Impossible, {} } fn main() { let x: &dyn Foo = &&(); // <~ THIS is where we emit an error. } ``` #### Regressions From a recent crater run, there's only one crate that relies on this behavior: https://github.com/rust-lang/rust/pull/124305#issuecomment-2122381740. The crate looks unmaintained and there seems to be no dependents. #### Further We may later choose to relax this (e.g. when the where clause is implied by the supertraits of the trait or something), but this is not something I propose to do in this FCP. For example, given: ``` trait Tr { fn f(&self) where Self: Blanket; } impl<T: ?Sized> Blanket for T {} ``` Proving that some placeholder `S` implements `S: Blanket` would be sufficient to prove that the same (blanket) impl applies for both `Concerete: Blanket` and `dyn Trait: Blanket`. Repeating here that I don't think we need to implement this behavior right now. ---- r? lcnr
2024-06-03Align Term methods with GenericArg methodsMichael Goulet-2/+2
2024-06-03Nits and formattingMichael Goulet-24/+26
2024-06-03check_is_object_safe -> is_object_safeMichael Goulet-3/+3
2024-06-03Add cycle errors to ScrubbedTraitError to remove a couple more calls to ↵Michael Goulet-3/+3
new_with_diagnostics
2024-06-03Move FulfillmentErrorCode to rustc_trait_selection tooMichael Goulet-4/+3
2024-06-03Use ScrubbedTraitError in more placesMichael Goulet-5/+3
2024-06-03Opt-in diagnostics reporting to avoid doing extra work in the new solverMichael Goulet-1/+13