Rollup merge of #74934 - nbdd0121:issue-73976, r=ecstatic-morse
Improve diagnostics when constant pattern is too generic This PR is a follow-up to PR #74538 and issue #73976 When constants queries Layout, TypeId or type_name of a generic parameter, instead of emitting `could not evaluate constant pattern`, we will instead emit a more detailed message `constant pattern depends on a generic parameter`.
This commit is contained in:
commit
b0d426165f
|
@ -16,7 +16,7 @@ use rustc_hir::pat_util::EnumerateAndAdjustIterator;
|
||||||
use rustc_hir::RangeEnd;
|
use rustc_hir::RangeEnd;
|
||||||
use rustc_index::vec::Idx;
|
use rustc_index::vec::Idx;
|
||||||
use rustc_middle::mir::interpret::{get_slice_bytes, sign_extend, ConstValue};
|
use rustc_middle::mir::interpret::{get_slice_bytes, sign_extend, ConstValue};
|
||||||
use rustc_middle::mir::interpret::{LitToConstError, LitToConstInput};
|
use rustc_middle::mir::interpret::{ErrorHandled, LitToConstError, LitToConstInput};
|
||||||
use rustc_middle::mir::UserTypeProjection;
|
use rustc_middle::mir::UserTypeProjection;
|
||||||
use rustc_middle::mir::{BorrowKind, Field, Mutability};
|
use rustc_middle::mir::{BorrowKind, Field, Mutability};
|
||||||
use rustc_middle::ty::subst::{GenericArg, SubstsRef};
|
use rustc_middle::ty::subst::{GenericArg, SubstsRef};
|
||||||
|
@ -834,6 +834,12 @@ impl<'a, 'tcx> PatCtxt<'a, 'tcx> {
|
||||||
pattern
|
pattern
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Err(ErrorHandled::TooGeneric) => {
|
||||||
|
// While `Reported | Linted` cases will have diagnostics emitted already
|
||||||
|
// it is not true for TooGeneric case, so we need to give user more information.
|
||||||
|
self.tcx.sess.span_err(span, "constant pattern depends on a generic parameter");
|
||||||
|
pat_from_kind(PatKind::Wild)
|
||||||
|
}
|
||||||
Err(_) => {
|
Err(_) => {
|
||||||
self.tcx.sess.span_err(span, "could not evaluate constant pattern");
|
self.tcx.sess.span_err(span, "could not evaluate constant pattern");
|
||||||
pat_from_kind(PatKind::Wild)
|
pat_from_kind(PatKind::Wild)
|
||||||
|
|
|
@ -17,8 +17,8 @@ impl<T: 'static> GetTypeId<T> {
|
||||||
|
|
||||||
const fn check_type_id<T: 'static>() -> bool {
|
const fn check_type_id<T: 'static>() -> bool {
|
||||||
matches!(GetTypeId::<T>::VALUE, GetTypeId::<T>::VALUE)
|
matches!(GetTypeId::<T>::VALUE, GetTypeId::<T>::VALUE)
|
||||||
//~^ ERROR could not evaluate constant pattern
|
//~^ ERROR constant pattern depends on a generic parameter
|
||||||
//~| ERROR could not evaluate constant pattern
|
//~| ERROR constant pattern depends on a generic parameter
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct GetTypeNameLen<T>(T);
|
pub struct GetTypeNameLen<T>(T);
|
||||||
|
@ -29,8 +29,8 @@ impl<T: 'static> GetTypeNameLen<T> {
|
||||||
|
|
||||||
const fn check_type_name_len<T: 'static>() -> bool {
|
const fn check_type_name_len<T: 'static>() -> bool {
|
||||||
matches!(GetTypeNameLen::<T>::VALUE, GetTypeNameLen::<T>::VALUE)
|
matches!(GetTypeNameLen::<T>::VALUE, GetTypeNameLen::<T>::VALUE)
|
||||||
//~^ ERROR could not evaluate constant pattern
|
//~^ ERROR constant pattern depends on a generic parameter
|
||||||
//~| ERROR could not evaluate constant pattern
|
//~| ERROR constant pattern depends on a generic parameter
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
|
|
|
@ -1,22 +1,22 @@
|
||||||
error: could not evaluate constant pattern
|
error: constant pattern depends on a generic parameter
|
||||||
--> $DIR/issue-73976-polymorphic.rs:19:37
|
--> $DIR/issue-73976-polymorphic.rs:19:37
|
||||||
|
|
|
|
||||||
LL | matches!(GetTypeId::<T>::VALUE, GetTypeId::<T>::VALUE)
|
LL | matches!(GetTypeId::<T>::VALUE, GetTypeId::<T>::VALUE)
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
error: could not evaluate constant pattern
|
error: constant pattern depends on a generic parameter
|
||||||
--> $DIR/issue-73976-polymorphic.rs:31:42
|
--> $DIR/issue-73976-polymorphic.rs:31:42
|
||||||
|
|
|
|
||||||
LL | matches!(GetTypeNameLen::<T>::VALUE, GetTypeNameLen::<T>::VALUE)
|
LL | matches!(GetTypeNameLen::<T>::VALUE, GetTypeNameLen::<T>::VALUE)
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
error: could not evaluate constant pattern
|
error: constant pattern depends on a generic parameter
|
||||||
--> $DIR/issue-73976-polymorphic.rs:19:37
|
--> $DIR/issue-73976-polymorphic.rs:19:37
|
||||||
|
|
|
|
||||||
LL | matches!(GetTypeId::<T>::VALUE, GetTypeId::<T>::VALUE)
|
LL | matches!(GetTypeId::<T>::VALUE, GetTypeId::<T>::VALUE)
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
error: could not evaluate constant pattern
|
error: constant pattern depends on a generic parameter
|
||||||
--> $DIR/issue-73976-polymorphic.rs:31:42
|
--> $DIR/issue-73976-polymorphic.rs:31:42
|
||||||
|
|
|
|
||||||
LL | matches!(GetTypeNameLen::<T>::VALUE, GetTypeNameLen::<T>::VALUE)
|
LL | matches!(GetTypeNameLen::<T>::VALUE, GetTypeNameLen::<T>::VALUE)
|
||||||
|
|
Loading…
Reference in New Issue