diff options
| author | bors <bors@rust-lang.org> | 2021-12-12 22:15:32 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2021-12-12 22:15:32 +0000 |
| commit | 22f8bde876f2fa9c5c4e95be1bce29cc271f2b51 (patch) | |
| tree | 780b4d0cada258ab3536c7bacbaf99dbf7980359 /src | |
| parent | 6bda5b331cfe7e04e1fe348c58a928fc2b650f4f (diff) | |
| parent | ffc9082d97cf88ac4d8f72bca0382b2499a0184d (diff) | |
| download | rust-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.rs | 5 | ||||
| -rw-r--r-- | src/test/ui/consts/not_const_clusure_in_const.rs | 9 | ||||
| -rw-r--r-- | src/test/ui/consts/try-operator.rs | 23 | ||||
| -rw-r--r-- | src/test/ui/infinite/infinite-struct.stderr | 2 | ||||
| -rw-r--r-- | src/test/ui/infinite/infinite-tag-type-recursion.stderr | 2 | ||||
| -rw-r--r-- | src/test/ui/issues/issue-91489.rs | 40 | ||||
| -rw-r--r-- | src/test/ui/rfc-2632-const-trait-impl/assoc-type.rs | 1 | ||||
| -rw-r--r-- | src/test/ui/rfc-2632-const-trait-impl/assoc-type.stderr | 4 | ||||
| -rw-r--r-- | src/test/ui/rfc-2632-const-trait-impl/non-const-op-in-closure-in-const.rs | 18 | ||||
| -rw-r--r-- | src/tools/clippy/clippy_lints/src/future_not_send.rs | 4 |
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; } |
