about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2021-12-12 22:15:32 +0000
committerbors <bors@rust-lang.org>2021-12-12 22:15:32 +0000
commit22f8bde876f2fa9c5c4e95be1bce29cc271f2b51 (patch)
tree780b4d0cada258ab3536c7bacbaf99dbf7980359 /src
parent6bda5b331cfe7e04e1fe348c58a928fc2b650f4f (diff)
parentffc9082d97cf88ac4d8f72bca0382b2499a0184d (diff)
downloadrust-22f8bde876f2fa9c5c4e95be1bce29cc271f2b51.tar.gz
rust-22f8bde876f2fa9c5c4e95be1bce29cc271f2b51.zip
Auto merge of #91549 - fee1-dead:const_env, r=spastorino
Eliminate ConstnessAnd again

Closes #91489.
Closes #89432.

Reverts #91491.
Reverts #89450.

r? `@spastorino`
Diffstat (limited to 'src')
-rw-r--r--src/librustdoc/clean/blanket_impl.rs5
-rw-r--r--src/test/ui/consts/not_const_clusure_in_const.rs9
-rw-r--r--src/test/ui/consts/try-operator.rs23
-rw-r--r--src/test/ui/infinite/infinite-struct.stderr2
-rw-r--r--src/test/ui/infinite/infinite-tag-type-recursion.stderr2
-rw-r--r--src/test/ui/issues/issue-91489.rs40
-rw-r--r--src/test/ui/rfc-2632-const-trait-impl/assoc-type.rs1
-rw-r--r--src/test/ui/rfc-2632-const-trait-impl/assoc-type.stderr4
-rw-r--r--src/test/ui/rfc-2632-const-trait-impl/non-const-op-in-closure-in-const.rs18
-rw-r--r--src/tools/clippy/clippy_lints/src/future_not_send.rs4
10 files changed, 90 insertions, 18 deletions
diff --git a/src/librustdoc/clean/blanket_impl.rs b/src/librustdoc/clean/blanket_impl.rs
index 80e3bb5c662..dca02cb25bd 100644
--- a/src/librustdoc/clean/blanket_impl.rs
+++ b/src/librustdoc/clean/blanket_impl.rs
@@ -3,7 +3,7 @@ use rustc_hir as hir;
 use rustc_infer::infer::{InferOk, TyCtxtInferExt};
 use rustc_infer::traits;
 use rustc_middle::ty::subst::Subst;
-use rustc_middle::ty::{ToPredicate, WithConstness};
+use rustc_middle::ty::ToPredicate;
 use rustc_span::DUMMY_SP;
 
 use super::*;
