Dogfood {exclusive,half-open} ranges in compiler (nfc)
In particular, this allows us to write more explicit matches that avoid the pitfalls of using a fully general fall-through case, yet remain fairly ergonomic. Less logic is in guard cases, more is in the actual exhaustive case analysis. No functional changes.
This commit is contained in:
parent
a9cd294cf2
commit
0e88db7db4
@ -35,6 +35,8 @@
|
|||||||
#![feature(never_type)]
|
#![feature(never_type)]
|
||||||
#![feature(nll)]
|
#![feature(nll)]
|
||||||
#![feature(or_patterns)]
|
#![feature(or_patterns)]
|
||||||
|
#![feature(half_open_range_patterns)]
|
||||||
|
#![feature(exclusive_range_pattern)]
|
||||||
#![recursion_limit = "256"]
|
#![recursion_limit = "256"]
|
||||||
|
|
||||||
#[macro_use]
|
#[macro_use]
|
||||||
|
@ -250,13 +250,13 @@ fn check_must_use_ty<'tcx>(
|
|||||||
has_emitted
|
has_emitted
|
||||||
}
|
}
|
||||||
ty::Array(ty, len) => match len.try_eval_usize(cx.tcx, cx.param_env) {
|
ty::Array(ty, len) => match len.try_eval_usize(cx.tcx, cx.param_env) {
|
||||||
|
// If the array is empty we don't lint, to avoid false positives
|
||||||
|
Some(0) | None => false,
|
||||||
// If the array is definitely non-empty, we can do `#[must_use]` checking.
|
// If the array is definitely non-empty, we can do `#[must_use]` checking.
|
||||||
Some(n) if n != 0 => {
|
Some(n) => {
|
||||||
let descr_pre = &format!("{}array{} of ", descr_pre, plural_suffix,);
|
let descr_pre = &format!("{}array{} of ", descr_pre, plural_suffix,);
|
||||||
check_must_use_ty(cx, ty, expr, span, descr_pre, descr_post, n as usize + 1)
|
check_must_use_ty(cx, ty, expr, span, descr_pre, descr_post, n as usize + 1)
|
||||||
}
|
}
|
||||||
// Otherwise, we don't lint, to avoid false positives.
|
|
||||||
_ => false,
|
|
||||||
},
|
},
|
||||||
ty::Closure(..) => {
|
ty::Closure(..) => {
|
||||||
cx.struct_span_lint(UNUSED_MUST_USE, span, |lint| {
|
cx.struct_span_lint(UNUSED_MUST_USE, span, |lint| {
|
||||||
|
@ -47,6 +47,8 @@
|
|||||||
#![feature(associated_type_bounds)]
|
#![feature(associated_type_bounds)]
|
||||||
#![feature(rustc_attrs)]
|
#![feature(rustc_attrs)]
|
||||||
#![feature(int_error_matching)]
|
#![feature(int_error_matching)]
|
||||||
|
#![feature(half_open_range_patterns)]
|
||||||
|
#![feature(exclusive_range_pattern)]
|
||||||
#![recursion_limit = "512"]
|
#![recursion_limit = "512"]
|
||||||
|
|
||||||
#[macro_use]
|
#[macro_use]
|
||||||
|
@ -201,13 +201,13 @@ fn uninhabited_from(&self, tcx: TyCtxt<'tcx>, param_env: ty::ParamEnv<'tcx>) ->
|
|||||||
),
|
),
|
||||||
|
|
||||||
Array(ty, len) => match len.try_eval_usize(tcx, param_env) {
|
Array(ty, len) => match len.try_eval_usize(tcx, param_env) {
|
||||||
|
Some(0) | None => DefIdForest::empty(),
|
||||||
// If the array is definitely non-empty, it's uninhabited if
|
// If the array is definitely non-empty, it's uninhabited if
|
||||||
// the type of its elements is uninhabited.
|
// the type of its elements is uninhabited.
|
||||||
Some(n) if n != 0 => ty.uninhabited_from(tcx, param_env),
|
Some(1..) => ty.uninhabited_from(tcx, param_env),
|
||||||
_ => DefIdForest::empty(),
|
|
||||||
},
|
},
|
||||||
|
|
||||||
// References to uninitialised memory is valid for any type, including
|
// References to uninitialised memory are valid for any type, including
|
||||||
// uninhabited types, in unsafe code, so we treat all references as
|
// uninhabited types, in unsafe code, so we treat all references as
|
||||||
// inhabited.
|
// inhabited.
|
||||||
// The precise semantics of inhabitedness with respect to references is currently
|
// The precise semantics of inhabitedness with respect to references is currently
|
||||||
|
@ -1834,10 +1834,10 @@ pub fn conservative_is_privately_uninhabited(&self, tcx: TyCtxt<'tcx>) -> bool {
|
|||||||
}
|
}
|
||||||
ty::Array(ty, len) => {
|
ty::Array(ty, len) => {
|
||||||
match len.try_eval_usize(tcx, ParamEnv::empty()) {
|
match len.try_eval_usize(tcx, ParamEnv::empty()) {
|
||||||
|
Some(0) | None => false,
|
||||||
// If the array is definitely non-empty, it's uninhabited if
|
// If the array is definitely non-empty, it's uninhabited if
|
||||||
// the type of its elements is uninhabited.
|
// the type of its elements is uninhabited.
|
||||||
Some(n) if n != 0 => ty.conservative_is_privately_uninhabited(tcx),
|
Some(1..) => ty.conservative_is_privately_uninhabited(tcx),
|
||||||
_ => false,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ty::Ref(..) => {
|
ty::Ref(..) => {
|
||||||
|
@ -153,14 +153,14 @@ fn find_libdir(sysroot: &Path) -> Cow<'static, str> {
|
|||||||
const SECONDARY_LIB_DIR: &str = "lib";
|
const SECONDARY_LIB_DIR: &str = "lib";
|
||||||
|
|
||||||
match option_env!("CFG_LIBDIR_RELATIVE") {
|
match option_env!("CFG_LIBDIR_RELATIVE") {
|
||||||
Some(libdir) if libdir != "lib" => libdir.into(),
|
None | Some("lib") => {
|
||||||
_ => {
|
|
||||||
if sysroot.join(PRIMARY_LIB_DIR).join(RUST_LIB_DIR).exists() {
|
if sysroot.join(PRIMARY_LIB_DIR).join(RUST_LIB_DIR).exists() {
|
||||||
PRIMARY_LIB_DIR.into()
|
PRIMARY_LIB_DIR.into()
|
||||||
} else {
|
} else {
|
||||||
SECONDARY_LIB_DIR.into()
|
SECONDARY_LIB_DIR.into()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Some(libdir) => libdir.into(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user