Remove by-mut-ref mode altogether #3513

Closed
nikomatsakis opened this Issue Sep 17, 2012 · 3 comments

Projects

None yet

3 participants

@nikomatsakis
Collaborator

The handling of "by mutable reference" parameters is unsound because it doesn't affect variance. This is not news. One place we take advantage of this is vec::push(), which has the type

fn push<T>(&vec: ~[const T], +val: T) { ... }

This is unsound because we accept any sort of vector for the argument vec, but the type system only guarantees that we'll write back a const vector. I thought this was basically harmless, since vectors are uniques, but I forgot that it also implies that we will be covariant with respect to T. When combined with regions, this leads to bugs like #3501. However you can create problems without regions too. Any place where we have subtyping.

Anyway, we had always planned to remove by-mut-ref mode as part of the general "de-moding", but I think we should up the priority for this particular mode. It is not that widely used in any case, though vec::push() is certainly frequent. I am checking out how hard it will be to just purge it altogether.

@graydon
graydon commented Sep 17, 2012

Yeah, this is the really major one.

@catamorphism

I'm not sure if we decided this was for 0.4 or not, but I'll try to do it.

@catamorphism catamorphism was assigned Oct 2, 2012
@catamorphism

I am working on this, but ran into a strange bug where apparently, the code after a nested pure fn gets treated as if it should be pure. I'll try to isolate it tomorrow.

@catamorphism catamorphism added a commit that closed this issue Oct 6, 2012
@catamorphism catamorphism Remove by-mutable-ref mode from the compiler
and test cases. Closes #3513
f96a2a2
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment