-
Notifications
You must be signed in to change notification settings - Fork 13.4k
Autoderef does not find methods on traits in scope #13264
New issue
Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? # to your account
Comments
Compiling your example, I get:
Which I believe is working as intended. Currently inherent methods shadow trait methods. |
@alexcrichton If I comment out the Deref impl, it compiles without issue. |
Ah, don't mind me, I think I see what's going on. |
|
The reason for this rule is to permit impls like |
Updated test case: struct Root {
jsref: JSRef
}
impl Deref<JSRef> for Root {
fn deref<'a>(&'a self) -> &'a JSRef {
&self.jsref
}
}
struct JSRef {
node: *const Node
}
impl Deref<Node> for JSRef {
fn deref<'a>(&'a self) -> &'a Node {
self.get()
}
}
trait INode {
fn RemoveChild(&self);
}
impl INode for JSRef {
fn RemoveChild(&self) {
self.get().RemoveChild(0)
}
}
impl JSRef {
fn AddChild(&self) {
self.get().AddChild(0);
}
fn get<'a>(&'a self) -> &'a Node {
unsafe {
&*self.node
}
}
}
struct Node;
impl Node {
fn RemoveChild(&self, _a: uint) {
}
fn AddChild(&self, _a: uint) {
}
}
fn main() {
let n = Node;
let jsref = JSRef { node: &n };
let root = Root { jsref: jsref };
root.AddChild();
jsref.AddChild();
root.RemoveChild();
jsref.RemoveChild();
} E-needstest. |
For more context: we changed the priorities so that inherent methods only override extension methods at a given autoderef level, which I think is close enough to the behavior that @jdm wanted for this test case. |
Closes rust-lang#5988. Closes rust-lang#10176. Closes rust-lang#10456. Closes rust-lang#12744. Closes rust-lang#13264. Closes rust-lang#13324. Closes rust-lang#14182. Closes rust-lang#15381. Closes rust-lang#15444. Closes rust-lang#15480. Closes rust-lang#15756. Closes rust-lang#16822. Closes rust-lang#16966. Closes rust-lang#17351. Closes rust-lang#17503. Closes rust-lang#17545. Closes rust-lang#17771. Closes rust-lang#17816. Closes rust-lang#17897. Closes rust-lang#17905. Closes rust-lang#18188. Closes rust-lang#18232. Closes rust-lang#18345. Closes rust-lang#18389. Closes rust-lang#18400. Closes rust-lang#18502. Closes rust-lang#18611. Closes rust-lang#18783. Closes rust-lang#19009. Closes rust-lang#19081. Closes rust-lang#19098. Closes rust-lang#19127. Closes rust-lang#19135.
Closes rust-lang#5988. Closes rust-lang#10176. Closes rust-lang#10456. Closes rust-lang#12744. Closes rust-lang#13264. Closes rust-lang#13324. Closes rust-lang#14182. Closes rust-lang#15381. Closes rust-lang#15444. Closes rust-lang#15480. Closes rust-lang#15756. Closes rust-lang#16822. Closes rust-lang#16966. Closes rust-lang#17351. Closes rust-lang#17503. Closes rust-lang#17545. Closes rust-lang#17771. Closes rust-lang#17816. Closes rust-lang#17897. Closes rust-lang#17905. Closes rust-lang#18188. Closes rust-lang#18232. Closes rust-lang#18345. Closes rust-lang#18389. Closes rust-lang#18400. Closes rust-lang#18502. Closes rust-lang#18611. Closes rust-lang#18783. Closes rust-lang#19009. Closes rust-lang#19081. Closes rust-lang#19098. Closes rust-lang#19127. Closes rust-lang#19135.
Closes #5988. Closes #10176. Closes #10456. Closes #12744. Closes #13264. Closes #13324. Closes #14182. Closes #15381. Closes #15444. Closes #15480. Closes #15756. Closes #16822. Closes #16966. Closes #17351. Closes #17503. Closes #17545. Closes #17771. Closes #17816. Closes #17897. Closes #17905. Closes #18188. Closes #18232. Closes #18345. Closes #18389. Closes #18400. Closes #18502. Closes #18611. Closes #18783. Closes #19009. Closes #19081. Closes #19098. Closes #19127. Closes #19135.
…ykril Ensure at least one trait bound in `TyKind::DynTy` One would expect `TyKind::DynTy` to have at least one trait bound, but we may produce a dyn type with no trait bounds at all. This patch prevents it by returning `TyKind::Error` in such cases. An "empty" dyn type would have caused panic during method resolution without rust-lang#13257. Although already fixed, I think an invariant to never produce such types would help prevent similar problems in the future.
Testcase: https://gist.github.com/jdm/9936609
Note how AddChild is resolved, since it's defined in an impl for JSRef itself, whereas RemoveChild is not resolved since it's a trait method.
RUST_LOG=rustc::middle::typeck::check::method
output: https://gist.github.com/jdm/9936635The text was updated successfully, but these errors were encountered: