Skip to content

Commit 099bb1b

Browse files
qnighynikomatsakis
authored andcommitted
Fix misdetection of upstream intercrate ambiguity.
1 parent 4d503b0 commit 099bb1b

File tree

3 files changed

+15
-10
lines changed

3 files changed

+15
-10
lines changed

src/librustc/traits/select.rs

+13-8
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ use super::{VtableImplData, VtableObjectData, VtableBuiltinData, VtableGenerator
3131
use super::util;
3232

3333
use dep_graph::{DepNodeIndex, DepKind};
34-
use hir::def_id::DefId;
34+
use hir::def_id::{DefId, LOCAL_CRATE};
3535
use infer;
3636
use infer::{InferCtxt, InferOk, TypeFreshener};
3737
use ty::subst::{Kind, Subst, Substs};
@@ -1069,13 +1069,18 @@ impl<'cx, 'gcx, 'tcx> SelectionContext<'cx, 'gcx, 'tcx> {
10691069
if !candidate_set.ambiguous && candidate_set.vec.is_empty() {
10701070
let trait_ref = stack.obligation.predicate.skip_binder().trait_ref;
10711071
let self_ty = trait_ref.self_ty();
1072-
let cause = IntercrateAmbiguityCause::UpstreamCrateUpdate {
1073-
trait_desc: trait_ref.to_string(),
1074-
self_desc: if self_ty.has_concrete_skeleton() {
1075-
Some(self_ty.to_string())
1076-
} else {
1077-
None
1078-
},
1072+
let trait_desc = trait_ref.to_string();
1073+
let self_desc = if self_ty.has_concrete_skeleton() {
1074+
Some(self_ty.to_string())
1075+
} else {
1076+
None
1077+
};
1078+
let cause = if
1079+
trait_ref.def_id.krate != LOCAL_CRATE &&
1080+
!self.tcx().has_attr(trait_ref.def_id, "fundamental") {
1081+
IntercrateAmbiguityCause::UpstreamCrateUpdate { trait_desc, self_desc }
1082+
} else {
1083+
IntercrateAmbiguityCause::DownstreamCrate { trait_desc, self_desc }
10791084
};
10801085
self.intercrate_ambiguity_causes.push(cause);
10811086
}

src/test/compile-fail/coherence-overlap-issue-23516-inherent.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ struct Cake<X>(X);
1919
impl<T:Sugar> Cake<T> { fn dummy(&self) { } }
2020
//~^ ERROR E0592
2121
//~| NOTE duplicate definitions for `dummy`
22-
//~| NOTE upstream crates may add new impl of trait `Sugar` for type `std::boxed::Box<_>`
22+
//~| NOTE downstream crates may implement trait `Sugar` for type `std::boxed::Box<_>`
2323
impl<U:Sugar> Cake<Box<U>> { fn dummy(&self) { } }
2424
//~^ NOTE other definition for `dummy`
2525

src/test/compile-fail/coherence-overlap-issue-23516.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,6 @@ impl<T:Sugar> Sweet for T { }
1919
impl<U:Sugar> Sweet for Box<U> { }
2020
//~^ ERROR E0119
2121
//~| NOTE conflicting implementation for `std::boxed::Box<_>`
22-
//~| NOTE upstream crates may add new impl of trait `Sugar` for type `std::boxed::Box<_>`
22+
//~| NOTE downstream crates may implement trait `Sugar` for type `std::boxed::Box<_>`
2323

2424
fn main() { }

0 commit comments

Comments
 (0)