about summary refs log tree commit diff
path: root/tests/ui/specialization
diff options
context:
space:
mode:
authorMichael Goulet <michael@errs.io>2024-06-07 14:59:38 -0400
committerMichael Goulet <michael@errs.io>2024-06-07 14:59:38 -0400
commit1653a2d34a7f841f15b0704c7ce07c74dee2bada (patch)
treeae87acbcfbd34a36389095e878a3f8ee717ffa24 /tests/ui/specialization
parente3c3ce62d7a8328120aa2abf60a34576f3862fde (diff)
downloadrust-1653a2d34a7f841f15b0704c7ce07c74dee2bada.tar.gz
rust-1653a2d34a7f841f15b0704c7ce07c74dee2bada.zip
Failing test
Diffstat (limited to 'tests/ui/specialization')
-rw-r--r--tests/ui/specialization/anyid-repro-125197.rs17
-rw-r--r--tests/ui/specialization/auxiliary/anyid-repro-125197.rs26
2 files changed, 43 insertions, 0 deletions
diff --git a/tests/ui/specialization/anyid-repro-125197.rs b/tests/ui/specialization/anyid-repro-125197.rs
new file mode 100644
index 00000000000..725b1f1aff4
--- /dev/null
+++ b/tests/ui/specialization/anyid-repro-125197.rs
@@ -0,0 +1,17 @@
+//@ aux-build: anyid-repro-125197.rs
+//@ check-pass
+
+// Makes sure that we don't check `specializes(impl1, impl2)` for a pair of impls that don't
+// actually participate in specialization. Since <https://github.com/rust-lang/rust/pull/122791>,
+// we don't treat inductive cycles as errors -- so we may need to winnow more pairs of impls, and
+// we try to winnow impls in favor of other impls. However, if we're *inside* the `specializes`
+// query, then may have a query cycle if we call `specializes` again! 
+
+extern crate anyid_repro_125197;
+use anyid_repro_125197::AnyId;
+
+fn main() {
+    let x = "hello, world";
+    let y: AnyId = x.into();
+    let _ = y == x;
+}
diff --git a/tests/ui/specialization/auxiliary/anyid-repro-125197.rs b/tests/ui/specialization/auxiliary/anyid-repro-125197.rs
new file mode 100644
index 00000000000..c2794959740
--- /dev/null
+++ b/tests/ui/specialization/auxiliary/anyid-repro-125197.rs
@@ -0,0 +1,26 @@
+use std::fmt::Display;
+use std::sync::Arc;
+
+pub struct AnyId(());
+
+impl PartialEq<Self> for AnyId {
+    fn eq(&self, _: &Self) -> bool {
+        todo!()
+    }
+}
+
+impl<T: Identifier> PartialEq<T> for AnyId {
+    fn eq(&self, _: &T) -> bool {
+        todo!()
+    }
+}
+
+impl<T: Identifier> From<T> for AnyId {
+    fn from(_: T) -> Self {
+        todo!()
+    }
+}
+
+pub trait Identifier: Display + 'static {}
+
+impl<T> Identifier for T where T: PartialEq + Display + 'static {}