Rollup merge of #61805 - davidtwco:ice-const-generic-repeat-expr-count-sequel, r=varkor
typeck: Fix ICE for blocks in repeat expr count. Fixes #61336 (again). This PR fixes an ICE that occured when a block expression resolving to a const generic was used for the count of an array repeat expression. r? @varkor
This commit is contained in:
commit
9e810a2775
3 changed files with 43 additions and 12 deletions
|
@ -2157,6 +2157,14 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
|
|||
|
||||
/// Returns the `DefId` of the constant parameter that the provided expression is a path to.
|
||||
pub fn const_param_def_id(&self, expr: &hir::Expr) -> Option<DefId> {
|
||||
// Unwrap a block, so that e.g. `{ P }` is recognised as a parameter. Const arguments
|
||||
// currently have to be wrapped in curly brackets, so it's necessary to special-case.
|
||||
let expr = match &expr.node {
|
||||
ExprKind::Block(block, _) if block.stmts.is_empty() && block.expr.is_some() =>
|
||||
block.expr.as_ref().unwrap(),
|
||||
_ => expr,
|
||||
};
|
||||
|
||||
match &expr.node {
|
||||
ExprKind::Path(hir::QPath::Resolved(_, path)) => match path.res {
|
||||
Res::Def(DefKind::ConstParam, did) => Some(did),
|
||||
|
@ -2184,18 +2192,7 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
|
|||
ty,
|
||||
};
|
||||
|
||||
let mut expr = &tcx.hir().body(ast_const.body).value;
|
||||
|
||||
// Unwrap a block, so that e.g. `{ P }` is recognised as a parameter. Const arguments
|
||||
// currently have to be wrapped in curly brackets, so it's necessary to special-case.
|
||||
if let ExprKind::Block(block, _) = &expr.node {
|
||||
if block.stmts.is_empty() {
|
||||
if let Some(trailing) = &block.expr {
|
||||
expr = &trailing;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
let expr = &tcx.hir().body(ast_const.body).value;
|
||||
if let Some(def_id) = self.const_param_def_id(expr) {
|
||||
// Find the name and index of the const parameter by indexing the generics of the
|
||||
// parent item and construct a `ParamConst`.
|
||||
|
|
16
src/test/ui/const-generics/issue-61336-2.rs
Normal file
16
src/test/ui/const-generics/issue-61336-2.rs
Normal file
|
@ -0,0 +1,16 @@
|
|||
#![feature(const_generics)]
|
||||
//~^ WARN the feature `const_generics` is incomplete and may cause the compiler to crash
|
||||
|
||||
fn f<T: Copy, const N: usize>(x: T) -> [T; N] {
|
||||
[x; {N}]
|
||||
}
|
||||
|
||||
fn g<T, const N: usize>(x: T) -> [T; N] {
|
||||
[x; {N}]
|
||||
//~^ ERROR the trait bound `T: std::marker::Copy` is not satisfied [E0277]
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let x: [u32; 5] = f::<u32, 5>(3);
|
||||
assert_eq!(x, [3u32; 5]);
|
||||
}
|
18
src/test/ui/const-generics/issue-61336-2.stderr
Normal file
18
src/test/ui/const-generics/issue-61336-2.stderr
Normal file
|
@ -0,0 +1,18 @@
|
|||
warning: the feature `const_generics` is incomplete and may cause the compiler to crash
|
||||
--> $DIR/issue-61336-2.rs:1:12
|
||||
|
|
||||
LL | #![feature(const_generics)]
|
||||
| ^^^^^^^^^^^^^^
|
||||
|
||||
error[E0277]: the trait bound `T: std::marker::Copy` is not satisfied
|
||||
--> $DIR/issue-61336-2.rs:9:5
|
||||
|
|
||||
LL | [x; {N}]
|
||||
| ^^^^^^^^ the trait `std::marker::Copy` is not implemented for `T`
|
||||
|
|
||||
= help: consider adding a `where T: std::marker::Copy` bound
|
||||
= note: the `Copy` trait is required because the repeated element will be copied
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
For more information about this error, try `rustc --explain E0277`.
|
Loading…
Add table
Add a link
Reference in a new issue