about summary refs log tree commit diff
path: root/src/test/compile-fail
diff options
context:
space:
mode:
authorNiko Matsakis <niko@alum.mit.edu>2016-03-29 16:33:50 -0400
committerNiko Matsakis <niko@alum.mit.edu>2016-04-04 11:14:44 -0400
commit6a749c7eb136e5ddc61a34d2adc4c8fc6a1725cf (patch)
treeea1570117775424de8a61e11126317dccf04bc89 /src/test/compile-fail
parent944723b7731ec1eacdbc1946009bcd51d17a6301 (diff)
downloadrust-6a749c7eb136e5ddc61a34d2adc4c8fc6a1725cf.tar.gz
rust-6a749c7eb136e5ddc61a34d2adc4c8fc6a1725cf.zip
fix corner case around top of stack
When deciding on a coinductive match, we were examining the new
obligation and the backtrace, but not the *current* obligation that goes
in between the two.  Refactoring the code to just have the cycle given
as input also made things a lot simpler.
Diffstat (limited to 'src/test/compile-fail')
-rw-r--r--src/test/compile-fail/traits-inductive-overflow-auto-normal-auto.rs32
1 files changed, 32 insertions, 0 deletions
diff --git a/src/test/compile-fail/traits-inductive-overflow-auto-normal-auto.rs b/src/test/compile-fail/traits-inductive-overflow-auto-normal-auto.rs
new file mode 100644
index 00000000000..6015c5669cd
--- /dev/null
+++ b/src/test/compile-fail/traits-inductive-overflow-auto-normal-auto.rs
@@ -0,0 +1,32 @@
+// Copyright 2015 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.
+
+// Test for a potential corner case in current impl where you have an
+// auto trait (Magic1) that depends on a normal trait (Magic2) which
+// in turn depends on the auto trait (Magic1). This was incorrectly
+// being considered coinductive, but because of the normal trait
+// interfering, it should not be.
+
+#![feature(optin_builtin_traits)]
+
+trait Magic1: Magic2 { }
+impl Magic1 for .. {}
+
+trait Magic2 { }
+impl<T: Magic1> Magic2 for T { }
+
+fn is_magic1<T: Magic1>() { }
+
+#[derive(Debug)]
+struct NoClone;
+
+fn main() {
+    is_magic1::<NoClone>();
+}