@@ -66,7 +66,8 @@ impl<'a, 'tcx> BlanketImplFinder<'a, 'tcx> {
                             .into_iter()
                             .chain(Some(
                                 ty::Binder::dummy(trait_ref)
-                                    .without_const()
+                                    .to_poly_trait_predicate()
+                                    .map_bound(ty::PredicateKind::Trait)
                                     .to_predicate(infcx.tcx),
                             ));
                         for predicate in predicates {
diff --git a/src/test/ui/consts/not_const_clusure_in_const.rs b/src/test/ui/consts/not_const_clusure_in_const.rs
deleted file mode 100644
index fd2cfa442d3..00000000000
--- a/src/test/ui/consts/not_const_clusure_in_const.rs
+++ /dev/null
@@ -1,9 +0,0 @@
-// run-pass
-
-const _FOO: fn() -> String = || "foo".into();
-
-pub fn bar() -> fn() -> String {
-    || "bar".into()
-}
-
-fn main(){}
diff --git a/src/test/ui/consts/try-operator.rs b/src/test/ui/consts/try-operator.rs
new file mode 100644
index 00000000000..fe43b132cbd
--- /dev/null
+++ b/src/test/ui/consts/try-operator.rs
@@ -0,0 +1,23 @@
+// run-pass
+
+#![feature(try_trait_v2)]
+#![feature(const_trait_impl)]
+#![feature(const_try)]
+#![feature(const_convert)]
+
+fn main() {
+    const fn result() -> Result<bool, ()> {
+        Err(())?;
+        Ok(true)
+    }
+
+    const FOO: Result<bool, ()> = result();
+    assert_eq!(Err(()), FOO);
+
+    const fn option() -> Option<()> {
+        None?;
+        Some(())
+    }
+    const BAR: Option<()> = option();
+    assert_eq!(None, BAR);
+}
diff --git a/src/test/ui/infinite/infinite-struct.stderr b/src/test/ui/infinite/infinite-struct.stderr
index 369645f9030..383e13fd4b0 100644
--- a/src/test/ui/infinite/infinite-struct.stderr
+++ b/src/test/ui/infinite/infinite-struct.stderr
@@ -19,7 +19,7 @@ LL | struct Take(Take);
    | ^^^^^^^^^^^^^^^^^^
    |
    = note: ...which immediately requires computing drop-check constraints for `Take` again
-   = note: cycle used when computing dropck types for `Canonical { max_universe: U0, variables: [], value: ParamEnvAnd { param_env: ParamEnv { caller_bounds: [], reveal: UserFacing }, value: Take } }`
+   = note: cycle used when computing dropck types for `Canonical { max_universe: U0, variables: [], value: ParamEnvAnd { param_env: ParamEnv { caller_bounds: [], reveal: UserFacing, constness: NotConst }, value: Take } }`
 
 error: aborting due to 2 previous errors
 
diff --git a/src/test/ui/infinite/infinite-tag-type-recursion.stderr b/src/test/ui/infinite/infinite-tag-type-recursion.stderr
index 61b5e946775..1802c7599a3 100644
--- a/src/test/ui/infinite/infinite-tag-type-recursion.stderr
+++ b/src/test/ui/infinite/infinite-tag-type-recursion.stderr
@@ -18,7 +18,7 @@ LL | enum MList { Cons(isize, MList), Nil }
    | ^^^^^^^^^^
    |
    = note: ...which immediately requires computing drop-check constraints for `MList` again
-   = note: cycle used when computing dropck types for `Canonical { max_universe: U0, variables: [], value: ParamEnvAnd { param_env: ParamEnv { caller_bounds: [], reveal: UserFacing }, value: MList } }`
+   = note: cycle used when computing dropck types for `Canonical { max_universe: U0, variables: [], value: ParamEnvAnd { param_env: ParamEnv { caller_bounds: [], reveal: UserFacing, constness: NotConst }, value: MList } }`
 
 error: aborting due to 2 previous errors
 
diff --git a/src/test/ui/issues/issue-91489.rs b/src/test/ui/issues/issue-91489.rs
new file mode 100644
index 00000000000..f028a4a3c6a
--- /dev/null
+++ b/src/test/ui/issues/issue-91489.rs
@@ -0,0 +1,40 @@
+// check-pass
+
+// regression test for #91489
+
+use std::borrow::Borrow;
+use std::borrow::Cow;
+
+pub struct VariantType {}
+pub struct VariantTy {}
+
+impl Borrow<VariantTy> for VariantType {
+    fn borrow(&self) -> &VariantTy {
+        unimplemented!()
+    }
+}
+
+impl ToOwned for VariantTy {
+    type Owned = VariantType;
+    fn to_owned(&self) -> VariantType {
+        unimplemented!()
+    }
+}
+
+impl VariantTy {
+    pub fn as_str(&self) -> () {}
+}
+
+// the presence of this was causing all attempts to call `as_str` on
+// `Cow<'_, VariantTy>, including in itself, to not find the method
+static _TYP: () = {
+    let _ = || {
+        // should be found
+        Cow::Borrowed(&VariantTy {}).as_str();
+    };
+};
+
+fn main() {
+    // should be found
+    Cow::Borrowed(&VariantTy {}).as_str()
+}
diff --git a/src/test/ui/rfc-2632-const-trait-impl/assoc-type.rs b/src/test/ui/rfc-2632-const-trait-impl/assoc-type.rs
index 228b5ed71e8..7b012083c5a 100644
--- a/src/test/ui/rfc-2632-const-trait-impl/assoc-type.rs
+++ b/src/test/ui/rfc-2632-const-trait-impl/assoc-type.rs
@@ -1,6 +1,5 @@
 // FIXME(fee1-dead): this should have a better error message
 #![feature(const_trait_impl)]
-
 struct NonConstAdd(i32);
 
 impl std::ops::Add for NonConstAdd {
diff --git a/src/test/ui/rfc-2632-const-trait-impl/assoc-type.stderr b/src/test/ui/rfc-2632-const-trait-impl/assoc-type.stderr
index 842b99edbe7..4a4b4de4758 100644
--- a/src/test/ui/rfc-2632-const-trait-impl/assoc-type.stderr
+++ b/src/test/ui/rfc-2632-const-trait-impl/assoc-type.stderr
@@ -1,12 +1,12 @@
 error[E0277]: cannot add `NonConstAdd` to `NonConstAdd`
-  --> $DIR/assoc-type.rs:19:16
+  --> $DIR/assoc-type.rs:18:16
    |
 LL |     type Bar = NonConstAdd;
    |                ^^^^^^^^^^^ no implementation for `NonConstAdd + NonConstAdd`
    |
    = help: the trait `Add` is not implemented for `NonConstAdd`
 note: required by a bound in `Foo::Bar`
-  --> $DIR/assoc-type.rs:15:15
+  --> $DIR/assoc-type.rs:14:15
    |
 LL |     type Bar: ~const std::ops::Add;
    |               ^^^^^^^^^^^^^^^^^^^^ required by this bound in `Foo::Bar`
diff --git a/src/test/ui/rfc-2632-const-trait-impl/non-const-op-in-closure-in-const.rs b/src/test/ui/rfc-2632-const-trait-impl/non-const-op-in-closure-in-const.rs
new file mode 100644
index 00000000000..ef74ef8e426
--- /dev/null
+++ b/src/test/ui/rfc-2632-const-trait-impl/non-const-op-in-closure-in-const.rs
@@ -0,0 +1,18 @@
+// check-pass
+
+#![feature(const_trait_impl)]
+#![feature(const_fn_trait_bound)]
+
+trait Convert<T> {
+    fn to(self) -> T;
+}
+
+impl<A, B> const Convert<B> for A where B: ~const From<A> {
+    fn to(self) -> B {
+        B::from(self)
+    }
+}
+
+const FOO: fn() -> String = || "foo".to();
+
+fn main() {}
diff --git a/src/tools/clippy/clippy_lints/src/future_not_send.rs b/src/tools/clippy/clippy_lints/src/future_not_send.rs
index fefdcfed42f..43911a313d5 100644
--- a/src/tools/clippy/clippy_lints/src/future_not_send.rs
+++ b/src/tools/clippy/clippy_lints/src/future_not_send.rs
@@ -68,8 +68,8 @@ impl<'tcx> LateLintPass<'tcx> for FutureNotSend {
             let mut is_future = false;
             for &(p, _span) in preds {
                 let p = p.subst(cx.tcx, subst);
-                if let Some(trait_ref) = p.to_opt_poly_trait_ref() {
-                    if Some(trait_ref.value.def_id()) == cx.tcx.lang_items().future_trait() {
+                if let Some(trait_pred) = p.to_opt_poly_trait_pred() {
+                    if Some(trait_pred.skip_binder().trait_ref.def_id) == cx.tcx.lang_items().future_trait() {
                         is_future = true;
                         break;
                     }