summaryrefslogtreecommitdiffstats
path: root/src/test/ui/autoref-autoderef/issue-38940.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/test/ui/autoref-autoderef/issue-38940.rs')
-rw-r--r--src/test/ui/autoref-autoderef/issue-38940.rs52
1 files changed, 52 insertions, 0 deletions
diff --git a/src/test/ui/autoref-autoderef/issue-38940.rs b/src/test/ui/autoref-autoderef/issue-38940.rs
new file mode 100644
index 000000000..d2f1c6e32
--- /dev/null
+++ b/src/test/ui/autoref-autoderef/issue-38940.rs
@@ -0,0 +1,52 @@
+// issue-38940: error printed twice for deref recursion limit exceeded
+// Test that the recursion limit can be changed. In this case, we have
+// deeply nested types that will fail the `Send` check by overflow
+// when the recursion limit is set very low.
+// 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 reached the recursion limit while auto-dereferencing `J`
+}