about summary refs log tree commit diff
diff options
context:
space:
mode:
authorLeón Orell Valerian Liehr <me@fmease.dev>2025-02-26 04:15:08 +0100
committerGitHub <noreply@github.com>2025-02-26 04:15:08 +0100
commitcf8498d36a614bb2ac669fb43303b0662e9b5225 (patch)
tree6efb91db231c2e82785d8a261749af2f41e09a9a
parenta82ad9494cd7be42dd1579de2436e4e3c38d819e (diff)
parent0bed12e02d75f9d786a3496cb243355e603809ad (diff)
downloadrust-cf8498d36a614bb2ac669fb43303b0662e9b5225.tar.gz
rust-cf8498d36a614bb2ac669fb43303b0662e9b5225.zip
Rollup merge of #137613 - davidtwco:const-traits-variances, r=compiler-errors
hir_analysis: skip self type of host effect preds in variances_of

Discovered as part of an implementation of rust-lang/rfcs#3729 - w/out this then when introducing const trait bounds: many more interesting tests change with different output, missing errors, new errors, etc related to this but they all depend on feature flags and are much more complex than this test.

r? ``@oli-obk``
-rw-r--r--compiler/rustc_hir_analysis/src/variance/mod.rs4
-rw-r--r--tests/ui/traits/const-traits/variance.rs13
-rw-r--r--tests/ui/traits/const-traits/variance.stderr8
3 files changed, 25 insertions, 0 deletions
diff --git a/compiler/rustc_hir_analysis/src/variance/mod.rs b/compiler/rustc_hir_analysis/src/variance/mod.rs
index a7760326bb4..0800d99e945 100644
--- a/compiler/rustc_hir_analysis/src/variance/mod.rs
+++ b/compiler/rustc_hir_analysis/src/variance/mod.rs
@@ -198,6 +198,10 @@ fn variance_of_opaque(
             ty::ClauseKind::Trait(ty::TraitPredicate {
                 trait_ref: ty::TraitRef { def_id: _, args, .. },
                 polarity: _,
+            })
+            | ty::ClauseKind::HostEffect(ty::HostEffectPredicate {
+                trait_ref: ty::TraitRef { def_id: _, args, .. },
+                constness: _,
             }) => {
                 for arg in &args[1..] {
                     arg.visit_with(&mut collector);
diff --git a/tests/ui/traits/const-traits/variance.rs b/tests/ui/traits/const-traits/variance.rs
new file mode 100644
index 00000000000..90b5c50161d
--- /dev/null
+++ b/tests/ui/traits/const-traits/variance.rs
@@ -0,0 +1,13 @@
+#![feature(rustc_attrs, const_trait_impl)]
+#![allow(internal_features)]
+#![rustc_variance_of_opaques]
+
+#[const_trait]
+trait Foo {}
+
+impl const Foo for () {}
+
+fn foo<'a: 'a>() -> impl const Foo {}
+//~^ ERROR ['a: *]
+
+fn main() {}
diff --git a/tests/ui/traits/const-traits/variance.stderr b/tests/ui/traits/const-traits/variance.stderr
new file mode 100644
index 00000000000..f5506931184
--- /dev/null
+++ b/tests/ui/traits/const-traits/variance.stderr
@@ -0,0 +1,8 @@
+error: ['a: *]
+  --> $DIR/variance.rs:10:21
+   |
+LL | fn foo<'a: 'a>() -> impl const Foo {}
+   |                     ^^^^^^^^^^^^^^
+
+error: aborting due to 1 previous error
+