diff options
| author | Niko Matsakis <niko@alum.mit.edu> | 2016-03-29 16:33:50 -0400 |
|---|---|---|
| committer | Niko Matsakis <niko@alum.mit.edu> | 2016-04-04 11:14:44 -0400 |
| commit | 6a749c7eb136e5ddc61a34d2adc4c8fc6a1725cf (patch) | |
| tree | ea1570117775424de8a61e11126317dccf04bc89 /src/test/compile-fail | |
| parent | 944723b7731ec1eacdbc1946009bcd51d17a6301 (diff) | |
| download | rust-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.rs | 32 |
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>(); +} |
