-
Notifications
You must be signed in to change notification settings - Fork 13.6k
Closed
Labels
P-highHigh priorityHigh priorityT-compilerRelevant to the compiler team, which will review and decide on the PR/issue.Relevant to the compiler team, which will review and decide on the PR/issue.regression-from-stable-to-betaPerformance or correctness regression from stable to beta.Performance or correctness regression from stable to beta.relnotesMarks issues that should be documented in the release notes of the next release.Marks issues that should be documented in the release notes of the next release.
Description
This regression is only visible in cross-crate code; NOTE it's very likely it's due to an actual rustc bug fix.
Here is some playpen code for illustration anyway.
Given a struct with default parameters and two constructor functions:
pub struct Graph<N, E, Ty = Directed, Ix: IndexType = DefIndex> {
nodes: Vec<Node<N, Ix>>,
edges: Vec<Edge<E, Ix>>,
ty: PhantomData<Ty>,
}
impl<N, E> Graph<N, E, Directed> {
pub fn new() -> Self {
Graph{nodes: Vec::new(), edges: Vec::new(), ty: PhantomData}
}
}
impl<N, E> Graph<N, E, Undirected> {
pub fn new_undirected() -> Self {
Graph{nodes: Vec::new(), edges: Vec::new(), ty: PhantomData}
}
}
In Rust 1.4 or later (current stable and current nightly), both must be called like this to compile:
let g = Graph::<i32, i32>::new();
let ug = Graph::<i32, i32, _>::new_undirected();
In current stable Rust 1.4, the following compiles if you import Graph
across crates!
let ug = Graph::<i32, i32>::new_undirected();
This is invalid in current nightly Rust ~1.6, see travis build example; the testcases are in their own crates.
tests/ograph.rs:1018:18: 1018:48 error: no associated item named `new_undirected` found for type `petgraph::graph::Graph<_, ()>` in the current scope
tests/ograph.rs:1018 let mut gr = Graph::<_, ()>::new_undirected();
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Metadata
Metadata
Assignees
Labels
P-highHigh priorityHigh priorityT-compilerRelevant to the compiler team, which will review and decide on the PR/issue.Relevant to the compiler team, which will review and decide on the PR/issue.regression-from-stable-to-betaPerformance or correctness regression from stable to beta.Performance or correctness regression from stable to beta.relnotesMarks issues that should be documented in the release notes of the next release.Marks issues that should be documented in the release notes of the next release.
Type
Projects
Milestone
Relationships
Development
Select code repository
Activity
nikomatsakis commentedon Dec 17, 2015
This does seem more like a bug fix, but I'm not sure what would have triggered it.
nikomatsakis commentedon Dec 17, 2015
triage: P-high
It's important to decide if this is now doing the correct thing.
bluss commentedon Dec 17, 2015
I'm sure it's an acceptable fix, but I think we want issues for all regressions, no matter why they happen.
I was mostly amused that there was no way to write a type hinted call of
Graph::new_undirected()
that would simultaneously compile with Rust 1.4 (requires 2 type params) and Rust 1.6 (requires three); you have to hint the types through the returned value instead.arielb1 commentedon Dec 21, 2015
The 2-type-param version was working only by a bug - we have no plans of working around that.
nikomatsakis commentedon Jan 6, 2016
@arielb1 do you think you know what fixed it? maybe something in metadata got corrected?
brson commentedon Jan 8, 2016
I'm trying to bisect to find out what changed, then write a test case.
8 remaining items
arielb1 commentedon Jan 14, 2016
This commit should not have changed anything, but I imagine there is a bug here.
brson commentedon Jan 16, 2016
@nikomatsakis nah that's ok. It's not a huge deal. I did start another bisect though. I'm having a hard time summarizing this change for the release notes. There are a lot of technical pieces here. Can somebody try?
bluss commentedon Jan 16, 2016
@arielb1 My guess could have landed totally wrong. Don't know why I tried. You all know this better than me. For example, as the ImageBuffer example shows, type parameter defaults don't have to be involved, which has me a bit confounded.
brson commentedon Jan 18, 2016
I am still trying to bisect.
brson commentedon Jan 19, 2016
f5fbefa caused it.
brson commentedon Jan 19, 2016
cc @arielb1
Add test for rust-lang#30123
arielb1 commentedon Jan 19, 2016
I think the culprit is that I added the
arielb1 commentedon Jan 19, 2016
That indeed seems to be the change (commenting it out makes things compile again).
Could someone who understands
resolve
tell me how the change could cause that kind of effects?nikomatsakis commentedon Jan 21, 2016
I'm going to close this issue then as "not a bug", since we know that commit caused it.
eddyb commentedon Feb 21, 2016
@arielb1 Coming back to this, I remember that you removed some metadata code for saving inherent methods: wouldn't they be picked up by resolve, instead of letting typeck do UFCS resolution?
hatahet commentedon Feb 27, 2016
@brson:
What caused it to fail the first time?