Fix assoc-type test
This commit is contained in:
parent
01bb3710b5
commit
bcf0e2f528
3 changed files with 29 additions and 5 deletions
|
@ -1,3 +1,6 @@
|
||||||
|
use rustc_hir as hir;
|
||||||
|
use rustc_middle::ty::PredicateKind;
|
||||||
|
|
||||||
use crate::infer::canonical::OriginalQueryValues;
|
use crate::infer::canonical::OriginalQueryValues;
|
||||||
use crate::infer::InferCtxt;
|
use crate::infer::InferCtxt;
|
||||||
use crate::traits::{
|
use crate::traits::{
|
||||||
|
@ -46,6 +49,12 @@ impl<'cx, 'tcx> InferCtxtExt<'tcx> for InferCtxt<'cx, 'tcx> {
|
||||||
&self,
|
&self,
|
||||||
obligation: &PredicateObligation<'tcx>,
|
obligation: &PredicateObligation<'tcx>,
|
||||||
) -> bool {
|
) -> bool {
|
||||||
|
if let PredicateKind::Trait(pred) = obligation.predicate.kind().skip_binder() {
|
||||||
|
if let hir::Constness::Const = pred.constness {
|
||||||
|
// do not evaluate to holds when we have a const predicate.
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
self.evaluate_obligation_no_overflow(obligation).must_apply_considering_regions()
|
self.evaluate_obligation_no_overflow(obligation).must_apply_considering_regions()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,8 +1,4 @@
|
||||||
// ignore-test
|
// FIXME(fee1-dead): this should have a better error message
|
||||||
//
|
|
||||||
// FIXME: This test should fail since, within a const impl of `Foo`, the bound on `Foo::Bar` should
|
|
||||||
// require a const impl of `Add` for the associated type.
|
|
||||||
|
|
||||||
#![feature(const_trait_impl)]
|
#![feature(const_trait_impl)]
|
||||||
|
|
||||||
struct NonConstAdd(i32);
|
struct NonConstAdd(i32);
|
||||||
|
@ -21,6 +17,7 @@ trait Foo {
|
||||||
|
|
||||||
impl const Foo for NonConstAdd {
|
impl const Foo for NonConstAdd {
|
||||||
type Bar = NonConstAdd;
|
type Bar = NonConstAdd;
|
||||||
|
//~^ ERROR
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
|
18
src/test/ui/rfc-2632-const-trait-impl/assoc-type.stderr
Normal file
18
src/test/ui/rfc-2632-const-trait-impl/assoc-type.stderr
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
error[E0277]: cannot add `NonConstAdd` to `NonConstAdd`
|
||||||
|
--> $DIR/assoc-type.rs:19:5
|
||||||
|
|
|
||||||
|
LL | type Bar: std::ops::Add;
|
||||||
|
| ------------- required by this bound in `Foo::Bar`
|
||||||
|
...
|
||||||
|
LL | type Bar = NonConstAdd;
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^ no implementation for `NonConstAdd + NonConstAdd`
|
||||||
|
|
|
||||||
|
= help: the trait `Add` is not implemented for `NonConstAdd`
|
||||||
|
help: consider introducing a `where` bound, but there might be an alternative better way to express this requirement
|
||||||
|
|
|
||||||
|
LL | impl const Foo for NonConstAdd where NonConstAdd: Add {
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0277`.
|
Loading…
Add table
Add a link
Reference in a new issue