fix is_const_context
This commit is contained in:
parent
672b272077
commit
72a2d35f16
7 changed files with 12 additions and 85 deletions
|
@ -374,6 +374,16 @@ impl<'hir> Map<'hir> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn enclosing_body_owner(&self, hir_id: HirId) -> HirId {
|
||||||
|
for (parent, _) in self.parent_iter(hir_id) {
|
||||||
|
if let Some(body) = self.maybe_body_owned_by(parent) {
|
||||||
|
return self.body_owner(body);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bug!("no `enclosing_body_owner` for hir_id `{}`", hir_id);
|
||||||
|
}
|
||||||
|
|
||||||
/// Returns the `HirId` that corresponds to the definition of
|
/// Returns the `HirId` that corresponds to the definition of
|
||||||
/// which this is the body of, i.e., a `fn`, `const` or `static`
|
/// which this is the body of, i.e., a `fn`, `const` or `static`
|
||||||
/// item (possibly associated), a closure, or a `hir::AnonConst`.
|
/// item (possibly associated), a closure, or a `hir::AnonConst`.
|
||||||
|
@ -577,17 +587,7 @@ impl<'hir> Map<'hir> {
|
||||||
/// Whether the expression pointed at by `hir_id` belongs to a `const` evaluation context.
|
/// Whether the expression pointed at by `hir_id` belongs to a `const` evaluation context.
|
||||||
/// Used exclusively for diagnostics, to avoid suggestion function calls.
|
/// Used exclusively for diagnostics, to avoid suggestion function calls.
|
||||||
pub fn is_const_context(&self, hir_id: HirId) -> bool {
|
pub fn is_const_context(&self, hir_id: HirId) -> bool {
|
||||||
let parent_id = self.get_parent_item(hir_id);
|
self.body_const_context(self.local_def_id(self.enclosing_body_owner(hir_id))).is_some()
|
||||||
match self.get(parent_id) {
|
|
||||||
Node::Item(&Item { kind: ItemKind::Const(..) | ItemKind::Static(..), .. })
|
|
||||||
| Node::TraitItem(&TraitItem { kind: TraitItemKind::Const(..), .. })
|
|
||||||
| Node::ImplItem(&ImplItem { kind: ImplItemKind::Const(..), .. })
|
|
||||||
| Node::AnonConst(_) => true,
|
|
||||||
Node::Item(&Item { kind: ItemKind::Fn(ref sig, ..), .. }) => {
|
|
||||||
sig.header.constness == Constness::Const
|
|
||||||
}
|
|
||||||
_ => false,
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Whether `hir_id` corresponds to a `mod` or a crate.
|
/// Whether `hir_id` corresponds to a `mod` or a crate.
|
||||||
|
|
|
@ -495,7 +495,7 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> {
|
||||||
let closure_id = hir.as_local_hir_id(self.mir_def_id.expect_local());
|
let closure_id = hir.as_local_hir_id(self.mir_def_id.expect_local());
|
||||||
let fn_call_id = hir.get_parent_node(closure_id);
|
let fn_call_id = hir.get_parent_node(closure_id);
|
||||||
let node = hir.get(fn_call_id);
|
let node = hir.get(fn_call_id);
|
||||||
let item_id = hir.get_parent_item(fn_call_id);
|
let item_id = hir.enclosing_body_owner(fn_call_id);
|
||||||
let mut look_at_return = true;
|
let mut look_at_return = true;
|
||||||
// If we can detect the expression to be an `fn` call where the closure was an argument,
|
// If we can detect the expression to be an `fn` call where the closure was an argument,
|
||||||
// we point at the `fn` definition argument...
|
// we point at the `fn` definition argument...
|
||||||
|
|
|
@ -11,10 +11,6 @@ LL | | }
|
||||||
| |_- in this macro invocation
|
| |_- in this macro invocation
|
||||||
|
|
|
|
||||||
= note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info)
|
= note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||||
help: you can convert an `i32` to `isize` and panic if the converted value wouldn't fit
|
|
||||||
|
|
|
||||||
LL | $( $v = $s::V.try_into().unwrap(), )*
|
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
||||||
|
|
||||||
error[E0308]: mismatched types
|
error[E0308]: mismatched types
|
||||||
--> $DIR/enum-discr-type-err.rs:18:21
|
--> $DIR/enum-discr-type-err.rs:18:21
|
||||||
|
@ -29,10 +25,6 @@ LL | | }
|
||||||
| |_- in this macro invocation
|
| |_- in this macro invocation
|
||||||
|
|
|
|
||||||
= note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info)
|
= note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||||
help: you can convert an `i32` to `isize` and panic if the converted value wouldn't fit
|
|
||||||
|
|
|
||||||
LL | $( $v = $s::V.try_into().unwrap(), )*
|
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
||||||
|
|
||||||
error: aborting due to 2 previous errors
|
error: aborting due to 2 previous errors
|
||||||
|
|
||||||
|
|
|
@ -3,88 +3,48 @@ error[E0308]: mismatched types
|
||||||
|
|
|
|
||||||
LL | OhNo = 0_u8,
|
LL | OhNo = 0_u8,
|
||||||
| ^^^^ expected `i8`, found `u8`
|
| ^^^^ expected `i8`, found `u8`
|
||||||
|
|
|
||||||
help: change the type of the numeric literal from `u8` to `i8`
|
|
||||||
|
|
|
||||||
LL | OhNo = 0_i8,
|
|
||||||
| ^^^^
|
|
||||||
|
|
||||||
error[E0308]: mismatched types
|
error[E0308]: mismatched types
|
||||||
--> $DIR/discrim-ill-typed.rs:30:16
|
--> $DIR/discrim-ill-typed.rs:30:16
|
||||||
|
|
|
|
||||||
LL | OhNo = 0_i8,
|
LL | OhNo = 0_i8,
|
||||||
| ^^^^ expected `u8`, found `i8`
|
| ^^^^ expected `u8`, found `i8`
|
||||||
|
|
|
||||||
help: change the type of the numeric literal from `i8` to `u8`
|
|
||||||
|
|
|
||||||
LL | OhNo = 0_u8,
|
|
||||||
| ^^^^
|
|
||||||
|
|
||||||
error[E0308]: mismatched types
|
error[E0308]: mismatched types
|
||||||
--> $DIR/discrim-ill-typed.rs:43:16
|
--> $DIR/discrim-ill-typed.rs:43:16
|
||||||
|
|
|
|
||||||
LL | OhNo = 0_u16,
|
LL | OhNo = 0_u16,
|
||||||
| ^^^^^ expected `i16`, found `u16`
|
| ^^^^^ expected `i16`, found `u16`
|
||||||
|
|
|
||||||
help: change the type of the numeric literal from `u16` to `i16`
|
|
||||||
|
|
|
||||||
LL | OhNo = 0_i16,
|
|
||||||
| ^^^^^
|
|
||||||
|
|
||||||
error[E0308]: mismatched types
|
error[E0308]: mismatched types
|
||||||
--> $DIR/discrim-ill-typed.rs:56:16
|
--> $DIR/discrim-ill-typed.rs:56:16
|
||||||
|
|
|
|
||||||
LL | OhNo = 0_i16,
|
LL | OhNo = 0_i16,
|
||||||
| ^^^^^ expected `u16`, found `i16`
|
| ^^^^^ expected `u16`, found `i16`
|
||||||
|
|
|
||||||
help: change the type of the numeric literal from `i16` to `u16`
|
|
||||||
|
|
|
||||||
LL | OhNo = 0_u16,
|
|
||||||
| ^^^^^
|
|
||||||
|
|
||||||
error[E0308]: mismatched types
|
error[E0308]: mismatched types
|
||||||
--> $DIR/discrim-ill-typed.rs:69:16
|
--> $DIR/discrim-ill-typed.rs:69:16
|
||||||
|
|
|
|
||||||
LL | OhNo = 0_u32,
|
LL | OhNo = 0_u32,
|
||||||
| ^^^^^ expected `i32`, found `u32`
|
| ^^^^^ expected `i32`, found `u32`
|
||||||
|
|
|
||||||
help: change the type of the numeric literal from `u32` to `i32`
|
|
||||||
|
|
|
||||||
LL | OhNo = 0_i32,
|
|
||||||
| ^^^^^
|
|
||||||
|
|
||||||
error[E0308]: mismatched types
|
error[E0308]: mismatched types
|
||||||
--> $DIR/discrim-ill-typed.rs:82:16
|
--> $DIR/discrim-ill-typed.rs:82:16
|
||||||
|
|
|
|
||||||
LL | OhNo = 0_i32,
|
LL | OhNo = 0_i32,
|
||||||
| ^^^^^ expected `u32`, found `i32`
|
| ^^^^^ expected `u32`, found `i32`
|
||||||
|
|
|
||||||
help: change the type of the numeric literal from `i32` to `u32`
|
|
||||||
|
|
|
||||||
LL | OhNo = 0_u32,
|
|
||||||
| ^^^^^
|
|
||||||
|
|
||||||
error[E0308]: mismatched types
|
error[E0308]: mismatched types
|
||||||
--> $DIR/discrim-ill-typed.rs:95:16
|
--> $DIR/discrim-ill-typed.rs:95:16
|
||||||
|
|
|
|
||||||
LL | OhNo = 0_u64,
|
LL | OhNo = 0_u64,
|
||||||
| ^^^^^ expected `i64`, found `u64`
|
| ^^^^^ expected `i64`, found `u64`
|
||||||
|
|
|
||||||
help: change the type of the numeric literal from `u64` to `i64`
|
|
||||||
|
|
|
||||||
LL | OhNo = 0_i64,
|
|
||||||
| ^^^^^
|
|
||||||
|
|
||||||
error[E0308]: mismatched types
|
error[E0308]: mismatched types
|
||||||
--> $DIR/discrim-ill-typed.rs:108:16
|
--> $DIR/discrim-ill-typed.rs:108:16
|
||||||
|
|
|
|
||||||
LL | OhNo = 0_i64,
|
LL | OhNo = 0_i64,
|
||||||
| ^^^^^ expected `u64`, found `i64`
|
| ^^^^^ expected `u64`, found `i64`
|
||||||
|
|
|
||||||
help: change the type of the numeric literal from `i64` to `u64`
|
|
||||||
|
|
|
||||||
LL | OhNo = 0_u64,
|
|
||||||
| ^^^^^
|
|
||||||
|
|
||||||
error: aborting due to 8 previous errors
|
error: aborting due to 8 previous errors
|
||||||
|
|
||||||
|
|
|
@ -3,11 +3,6 @@ error[E0308]: mismatched types
|
||||||
|
|
|
|
||||||
LL | X = Trait::Number,
|
LL | X = Trait::Number,
|
||||||
| ^^^^^^^^^^^^^ expected `isize`, found `i32`
|
| ^^^^^^^^^^^^^ expected `isize`, found `i32`
|
||||||
|
|
|
||||||
help: you can convert an `i32` to `isize` and panic if the converted value wouldn't fit
|
|
||||||
|
|
|
||||||
LL | X = Trait::Number.try_into().unwrap(),
|
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
||||||
|
|
||||||
error: aborting due to previous error
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
|
|
@ -3,22 +3,12 @@ error[E0308]: mismatched types
|
||||||
|
|
|
|
||||||
LL | A = 1i64,
|
LL | A = 1i64,
|
||||||
| ^^^^ expected `isize`, found `i64`
|
| ^^^^ expected `isize`, found `i64`
|
||||||
|
|
|
||||||
help: change the type of the numeric literal from `i64` to `isize`
|
|
||||||
|
|
|
||||||
LL | A = 1isize,
|
|
||||||
| ^^^^^^
|
|
||||||
|
|
||||||
error[E0308]: mismatched types
|
error[E0308]: mismatched types
|
||||||
--> $DIR/issue-8761.rs:5:9
|
--> $DIR/issue-8761.rs:5:9
|
||||||
|
|
|
|
||||||
LL | B = 2u8
|
LL | B = 2u8
|
||||||
| ^^^ expected `isize`, found `u8`
|
| ^^^ expected `isize`, found `u8`
|
||||||
|
|
|
||||||
help: change the type of the numeric literal from `u8` to `isize`
|
|
||||||
|
|
|
||||||
LL | B = 2isize
|
|
||||||
| ^^^^^^
|
|
||||||
|
|
||||||
error: aborting due to 2 previous errors
|
error: aborting due to 2 previous errors
|
||||||
|
|
||||||
|
|
|
@ -39,22 +39,12 @@ error[E0308]: mismatched types
|
||||||
|
|
|
|
||||||
LL | let f = [0; -4_isize];
|
LL | let f = [0; -4_isize];
|
||||||
| ^^^^^^^^ expected `usize`, found `isize`
|
| ^^^^^^^^ expected `usize`, found `isize`
|
||||||
|
|
|
||||||
help: you can convert an `isize` to `usize` and panic if the converted value wouldn't fit
|
|
||||||
|
|
|
||||||
LL | let f = [0; (-4_isize).try_into().unwrap()];
|
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
||||||
|
|
||||||
error[E0308]: mismatched types
|
error[E0308]: mismatched types
|
||||||
--> $DIR/repeat_count.rs:22:23
|
--> $DIR/repeat_count.rs:22:23
|
||||||
|
|
|
|
||||||
LL | let f = [0_usize; -1_isize];
|
LL | let f = [0_usize; -1_isize];
|
||||||
| ^^^^^^^^ expected `usize`, found `isize`
|
| ^^^^^^^^ expected `usize`, found `isize`
|
||||||
|
|
|
||||||
help: you can convert an `isize` to `usize` and panic if the converted value wouldn't fit
|
|
||||||
|
|
|
||||||
LL | let f = [0_usize; (-1_isize).try_into().unwrap()];
|
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
||||||
|
|
||||||
error: aborting due to 8 previous errors
|
error: aborting due to 8 previous errors
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue