From 7bf6fc16f24902d5efc5fc2c5ba6b72840a239b9 Mon Sep 17 00:00:00 2001
From: David Wood <david.wood2@arm.com>
Date: Mon, 24 Feb 2025 09:49:06 +0000
Subject: [PATCH 1/2] tests: add variance test for const traits

Added to demonstrate change in output in following commit. 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.
---
 tests/ui/traits/const-traits/variance.rs     | 14 ++++++++++++++
 tests/ui/traits/const-traits/variance.stderr |  8 ++++++++
 2 files changed, 22 insertions(+)
 create mode 100644 tests/ui/traits/const-traits/variance.rs
 create mode 100644 tests/ui/traits/const-traits/variance.stderr

diff --git a/tests/ui/traits/const-traits/variance.rs b/tests/ui/traits/const-traits/variance.rs
new file mode 100644
index 0000000000000..9eaf7910cb884
--- /dev/null
+++ b/tests/ui/traits/const-traits/variance.rs
@@ -0,0 +1,14 @@
+#![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: o]
+
+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 0000000000000..f6efc24b747b5
--- /dev/null
+++ b/tests/ui/traits/const-traits/variance.stderr
@@ -0,0 +1,8 @@
+error: ['a: o]
+  --> $DIR/variance.rs:10:21
+   |
+LL | fn foo<'a: 'a>() -> impl const Foo {}
+   |                     ^^^^^^^^^^^^^^
+
+error: aborting due to 1 previous error
+

From 0bed12e02d75f9d786a3496cb243355e603809ad Mon Sep 17 00:00:00 2001
From: David Wood <david.wood2@arm.com>
Date: Mon, 24 Feb 2025 09:50:22 +0000
Subject: [PATCH 2/2] hir_analysis: skip self type of host effect preds

Like trait predicates, the self type ought to be skipped here.
---
 compiler/rustc_hir_analysis/src/variance/mod.rs | 4 ++++
 tests/ui/traits/const-traits/variance.rs        | 3 +--
 tests/ui/traits/const-traits/variance.stderr    | 2 +-
 3 files changed, 6 insertions(+), 3 deletions(-)

diff --git a/compiler/rustc_hir_analysis/src/variance/mod.rs b/compiler/rustc_hir_analysis/src/variance/mod.rs
index a7760326bb4c3..0800d99e9452e 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
index 9eaf7910cb884..90b5c50161d51 100644
--- a/tests/ui/traits/const-traits/variance.rs
+++ b/tests/ui/traits/const-traits/variance.rs
@@ -8,7 +8,6 @@ trait Foo {}
 impl const Foo for () {}
 
 fn foo<'a: 'a>() -> impl const Foo {}
-//~^ ERROR ['a: o]
+//~^ ERROR ['a: *]
 
 fn main() {}
-
diff --git a/tests/ui/traits/const-traits/variance.stderr b/tests/ui/traits/const-traits/variance.stderr
index f6efc24b747b5..f55069311848a 100644
--- a/tests/ui/traits/const-traits/variance.stderr
+++ b/tests/ui/traits/const-traits/variance.stderr
@@ -1,4 +1,4 @@
-error: ['a: o]
+error: ['a: *]
   --> $DIR/variance.rs:10:21
    |
 LL | fn foo<'a: 'a>() -> impl const Foo {}