about summary refs log tree commit diff
path: root/tests
diff options
context:
space:
mode:
authorGuillaume Gomez <guillaume1.gomez@gmail.com>2024-02-16 17:08:14 +0100
committerGitHub <noreply@github.com>2024-02-16 17:08:14 +0100
commitf82875e2425c565db12643a562e60c0f08b28c87 (patch)
treee579fc67ea508aaee7b40a6b596c796baa171dce /tests
parent0c921460349d1ecbb3bacb6ad9af2faebc2a790e (diff)
parentdb4ba498d9ffd584f9fd5483acd0c996c3379d8e (diff)
downloadrust-f82875e2425c565db12643a562e60c0f08b28c87.tar.gz
rust-f82875e2425c565db12643a562e60c0f08b28c87.zip
Rollup merge of #121181 - oli-obk:normalize_with_conflicting_impls, r=cjgillot
Fix an ICE in the recursion lint

fixes #121170

I looked into it, and there is no good path towards tainting mir_build (where the ICE happens), but using `try_normalize` in a lint seems generally better anyway
Diffstat (limited to 'tests')
-rw-r--r--tests/ui/traits/normalize-conflicting-impls.rs49
-rw-r--r--tests/ui/traits/normalize-conflicting-impls.stderr21
2 files changed, 70 insertions, 0 deletions
diff --git a/tests/ui/traits/normalize-conflicting-impls.rs b/tests/ui/traits/normalize-conflicting-impls.rs
new file mode 100644
index 00000000000..454b2fd0153
--- /dev/null
+++ b/tests/ui/traits/normalize-conflicting-impls.rs
@@ -0,0 +1,49 @@
+fn problematic_function<Space>(material_surface_element: ())
+where
+    DefaultAllocator: FiniteElementAllocator<(), Space>,
+{
+    let _: Point2<f64> = material_surface_element.map_reference_coords().into();
+}
+
+impl<N, R> Allocator<N, R> for DefaultAllocator
+where
+    R::Value: DimName, //~ ERROR: `Value` not found for `R`
+{
+    type Buffer = ();
+}
+impl<N> Allocator<N, ()> for DefaultAllocator {}
+//~^ ERROR: conflicting implementations
+impl DimName for () {}
+impl DimName for u32 {}
+impl<N, D: DimName> From<VectorN<N, D>> for Point<N, D> {
+    fn from(_: VectorN<N, D>) -> Self {
+        todo!()
+    }
+}
+
+impl FiniteElement<u32> for () {}
+
+type VectorN<N, D> = Matrix<<DefaultAllocator as Allocator<N, D>>::Buffer>;
+
+type Point2<N> = Point<N, u32>;
+
+struct DefaultAllocator;
+struct Matrix<S>(S);
+struct Point<N, D>(N, D);
+
+trait Allocator<Scalar, R> {
+    type Buffer;
+}
+trait DimName {}
+trait FiniteElementAllocator<GeometryDim, NodalDim>:
+    Allocator<f64, ()> + Allocator<f64, NodalDim>
+{
+}
+
+trait FiniteElement<GeometryDim> {
+    fn map_reference_coords(&self) -> VectorN<f64, GeometryDim> {
+        todo!()
+    }
+}
+
+fn main() {}
diff --git a/tests/ui/traits/normalize-conflicting-impls.stderr b/tests/ui/traits/normalize-conflicting-impls.stderr
new file mode 100644
index 00000000000..9a66fe00c3f
--- /dev/null
+++ b/tests/ui/traits/normalize-conflicting-impls.stderr
@@ -0,0 +1,21 @@
+error[E0220]: associated type `Value` not found for `R`
+  --> $DIR/normalize-conflicting-impls.rs:10:8
+   |
+LL |     R::Value: DimName,
+   |        ^^^^^ associated type `Value` not found
+
+error[E0119]: conflicting implementations of trait `Allocator<_, ()>` for type `DefaultAllocator`
+  --> $DIR/normalize-conflicting-impls.rs:14:1
+   |
+LL | / impl<N, R> Allocator<N, R> for DefaultAllocator
+LL | | where
+LL | |     R::Value: DimName,
+   | |______________________- first implementation here
+...
+LL |   impl<N> Allocator<N, ()> for DefaultAllocator {}
+   |   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation for `DefaultAllocator`
+
+error: aborting due to 2 previous errors
+
+Some errors have detailed explanations: E0119, E0220.
+For more information about an error, try `rustc --explain E0119`.