Rollup merge of #122370 - gurry:122199-ice-unexpected-node, r=davidtwco
Gracefully handle `AnonConst` in `diagnostic_hir_wf_check()` Instead of running the WF check on the `AnonConst` itself we run it on the `ty` of the generic param of which the `AnonConst` is the default value. Fixes #122199
This commit is contained in:
commit
f5ac009a27
@ -163,6 +163,16 @@ fn visit_ty(&mut self, ty: &'tcx hir::Ty<'tcx>) {
|
|||||||
kind: hir::GenericParamKind::Type { default: Some(ty), .. },
|
kind: hir::GenericParamKind::Type { default: Some(ty), .. },
|
||||||
..
|
..
|
||||||
}) => vec![*ty],
|
}) => vec![*ty],
|
||||||
|
hir::Node::AnonConst(_)
|
||||||
|
if let Some(const_param_id) =
|
||||||
|
tcx.hir().opt_const_param_default_param_def_id(hir_id)
|
||||||
|
&& let hir::Node::GenericParam(hir::GenericParam {
|
||||||
|
kind: hir::GenericParamKind::Const { ty, .. },
|
||||||
|
..
|
||||||
|
}) = tcx.hir_node_by_def_id(const_param_id) =>
|
||||||
|
{
|
||||||
|
vec![*ty]
|
||||||
|
}
|
||||||
ref node => bug!("Unexpected node {:?}", node),
|
ref node => bug!("Unexpected node {:?}", node),
|
||||||
},
|
},
|
||||||
WellFormedLoc::Param { function: _, param_idx } => {
|
WellFormedLoc::Param { function: _, param_idx } => {
|
||||||
|
12
tests/ui/wf/ice-hir-wf-check-anon-const-issue-122199.rs
Normal file
12
tests/ui/wf/ice-hir-wf-check-anon-const-issue-122199.rs
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
trait Trait<const N: Trait = bar> {
|
||||||
|
//~^ ERROR cannot find value `bar` in this scope
|
||||||
|
//~| ERROR cycle detected when computing type of `Trait::N`
|
||||||
|
//~| ERROR cycle detected when computing type of `Trait::N`
|
||||||
|
//~| ERROR `(dyn Trait<{const error}> + 'static)` is forbidden as the type of a const generic parameter
|
||||||
|
//~| WARN trait objects without an explicit `dyn` are deprecated
|
||||||
|
//~| WARN this is accepted in the current edition (Rust 2015) but is a hard error in Rust 2021!
|
||||||
|
fn fnc(&self) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {}
|
60
tests/ui/wf/ice-hir-wf-check-anon-const-issue-122199.stderr
Normal file
60
tests/ui/wf/ice-hir-wf-check-anon-const-issue-122199.stderr
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
error[E0425]: cannot find value `bar` in this scope
|
||||||
|
--> $DIR/ice-hir-wf-check-anon-const-issue-122199.rs:1:30
|
||||||
|
|
|
||||||
|
LL | trait Trait<const N: Trait = bar> {
|
||||||
|
| ^^^ not found in this scope
|
||||||
|
|
||||||
|
warning: trait objects without an explicit `dyn` are deprecated
|
||||||
|
--> $DIR/ice-hir-wf-check-anon-const-issue-122199.rs:1:22
|
||||||
|
|
|
||||||
|
LL | trait Trait<const N: Trait = bar> {
|
||||||
|
| ^^^^^
|
||||||
|
|
|
||||||
|
= warning: this is accepted in the current edition (Rust 2015) but is a hard error in Rust 2021!
|
||||||
|
= note: for more information, see <https://doc.rust-lang.org/nightly/edition-guide/rust-2021/warnings-promoted-to-error.html>
|
||||||
|
= note: `#[warn(bare_trait_objects)]` on by default
|
||||||
|
help: if this is an object-safe trait, use `dyn`
|
||||||
|
|
|
||||||
|
LL | trait Trait<const N: dyn Trait = bar> {
|
||||||
|
| +++
|
||||||
|
|
||||||
|
error[E0391]: cycle detected when computing type of `Trait::N`
|
||||||
|
--> $DIR/ice-hir-wf-check-anon-const-issue-122199.rs:1:22
|
||||||
|
|
|
||||||
|
LL | trait Trait<const N: Trait = bar> {
|
||||||
|
| ^^^^^
|
||||||
|
|
|
||||||
|
= note: ...which immediately requires computing type of `Trait::N` again
|
||||||
|
note: cycle used when computing explicit predicates of trait `Trait`
|
||||||
|
--> $DIR/ice-hir-wf-check-anon-const-issue-122199.rs:1:1
|
||||||
|
|
|
||||||
|
LL | trait Trait<const N: Trait = bar> {
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
= note: see https://rustc-dev-guide.rust-lang.org/overview.html#queries and https://rustc-dev-guide.rust-lang.org/query.html for more information
|
||||||
|
|
||||||
|
error[E0391]: cycle detected when computing type of `Trait::N`
|
||||||
|
--> $DIR/ice-hir-wf-check-anon-const-issue-122199.rs:1:13
|
||||||
|
|
|
||||||
|
LL | trait Trait<const N: Trait = bar> {
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
|
||||||
|
= note: ...which immediately requires computing type of `Trait::N` again
|
||||||
|
note: cycle used when computing explicit predicates of trait `Trait`
|
||||||
|
--> $DIR/ice-hir-wf-check-anon-const-issue-122199.rs:1:1
|
||||||
|
|
|
||||||
|
LL | trait Trait<const N: Trait = bar> {
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
= note: see https://rustc-dev-guide.rust-lang.org/overview.html#queries and https://rustc-dev-guide.rust-lang.org/query.html for more information
|
||||||
|
|
||||||
|
error: `(dyn Trait<{const error}> + 'static)` is forbidden as the type of a const generic parameter
|
||||||
|
--> $DIR/ice-hir-wf-check-anon-const-issue-122199.rs:1:22
|
||||||
|
|
|
||||||
|
LL | trait Trait<const N: Trait = bar> {
|
||||||
|
| ^^^^^
|
||||||
|
|
|
||||||
|
= note: the only supported types are integers, `bool` and `char`
|
||||||
|
|
||||||
|
error: aborting due to 4 previous errors; 1 warning emitted
|
||||||
|
|
||||||
|
Some errors have detailed explanations: E0391, E0425.
|
||||||
|
For more information about an error, try `rustc --explain E0391`.
|
Loading…
Reference in New Issue
Block a user