mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-25 08:13:41 +00:00
Rollup merge of #106949 - compiler-errors:is-poly, r=BoxyUwU
ConstBlocks are poly if their substs are poly r? `@BoxyUwU` fixes #106926
This commit is contained in:
commit
9bcc46ee90
@ -10,17 +10,17 @@ ty_utils_address_and_deref_not_supported = dereferencing or taking the address i
|
||||
|
||||
ty_utils_array_not_supported = array construction is not supported in generic constants
|
||||
|
||||
ty_utils_block_not_supported = blocks are not supported in generic constant
|
||||
ty_utils_block_not_supported = blocks are not supported in generic constants
|
||||
|
||||
ty_utils_never_to_any_not_supported = converting nevers to any is not supported in generic constant
|
||||
ty_utils_never_to_any_not_supported = converting nevers to any is not supported in generic constants
|
||||
|
||||
ty_utils_tuple_not_supported = tuple construction is not supported in generic constants
|
||||
|
||||
ty_utils_index_not_supported = indexing is not supported in generic constant
|
||||
ty_utils_index_not_supported = indexing is not supported in generic constants
|
||||
|
||||
ty_utils_field_not_supported = field access is not supported in generic constant
|
||||
ty_utils_field_not_supported = field access is not supported in generic constants
|
||||
|
||||
ty_utils_const_block_not_supported = const blocks are not supported in generic constant
|
||||
ty_utils_const_block_not_supported = const blocks are not supported in generic constants
|
||||
|
||||
ty_utils_adt_not_supported = struct/enum construction is not supported in generic constants
|
||||
|
||||
@ -44,4 +44,4 @@ ty_utils_control_flow_not_supported = control flow is not supported in generic c
|
||||
|
||||
ty_utils_inline_asm_not_supported = assembly is not supported in generic constants
|
||||
|
||||
ty_utils_operation_not_supported = unsupported operation in generic constant
|
||||
ty_utils_operation_not_supported = unsupported operation in generic constants
|
||||
|
@ -302,13 +302,53 @@ impl<'a, 'tcx> IsThirPolymorphic<'a, 'tcx> {
|
||||
}
|
||||
|
||||
match expr.kind {
|
||||
thir::ExprKind::NamedConst { substs, .. } => substs.has_non_region_param(),
|
||||
thir::ExprKind::NamedConst { substs, .. }
|
||||
| thir::ExprKind::ConstBlock { substs, .. } => substs.has_non_region_param(),
|
||||
thir::ExprKind::ConstParam { .. } => true,
|
||||
thir::ExprKind::Repeat { value, count } => {
|
||||
self.visit_expr(&self.thir()[value]);
|
||||
count.has_non_region_param()
|
||||
}
|
||||
_ => false,
|
||||
thir::ExprKind::Scope { .. }
|
||||
| thir::ExprKind::Box { .. }
|
||||
| thir::ExprKind::If { .. }
|
||||
| thir::ExprKind::Call { .. }
|
||||
| thir::ExprKind::Deref { .. }
|
||||
| thir::ExprKind::Binary { .. }
|
||||
| thir::ExprKind::LogicalOp { .. }
|
||||
| thir::ExprKind::Unary { .. }
|
||||
| thir::ExprKind::Cast { .. }
|
||||
| thir::ExprKind::Use { .. }
|
||||
| thir::ExprKind::NeverToAny { .. }
|
||||
| thir::ExprKind::Pointer { .. }
|
||||
| thir::ExprKind::Loop { .. }
|
||||
| thir::ExprKind::Let { .. }
|
||||
| thir::ExprKind::Match { .. }
|
||||
| thir::ExprKind::Block { .. }
|
||||
| thir::ExprKind::Assign { .. }
|
||||
| thir::ExprKind::AssignOp { .. }
|
||||
| thir::ExprKind::Field { .. }
|
||||
| thir::ExprKind::Index { .. }
|
||||
| thir::ExprKind::VarRef { .. }
|
||||
| thir::ExprKind::UpvarRef { .. }
|
||||
| thir::ExprKind::Borrow { .. }
|
||||
| thir::ExprKind::AddressOf { .. }
|
||||
| thir::ExprKind::Break { .. }
|
||||
| thir::ExprKind::Continue { .. }
|
||||
| thir::ExprKind::Return { .. }
|
||||
| thir::ExprKind::Array { .. }
|
||||
| thir::ExprKind::Tuple { .. }
|
||||
| thir::ExprKind::Adt(_)
|
||||
| thir::ExprKind::PlaceTypeAscription { .. }
|
||||
| thir::ExprKind::ValueTypeAscription { .. }
|
||||
| thir::ExprKind::Closure(_)
|
||||
| thir::ExprKind::Literal { .. }
|
||||
| thir::ExprKind::NonHirLiteral { .. }
|
||||
| thir::ExprKind::ZstLiteral { .. }
|
||||
| thir::ExprKind::StaticRef { .. }
|
||||
| thir::ExprKind::InlineAsm(_)
|
||||
| thir::ExprKind::ThreadLocalRef(_)
|
||||
| thir::ExprKind::Yield { .. } => false,
|
||||
}
|
||||
}
|
||||
fn pat_is_poly(&mut self, pat: &thir::Pat<'tcx>) -> bool {
|
||||
|
@ -10,7 +10,7 @@ error: overly complex generic constant
|
||||
--> $DIR/array-size-in-generic-struct-param.rs:19:15
|
||||
|
|
||||
LL | arr: [u8; CFG.arr_size],
|
||||
| ^^^^^^^^^^^^ field access is not supported in generic constant
|
||||
| ^^^^^^^^^^^^ field access is not supported in generic constants
|
||||
|
|
||||
= help: consider moving this anonymous constant into a `const` function
|
||||
= note: this operation may be supported in the future
|
||||
|
@ -0,0 +1,11 @@
|
||||
#![feature(inline_const, generic_const_exprs)]
|
||||
//~^ WARN the feature `generic_const_exprs` is incomplete
|
||||
|
||||
fn foo<T>() {
|
||||
let _ = [0u8; const { std::mem::size_of::<T>() }];
|
||||
//~^ ERROR: overly complex generic constant
|
||||
}
|
||||
|
||||
fn main() {
|
||||
foo::<i32>();
|
||||
}
|
@ -0,0 +1,20 @@
|
||||
warning: the feature `generic_const_exprs` is incomplete and may not be safe to use and/or cause compiler crashes
|
||||
--> $DIR/const-block-is-poly.rs:1:26
|
||||
|
|
||||
LL | #![feature(inline_const, generic_const_exprs)]
|
||||
| ^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: see issue #76560 <https://github.com/rust-lang/rust/issues/76560> for more information
|
||||
= note: `#[warn(incomplete_features)]` on by default
|
||||
|
||||
error: overly complex generic constant
|
||||
--> $DIR/const-block-is-poly.rs:5:19
|
||||
|
|
||||
LL | let _ = [0u8; const { std::mem::size_of::<T>() }];
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ const blocks are not supported in generic constants
|
||||
|
|
||||
= help: consider moving this anonymous constant into a `const` function
|
||||
= note: this operation may be supported in the future
|
||||
|
||||
error: aborting due to previous error; 1 warning emitted
|
||||
|
@ -2,7 +2,7 @@ error: overly complex generic constant
|
||||
--> $DIR/let-bindings.rs:6:68
|
||||
|
|
||||
LL | fn test<const N: usize>() -> [u8; { let x = N; N + 1 }] where [u8; { let x = N; N + 1 }]: Default {
|
||||
| ^^^^^^^^^^^^^^^^^^^^ blocks are not supported in generic constant
|
||||
| ^^^^^^^^^^^^^^^^^^^^ blocks are not supported in generic constants
|
||||
|
|
||||
= help: consider moving this anonymous constant into a `const` function
|
||||
= note: this operation may be supported in the future
|
||||
@ -11,7 +11,7 @@ error: overly complex generic constant
|
||||
--> $DIR/let-bindings.rs:6:35
|
||||
|
|
||||
LL | fn test<const N: usize>() -> [u8; { let x = N; N + 1 }] where [u8; { let x = N; N + 1 }]: Default {
|
||||
| ^^^^^^^^^^^^^^^^^^^^ blocks are not supported in generic constant
|
||||
| ^^^^^^^^^^^^^^^^^^^^ blocks are not supported in generic constants
|
||||
|
|
||||
= help: consider moving this anonymous constant into a `const` function
|
||||
= note: this operation may be supported in the future
|
||||
|
@ -2,7 +2,7 @@ error: overly complex generic constant
|
||||
--> $DIR/unused_expr.rs:4:34
|
||||
|
|
||||
LL | fn add<const N: usize>() -> [u8; { N + 1; 5 }] {
|
||||
| ^^^^^^^^^^^^ blocks are not supported in generic constant
|
||||
| ^^^^^^^^^^^^ blocks are not supported in generic constants
|
||||
|
|
||||
= help: consider moving this anonymous constant into a `const` function
|
||||
= note: this operation may be supported in the future
|
||||
@ -11,7 +11,7 @@ error: overly complex generic constant
|
||||
--> $DIR/unused_expr.rs:9:34
|
||||
|
|
||||
LL | fn div<const N: usize>() -> [u8; { N / 1; 5 }] {
|
||||
| ^^^^^^^^^^^^ blocks are not supported in generic constant
|
||||
| ^^^^^^^^^^^^ blocks are not supported in generic constants
|
||||
|
|
||||
= help: consider moving this anonymous constant into a `const` function
|
||||
= note: this operation may be supported in the future
|
||||
@ -20,7 +20,7 @@ error: overly complex generic constant
|
||||
--> $DIR/unused_expr.rs:16:38
|
||||
|
|
||||
LL | fn fn_call<const N: usize>() -> [u8; { foo(N); 5 }] {
|
||||
| ^^^^^^^^^^^^^ blocks are not supported in generic constant
|
||||
| ^^^^^^^^^^^^^ blocks are not supported in generic constants
|
||||
|
|
||||
= help: consider moving this anonymous constant into a `const` function
|
||||
= note: this operation may be supported in the future
|
||||
|
@ -8,7 +8,7 @@ LL | | let x: Option<Box<Self>> = None;
|
||||
LL | |
|
||||
LL | | 0
|
||||
LL | | }],
|
||||
| |_____^ blocks are not supported in generic constant
|
||||
| |_____^ blocks are not supported in generic constants
|
||||
|
|
||||
= help: consider moving this anonymous constant into a `const` function
|
||||
= note: this operation may be supported in the future
|
||||
|
@ -7,7 +7,7 @@ LL | | let x: Option<S> = None;
|
||||
LL | |
|
||||
LL | | 0
|
||||
LL | | }],
|
||||
| |_____^ blocks are not supported in generic constant
|
||||
| |_____^ blocks are not supported in generic constants
|
||||
|
|
||||
= help: consider moving this anonymous constant into a `const` function
|
||||
= note: this operation may be supported in the future
|
||||
|
@ -7,7 +7,7 @@ LL | | let x: Option<Box<S>> = None;
|
||||
LL | |
|
||||
LL | | 0
|
||||
LL | | }],
|
||||
| |_____^ blocks are not supported in generic constant
|
||||
| |_____^ blocks are not supported in generic constants
|
||||
|
|
||||
= help: consider moving this anonymous constant into a `const` function
|
||||
= note: this operation may be supported in the future
|
||||
|
@ -2,7 +2,7 @@ error: overly complex generic constant
|
||||
--> $DIR/issue-77357.rs:6:46
|
||||
|
|
||||
LL | fn bug<'a, T>() -> &'static dyn MyTrait<[(); { |x: &'a u32| { x }; 4 }]> {
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^ blocks are not supported in generic constant
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^ blocks are not supported in generic constants
|
||||
|
|
||||
= help: consider moving this anonymous constant into a `const` function
|
||||
= note: this operation may be supported in the future
|
||||
|
Loading…
Reference in New Issue
Block a user