diff --git a/src/librustc/ty/util.rs b/src/librustc/ty/util.rs index 01fed11fc97af..eb7744e1213e7 100644 --- a/src/librustc/ty/util.rs +++ b/src/librustc/ty/util.rs @@ -266,13 +266,29 @@ impl<'a, 'gcx, 'tcx> TyCtxt<'a, 'gcx, 'tcx> { /// if not a structure at all. Corresponds to the only possible unsized /// field, and its type can be used to determine unsizing strategy. pub fn struct_tail(self, mut ty: Ty<'tcx>) -> Ty<'tcx> { - while let TyAdt(def, substs) = ty.sty { - if !def.is_struct() { - break; - } - match def.struct_variant().fields.last() { - Some(f) => ty = f.ty(self, substs), - None => break, + loop { + match ty.sty { + ty::TyAdt(def, substs) => { + if !def.is_struct() { + break; + } + match def.struct_variant().fields.last() { + Some(f) => ty = f.ty(self, substs), + None => break, + } + } + + ty::TyTuple(tys, _) => { + if let Some((&last_ty, _)) = tys.split_last() { + ty = last_ty; + } else { + break; + } + } + + _ => { + break; + } } } ty diff --git a/src/test/run-pass/issue-42210.rs b/src/test/run-pass/issue-42210.rs new file mode 100644 index 0000000000000..ecdf78cd5bdf8 --- /dev/null +++ b/src/test/run-pass/issue-42210.rs @@ -0,0 +1,29 @@ +// Copyright 2014 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 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +// Regression test for #42210. + +// compile-flags: -g + +trait Foo { + fn foo() { } +} + +struct Bar; + +trait Baz { +} + +impl Foo for (Bar, Baz) { } + + +fn main() { + <(Bar, Baz) as Foo>::foo() +}