about summary refs log tree commit diff
diff options
context:
space:
mode:
authorMatthias Krüger <matthias.krueger@famsik.de>2024-03-24 10:05:27 +0100
committerMatthias Krüger <matthias.krueger@famsik.de>2024-03-24 10:05:27 +0100
commitdb68dc27f4c7a18be8e01864eb5f95f8879858e4 (patch)
tree6c95d967a1170015fa0e04a730913044e61ce9c2
parent127c36c79490326ceeb14675425af672c589256d (diff)
downloadrust-db68dc27f4c7a18be8e01864eb5f95f8879858e4.tar.gz
rust-db68dc27f4c7a18be8e01864eb5f95f8879858e4.zip
add test for #116599
Fixes #116599
-rw-r--r--tests/ui/nll/unexpected-inference-var-ice-116599.rs44
1 files changed, 44 insertions, 0 deletions
diff --git a/tests/ui/nll/unexpected-inference-var-ice-116599.rs b/tests/ui/nll/unexpected-inference-var-ice-116599.rs
new file mode 100644
index 00000000000..53eeba23224
--- /dev/null
+++ b/tests/ui/nll/unexpected-inference-var-ice-116599.rs
@@ -0,0 +1,44 @@
+// ICE unexpected inference var
+// issue: rust-lang/rust#116599
+//@ check-pass
+
+pub trait EvaluateConstMethods {
+    type Trait: TraitWithConstMethods;
+
+    /// **This block breaks**
+    const DATA_3: Data3 = {
+        <<<Self::Trait as TraitWithConstMethods>::Method2 as ConstFn<_, _>>::Body<
+            <<Self::Trait as TraitWithConstMethods>::Method1 as ConstFn<_, _>>::Body<ContainsData1>,
+        > as Contains<_>>::ITEM
+    };
+}
+
+pub trait TraitWithConstMethods {
+    /// "const trait method" of signature `fn(Data1) -> Data2`
+    type Method1: ConstFn<Data1, Data2>;
+
+    /// "const trait method" of signature `fn(Data2) -> Data3`
+    type Method2: ConstFn<Data2, Data3>;
+}
+
+/// A trait which tries to implement const methods in traits
+pub trait ConstFn<Arg, Ret> {
+    type Body<T: Contains<Arg>>: Contains<Ret>;
+}
+
+/// A ZST which represents / "contains" a const value which can be pass to a [`ConstFn`]
+pub trait Contains<T> {
+    const ITEM: T;
+}
+
+pub struct ContainsData1;
+impl Contains<Data1> for ContainsData1 {
+    const ITEM: Data1 = Data1 {};
+}
+
+// Arbitrary data
+pub struct Data1 {}
+pub struct Data2 {}
+pub struct Data3 {}
+
+pub fn main() {}