bool: intern_ty(arena, interner, ty_bool),
char: intern_ty(arena, interner, ty_char),
err: intern_ty(arena, interner, ty_err),
- int: intern_ty(arena, interner, ty_int(ast::TyIs(_))),
+ int: intern_ty(arena, interner, ty_int(ast::TyIs(false))),
i8: intern_ty(arena, interner, ty_int(ast::TyI8)),
i16: intern_ty(arena, interner, ty_int(ast::TyI16)),
i32: intern_ty(arena, interner, ty_int(ast::TyI32)),
i64: intern_ty(arena, interner, ty_int(ast::TyI64)),
- uint: intern_ty(arena, interner, ty_uint(ast::TyUs(_))),
+ uint: intern_ty(arena, interner, ty_uint(ast::TyUs(false))),
u8: intern_ty(arena, interner, ty_uint(ast::TyU8)),
u16: intern_ty(arena, interner, ty_uint(ast::TyU16)),
u32: intern_ty(arena, interner, ty_uint(ast::TyU32)),
}
match unsized_part_of_type(cx.tcx(), t).sty {
- ty::ty_str | ty::ty_vec(..) => Type::uint_from_ty(cx, ast::TyUs(_)),
+ ty::ty_str | ty::ty_vec(..) => Type::uint_from_ty(cx, ast::TyUs(false)),
ty::ty_trait(_) => Type::vtable_ptr(cx),
_ => panic!("Unexpected type returned from unsized_part_of_type : {}",
t.repr(cx.tcx()))
// OIBIT specific features
("optin_builtin_traits", Active),
+ // int and uint are now deprecated
+ ("int_uint", Active),
+
// These are used to test this portion of the compiler, they don't actually
// mean anything
("test_accepted_feature", Accepted),
}
}
+ fn warn_feature(&self, feature: &str, span: Span, explain: &str) {
+ if !self.has_feature(feature) {
+ self.span_handler.span_warn(span, explain);
+ self.span_handler.span_help(span, &format!("add #![feature({})] to the \
+ crate attributes to silence this warning",
+ feature)[]);
+ }
+ }
fn has_feature(&self, feature: &str) -> bool {
self.features.iter().any(|&n| n == feature)
}
}
fn visit_ty(&mut self, t: &ast::Ty) {
+ match t.node {
+ ast::TyPath(ref p, _) => {
+ match &*p.segments {
+
+ [ast::PathSegment { identifier, .. }] => {
+ let name = token::get_ident(identifier);
+ let msg = if name == "int" {
+ Some("the `int` type is deprecated; \
+ use `isize` or a fixed-sized integer")
+ } else if name == "uint" {
+ Some("the `unt` type is deprecated; \
+ use `usize` or a fixed-sized integer")
+ } else {
+ None
+ };
+
+ if let Some(msg) = msg {
+ self.context.warn_feature("int_uint", t.span, msg)
+ }
+ }
+ _ => {}
+ }
+ }
+ _ => {}
+ }
visit::walk_ty(self, t);
}
"box expression syntax is experimental in alpha release; \
you can call `Box::new` instead.");
}
+ ast::ExprLit(ref lit) => {
+ match lit.node {
+ ast::LitInt(_, ty) => {
+ let msg = if let ast::SignedIntLit(ast::TyIs(true), _) = ty {
+ Some("the `i` suffix on integers is deprecated; use `is` \
+ or one of the fixed-sized suffixes")
+ } else if let ast::UnsignedIntLit(ast::TyUs(true)) = ty {
+ Some("the `u` suffix on integers is deprecated; use `us` \
+ or one of the fixed-sized suffixes")
+ } else {
+ None
+ };
+ if let Some(msg) = msg {
+ self.context.warn_feature("int_uint", e.span, msg);
+ }
+ }
+ _ => {}
+ }
+ }
_ => {}
}
visit::walk_expr(self, e);
--- /dev/null
+// Copyright 2015 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.
+
+#![allow(dead_code)]
+
+mod u {
+ type X = uint; //~ WARN the `uint` type is deprecated
+ struct Foo {
+ x: uint //~ WARN the `uint` type is deprecated
+ }
+ fn bar(x: uint) { //~ WARN the `uint` type is deprecated
+ 1u; //~ WARN the `u` suffix on integers is deprecated
+ }
+}
+mod i {
+ type X = int; //~ WARN the `int` type is deprecated
+ struct Foo {
+ x: int //~ WARN the `int` type is deprecated
+ }
+ fn bar(x: int) { //~ WARN the `int` type is deprecated
+ 1i; //~ WARN the `u` suffix on integers is deprecated
+ }
+}
+
+fn main() {
+ // make compilation fail, after feature gating
+ let () = 1u8; //~ ERROR
+}