Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
int
Rust
提交
bac3eec6
R
Rust
项目概览
int
/
Rust
大约 1 年 前同步成功
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
Rust
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
bac3eec6
编写于
1月 11, 2016
作者:
O
Oliver Schneider
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
[breaking-change] remove negate_unsigned feature gate
上级
69e1f57d
变更
11
隐藏空白更改
内联
并排
Showing
11 changed file
with
179 addition
and
90 deletion
+179
-90
src/librustc_lint/lib.rs
src/librustc_lint/lib.rs
+2
-0
src/librustc_lint/types.rs
src/librustc_lint/types.rs
+51
-33
src/libsyntax/feature_gate.rs
src/libsyntax/feature_gate.rs
+1
-4
src/test/compile-fail/const-eval-overflow.rs
src/test/compile-fail/const-eval-overflow.rs
+4
-5
src/test/compile-fail/const-eval-overflow0.rs
src/test/compile-fail/const-eval-overflow0.rs
+100
-0
src/test/compile-fail/enum-discrim-too-small.rs
src/test/compile-fail/enum-discrim-too-small.rs
+0
-1
src/test/compile-fail/feature-gate-negate-unsigned.rs
src/test/compile-fail/feature-gate-negate-unsigned.rs
+11
-7
src/test/compile-fail/lint-type-limits.rs
src/test/compile-fail/lint-type-limits.rs
+0
-2
src/test/run-pass/bitwise.rs
src/test/run-pass/bitwise.rs
+2
-4
src/test/run-pass/intrinsics-integer.rs
src/test/run-pass/intrinsics-integer.rs
+8
-10
src/test/run-pass/unary-minus-suffix-inference.rs
src/test/run-pass/unary-minus-suffix-inference.rs
+0
-24
未找到文件。
src/librustc_lint/lib.rs
浏览文件 @
bac3eec6
...
...
@@ -38,6 +38,7 @@
#![feature(staged_api)]
#![feature(str_char)]
#[macro_use]
extern
crate
syntax
;
#[macro_use]
extern
crate
rustc
;
...
...
@@ -153,4 +154,5 @@ pub fn register_builtins(store: &mut lint::LintStore, sess: Option<&Session>) {
store
.register_renamed
(
"unknown_features"
,
"unused_features"
);
store
.register_removed
(
"unsigned_negation"
,
"replaced by negate_unsigned feature gate"
);
store
.register_removed
(
"negate_unsigned"
,
"cast a signed value instead"
);
}
src/librustc_lint/types.rs
浏览文件 @
bac3eec6
...
...
@@ -8,6 +8,8 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.
#![allow(non_snake_case)]
use
middle
::{
infer
};
use
middle
::
def_id
::
DefId
;
use
middle
::
subst
::
Substs
;
...
...
@@ -24,13 +26,39 @@
use
syntax
::{
abi
,
ast
};
use
syntax
::
attr
::{
self
,
AttrMetaMethods
};
use
syntax
::
codemap
::{
self
,
Span
};
use
syntax
::
feature_gate
::{
emit_feature_err
,
GateIssue
};
use
syntax
::
ast
::{
TyIs
,
TyUs
,
TyI8
,
TyU8
,
TyI16
,
TyU16
,
TyI32
,
TyU32
,
TyI64
,
TyU64
};
use
rustc_front
::
hir
;
use
rustc_front
::
intravisit
::{
self
,
Visitor
};
use
rustc_front
::
util
::
is_shift_binop
;
register_long_diagnostics!
{
E0519
:
r##"
It is not allowed to negate an unsigned integer.
You can negate a signed integer and cast it to an
unsigned integer or use the `!` operator.
```
let x: usize = -1isize as usize;
let y: usize = !0;
assert_eq!(x, y);
```
Alternatively you can use the `Wrapping` newtype
or the `wrapping_neg` operation that all
integral types support:
```
use std::num::Wrapping;
let x: Wrapping<usize> = -Wrapping(1);
let Wrapping(x) = x;
let y: usize = 1.wrapping_neg();
assert_eq!(x, y);
```
"##
}
declare_lint!
{
UNUSED_COMPARISONS
,
Warn
,
...
...
@@ -73,30 +101,24 @@ impl LateLintPass for TypeLimits {
fn
check_expr
(
&
mut
self
,
cx
:
&
LateContext
,
e
:
&
hir
::
Expr
)
{
match
e
.node
{
hir
::
ExprUnary
(
hir
::
UnNeg
,
ref
expr
)
=>
{
match
expr
.node
{
hir
::
ExprLit
(
ref
lit
)
=>
{
match
lit
.node
{
ast
::
LitInt
(
_
,
ast
::
UnsignedIntLit
(
_
))
=>
{
check_unsigned_negation_feature
(
cx
,
e
.span
);
},
ast
::
LitInt
(
_
,
ast
::
UnsuffixedIntLit
(
_
))
=>
{
if
let
ty
::
TyUint
(
_
)
=
cx
.tcx
.node_id_to_type
(
e
.id
)
.sty
{
check_unsigned_negation_feature
(
cx
,
e
.span
);
}
},
_
=>
()
}
},
_
=>
{
let
t
=
cx
.tcx
.node_id_to_type
(
expr
.id
);
match
t
.sty
{
ty
::
TyUint
(
_
)
=>
{
check_unsigned_negation_feature
(
cx
,
e
.span
);
},
_
=>
()
}
if
let
hir
::
ExprLit
(
ref
lit
)
=
expr
.node
{
match
lit
.node
{
ast
::
LitInt
(
_
,
ast
::
UnsignedIntLit
(
_
))
=>
{
forbid_unsigned_negation
(
cx
,
e
.span
);
},
ast
::
LitInt
(
_
,
ast
::
UnsuffixedIntLit
(
_
))
=>
{
if
let
ty
::
TyUint
(
_
)
=
cx
.tcx
.node_id_to_type
(
e
.id
)
.sty
{
forbid_unsigned_negation
(
cx
,
e
.span
);
}
},
_
=>
()
}
};
}
else
{
let
t
=
cx
.tcx
.node_id_to_type
(
expr
.id
);
if
let
ty
::
TyUint
(
_
)
=
t
.sty
{
forbid_unsigned_negation
(
cx
,
e
.span
);
}
}
// propagate negation, if the negation itself isn't negated
if
self
.negated_expr_id
!=
e
.id
{
self
.negated_expr_id
=
expr
.id
;
...
...
@@ -322,15 +344,11 @@ fn is_comparison(binop: hir::BinOp) -> bool {
}
}
fn
check_unsigned_negation_feature
(
cx
:
&
LateContext
,
span
:
Span
)
{
if
!
cx
.sess
()
.features
.borrow
()
.negate_unsigned
{
emit_feature_err
(
&
cx
.sess
()
.parse_sess.span_diagnostic
,
"negate_unsigned"
,
span
,
GateIssue
::
Language
,
"unary negation of unsigned integers may be removed in the future"
);
}
fn
forbid_unsigned_negation
(
cx
:
&
LateContext
,
span
:
Span
)
{
cx
.sess
()
.struct_span_err_with_code
(
span
,
"unary negation of unsigned integer"
,
"E0519"
)
.span_help
(
span
,
"use a cast or the `!` operator"
)
.emit
();
}
}
}
...
...
src/libsyntax/feature_gate.rs
浏览文件 @
bac3eec6
...
...
@@ -170,7 +170,7 @@
(
"slice_patterns"
,
"1.0.0"
,
Some
(
23121
),
Active
),
// Allows use of unary negate on unsigned integers, e.g. -e for e: u8
(
"negate_unsigned"
,
"1.0.0"
,
Some
(
29645
),
Active
),
(
"negate_unsigned"
,
"1.0.0"
,
Some
(
29645
),
Removed
),
// Allows the definition of associated constants in `trait` or `impl`
// blocks.
...
...
@@ -548,7 +548,6 @@ pub struct Features {
pub
allow_pushpop_unsafe
:
bool
,
pub
simd_ffi
:
bool
,
pub
unmarked_api
:
bool
,
pub
negate_unsigned
:
bool
,
/// spans of #![feature] attrs for stable language features. for error reporting
pub
declared_stable_lang_features
:
Vec
<
Span
>
,
/// #![feature] attrs for non-language (library) features
...
...
@@ -585,7 +584,6 @@ pub fn new() -> Features {
allow_pushpop_unsafe
:
false
,
simd_ffi
:
false
,
unmarked_api
:
false
,
negate_unsigned
:
false
,
declared_stable_lang_features
:
Vec
::
new
(),
declared_lib_features
:
Vec
::
new
(),
const_fn
:
false
,
...
...
@@ -1174,7 +1172,6 @@ fn check_crate_inner<F>(cm: &CodeMap, span_handler: &Handler,
allow_pushpop_unsafe
:
cx
.has_feature
(
"pushpop_unsafe"
),
simd_ffi
:
cx
.has_feature
(
"simd_ffi"
),
unmarked_api
:
cx
.has_feature
(
"unmarked_api"
),
negate_unsigned
:
cx
.has_feature
(
"negate_unsigned"
),
declared_stable_lang_features
:
accepted_features
,
declared_lib_features
:
unknown_features
,
const_fn
:
cx
.has_feature
(
"const_fn"
),
...
...
src/test/compile-fail/const-eval-overflow.rs
浏览文件 @
bac3eec6
...
...
@@ -9,7 +9,6 @@
// except according to those terms.
#![allow(unused_imports)]
#![feature(negate_unsigned)]
// Note: the relevant lint pass here runs before some of the constant
// evaluation below (e.g. that performed by trans and llvm), so if you
...
...
@@ -65,7 +64,7 @@
);
const
VALS_U8
:
(
u8
,
u8
,
u8
,
u8
)
=
(
-
u8
::
MIN
,
(
-
(
u8
::
MIN
as
i8
)
as
u8
,
u8
::
MIN
-
1
,
//~^ ERROR attempted to sub with overflow
u8
::
MAX
+
1
,
...
...
@@ -75,7 +74,7 @@
);
const
VALS_U16
:
(
u16
,
u16
,
u16
,
u16
)
=
(
-
u16
::
MIN
,
(
-
(
u16
::
MIN
as
i16
)
as
u16
,
u16
::
MIN
-
1
,
//~^ ERROR attempted to sub with overflow
u16
::
MAX
+
1
,
...
...
@@ -85,7 +84,7 @@
);
const
VALS_U32
:
(
u32
,
u32
,
u32
,
u32
)
=
(
-
u32
::
MIN
,
(
-
(
u32
::
MIN
as
i32
)
as
u32
,
u32
::
MIN
-
1
,
//~^ ERROR attempted to sub with overflow
u32
::
MAX
+
1
,
...
...
@@ -95,7 +94,7 @@
);
const
VALS_U64
:
(
u64
,
u64
,
u64
,
u64
)
=
(
-
u64
::
MIN
,
(
-
(
u64
::
MIN
as
i64
)
as
u64
,
u64
::
MIN
-
1
,
//~^ ERROR attempted to sub with overflow
u64
::
MAX
+
1
,
...
...
src/test/compile-fail/const-eval-overflow0.rs
0 → 100644
浏览文件 @
bac3eec6
// 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(unused_imports)]
// Note: the relevant lint pass here runs before some of the constant
// evaluation below (e.g. that performed by trans and llvm), so if you
// change this warn to a deny, then the compiler will exit before
// those errors are detected.
use
std
::
fmt
;
use
std
::{
i8
,
i16
,
i32
,
i64
,
isize
};
use
std
::{
u8
,
u16
,
u32
,
u64
,
usize
};
const
VALS_I8
:
(
i8
,
i8
,
i8
,
i8
)
=
(
-
i8
::
MIN
,
i8
::
MIN
-
1
,
i8
::
MAX
+
1
,
i8
::
MIN
*
2
,
);
const
VALS_I16
:
(
i16
,
i16
,
i16
,
i16
)
=
(
-
i16
::
MIN
,
i16
::
MIN
-
1
,
i16
::
MAX
+
1
,
i16
::
MIN
*
2
,
);
const
VALS_I32
:
(
i32
,
i32
,
i32
,
i32
)
=
(
-
i32
::
MIN
,
i32
::
MIN
-
1
,
i32
::
MAX
+
1
,
i32
::
MIN
*
2
,
);
const
VALS_I64
:
(
i64
,
i64
,
i64
,
i64
)
=
(
-
i64
::
MIN
,
i64
::
MIN
-
1
,
i64
::
MAX
+
1
,
i64
::
MAX
*
2
,
);
const
VALS_U8
:
(
u8
,
u8
,
u8
,
u8
)
=
(
-
u8
::
MIN
,
//~^ ERROR unary negation of unsigned integer
//~| HELP use a cast or the `!` operator
u8
::
MIN
-
1
,
u8
::
MAX
+
1
,
u8
::
MAX
*
2
,
);
const
VALS_U16
:
(
u16
,
u16
,
u16
,
u16
)
=
(
-
u16
::
MIN
,
//~^ ERROR unary negation of unsigned integer
//~| HELP use a cast or the `!` operator
u16
::
MIN
-
1
,
u16
::
MAX
+
1
,
u16
::
MAX
*
2
,
);
const
VALS_U32
:
(
u32
,
u32
,
u32
,
u32
)
=
(
-
u32
::
MIN
,
//~^ ERROR unary negation of unsigned integer
//~| HELP use a cast or the `!` operator
u32
::
MIN
-
1
,
u32
::
MAX
+
1
,
u32
::
MAX
*
2
,
);
const
VALS_U64
:
(
u64
,
u64
,
u64
,
u64
)
=
(
-
u64
::
MIN
,
//~^ ERROR unary negation of unsigned integer
//~| HELP use a cast or the `!` operator
u64
::
MIN
-
1
,
u64
::
MAX
+
1
,
u64
::
MAX
*
2
,
);
fn
main
()
{
foo
(
VALS_I8
);
foo
(
VALS_I16
);
foo
(
VALS_I32
);
foo
(
VALS_I64
);
foo
(
VALS_U8
);
foo
(
VALS_U16
);
foo
(
VALS_U32
);
foo
(
VALS_U64
);
}
fn
foo
<
T
:
fmt
::
Debug
>
(
x
:
T
)
{
println!
(
"{:?}"
,
x
);
}
src/test/compile-fail/enum-discrim-too-small.rs
浏览文件 @
bac3eec6
...
...
@@ -8,7 +8,6 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.
#![feature(negate_unsigned)]
#[repr(u8)]
//~ NOTE discriminant type specified here
enum
Eu8
{
...
...
src/test/compile-fail/feature-gate-negate-unsigned.rs
浏览文件 @
bac3eec6
...
...
@@ -8,8 +8,7 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.
// Test that negating unsigned integers is gated by `negate_unsigned` feature
// gate
// Test that negating unsigned integers doesn't compile
struct
S
;
impl
std
::
ops
::
Neg
for
S
{
...
...
@@ -18,21 +17,26 @@ fn neg(self) -> u32 { 0 }
}
const
_
MAX
:
usize
=
-
1
;
//~^ ERROR unary negation of unsigned integers may be removed in the future
//~^ ERROR unary negation of unsigned integer
//~| HELP use a cast or the `!` operator
fn
main
()
{
let
a
=
-
1
;
//~^ ERROR unary negation of unsigned integers may be removed in the future
//~^ ERROR unary negation of unsigned integer
//~| HELP use a cast or the `!` operator
let
_
b
:
u8
=
a
;
// for infering variable a to u8.
-
a
;
//~^ ERROR unary negation of unsigned integers may be removed in the future
//~^ ERROR unary negation of unsigned integer
//~| HELP use a cast or the `!` operator
let
_
d
=
-
1u8
;
//~^ ERROR unary negation of unsigned integers may be removed in the future
//~^ ERROR unary negation of unsigned integer
//~| HELP use a cast or the `!` operator
for
_
in
-
10
..
10u8
{}
//~^ ERROR unary negation of unsigned integers may be removed in the future
//~^ ERROR unary negation of unsigned integer
//~| HELP use a cast or the `!` operator
-
S
;
// should not trigger the gate; issue 26840
}
src/test/compile-fail/lint-type-limits.rs
浏览文件 @
bac3eec6
...
...
@@ -8,9 +8,7 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.
#![feature(negate_unsigned)]
#![allow(dead_code)]
#![feature(negate_unsigned)]
// compile-flags: -D unused-comparisons
fn
main
()
{
}
...
...
src/test/run-pass/bitwise.rs
浏览文件 @
bac3eec6
...
...
@@ -8,16 +8,14 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.
#![feature(negate_unsigned)]
#[cfg(any(target_arch
=
"x86"
,
target_arch
=
"arm"
))]
fn
target
()
{
assert_eq!
(
-
1000
as
usize
>>
3_u
size
,
536870787_u
size
);
assert_eq!
(
-
1000
isize
as
usize
>>
3_u
size
,
536870787_u
size
);
}
#[cfg(any(target_arch
=
"x86_64"
,
target_arch
=
"aarch64"
))]
fn
target
()
{
assert_eq!
(
-
1000
as
usize
>>
3_u
size
,
2305843009213693827_u
size
);
assert_eq!
(
-
1000
isize
as
usize
>>
3_u
size
,
2305843009213693827_u
size
);
}
fn
general
()
{
...
...
src/test/run-pass/intrinsics-integer.rs
浏览文件 @
bac3eec6
...
...
@@ -8,8 +8,6 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.
#![feature(negate_unsigned)]
#![feature(intrinsics)]
mod
rusti
{
...
...
@@ -45,10 +43,10 @@ pub fn main() {
assert_eq!
(
ctpop
(
100u32
),
3
);
assert_eq!
(
ctpop
(
100i32
),
3
);
assert_eq!
(
ctpop
(
100u64
),
3
);
assert_eq!
(
ctpop
(
100i64
),
3
);
assert_eq!
(
ctpop
(
-
1u8
),
8
);
assert_eq!
(
ctpop
(
-
1i8
),
8
);
assert_eq!
(
ctpop
(
-
1u16
),
16
);
assert_eq!
(
ctpop
(
-
1i16
),
16
);
assert_eq!
(
ctpop
(
-
1u32
),
32
);
assert_eq!
(
ctpop
(
-
1i32
),
32
);
assert_eq!
(
ctpop
(
-
1u64
),
64
);
assert_eq!
(
ctpop
(
-
1i64
),
64
);
assert_eq!
(
ctpop
(
-
1
i8
as
u8
),
8
);
assert_eq!
(
ctpop
(
-
1i8
),
8
);
assert_eq!
(
ctpop
(
-
1
i16
as
u16
),
16
);
assert_eq!
(
ctpop
(
-
1i16
),
16
);
assert_eq!
(
ctpop
(
-
1
i32
as
u32
),
32
);
assert_eq!
(
ctpop
(
-
1i32
),
32
);
assert_eq!
(
ctpop
(
-
1
i64
as
u64
),
64
);
assert_eq!
(
ctpop
(
-
1i64
),
64
);
assert_eq!
(
ctlz
(
0u8
),
8
);
assert_eq!
(
ctlz
(
0i8
),
8
);
assert_eq!
(
ctlz
(
0u16
),
16
);
assert_eq!
(
ctlz
(
0i16
),
16
);
...
...
@@ -70,10 +68,10 @@ pub fn main() {
assert_eq!
(
ctlz
(
100u32
),
25
);
assert_eq!
(
ctlz
(
100i32
),
25
);
assert_eq!
(
ctlz
(
100u64
),
57
);
assert_eq!
(
ctlz
(
100i64
),
57
);
assert_eq!
(
cttz
(
-
1u8
),
0
);
assert_eq!
(
cttz
(
-
1i8
),
0
);
assert_eq!
(
cttz
(
-
1u16
),
0
);
assert_eq!
(
cttz
(
-
1i16
),
0
);
assert_eq!
(
cttz
(
-
1u32
),
0
);
assert_eq!
(
cttz
(
-
1i32
),
0
);
assert_eq!
(
cttz
(
-
1u64
),
0
);
assert_eq!
(
cttz
(
-
1i64
),
0
);
assert_eq!
(
cttz
(
-
1
i8
as
u8
),
0
);
assert_eq!
(
cttz
(
-
1i8
),
0
);
assert_eq!
(
cttz
(
-
1
i16
as
u16
),
0
);
assert_eq!
(
cttz
(
-
1i16
),
0
);
assert_eq!
(
cttz
(
-
1
i32
as
u32
),
0
);
assert_eq!
(
cttz
(
-
1i32
),
0
);
assert_eq!
(
cttz
(
-
1
i64
as
u64
),
0
);
assert_eq!
(
cttz
(
-
1i64
),
0
);
assert_eq!
(
cttz
(
0u8
),
8
);
assert_eq!
(
cttz
(
0i8
),
8
);
assert_eq!
(
cttz
(
0u16
),
16
);
assert_eq!
(
cttz
(
0i16
),
16
);
...
...
src/test/run-pass/unary-minus-suffix-inference.rs
浏览文件 @
bac3eec6
...
...
@@ -8,8 +8,6 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.
#![feature(negate_unsigned)]
pub
fn
main
()
{
let
a
=
1
;
let
a_neg
:
i8
=
-
a
;
...
...
@@ -30,26 +28,4 @@ pub fn main() {
let
e
=
1
;
let
e_neg
:
isize
=
-
e
;
println!
(
"{}"
,
e_neg
);
// intentional overflows
let
f
=
1
;
let
f_neg
:
u8
=
-
f
;
println!
(
"{}"
,
f_neg
);
let
g
=
1
;
let
g_neg
:
u16
=
-
g
;
println!
(
"{}"
,
g_neg
);
let
h
=
1
;
let
h_neg
:
u32
=
-
h
;
println!
(
"{}"
,
h_neg
);
let
i
=
1
;
let
i_neg
:
u64
=
-
i
;
println!
(
"{}"
,
i_neg
);
let
j
=
1
;
let
j_neg
:
usize
=
-
j
;
println!
(
"{}"
,
j_neg
);
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录