]> git.lizzy.rs Git - rust.git/commitdiff
extend `struct_tail` to operate over closures
authorNiko Matsakis <niko@alum.mit.edu>
Fri, 26 May 2017 20:36:40 +0000 (16:36 -0400)
committerNiko Matsakis <niko@alum.mit.edu>
Fri, 26 May 2017 20:36:40 +0000 (16:36 -0400)
src/librustc/ty/util.rs
src/test/run-pass/issue-42210.rs [new file with mode: 0644]

index 01fed11fc97affd7e8ad22cb0f275e7b5ec1faef..eb7744e1213e703245877c35fa1567d3cfcc4443 100644 (file)
@@ -266,13 +266,29 @@ pub fn named_element_ty(self,
     /// 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 (file)
index 0000000..ecdf78c
--- /dev/null
@@ -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 <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.
+
+// 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()
+}