Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions compiler/rustc_hir_typeck/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -200,6 +200,14 @@ fn typeck_with_inspect<'tcx>(
let wf_code = ObligationCauseCode::WellFormed(Some(WellFormedLoc::Ty(def_id)));
fcx.register_wf_obligation(expected_type.into(), body.value.span, wf_code);

if let hir::Node::AnonConst(_) = node {
fcx.require_type_is_sized(
expected_type,
body.value.span,
ObligationCauseCode::SizedConstOrStatic,
);
}

fcx.check_expr_coercible_to_type(body.value, expected_type, None);

fcx.write_ty(id, expected_type);
Expand Down
16 changes: 0 additions & 16 deletions tests/crashes/137582.rs

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
// regression test for issue #137582, where constant evaluating an unsized AnonConst would ICE

#![feature(adt_const_params)]

mod lib {
pub type Matrix = [&'static u32];

const EMPTY_MATRIX: Matrix = [[0; 4]; 4];
//~^ ERROR the size for values of type `[&'static u32]` cannot be known at compilation time
//~| ERROR mismatched types
//~| ERROR mismatched types

pub struct Walk<const CURRENT: usize, const REMAINING: Matrix> {
//~^ ERROR use of unstable library feature `unsized_const_params`
_p: (),
}

impl<const CURRENT: usize> Walk<CURRENT, EMPTY_MATRIX> {}
//~^ ERROR the size for values of type `[&'static u32]` cannot be known at compilation time
}

fn main() {}
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
error[E0277]: the size for values of type `[&'static u32]` cannot be known at compilation time
--> $DIR/unsized-anon-const-err-1.rs:8:25
|
LL | const EMPTY_MATRIX: Matrix = [[0; 4]; 4];
| ^^^^^^ doesn't have a size known at compile-time
|
= help: the trait `Sized` is not implemented for `[&'static u32]`
= note: statics and constants must have a statically known size

error[E0658]: use of unstable library feature `unsized_const_params`
--> $DIR/unsized-anon-const-err-1.rs:13:43
|
LL | pub struct Walk<const CURRENT: usize, const REMAINING: Matrix> {
| ^^^^^^^^^^^^^^^^^^^^^^^
|
= help: add `#![feature(unsized_const_params)]` to the crate attributes to enable
= note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date
= note: required for `[&'static u32]` to implement `ConstParamTy_`

error[E0277]: the size for values of type `[&'static u32]` cannot be known at compilation time
--> $DIR/unsized-anon-const-err-1.rs:18:46
|
LL | impl<const CURRENT: usize> Walk<CURRENT, EMPTY_MATRIX> {}
| ^^^^^^^^^^^^ doesn't have a size known at compile-time
|
= help: the trait `Sized` is not implemented for `[&'static u32]`
= note: statics and constants must have a statically known size

error[E0308]: mismatched types
--> $DIR/unsized-anon-const-err-1.rs:8:35
|
LL | const EMPTY_MATRIX: Matrix = [[0; 4]; 4];
| ^^^^^^ expected `&u32`, found `[{integer}; 4]`

error[E0308]: mismatched types
--> $DIR/unsized-anon-const-err-1.rs:8:34
|
LL | const EMPTY_MATRIX: Matrix = [[0; 4]; 4];
| ^^^^^^^^^^^ expected `[&u32]`, found `[&u32; 4]`

error: aborting due to 5 previous errors

Some errors have detailed explanations: E0277, E0308, E0658.
For more information about an error, try `rustc --explain E0277`.
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
// regression test for issue #151591, where constant evaluating an unsized AnonConst would ICE

#![feature(adt_const_params)]
#![feature(unsized_const_params)]
//~^ WARN the feature `unsized_const_params` is incomplete and may not be safe to use and/or cause compiler crashes

#[derive(Clone)]
struct S<const L: [u8]>;

const A: [u8];
//~^ ERROR free constant item without body
//~| ERROR the size for values of type `[u8]` cannot be known at compilation time

impl<const N: i32> Copy for S<A> {}
//~^ ERROR the size for values of type `[u8]` cannot be known at compilation time
//~| ERROR the const parameter `N` is not constrained by the impl trait, self type, or predicates
impl<const M: usize> Copy for S<A> {}
//~^ ERROR the size for values of type `[u8]` cannot be known at compilation time
//~| ERROR the const parameter `M` is not constrained by the impl trait, self type, or predicates

fn main() {}
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
error: free constant item without body
--> $DIR/unsized-anon-const-err-2.rs:10:1
|
LL | const A: [u8];
| ^^^^^^^^^^^^^-
| |
| help: provide a definition for the constant: `= <expr>;`

warning: the feature `unsized_const_params` is incomplete and may not be safe to use and/or cause compiler crashes
--> $DIR/unsized-anon-const-err-2.rs:4:12
|
LL | #![feature(unsized_const_params)]
| ^^^^^^^^^^^^^^^^^^^^
|
= note: see issue #95174 <https://github.com/rust-lang/rust/issues/95174> for more information
= note: `#[warn(incomplete_features)]` on by default

error[E0277]: the size for values of type `[u8]` cannot be known at compilation time
--> $DIR/unsized-anon-const-err-2.rs:10:10
|
LL | const A: [u8];
| ^^^^ doesn't have a size known at compile-time
|
= help: the trait `Sized` is not implemented for `[u8]`
= note: statics and constants must have a statically known size

error[E0277]: the size for values of type `[u8]` cannot be known at compilation time
--> $DIR/unsized-anon-const-err-2.rs:14:31
|
LL | impl<const N: i32> Copy for S<A> {}
| ^ doesn't have a size known at compile-time
|
= help: the trait `Sized` is not implemented for `[u8]`
= note: statics and constants must have a statically known size

error[E0277]: the size for values of type `[u8]` cannot be known at compilation time
--> $DIR/unsized-anon-const-err-2.rs:17:33
|
LL | impl<const M: usize> Copy for S<A> {}
| ^ doesn't have a size known at compile-time
|
= help: the trait `Sized` is not implemented for `[u8]`
= note: statics and constants must have a statically known size

error[E0207]: the const parameter `N` is not constrained by the impl trait, self type, or predicates
--> $DIR/unsized-anon-const-err-2.rs:14:6
|
LL | impl<const N: i32> Copy for S<A> {}
| ^^^^^^^^^^^^ unconstrained const parameter
|
= note: expressions using a const parameter must map each value to a distinct output value
= note: proving the result of expressions other than the parameter are unique is not supported

error[E0207]: the const parameter `M` is not constrained by the impl trait, self type, or predicates
--> $DIR/unsized-anon-const-err-2.rs:17:6
|
LL | impl<const M: usize> Copy for S<A> {}
| ^^^^^^^^^^^^^^ unconstrained const parameter
|
= note: expressions using a const parameter must map each value to a distinct output value
= note: proving the result of expressions other than the parameter are unique is not supported

error: aborting due to 6 previous errors; 1 warning emitted

Some errors have detailed explanations: E0207, E0277.
For more information about an error, try `rustc --explain E0207`.
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
// manually reduced reproduction of issue #137582, where constant evaluating an unsized AnonConst
// would ICE

#![feature(adt_const_params)]

fn func<const V: [u32]>() {}
//~^ ERROR use of unstable library feature `unsized_const_params`

const VALUE: [u32] = [0; 4];
//~^ ERROR mismatched types
//~| ERROR the size for values of type `[u32]` cannot be known at compilation time

fn main() {
func::<VALUE>();
//~^ ERROR the size for values of type `[u32]` cannot be known at compilation time
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
error[E0658]: use of unstable library feature `unsized_const_params`
--> $DIR/unsized-anon-const-func-err.rs:6:9
|
LL | fn func<const V: [u32]>() {}
| ^^^^^^^^^^^^^^
|
= help: add `#![feature(unsized_const_params)]` to the crate attributes to enable
= note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date
= note: required for `[u32]` to implement `ConstParamTy_`

error[E0277]: the size for values of type `[u32]` cannot be known at compilation time
--> $DIR/unsized-anon-const-func-err.rs:9:14
|
LL | const VALUE: [u32] = [0; 4];
| ^^^^^ doesn't have a size known at compile-time
|
= help: the trait `Sized` is not implemented for `[u32]`
= note: statics and constants must have a statically known size

error[E0308]: mismatched types
--> $DIR/unsized-anon-const-func-err.rs:9:22
|
LL | const VALUE: [u32] = [0; 4];
| ^^^^^^ expected `[u32]`, found `[u32; 4]`

error[E0277]: the size for values of type `[u32]` cannot be known at compilation time
--> $DIR/unsized-anon-const-func-err.rs:14:12
|
LL | func::<VALUE>();
| ^^^^^ doesn't have a size known at compile-time
|
= help: the trait `Sized` is not implemented for `[u32]`
= note: statics and constants must have a statically known size

error: aborting due to 4 previous errors

Some errors have detailed explanations: E0277, E0308, E0658.
For more information about an error, try `rustc --explain E0277`.
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
// manually reduced reproduction of issue #137582, where constant evaluating an unsized AnonConst
// would ICE

#![feature(adt_const_params)]

const VALUE: [u32] = [0; 4];
//~^ ERROR the size for values of type `[u32]` cannot be known at compilation time
//~| ERROR mismatched types

struct SomeStruct<const V: [u32]> {}
//~^ ERROR use of unstable library feature `unsized_const_params`

impl SomeStruct<VALUE> {}
//~^ ERROR the size for values of type `[u32]` cannot be known at compilation time

fn main() {}
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
error[E0277]: the size for values of type `[u32]` cannot be known at compilation time
--> $DIR/unsized-anon-const-struct-err.rs:6:14
|
LL | const VALUE: [u32] = [0; 4];
| ^^^^^ doesn't have a size known at compile-time
|
= help: the trait `Sized` is not implemented for `[u32]`
= note: statics and constants must have a statically known size

error[E0658]: use of unstable library feature `unsized_const_params`
--> $DIR/unsized-anon-const-struct-err.rs:10:19
|
LL | struct SomeStruct<const V: [u32]> {}
| ^^^^^^^^^^^^^^
|
= help: add `#![feature(unsized_const_params)]` to the crate attributes to enable
= note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date
= note: required for `[u32]` to implement `ConstParamTy_`

error[E0277]: the size for values of type `[u32]` cannot be known at compilation time
--> $DIR/unsized-anon-const-struct-err.rs:13:17
|
LL | impl SomeStruct<VALUE> {}
| ^^^^^ doesn't have a size known at compile-time
|
= help: the trait `Sized` is not implemented for `[u32]`
= note: statics and constants must have a statically known size

error[E0308]: mismatched types
--> $DIR/unsized-anon-const-struct-err.rs:6:22
|
LL | const VALUE: [u32] = [0; 4];
| ^^^^^^ expected `[u32]`, found `[u32; 4]`

error: aborting due to 4 previous errors

Some errors have detailed explanations: E0277, E0308, E0658.
For more information about an error, try `rustc --explain E0277`.
Loading