mirror of
https://github.com/rust-lang/rust.git
synced 2024-12-03 12:13:43 +00:00
Add a warning feature gate for int/uint in types and i/u suffixes.
This commit is contained in:
parent
e95779554e
commit
d12514bc58
@ -2341,12 +2341,12 @@ impl<'tcx> CommonTypes<'tcx> {
|
|||||||
bool: intern_ty(arena, interner, ty_bool),
|
bool: intern_ty(arena, interner, ty_bool),
|
||||||
char: intern_ty(arena, interner, ty_char),
|
char: intern_ty(arena, interner, ty_char),
|
||||||
err: intern_ty(arena, interner, ty_err),
|
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)),
|
i8: intern_ty(arena, interner, ty_int(ast::TyI8)),
|
||||||
i16: intern_ty(arena, interner, ty_int(ast::TyI16)),
|
i16: intern_ty(arena, interner, ty_int(ast::TyI16)),
|
||||||
i32: intern_ty(arena, interner, ty_int(ast::TyI32)),
|
i32: intern_ty(arena, interner, ty_int(ast::TyI32)),
|
||||||
i64: intern_ty(arena, interner, ty_int(ast::TyI64)),
|
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)),
|
u8: intern_ty(arena, interner, ty_uint(ast::TyU8)),
|
||||||
u16: intern_ty(arena, interner, ty_uint(ast::TyU16)),
|
u16: intern_ty(arena, interner, ty_uint(ast::TyU16)),
|
||||||
u32: intern_ty(arena, interner, ty_uint(ast::TyU32)),
|
u32: intern_ty(arena, interner, ty_uint(ast::TyU32)),
|
||||||
|
@ -263,7 +263,7 @@ pub fn type_of<'a, 'tcx>(cx: &CrateContext<'a, 'tcx>, t: Ty<'tcx>) -> Type {
|
|||||||
}
|
}
|
||||||
|
|
||||||
match unsized_part_of_type(cx.tcx(), t).sty {
|
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),
|
ty::ty_trait(_) => Type::vtable_ptr(cx),
|
||||||
_ => panic!("Unexpected type returned from unsized_part_of_type : {}",
|
_ => panic!("Unexpected type returned from unsized_part_of_type : {}",
|
||||||
t.repr(cx.tcx()))
|
t.repr(cx.tcx()))
|
||||||
|
@ -93,6 +93,9 @@ static KNOWN_FEATURES: &'static [(&'static str, Status)] = &[
|
|||||||
// OIBIT specific features
|
// OIBIT specific features
|
||||||
("optin_builtin_traits", Active),
|
("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
|
// These are used to test this portion of the compiler, they don't actually
|
||||||
// mean anything
|
// mean anything
|
||||||
("test_accepted_feature", Accepted),
|
("test_accepted_feature", Accepted),
|
||||||
@ -157,6 +160,14 @@ impl<'a> Context<'a> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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 {
|
fn has_feature(&self, feature: &str) -> bool {
|
||||||
self.features.iter().any(|&n| n == feature)
|
self.features.iter().any(|&n| n == feature)
|
||||||
}
|
}
|
||||||
@ -334,6 +345,31 @@ impl<'a, 'v> Visitor<'v> for PostExpansionVisitor<'a> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn visit_ty(&mut self, t: &ast::Ty) {
|
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);
|
visit::walk_ty(self, t);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -345,6 +381,25 @@ impl<'a, 'v> Visitor<'v> for PostExpansionVisitor<'a> {
|
|||||||
"box expression syntax is experimental in alpha release; \
|
"box expression syntax is experimental in alpha release; \
|
||||||
you can call `Box::new` instead.");
|
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);
|
visit::walk_expr(self, e);
|
||||||
|
35
src/test/compile-fail/feature-gate-int-uint.rs
Normal file
35
src/test/compile-fail/feature-gate-int-uint.rs
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
// 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
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user