# 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) can be found separately. ## 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(x: Vec) -> (Vec, Vec) { (x.clone(), x) } ``` Here the call to `x.clone()` requires us to prove that `Vec` 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: Clone` with the assumption `T: Clone`" is called a [`Goal`]. Both `Vec: Clone` and `T: Clone` are represented using [`Predicate`]. There are other predicates, most notably equality bounds on associated items: ` 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: Clone` we first use `impl Clone for Vec`. 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: 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_trait_selection/traits/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_trait_selection/solve/assembly/struct.Candidate.html [`CandidateSource`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_trait_selection/solve/assembly/enum.CandidateSource.html [`CanonicalResponse`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_trait_selection/traits/solve/type.CanonicalResponse.html