Auto merge of #34336 - petrochenkov:icemctuple, r=arielb1
Fix ICE in memory categorization of tuple patterns Fixes https://github.com/rust-lang/rust/issues/34334 It seems to be ok for `pat_ty` to return `Err` even if type checking is done, because it uses `infcx.node_ty` which is supposed to return `Err` for all kinds of erroneous types so its callers could quickly bail out with `?`. r? @arielb1
This commit is contained in:
commit
f4d03da825
2 changed files with 19 additions and 4 deletions
|
|
@ -1145,8 +1145,8 @@ impl<'a, 'gcx, 'tcx> MemCategorizationContext<'a, 'gcx, 'tcx> {
|
|||
}
|
||||
}
|
||||
Some(Def::Struct(..)) => {
|
||||
let expected_len = match self.pat_ty(&pat) {
|
||||
Ok(&ty::TyS{sty: ty::TyStruct(adt_def, _), ..}) => {
|
||||
let expected_len = match self.pat_ty(&pat)?.sty {
|
||||
ty::TyStruct(adt_def, _) => {
|
||||
adt_def.struct_variant().fields.len()
|
||||
}
|
||||
ref ty => {
|
||||
|
|
@ -1196,8 +1196,8 @@ impl<'a, 'gcx, 'tcx> MemCategorizationContext<'a, 'gcx, 'tcx> {
|
|||
|
||||
PatKind::Tuple(ref subpats, ddpos) => {
|
||||
// (p1, ..., pN)
|
||||
let expected_len = match self.pat_ty(&pat) {
|
||||
Ok(&ty::TyS{sty: ty::TyTuple(ref tys), ..}) => tys.len(),
|
||||
let expected_len = match self.pat_ty(&pat)?.sty {
|
||||
ty::TyTuple(ref tys) => tys.len(),
|
||||
ref ty => span_bug!(pat.span, "tuple pattern unexpected type {:?}", ty),
|
||||
};
|
||||
for (i, subpat) in subpats.iter().enumerate_and_adjust(expected_len, ddpos) {
|
||||
|
|
|
|||
15
src/test/compile-fail/issue-34334.rs
Normal file
15
src/test/compile-fail/issue-34334.rs
Normal file
|
|
@ -0,0 +1,15 @@
|
|||
// Copyright 2016 The Rust Project Developers. See the COPYRIGHT
|
||||
// file at the top-level directory of this distribution and at
|
||||
// http://rust-lang.org/COPYRIGHT.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
fn main () {
|
||||
let sr: Vec<(u32, _, _) = vec![]; //~ ERROR expected one of `+`, `,`, or `>`, found `=`
|
||||
let sr2: Vec<(u32, _, _)> = sr.iter().map(|(faction, th_sender, th_receiver)| {}).collect();
|
||||
//~^ ERROR unresolved name `sr`
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue