summaryrefslogtreecommitdiffstats
path: root/src/test/ui/did_you_mean/recursion_limit_deref.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/test/ui/did_you_mean/recursion_limit_deref.rs')
-rw-r--r--src/test/ui/did_you_mean/recursion_limit_deref.rs53
1 files changed, 53 insertions, 0 deletions
diff --git a/src/test/ui/did_you_mean/recursion_limit_deref.rs b/src/test/ui/did_you_mean/recursion_limit_deref.rs
new file mode 100644
index 000000000..41bbca661
--- /dev/null
+++ b/src/test/ui/did_you_mean/recursion_limit_deref.rs
@@ -0,0 +1,53 @@
+// Test that the recursion limit can be changed and that the compiler
+// suggests a fix. In this case, we have a long chain of Deref impls
+// which will cause an overflow during the autoderef loop.
+// compile-flags: -Zdeduplicate-diagnostics=yes
+
+#![allow(dead_code)]
+#![recursion_limit="10"]
+
+macro_rules! link {
+ ($outer:ident, $inner:ident) => {
+ struct $outer($inner);
+
+ impl $outer {
+ fn new() -> $outer {
+ $outer($inner::new())
+ }
+ }
+
+ impl std::ops::Deref for $outer {
+ type Target = $inner;
+
+ fn deref(&self) -> &$inner {
+ &self.0
+ }
+ }
+ }
+}
+
+struct Bottom;
+impl Bottom {
+ fn new() -> Bottom {
+ Bottom
+ }
+}
+
+link!(Top, A);
+link!(A, B);
+link!(B, C);
+link!(C, D);
+link!(D, E);
+link!(E, F);
+link!(F, G);
+link!(G, H);
+link!(H, I);
+link!(I, J);
+link!(J, K);
+link!(K, Bottom);
+
+fn main() {
+ let t = Top::new();
+ let x: &Bottom = &t; //~ ERROR mismatched types
+ //~^ error recursion limit
+}