Skip to content

Commit

Permalink
Rollup merge of #107815 - compiler-errors:new-solver-no-auto-if-impl,…
Browse files Browse the repository at this point in the history
… r=lcnr

Disqualify `auto trait` built-in impl in new solver if explicit `impl` exists
  • Loading branch information
Dylan-DPC authored Feb 9, 2023
2 parents 16a4138 + 68e27b3 commit b080a1a
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 0 deletions.
14 changes: 14 additions & 0 deletions compiler/rustc_trait_selection/src/solve/trait_goals.rs
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,20 @@ impl<'tcx> assembly::GoalKind<'tcx> for TraitPredicate<'tcx> {
ecx: &mut EvalCtxt<'_, 'tcx>,
goal: Goal<'tcx, Self>,
) -> QueryResult<'tcx> {
// This differs from the current stable behavior and
// fixes #84857. Due to breakage found via crater, we
// currently instead lint patterns which can be used to
// exploit this unsoundness on stable, see #93367 for
// more details.
if let Some(def_id) = ecx.tcx().find_map_relevant_impl(
goal.predicate.def_id(),
goal.predicate.self_ty(),
Some,
) {
debug!(?def_id, ?goal, "disqualified auto-trait implementation");
return Err(NoSolution);
}

ecx.probe_and_evaluate_goal_for_constituent_tys(
goal,
structural_traits::instantiate_constituent_tys_for_auto_trait,
Expand Down
8 changes: 8 additions & 0 deletions tests/ui/traits/new-solver/unsafe-auto-trait-impl.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
// compile-flags: -Ztrait-solver=next
// check-pass

struct Foo(*mut ());

unsafe impl Sync for Foo {}

fn main() {}

0 comments on commit b080a1a

Please sign in to comment.