libsyntax: Remove @const
from the language
This commit is contained in:
parent
d4fee24c7c
commit
02c49b32ca
15 changed files with 41 additions and 248 deletions
|
@ -49,23 +49,43 @@ pub pure fn mut_ptr_eq<T>(a: @mut T, b: @mut T) -> bool {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(notest)]
|
#[cfg(notest)]
|
||||||
impl<T:Eq> Eq for @const T {
|
impl<T:Eq> Eq for @T {
|
||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
pure fn eq(&self, other: &@const T) -> bool { *(*self) == *(*other) }
|
pure fn eq(&self, other: &@T) -> bool { *(*self) == *(*other) }
|
||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
pure fn ne(&self, other: &@const T) -> bool { *(*self) != *(*other) }
|
pure fn ne(&self, other: &@T) -> bool { *(*self) != *(*other) }
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(notest)]
|
#[cfg(notest)]
|
||||||
impl<T:Ord> Ord for @const T {
|
impl<T:Eq> Eq for @mut T {
|
||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
pure fn lt(&self, other: &@const T) -> bool { *(*self) < *(*other) }
|
pure fn eq(&self, other: &@mut T) -> bool { *(*self) == *(*other) }
|
||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
pure fn le(&self, other: &@const T) -> bool { *(*self) <= *(*other) }
|
pure fn ne(&self, other: &@mut T) -> bool { *(*self) != *(*other) }
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(notest)]
|
||||||
|
impl<T:Ord> Ord for @T {
|
||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
pure fn ge(&self, other: &@const T) -> bool { *(*self) >= *(*other) }
|
pure fn lt(&self, other: &@T) -> bool { *(*self) < *(*other) }
|
||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
pure fn gt(&self, other: &@const T) -> bool { *(*self) > *(*other) }
|
pure fn le(&self, other: &@T) -> bool { *(*self) <= *(*other) }
|
||||||
|
#[inline(always)]
|
||||||
|
pure fn ge(&self, other: &@T) -> bool { *(*self) >= *(*other) }
|
||||||
|
#[inline(always)]
|
||||||
|
pure fn gt(&self, other: &@T) -> bool { *(*self) > *(*other) }
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(notest)]
|
||||||
|
impl<T:Ord> Ord for @mut T {
|
||||||
|
#[inline(always)]
|
||||||
|
pure fn lt(&self, other: &@mut T) -> bool { *(*self) < *(*other) }
|
||||||
|
#[inline(always)]
|
||||||
|
pure fn le(&self, other: &@mut T) -> bool { *(*self) <= *(*other) }
|
||||||
|
#[inline(always)]
|
||||||
|
pure fn ge(&self, other: &@mut T) -> bool { *(*self) >= *(*other) }
|
||||||
|
#[inline(always)]
|
||||||
|
pure fn gt(&self, other: &@mut T) -> bool { *(*self) > *(*other) }
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
|
|
@ -58,6 +58,7 @@ pub enum ObsoleteSyntax {
|
||||||
ObsoleteMode,
|
ObsoleteMode,
|
||||||
ObsoleteImplicitSelf,
|
ObsoleteImplicitSelf,
|
||||||
ObsoleteLifetimeNotation,
|
ObsoleteLifetimeNotation,
|
||||||
|
ObsoleteConstManagedPointer,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl to_bytes::IterBytes for ObsoleteSyntax {
|
impl to_bytes::IterBytes for ObsoleteSyntax {
|
||||||
|
@ -193,6 +194,10 @@ pub impl Parser {
|
||||||
"instead of `&foo/bar`, write `&'foo bar`; instead of \
|
"instead of `&foo/bar`, write `&'foo bar`; instead of \
|
||||||
`bar/&foo`, write `&bar<'foo>"
|
`bar/&foo`, write `&bar<'foo>"
|
||||||
),
|
),
|
||||||
|
ObsoleteConstManagedPointer => (
|
||||||
|
"const `@` pointer",
|
||||||
|
"instead of `@const Foo`, write `@Foo`"
|
||||||
|
),
|
||||||
};
|
};
|
||||||
|
|
||||||
self.report(sp, kind, kind_str, desc);
|
self.report(sp, kind, kind_str, desc);
|
||||||
|
|
|
@ -79,7 +79,7 @@ use parse::obsolete::{ObsoleteRecordType, ObsoleteRecordPattern};
|
||||||
use parse::obsolete::{ObsoleteAssertion, ObsoletePostFnTySigil};
|
use parse::obsolete::{ObsoleteAssertion, ObsoletePostFnTySigil};
|
||||||
use parse::obsolete::{ObsoleteBareFnType, ObsoleteNewtypeEnum};
|
use parse::obsolete::{ObsoleteBareFnType, ObsoleteNewtypeEnum};
|
||||||
use parse::obsolete::{ObsoleteMode, ObsoleteImplicitSelf};
|
use parse::obsolete::{ObsoleteMode, ObsoleteImplicitSelf};
|
||||||
use parse::obsolete::{ObsoleteLifetimeNotation};
|
use parse::obsolete::{ObsoleteLifetimeNotation, ObsoleteConstManagedPointer};
|
||||||
use parse::prec::{as_prec, token_to_binop};
|
use parse::prec::{as_prec, token_to_binop};
|
||||||
use parse::token::{can_begin_expr, is_ident, is_ident_or_path};
|
use parse::token::{can_begin_expr, is_ident, is_ident_or_path};
|
||||||
use parse::token::{is_plain_ident, INTERPOLATED, special_idents};
|
use parse::token::{is_plain_ident, INTERPOLATED, special_idents};
|
||||||
|
@ -710,6 +710,9 @@ pub impl Parser {
|
||||||
if mt.mutbl != m_imm && sigil == OwnedSigil {
|
if mt.mutbl != m_imm && sigil == OwnedSigil {
|
||||||
self.obsolete(*self.last_span, ObsoleteMutOwnedPointer);
|
self.obsolete(*self.last_span, ObsoleteMutOwnedPointer);
|
||||||
}
|
}
|
||||||
|
if mt.mutbl == m_const && sigil == ManagedSigil {
|
||||||
|
self.obsolete(*self.last_span, ObsoleteConstManagedPointer);
|
||||||
|
}
|
||||||
|
|
||||||
ctor(mt)
|
ctor(mt)
|
||||||
}
|
}
|
||||||
|
@ -1636,6 +1639,10 @@ pub impl Parser {
|
||||||
token::AT => {
|
token::AT => {
|
||||||
self.bump();
|
self.bump();
|
||||||
let m = self.parse_mutability();
|
let m = self.parse_mutability();
|
||||||
|
if m == m_const {
|
||||||
|
self.obsolete(*self.last_span, ObsoleteConstManagedPointer);
|
||||||
|
}
|
||||||
|
|
||||||
let e = self.parse_prefix_expr();
|
let e = self.parse_prefix_expr();
|
||||||
hi = e.span.hi;
|
hi = e.span.hi;
|
||||||
// HACK: turn @[...] into a @-evec
|
// HACK: turn @[...] into a @-evec
|
||||||
|
|
|
@ -13,7 +13,6 @@ fn main() {
|
||||||
a: int,
|
a: int,
|
||||||
w: B,
|
w: B,
|
||||||
x: @B,
|
x: @B,
|
||||||
y: @const B,
|
|
||||||
z: @mut B
|
z: @mut B
|
||||||
}
|
}
|
||||||
struct B {
|
struct B {
|
||||||
|
@ -23,7 +22,6 @@ fn main() {
|
||||||
a: 1,
|
a: 1,
|
||||||
w: B {a: 1},
|
w: B {a: 1},
|
||||||
x: @B {a: 1},
|
x: @B {a: 1},
|
||||||
y: @const B {a: 1},
|
|
||||||
z: @mut B {a: 1}
|
z: @mut B {a: 1}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -37,6 +35,5 @@ fn main() {
|
||||||
// in these cases we pass through a box, so the mut
|
// in these cases we pass through a box, so the mut
|
||||||
// of the box is dominant
|
// of the box is dominant
|
||||||
p.x.a = 2; //~ ERROR assigning to immutable field
|
p.x.a = 2; //~ ERROR assigning to immutable field
|
||||||
p.y.a = 2; //~ ERROR assigning to const field
|
|
||||||
p.z.a = 2;
|
p.z.a = 2;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,37 +0,0 @@
|
||||||
// Copyright 2012 The Rust Project Developers. See the COPYRIGHT
|
|
||||||
// file at the top-level directory of this distribution and at
|
|
||||||
// http://rust-lang.org/COPYRIGHT.
|
|
||||||
//
|
|
||||||
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
|
||||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
|
||||||
// option. This file may not be copied, modified, or distributed
|
|
||||||
// except according to those terms.
|
|
||||||
|
|
||||||
fn match_imm_box(v: &const @Option<int>) -> int {
|
|
||||||
match *v {
|
|
||||||
@Some(ref i) => {*i}
|
|
||||||
@None => {0}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn match_const_box(v: &const @const Option<int>) -> int {
|
|
||||||
match *v {
|
|
||||||
@Some(ref i) => { *i } // ok because this is pure
|
|
||||||
@None => {0}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn process(_i: int) {}
|
|
||||||
|
|
||||||
fn match_const_box_and_do_bad_things(v: &const @const Option<int>) {
|
|
||||||
match *v {
|
|
||||||
@Some(ref i) => { //~ ERROR illegal borrow unless pure
|
|
||||||
process(*i) //~ NOTE impure due to access to impure function
|
|
||||||
}
|
|
||||||
@None => {}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn main() {
|
|
||||||
}
|
|
|
@ -50,18 +50,6 @@ fn box_imm_recs(v: @Outer) {
|
||||||
borrow(v.f.g.h); // OK
|
borrow(v.f.g.h); // OK
|
||||||
}
|
}
|
||||||
|
|
||||||
fn box_const(v: @const ~int) {
|
|
||||||
borrow(*v); //~ ERROR illegal borrow unless pure
|
|
||||||
}
|
|
||||||
|
|
||||||
fn box_const_rec(v: @const Rec) {
|
|
||||||
borrow(v.f); //~ ERROR illegal borrow unless pure
|
|
||||||
}
|
|
||||||
|
|
||||||
fn box_const_recs(v: @const Outer) {
|
|
||||||
borrow(v.f.g.h); //~ ERROR illegal borrow unless pure
|
|
||||||
}
|
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,17 +0,0 @@
|
||||||
fn mutate(x: &mut @const int) {
|
|
||||||
*x = @3;
|
|
||||||
}
|
|
||||||
|
|
||||||
fn give_away1(y: @mut @mut int) {
|
|
||||||
mutate(y); //~ ERROR values differ in mutability
|
|
||||||
}
|
|
||||||
|
|
||||||
fn give_away2(y: @mut @const int) {
|
|
||||||
mutate(y);
|
|
||||||
}
|
|
||||||
|
|
||||||
fn give_away3(y: @mut @int) {
|
|
||||||
mutate(y); //~ ERROR values differ in mutability
|
|
||||||
}
|
|
||||||
|
|
||||||
fn main() {}
|
|
|
@ -11,7 +11,6 @@
|
||||||
#[legacy_modes];
|
#[legacy_modes];
|
||||||
|
|
||||||
fn takes_mut(&&x: @mut int) { }
|
fn takes_mut(&&x: @mut int) { }
|
||||||
fn takes_const(&&x: @const int) { }
|
|
||||||
fn takes_imm(&&x: @int) { }
|
fn takes_imm(&&x: @int) { }
|
||||||
|
|
||||||
fn apply<T>(t: T, f: &fn(T)) {
|
fn apply<T>(t: T, f: &fn(T)) {
|
||||||
|
@ -20,10 +19,8 @@ fn apply<T>(t: T, f: &fn(T)) {
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
apply(@3, takes_mut); //~ ERROR (values differ in mutability)
|
apply(@3, takes_mut); //~ ERROR (values differ in mutability)
|
||||||
apply(@3, takes_const);
|
|
||||||
apply(@3, takes_imm);
|
apply(@3, takes_imm);
|
||||||
|
|
||||||
apply(@mut 3, takes_mut);
|
apply(@mut 3, takes_mut);
|
||||||
apply(@mut 3, takes_const);
|
|
||||||
apply(@mut 3, takes_imm); //~ ERROR (values differ in mutability)
|
apply(@mut 3, takes_imm); //~ ERROR (values differ in mutability)
|
||||||
}
|
}
|
||||||
|
|
|
@ -25,9 +25,6 @@ fn main() {
|
||||||
// @mut int.
|
// @mut int.
|
||||||
let f: @mut int = r();
|
let f: @mut int = r();
|
||||||
|
|
||||||
// OK.
|
|
||||||
let g: @const int = r();
|
|
||||||
|
|
||||||
// Bad.
|
// Bad.
|
||||||
let h: @int = r(); //~ ERROR (values differ in mutability)
|
let h: @int = r(); //~ ERROR (values differ in mutability)
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,19 +0,0 @@
|
||||||
// Copyright 2012 The Rust Project Developers. See the COPYRIGHT
|
|
||||||
// file at the top-level directory of this distribution and at
|
|
||||||
// http://rust-lang.org/COPYRIGHT.
|
|
||||||
//
|
|
||||||
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
|
||||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
|
||||||
// option. This file may not be copied, modified, or distributed
|
|
||||||
// except according to those terms.
|
|
||||||
|
|
||||||
fn main() {
|
|
||||||
fn f(&&v: @const int) {
|
|
||||||
*v = 1 //~ ERROR assigning to dereference of const @ pointer
|
|
||||||
}
|
|
||||||
|
|
||||||
let v = @0;
|
|
||||||
|
|
||||||
f(v);
|
|
||||||
}
|
|
|
@ -1,33 +0,0 @@
|
||||||
// Copyright 2012 The Rust Project Developers. See the COPYRIGHT
|
|
||||||
// file at the top-level directory of this distribution and at
|
|
||||||
// http://rust-lang.org/COPYRIGHT.
|
|
||||||
//
|
|
||||||
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
|
||||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
|
||||||
// option. This file may not be copied, modified, or distributed
|
|
||||||
// except according to those terms.
|
|
||||||
|
|
||||||
struct box_impl<T> {
|
|
||||||
f: T,
|
|
||||||
}
|
|
||||||
|
|
||||||
fn box_impl<T>(f: T) -> box_impl<T> {
|
|
||||||
box_impl {
|
|
||||||
f: f
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn set_box_impl<T>(b: box_impl<@const T>, v: @const T) {
|
|
||||||
b.f = v;
|
|
||||||
}
|
|
||||||
|
|
||||||
fn main() {
|
|
||||||
let b = box_impl::<@int>(@3);
|
|
||||||
set_box_impl(b, @mut 5);
|
|
||||||
//~^ ERROR values differ in mutability
|
|
||||||
|
|
||||||
// No error when type of parameter actually IS @const int
|
|
||||||
let b = box_impl::<@const int>(@3);
|
|
||||||
set_box_impl(b, @mut 5);
|
|
||||||
}
|
|
|
@ -1,30 +0,0 @@
|
||||||
// Copyright 2012 The Rust Project Developers. See the COPYRIGHT
|
|
||||||
// file at the top-level directory of this distribution and at
|
|
||||||
// http://rust-lang.org/COPYRIGHT.
|
|
||||||
//
|
|
||||||
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
|
||||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
|
||||||
// option. This file may not be copied, modified, or distributed
|
|
||||||
// except according to those terms.
|
|
||||||
|
|
||||||
struct box<T> {
|
|
||||||
f: T
|
|
||||||
}
|
|
||||||
|
|
||||||
struct box_impl<T>(box<T>);
|
|
||||||
|
|
||||||
fn set_box_impl<T>(b: box_impl<@const T>, v: @const T) {
|
|
||||||
b.f = v;
|
|
||||||
}
|
|
||||||
|
|
||||||
fn main() {
|
|
||||||
let b = box_impl::<@int>(box::<@int> {f: @3});
|
|
||||||
set_box_impl(b, @mut 5);
|
|
||||||
//~^ ERROR values differ in mutability
|
|
||||||
|
|
||||||
// No error when type of parameter actually IS @const int
|
|
||||||
let x: @const int = @3; // only way I could find to upcast
|
|
||||||
let b = box_impl::<@const int>(box::<@const int>{f: x});
|
|
||||||
set_box_impl(b, @mut 5);
|
|
||||||
}
|
|
|
@ -1,41 +0,0 @@
|
||||||
// Copyright 2012 The Rust Project Developers. See the COPYRIGHT
|
|
||||||
// file at the top-level directory of this distribution and at
|
|
||||||
// http://rust-lang.org/COPYRIGHT.
|
|
||||||
//
|
|
||||||
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
|
||||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
|
||||||
// option. This file may not be copied, modified, or distributed
|
|
||||||
// except according to those terms.
|
|
||||||
|
|
||||||
trait box_trait<T> {
|
|
||||||
fn get(&self) -> T;
|
|
||||||
fn set(&self, t: T);
|
|
||||||
}
|
|
||||||
|
|
||||||
struct box<T> {
|
|
||||||
f: T
|
|
||||||
}
|
|
||||||
|
|
||||||
struct box_impl<T>(box<T>);
|
|
||||||
|
|
||||||
impl<T:Copy> box_trait<T> for box_impl<T> {
|
|
||||||
fn get(&self) -> T { return self.f; }
|
|
||||||
fn set(&self, t: T) { self.f = t; }
|
|
||||||
}
|
|
||||||
|
|
||||||
fn set_box_trait<T>(b: @box_trait<@const T>, v: @const T) {
|
|
||||||
b.set(v);
|
|
||||||
}
|
|
||||||
|
|
||||||
fn set_box_impl<T>(b: box_impl<@const T>, v: @const T) {
|
|
||||||
b.set(v);
|
|
||||||
}
|
|
||||||
|
|
||||||
fn main() {
|
|
||||||
let b = box_impl::<@int>(box::<@int> {f: @3});
|
|
||||||
set_box_trait(@b as @box_trait<@int>, @mut 5);
|
|
||||||
//~^ ERROR values differ in mutability
|
|
||||||
set_box_impl(b, @mut 5);
|
|
||||||
//~^ ERROR values differ in mutability
|
|
||||||
}
|
|
|
@ -10,22 +10,12 @@
|
||||||
|
|
||||||
trait Mumbo {
|
trait Mumbo {
|
||||||
fn jumbo(&self, x: @uint) -> uint;
|
fn jumbo(&self, x: @uint) -> uint;
|
||||||
fn jambo(&self, x: @const uint) -> uint;
|
|
||||||
fn jbmbo(&self) -> @uint;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Mumbo for uint {
|
impl Mumbo for uint {
|
||||||
// Cannot have a larger effect than the trait:
|
// Cannot have a larger effect than the trait:
|
||||||
unsafe fn jumbo(&self, x: @uint) { *self + *x; }
|
unsafe fn jumbo(&self, x: @uint) { *self + *x; }
|
||||||
//~^ ERROR expected impure fn but found unsafe fn
|
//~^ ERROR expected impure fn but found unsafe fn
|
||||||
|
|
||||||
// Cannot accept a narrower range of parameters:
|
|
||||||
fn jambo(&self, x: @uint) { *self + *x; }
|
|
||||||
//~^ ERROR values differ in mutability
|
|
||||||
|
|
||||||
// Cannot return a wider range of values:
|
|
||||||
fn jbmbo(&self) -> @const uint { @const 0 }
|
|
||||||
//~^ ERROR values differ in mutability
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
|
|
@ -1,31 +0,0 @@
|
||||||
// Copyright 2012 The Rust Project Developers. See the COPYRIGHT
|
|
||||||
// file at the top-level directory of this distribution and at
|
|
||||||
// http://rust-lang.org/COPYRIGHT.
|
|
||||||
//
|
|
||||||
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
|
||||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
|
||||||
// option. This file may not be copied, modified, or distributed
|
|
||||||
// except according to those terms.
|
|
||||||
|
|
||||||
trait Mumbo {
|
|
||||||
fn jumbo(&self, x: @uint) -> uint;
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Mumbo for uint {
|
|
||||||
// Note: this method def is ok, it is more accepting and
|
|
||||||
// less effecting than the trait method:
|
|
||||||
pure fn jumbo(&self, x: @const uint) -> uint { *self + *x }
|
|
||||||
}
|
|
||||||
|
|
||||||
fn main() {
|
|
||||||
let a = 3u;
|
|
||||||
let b = a.jumbo(@mut 6);
|
|
||||||
|
|
||||||
let x = @a as @Mumbo;
|
|
||||||
let y = x.jumbo(@mut 6); //~ ERROR values differ in mutability
|
|
||||||
let z = x.jumbo(@6);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue