|  | # Trait solving (new) | 
|  |  | 
|  | This chapter describes how trait solving works with the new WIP solver located in | 
|  | [`rustc_trait_selection/solve`][solve]. Feel free to also look at the docs for | 
|  | [the current solver](../traits/resolution.md) and [the chalk solver](../traits/chalk.md). | 
|  |  | 
|  | ## Core concepts | 
|  |  | 
|  | The goal of the trait system is to check whether a given trait bound is satisfied. | 
|  | Most notably when typechecking the body of - potentially generic - functions. | 
|  | For example: | 
|  |  | 
|  | ```rust | 
|  | fn uses_vec_clone<T: Clone>(x: Vec<T>) -> (Vec<T>, Vec<T>) { | 
|  | (x.clone(), x) | 
|  | } | 
|  | ``` | 
|  | Here the call to `x.clone()` requires us to prove that `Vec<T>` implements `Clone` given | 
|  | the assumption that `T: Clone` is true. We can assume `T: Clone` as that will be proven by | 
|  | callers of this function. | 
|  |  | 
|  | The concept of "prove the `Vec<T>: Clone` with the assumption `T: Clone`" is called a [`Goal`]. | 
|  | Both `Vec<T>: Clone` and `T: Clone` are represented using [`Predicate`]. There are other | 
|  | predicates, most notably equality bounds on associated items: `<Vec<T> as IntoIterator>::Item == T`. | 
|  | See the `PredicateKind` enum for an exhaustive list. A `Goal` is represented as the `predicate` we | 
|  | have to prove and the `param_env` in which this predicate has to hold. | 
|  |  | 
|  | We prove goals by checking whether each possible [`Candidate`] applies for the given goal by | 
|  | recursively proving its nested goals. For a list of possible candidates with examples, look at | 
|  | [`CandidateSource`]. The most important candidates are `Impl` candidates, i.e. trait implementations | 
|  | written by the user, and `ParamEnv` candidates, i.e. assumptions in our current environment. | 
|  |  | 
|  | Looking at the above example, to prove `Vec<T>: Clone` we first use | 
|  | `impl<T: Clone> Clone for Vec<T>`. To use this impl we have to prove the nested | 
|  | goal that `T: Clone` holds. This can use the assumption `T: Clone` from the `ParamEnv` | 
|  | which does not have any nested goals. Therefore `Vec<T>: Clone` holds. | 
|  |  | 
|  | The trait solver can either return success, ambiguity or an error as a [`CanonicalResponse`]. | 
|  | For success and ambiguity it also returns constraints inference and region constraints. | 
|  |  | 
|  | [solve]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_trait_selection/solve/index.html | 
|  | [`Goal`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_infer/infer/canonical/ir/solve/struct.Goal.html | 
|  | [`Predicate`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/ty/struct.Predicate.html | 
|  | [`Candidate`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_next_trait_solver/solve/assembly/struct.Candidate.html | 
|  | [`CandidateSource`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_infer/infer/canonical/ir/solve/enum.CandidateSource.html | 
|  | [`CanonicalResponse`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_trait_selection/traits/solve/type.CanonicalResponse.html |