mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-22 14:55:26 +00:00
Auto merge of #130249 - compiler-errors:sad-new-solver-coherence, r=lcnr
Revert "Stabilize `-Znext-solver=coherence`" This is a clean revert of #121848, prepared by running: ``` $ git revert17b322fa69
-m1 ``` Which effectively reverts: *a138a92615
,69fdd1457d
,d93e047c9f
,1a893ac648
see: https://rust-lang.zulipchat.com/#narrow/stream/364551-t-types.2Ftrait-system-refactor/topic/nalgebra.20hang Closes #130056 r? lcnr
This commit is contained in:
commit
f753bc769b
@ -808,7 +808,7 @@ fn test_unstable_options_tracking_hash() {
|
|||||||
tracked!(mir_opt_level, Some(4));
|
tracked!(mir_opt_level, Some(4));
|
||||||
tracked!(move_size_limit, Some(4096));
|
tracked!(move_size_limit, Some(4096));
|
||||||
tracked!(mutable_noalias, false);
|
tracked!(mutable_noalias, false);
|
||||||
tracked!(next_solver, NextSolverConfig { coherence: true, globally: true });
|
tracked!(next_solver, Some(NextSolverConfig { coherence: true, globally: false }));
|
||||||
tracked!(no_generate_arange_section, true);
|
tracked!(no_generate_arange_section, true);
|
||||||
tracked!(no_jump_tables, true);
|
tracked!(no_jump_tables, true);
|
||||||
tracked!(no_link, true);
|
tracked!(no_link, true);
|
||||||
|
@ -3132,11 +3132,11 @@ impl<'tcx> TyCtxt<'tcx> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn next_trait_solver_globally(self) -> bool {
|
pub fn next_trait_solver_globally(self) -> bool {
|
||||||
self.sess.opts.unstable_opts.next_solver.globally
|
self.sess.opts.unstable_opts.next_solver.map_or(false, |c| c.globally)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn next_trait_solver_in_coherence(self) -> bool {
|
pub fn next_trait_solver_in_coherence(self) -> bool {
|
||||||
self.sess.opts.unstable_opts.next_solver.coherence
|
self.sess.opts.unstable_opts.next_solver.map_or(false, |c| c.coherence)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn is_impl_trait_in_trait(self, def_id: DefId) -> bool {
|
pub fn is_impl_trait_in_trait(self, def_id: DefId) -> bool {
|
||||||
|
@ -842,11 +842,6 @@ pub struct NextSolverConfig {
|
|||||||
/// This is only `true` if `coherence` is also enabled.
|
/// This is only `true` if `coherence` is also enabled.
|
||||||
pub globally: bool,
|
pub globally: bool,
|
||||||
}
|
}
|
||||||
impl Default for NextSolverConfig {
|
|
||||||
fn default() -> Self {
|
|
||||||
NextSolverConfig { coherence: true, globally: false }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Clone)]
|
#[derive(Clone)]
|
||||||
pub enum Input {
|
pub enum Input {
|
||||||
|
@ -403,7 +403,7 @@ mod desc {
|
|||||||
pub(crate) const parse_unpretty: &str = "`string` or `string=string`";
|
pub(crate) const parse_unpretty: &str = "`string` or `string=string`";
|
||||||
pub(crate) const parse_treat_err_as_bug: &str = "either no value or a non-negative number";
|
pub(crate) const parse_treat_err_as_bug: &str = "either no value or a non-negative number";
|
||||||
pub(crate) const parse_next_solver_config: &str =
|
pub(crate) const parse_next_solver_config: &str =
|
||||||
"either `globally` (when used without an argument), `coherence` (default) or `no`";
|
"a comma separated list of solver configurations: `globally` (default), and `coherence`";
|
||||||
pub(crate) const parse_lto: &str =
|
pub(crate) const parse_lto: &str =
|
||||||
"either a boolean (`yes`, `no`, `on`, `off`, etc), `thin`, `fat`, or omitted";
|
"either a boolean (`yes`, `no`, `on`, `off`, etc), `thin`, `fat`, or omitted";
|
||||||
pub(crate) const parse_linker_plugin_lto: &str =
|
pub(crate) const parse_linker_plugin_lto: &str =
|
||||||
@ -1105,16 +1105,27 @@ mod parse {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) fn parse_next_solver_config(slot: &mut NextSolverConfig, v: Option<&str>) -> bool {
|
pub(crate) fn parse_next_solver_config(
|
||||||
|
slot: &mut Option<NextSolverConfig>,
|
||||||
|
v: Option<&str>,
|
||||||
|
) -> bool {
|
||||||
if let Some(config) = v {
|
if let Some(config) = v {
|
||||||
*slot = match config {
|
let mut coherence = false;
|
||||||
"no" => NextSolverConfig { coherence: false, globally: false },
|
let mut globally = true;
|
||||||
"coherence" => NextSolverConfig { coherence: true, globally: false },
|
for c in config.split(',') {
|
||||||
"globally" => NextSolverConfig { coherence: true, globally: true },
|
match c {
|
||||||
|
"globally" => globally = true,
|
||||||
|
"coherence" => {
|
||||||
|
globally = false;
|
||||||
|
coherence = true;
|
||||||
|
}
|
||||||
_ => return false,
|
_ => return false,
|
||||||
};
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
*slot = Some(NextSolverConfig { coherence: coherence || globally, globally });
|
||||||
} else {
|
} else {
|
||||||
*slot = NextSolverConfig { coherence: true, globally: true };
|
*slot = Some(NextSolverConfig { coherence: true, globally: true });
|
||||||
}
|
}
|
||||||
|
|
||||||
true
|
true
|
||||||
@ -1867,7 +1878,7 @@ options! {
|
|||||||
"the size at which the `large_assignments` lint starts to be emitted"),
|
"the size at which the `large_assignments` lint starts to be emitted"),
|
||||||
mutable_noalias: bool = (true, parse_bool, [TRACKED],
|
mutable_noalias: bool = (true, parse_bool, [TRACKED],
|
||||||
"emit noalias metadata for mutable references (default: yes)"),
|
"emit noalias metadata for mutable references (default: yes)"),
|
||||||
next_solver: NextSolverConfig = (NextSolverConfig::default(), parse_next_solver_config, [TRACKED],
|
next_solver: Option<NextSolverConfig> = (None, parse_next_solver_config, [TRACKED],
|
||||||
"enable and configure the next generation trait solver used by rustc"),
|
"enable and configure the next generation trait solver used by rustc"),
|
||||||
nll_facts: bool = (false, parse_bool, [UNTRACKED],
|
nll_facts: bool = (false, parse_bool, [UNTRACKED],
|
||||||
"dump facts from NLL analysis into side files (default: no)"),
|
"dump facts from NLL analysis into side files (default: no)"),
|
||||||
|
@ -35,8 +35,10 @@ where
|
|||||||
if infcx.next_trait_solver() {
|
if infcx.next_trait_solver() {
|
||||||
Box::new(NextFulfillmentCtxt::new(infcx))
|
Box::new(NextFulfillmentCtxt::new(infcx))
|
||||||
} else {
|
} else {
|
||||||
|
let new_solver_globally =
|
||||||
|
infcx.tcx.sess.opts.unstable_opts.next_solver.map_or(false, |c| c.globally);
|
||||||
assert!(
|
assert!(
|
||||||
!infcx.tcx.next_trait_solver_globally(),
|
!new_solver_globally,
|
||||||
"using old solver even though new solver is enabled globally"
|
"using old solver even though new solver is enabled globally"
|
||||||
);
|
);
|
||||||
Box::new(FulfillmentContext::new(infcx))
|
Box::new(FulfillmentContext::new(infcx))
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// regression test for #118987
|
//@ known-bug: #118987
|
||||||
#![feature(specialization)] //~ WARN the feature `specialization` is incomplete
|
#![feature(specialization)] //~ WARN the feature `specialization` is incomplete
|
||||||
|
|
||||||
trait Assoc {
|
trait Assoc {
|
||||||
@ -15,5 +15,3 @@ trait Foo {}
|
|||||||
|
|
||||||
impl Foo for <u8 as Assoc>::Output {}
|
impl Foo for <u8 as Assoc>::Output {}
|
||||||
impl Foo for <u16 as Assoc>::Output {}
|
impl Foo for <u16 as Assoc>::Output {}
|
||||||
//~^ ERROR the trait bound `u16: Assoc` is not satisfied
|
|
||||||
fn main() {}
|
|
17
tests/crashes/118987.rs
Normal file
17
tests/crashes/118987.rs
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
//@ known-bug: #118987
|
||||||
|
#![feature(specialization)] //~ WARN the feature `specialization` is incomplete
|
||||||
|
|
||||||
|
trait Assoc {
|
||||||
|
type Output;
|
||||||
|
}
|
||||||
|
|
||||||
|
default impl<T: Clone> Assoc for T {
|
||||||
|
type Output = bool;
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Assoc for u8 {}
|
||||||
|
|
||||||
|
trait Foo {}
|
||||||
|
|
||||||
|
impl Foo for <u8 as Assoc>::Output {}
|
||||||
|
impl Foo for <u16 as Assoc>::Output {}
|
@ -1,11 +1,9 @@
|
|||||||
|
//@ known-bug: #124207
|
||||||
#![feature(transmutability)]
|
#![feature(transmutability)]
|
||||||
#![feature(type_alias_impl_trait)]
|
#![feature(type_alias_impl_trait)]
|
||||||
trait OpaqueTrait {}
|
trait OpaqueTrait {}
|
||||||
type OpaqueType = impl OpaqueTrait;
|
type OpaqueType = impl OpaqueTrait;
|
||||||
//~^ ERROR unconstrained opaque type
|
|
||||||
trait AnotherTrait {}
|
trait AnotherTrait {}
|
||||||
impl<T: std::mem::TransmuteFrom<(), ()>> AnotherTrait for T {}
|
impl<T: std::mem::TransmuteFrom<(), ()>> AnotherTrait for T {}
|
||||||
//~^ ERROR type provided when a constant was expected
|
|
||||||
impl AnotherTrait for OpaqueType {}
|
impl AnotherTrait for OpaqueType {}
|
||||||
//~^ ERROR conflicting implementations of trait `AnotherTrait`
|
|
||||||
pub fn main() {}
|
pub fn main() {}
|
@ -1,5 +1,5 @@
|
|||||||
// regression test for #73299.
|
//@ known-bug: #74299
|
||||||
#![feature(specialization)] //~ WARN the feature `specialization` is incomplete
|
#![feature(specialization)]
|
||||||
|
|
||||||
trait X {
|
trait X {
|
||||||
type U;
|
type U;
|
||||||
@ -18,7 +18,6 @@ trait Y {
|
|||||||
|
|
||||||
impl Y for <() as X>::U {}
|
impl Y for <() as X>::U {}
|
||||||
impl Y for <i32 as X>::U {}
|
impl Y for <i32 as X>::U {}
|
||||||
//~^ ERROR conflicting implementations of trait `Y` for type `<() as X>::U`
|
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
().f().g();
|
().f().g();
|
@ -1,20 +1,20 @@
|
|||||||
error[E0119]: conflicting implementations of trait `IntoCow<'_, _>` for type `<_ as ToOwned>::Owned`
|
error[E0119]: conflicting implementations of trait `IntoCow<'_, _>` for type `Cow<'_, _>`
|
||||||
--> $DIR/associated-types-coherence-failure.rs:21:1
|
--> $DIR/associated-types-coherence-failure.rs:21:1
|
||||||
|
|
|
|
||||||
LL | impl<'a, B: ?Sized> IntoCow<'a, B> for <B as ToOwned>::Owned where B: ToOwned {
|
LL | impl<'a, B: ?Sized> IntoCow<'a, B> for <B as ToOwned>::Owned where B: ToOwned {
|
||||||
| ----------------------------------------------------------------------------- first implementation here
|
| ----------------------------------------------------------------------------- first implementation here
|
||||||
...
|
...
|
||||||
LL | impl<'a, B: ?Sized> IntoCow<'a, B> for Cow<'a, B> where B: ToOwned {
|
LL | impl<'a, B: ?Sized> IntoCow<'a, B> for Cow<'a, B> where B: ToOwned {
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation for `<_ as ToOwned>::Owned`
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation for `Cow<'_, _>`
|
||||||
|
|
||||||
error[E0119]: conflicting implementations of trait `IntoCow<'_, _>` for type `<_ as ToOwned>::Owned`
|
error[E0119]: conflicting implementations of trait `IntoCow<'_, _>` for type `&_`
|
||||||
--> $DIR/associated-types-coherence-failure.rs:28:1
|
--> $DIR/associated-types-coherence-failure.rs:28:1
|
||||||
|
|
|
|
||||||
LL | impl<'a, B: ?Sized> IntoCow<'a, B> for <B as ToOwned>::Owned where B: ToOwned {
|
LL | impl<'a, B: ?Sized> IntoCow<'a, B> for <B as ToOwned>::Owned where B: ToOwned {
|
||||||
| ----------------------------------------------------------------------------- first implementation here
|
| ----------------------------------------------------------------------------- first implementation here
|
||||||
...
|
...
|
||||||
LL | impl<'a, B: ?Sized> IntoCow<'a, B> for &'a B where B: ToOwned {
|
LL | impl<'a, B: ?Sized> IntoCow<'a, B> for &'a B where B: ToOwned {
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation for `<_ as ToOwned>::Owned`
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation for `&_`
|
||||||
|
|
||||||
error: aborting due to 2 previous errors
|
error: aborting due to 2 previous errors
|
||||||
|
|
||||||
|
30
tests/ui/auto-traits/opaque_type_candidate_selection.rs
Normal file
30
tests/ui/auto-traits/opaque_type_candidate_selection.rs
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
//! used to ICE: #119272
|
||||||
|
|
||||||
|
//@ check-pass
|
||||||
|
|
||||||
|
#![feature(type_alias_impl_trait)]
|
||||||
|
mod defining_scope {
|
||||||
|
use super::*;
|
||||||
|
pub type Alias<T> = impl Sized;
|
||||||
|
|
||||||
|
pub fn cast<T>(x: Container<Alias<T>, T>) -> Container<T, T> {
|
||||||
|
x
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
struct Container<T: Trait<U>, U> {
|
||||||
|
x: <T as Trait<U>>::Assoc,
|
||||||
|
}
|
||||||
|
|
||||||
|
trait Trait<T> {
|
||||||
|
type Assoc;
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<T> Trait<T> for T {
|
||||||
|
type Assoc = Box<u32>;
|
||||||
|
}
|
||||||
|
impl<T> Trait<T> for defining_scope::Alias<T> {
|
||||||
|
type Assoc = usize;
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {}
|
@ -5,8 +5,6 @@ LL | impl<'a, T: MyPredicate<'a>> MyTrait<'a> for T {}
|
|||||||
| ---------------------------------------------- first implementation here
|
| ---------------------------------------------- first implementation here
|
||||||
LL | impl<'a, T> MyTrait<'a> for &'a T {}
|
LL | impl<'a, T> MyTrait<'a> for &'a T {}
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation for `&_`
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation for `&_`
|
||||||
|
|
|
||||||
= note: downstream crates may implement trait `MyPredicate<'_>` for type `&_`
|
|
||||||
|
|
||||||
error: aborting due to 1 previous error
|
error: aborting due to 1 previous error
|
||||||
|
|
||||||
|
@ -5,8 +5,6 @@ LL | impl<'a, T: MyPredicate<'a>> MyTrait<'a> for T {}
|
|||||||
| ---------------------------------------------- first implementation here
|
| ---------------------------------------------- first implementation here
|
||||||
LL | impl<'a, T> MyTrait<'a> for &'a T {}
|
LL | impl<'a, T> MyTrait<'a> for &'a T {}
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation for `&_`
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation for `&_`
|
||||||
|
|
|
||||||
= note: downstream crates may implement trait `MyPredicate<'_>` for type `&_`
|
|
||||||
|
|
||||||
error: aborting due to 1 previous error
|
error: aborting due to 1 previous error
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
error[E0592]: duplicate definitions with name `dummy`
|
error[E0592]: duplicate definitions with name `dummy`
|
||||||
--> $DIR/coherence-overlap-downstream-inherent.rs:7:26
|
--> $DIR/coherence-overlap-downstream-inherent.rs:10:26
|
||||||
|
|
|
|
||||||
LL | impl<T:Sugar> Sweet<T> { fn dummy(&self) { } }
|
LL | impl<T:Sugar> Sweet<T> { fn dummy(&self) { } }
|
||||||
| ^^^^^^^^^^^^^^^ duplicate definitions for `dummy`
|
| ^^^^^^^^^^^^^^^ duplicate definitions for `dummy`
|
||||||
@ -8,7 +8,7 @@ LL | impl<T:Fruit> Sweet<T> { fn dummy(&self) { } }
|
|||||||
| --------------- other definition for `dummy`
|
| --------------- other definition for `dummy`
|
||||||
|
|
||||||
error[E0592]: duplicate definitions with name `f`
|
error[E0592]: duplicate definitions with name `f`
|
||||||
--> $DIR/coherence-overlap-downstream-inherent.rs:13:38
|
--> $DIR/coherence-overlap-downstream-inherent.rs:16:38
|
||||||
|
|
|
|
||||||
LL | impl<X, T> A<T, X> where T: Bar<X> { fn f(&self) {} }
|
LL | impl<X, T> A<T, X> where T: Bar<X> { fn f(&self) {} }
|
||||||
| ^^^^^^^^^^^ duplicate definitions for `f`
|
| ^^^^^^^^^^^ duplicate definitions for `f`
|
@ -0,0 +1,23 @@
|
|||||||
|
error[E0592]: duplicate definitions with name `dummy`
|
||||||
|
--> $DIR/coherence-overlap-downstream-inherent.rs:10:26
|
||||||
|
|
|
||||||
|
LL | impl<T:Sugar> Sweet<T> { fn dummy(&self) { } }
|
||||||
|
| ^^^^^^^^^^^^^^^ duplicate definitions for `dummy`
|
||||||
|
LL |
|
||||||
|
LL | impl<T:Fruit> Sweet<T> { fn dummy(&self) { } }
|
||||||
|
| --------------- other definition for `dummy`
|
||||||
|
|
||||||
|
error[E0592]: duplicate definitions with name `f`
|
||||||
|
--> $DIR/coherence-overlap-downstream-inherent.rs:16:38
|
||||||
|
|
|
||||||
|
LL | impl<X, T> A<T, X> where T: Bar<X> { fn f(&self) {} }
|
||||||
|
| ^^^^^^^^^^^ duplicate definitions for `f`
|
||||||
|
LL |
|
||||||
|
LL | impl<X> A<i32, X> { fn f(&self) {} }
|
||||||
|
| ----------- other definition for `f`
|
||||||
|
|
|
||||||
|
= note: downstream crates may implement trait `Bar<_>` for type `i32`
|
||||||
|
|
||||||
|
error: aborting due to 2 previous errors
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0592`.
|
@ -1,3 +1,6 @@
|
|||||||
|
//@ revisions: old next
|
||||||
|
//@[next] compile-flags: -Znext-solver
|
||||||
|
|
||||||
// Tests that we consider `T: Sugar + Fruit` to be ambiguous, even
|
// Tests that we consider `T: Sugar + Fruit` to be ambiguous, even
|
||||||
// though no impls are found.
|
// though no impls are found.
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
error[E0119]: conflicting implementations of trait `Sweet`
|
error[E0119]: conflicting implementations of trait `Sweet`
|
||||||
--> $DIR/coherence-overlap-downstream.rs:8:1
|
--> $DIR/coherence-overlap-downstream.rs:11:1
|
||||||
|
|
|
|
||||||
LL | impl<T:Sugar> Sweet for T { }
|
LL | impl<T:Sugar> Sweet for T { }
|
||||||
| ------------------------- first implementation here
|
| ------------------------- first implementation here
|
||||||
@ -7,7 +7,7 @@ LL | impl<T:Fruit> Sweet for T { }
|
|||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation
|
||||||
|
|
||||||
error[E0119]: conflicting implementations of trait `Foo<_>` for type `i32`
|
error[E0119]: conflicting implementations of trait `Foo<_>` for type `i32`
|
||||||
--> $DIR/coherence-overlap-downstream.rs:14:1
|
--> $DIR/coherence-overlap-downstream.rs:17:1
|
||||||
|
|
|
|
||||||
LL | impl<X, T> Foo<X> for T where T: Bar<X> {}
|
LL | impl<X, T> Foo<X> for T where T: Bar<X> {}
|
||||||
| --------------------------------------- first implementation here
|
| --------------------------------------- first implementation here
|
21
tests/ui/coherence/coherence-overlap-downstream.old.stderr
Normal file
21
tests/ui/coherence/coherence-overlap-downstream.old.stderr
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
error[E0119]: conflicting implementations of trait `Sweet`
|
||||||
|
--> $DIR/coherence-overlap-downstream.rs:11:1
|
||||||
|
|
|
||||||
|
LL | impl<T:Sugar> Sweet for T { }
|
||||||
|
| ------------------------- first implementation here
|
||||||
|
LL | impl<T:Fruit> Sweet for T { }
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation
|
||||||
|
|
||||||
|
error[E0119]: conflicting implementations of trait `Foo<_>` for type `i32`
|
||||||
|
--> $DIR/coherence-overlap-downstream.rs:17:1
|
||||||
|
|
|
||||||
|
LL | impl<X, T> Foo<X> for T where T: Bar<X> {}
|
||||||
|
| --------------------------------------- first implementation here
|
||||||
|
LL | impl<X> Foo<X> for i32 {}
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation for `i32`
|
||||||
|
|
|
||||||
|
= note: downstream crates may implement trait `Bar<_>` for type `i32`
|
||||||
|
|
||||||
|
error: aborting due to 2 previous errors
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0119`.
|
@ -1,3 +1,6 @@
|
|||||||
|
//@ revisions: old next
|
||||||
|
//@[next] compile-flags: -Znext-solver
|
||||||
|
|
||||||
// Tests that we consider `T: Sugar + Fruit` to be ambiguous, even
|
// Tests that we consider `T: Sugar + Fruit` to be ambiguous, even
|
||||||
// though no impls are found.
|
// though no impls are found.
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
error[E0592]: duplicate definitions with name `dummy`
|
error[E0592]: duplicate definitions with name `dummy`
|
||||||
--> $DIR/coherence-overlap-issue-23516-inherent.rs:9:25
|
--> $DIR/coherence-overlap-issue-23516-inherent.rs:12:25
|
||||||
|
|
|
|
||||||
LL | impl<T:Sugar> Cake<T> { fn dummy(&self) { } }
|
LL | impl<T:Sugar> Cake<T> { fn dummy(&self) { } }
|
||||||
| ^^^^^^^^^^^^^^^ duplicate definitions for `dummy`
|
| ^^^^^^^^^^^^^^^ duplicate definitions for `dummy`
|
@ -0,0 +1,14 @@
|
|||||||
|
error[E0592]: duplicate definitions with name `dummy`
|
||||||
|
--> $DIR/coherence-overlap-issue-23516-inherent.rs:12:25
|
||||||
|
|
|
||||||
|
LL | impl<T:Sugar> Cake<T> { fn dummy(&self) { } }
|
||||||
|
| ^^^^^^^^^^^^^^^ duplicate definitions for `dummy`
|
||||||
|
LL |
|
||||||
|
LL | impl<U:Sugar> Cake<Box<U>> { fn dummy(&self) { } }
|
||||||
|
| --------------- other definition for `dummy`
|
||||||
|
|
|
||||||
|
= note: downstream crates may implement trait `Sugar` for type `std::boxed::Box<_>`
|
||||||
|
|
||||||
|
error: aborting due to 1 previous error
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0592`.
|
@ -1,3 +1,6 @@
|
|||||||
|
//@ revisions: old next
|
||||||
|
//@[next] compile-flags: -Znext-solver
|
||||||
|
|
||||||
// Tests that we consider `Box<U>: !Sugar` to be ambiguous, even
|
// Tests that we consider `Box<U>: !Sugar` to be ambiguous, even
|
||||||
// though we see no impl of `Sugar` for `Box`. Therefore, an overlap
|
// though we see no impl of `Sugar` for `Box`. Therefore, an overlap
|
||||||
// error is reported for the following pair of impls (#23516).
|
// error is reported for the following pair of impls (#23516).
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
error[E0119]: conflicting implementations of trait `Sweet` for type `Box<_>`
|
error[E0119]: conflicting implementations of trait `Sweet` for type `Box<_>`
|
||||||
--> $DIR/coherence-overlap-issue-23516.rs:8:1
|
--> $DIR/coherence-overlap-issue-23516.rs:11:1
|
||||||
|
|
|
|
||||||
LL | impl<T:Sugar> Sweet for T { }
|
LL | impl<T:Sugar> Sweet for T { }
|
||||||
| ------------------------- first implementation here
|
| ------------------------- first implementation here
|
13
tests/ui/coherence/coherence-overlap-issue-23516.old.stderr
Normal file
13
tests/ui/coherence/coherence-overlap-issue-23516.old.stderr
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
error[E0119]: conflicting implementations of trait `Sweet` for type `Box<_>`
|
||||||
|
--> $DIR/coherence-overlap-issue-23516.rs:11:1
|
||||||
|
|
|
||||||
|
LL | impl<T:Sugar> Sweet for T { }
|
||||||
|
| ------------------------- first implementation here
|
||||||
|
LL | impl<U:Sugar> Sweet for Box<U> { }
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation for `Box<_>`
|
||||||
|
|
|
||||||
|
= note: downstream crates may implement trait `Sugar` for type `std::boxed::Box<_>`
|
||||||
|
|
||||||
|
error: aborting due to 1 previous error
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0119`.
|
@ -1,3 +1,6 @@
|
|||||||
|
//@ revisions: old next
|
||||||
|
//@[next] compile-flags: -Znext-solver
|
||||||
|
|
||||||
// Tests that we consider `Box<U>: !Sugar` to be ambiguous, even
|
// Tests that we consider `Box<U>: !Sugar` to be ambiguous, even
|
||||||
// though we see no impl of `Sugar` for `Box`. Therefore, an overlap
|
// though we see no impl of `Sugar` for `Box`. Therefore, an overlap
|
||||||
// error is reported for the following pair of impls (#23516).
|
// error is reported for the following pair of impls (#23516).
|
||||||
|
@ -5,8 +5,6 @@ LL | impl<T: DerefMut> Foo for T {}
|
|||||||
| --------------------------- first implementation here
|
| --------------------------- first implementation here
|
||||||
LL | impl<U> Foo for &U {}
|
LL | impl<U> Foo for &U {}
|
||||||
| ^^^^^^^^^^^^^^^^^^ conflicting implementation for `&_`
|
| ^^^^^^^^^^^^^^^^^^ conflicting implementation for `&_`
|
||||||
|
|
|
||||||
= note: downstream crates may implement trait `std::ops::DerefMut` for type `&_`
|
|
||||||
|
|
||||||
error: aborting due to 1 previous error
|
error: aborting due to 1 previous error
|
||||||
|
|
||||||
|
@ -0,0 +1,19 @@
|
|||||||
|
error[E0119]: conflicting implementations of trait `Trait` for type `Box<_>`
|
||||||
|
--> $DIR/coherence-overlap-unnormalizable-projection-0.rs:27:1
|
||||||
|
|
|
||||||
|
LL | / impl<T> Trait for T
|
||||||
|
LL | | where
|
||||||
|
LL | | T: 'static,
|
||||||
|
LL | | for<'a> T: WithAssoc<'a>,
|
||||||
|
LL | | for<'a> <T as WithAssoc<'a>>::Assoc: WhereBound,
|
||||||
|
| |____________________________________________________- first implementation here
|
||||||
|
...
|
||||||
|
LL | impl<T> Trait for Box<T> {}
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation for `Box<_>`
|
||||||
|
|
|
||||||
|
= note: downstream crates may implement trait `WithAssoc<'a>` for type `std::boxed::Box<_>`
|
||||||
|
= note: downstream crates may implement trait `WhereBound` for type `<std::boxed::Box<_> as WithAssoc<'a>>::Assoc`
|
||||||
|
|
||||||
|
error: aborting due to 1 previous error
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0119`.
|
@ -1,5 +1,5 @@
|
|||||||
error[E0119]: conflicting implementations of trait `Trait` for type `Box<_>`
|
error[E0119]: conflicting implementations of trait `Trait` for type `Box<_>`
|
||||||
--> $DIR/coherence-overlap-unnormalizable-projection-0.rs:24:1
|
--> $DIR/coherence-overlap-unnormalizable-projection-0.rs:27:1
|
||||||
|
|
|
|
||||||
LL | / impl<T> Trait for T
|
LL | / impl<T> Trait for T
|
||||||
LL | | where
|
LL | | where
|
@ -2,6 +2,9 @@
|
|||||||
// "Coherence incorrectly considers `unnormalizable_projection: Trait` to not hold even if it could"
|
// "Coherence incorrectly considers `unnormalizable_projection: Trait` to not hold even if it could"
|
||||||
#![crate_type = "lib"]
|
#![crate_type = "lib"]
|
||||||
|
|
||||||
|
//@ revisions: classic next
|
||||||
|
//@[next] compile-flags: -Znext-solver
|
||||||
|
|
||||||
trait WhereBound {}
|
trait WhereBound {}
|
||||||
impl WhereBound for () {}
|
impl WhereBound for () {}
|
||||||
|
|
||||||
|
@ -0,0 +1,19 @@
|
|||||||
|
error[E0119]: conflicting implementations of trait `Trait` for type `Box<_>`
|
||||||
|
--> $DIR/coherence-overlap-unnormalizable-projection-1.rs:26:1
|
||||||
|
|
|
||||||
|
LL | / impl<T> Trait for T
|
||||||
|
LL | | where
|
||||||
|
LL | | T: 'static,
|
||||||
|
LL | | for<'a> T: WithAssoc<'a>,
|
||||||
|
LL | | for<'a> Box<<T as WithAssoc<'a>>::Assoc>: WhereBound,
|
||||||
|
| |_________________________________________________________- first implementation here
|
||||||
|
...
|
||||||
|
LL | impl<T> Trait for Box<T> {}
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation for `Box<_>`
|
||||||
|
|
|
||||||
|
= note: downstream crates may implement trait `WithAssoc<'a>` for type `std::boxed::Box<_>`
|
||||||
|
= note: downstream crates may implement trait `WhereBound` for type `std::boxed::Box<<std::boxed::Box<_> as WithAssoc<'a>>::Assoc>`
|
||||||
|
|
||||||
|
error: aborting due to 1 previous error
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0119`.
|
@ -1,5 +1,5 @@
|
|||||||
error[E0119]: conflicting implementations of trait `Trait` for type `Box<_>`
|
error[E0119]: conflicting implementations of trait `Trait` for type `Box<_>`
|
||||||
--> $DIR/coherence-overlap-unnormalizable-projection-1.rs:23:1
|
--> $DIR/coherence-overlap-unnormalizable-projection-1.rs:26:1
|
||||||
|
|
|
|
||||||
LL | / impl<T> Trait for T
|
LL | / impl<T> Trait for T
|
||||||
LL | | where
|
LL | | where
|
@ -2,6 +2,9 @@
|
|||||||
// "Coherence incorrectly considers `unnormalizable_projection: Trait` to not hold even if it could"
|
// "Coherence incorrectly considers `unnormalizable_projection: Trait` to not hold even if it could"
|
||||||
#![crate_type = "lib"]
|
#![crate_type = "lib"]
|
||||||
|
|
||||||
|
//@ revisions: classic next
|
||||||
|
//@[next] compile-flags: -Znext-solver
|
||||||
|
|
||||||
pub trait WhereBound {}
|
pub trait WhereBound {}
|
||||||
impl WhereBound for () {}
|
impl WhereBound for () {}
|
||||||
|
|
||||||
|
@ -1,4 +1,6 @@
|
|||||||
|
//@ compile-flags: -Znext-solver=coherence
|
||||||
//@ check-pass
|
//@ check-pass
|
||||||
|
|
||||||
trait Mirror {
|
trait Mirror {
|
||||||
type Assoc;
|
type Assoc;
|
||||||
}
|
}
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
//@ compile-flags: -Znext-solver=coherence
|
||||||
|
|
||||||
trait Mirror {
|
trait Mirror {
|
||||||
type Assoc;
|
type Assoc;
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
error[E0119]: conflicting implementations of trait `Foo` for type `()`
|
error[E0119]: conflicting implementations of trait `Foo` for type `()`
|
||||||
--> $DIR/incoherent-even-though-we-fulfill.rs:15:1
|
--> $DIR/incoherent-even-though-we-fulfill.rs:17:1
|
||||||
|
|
|
|
||||||
LL | impl<T> Foo for T where (): Mirror<Assoc = T> {}
|
LL | impl<T> Foo for T where (): Mirror<Assoc = T> {}
|
||||||
| --------------------------------------------- first implementation here
|
| --------------------------------------------- first implementation here
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
error[E0119]: conflicting implementations of trait `From<()>` for type `S`
|
error[E0119]: conflicting implementations of trait `From<()>` for type `S`
|
||||||
--> $DIR/inter-crate-ambiguity-causes-notes.rs:9:1
|
--> $DIR/inter-crate-ambiguity-causes-notes.rs:12:1
|
||||||
|
|
|
|
||||||
LL | impl From<()> for S {
|
LL | impl From<()> for S {
|
||||||
| ------------------- first implementation here
|
| ------------------- first implementation here
|
@ -0,0 +1,17 @@
|
|||||||
|
error[E0119]: conflicting implementations of trait `From<()>` for type `S`
|
||||||
|
--> $DIR/inter-crate-ambiguity-causes-notes.rs:12:1
|
||||||
|
|
|
||||||
|
LL | impl From<()> for S {
|
||||||
|
| ------------------- first implementation here
|
||||||
|
...
|
||||||
|
LL | / impl<I> From<I> for S
|
||||||
|
LL | |
|
||||||
|
LL | | where
|
||||||
|
LL | | I: Iterator<Item = ()>,
|
||||||
|
| |___________________________^ conflicting implementation for `S`
|
||||||
|
|
|
||||||
|
= note: upstream crates may add a new impl of trait `std::iter::Iterator` for type `()` in future versions
|
||||||
|
|
||||||
|
error: aborting due to 1 previous error
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0119`.
|
@ -1,3 +1,6 @@
|
|||||||
|
//@ revisions: old next
|
||||||
|
//@[next] compile-flags: -Znext-solver
|
||||||
|
|
||||||
struct S;
|
struct S;
|
||||||
|
|
||||||
impl From<()> for S {
|
impl From<()> for S {
|
||||||
|
@ -5,8 +5,6 @@ LL | impl<T> Bar for T where T: Foo {}
|
|||||||
| ------------------------------ first implementation here
|
| ------------------------------ first implementation here
|
||||||
LL | impl<T> Bar for Box<T> {}
|
LL | impl<T> Bar for Box<T> {}
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation for `Box<_>`
|
| ^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation for `Box<_>`
|
||||||
|
|
|
||||||
= note: downstream crates may implement trait `Foo` for type `std::boxed::Box<_>`
|
|
||||||
|
|
||||||
error: aborting due to 1 previous error
|
error: aborting due to 1 previous error
|
||||||
|
|
||||||
|
@ -6,8 +6,6 @@ LL | impl<T> Bar for T where T: Foo {}
|
|||||||
...
|
...
|
||||||
LL | impl<T> Bar for &T {}
|
LL | impl<T> Bar for &T {}
|
||||||
| ^^^^^^^^^^^^^^^^^^ conflicting implementation for `&_`
|
| ^^^^^^^^^^^^^^^^^^ conflicting implementation for `&_`
|
||||||
|
|
|
||||||
= note: downstream crates may implement trait `Foo` for type `&_`
|
|
||||||
|
|
||||||
error: aborting due to 1 previous error
|
error: aborting due to 1 previous error
|
||||||
|
|
||||||
|
@ -8,7 +8,6 @@ LL | impl<T: ?Sized> FnMarker for fn(&T) {}
|
|||||||
|
|
|
|
||||||
= warning: the behavior may change in a future release
|
= warning: the behavior may change in a future release
|
||||||
= note: for more information, see issue #56105 <https://github.com/rust-lang/rust/issues/56105>
|
= note: for more information, see issue #56105 <https://github.com/rust-lang/rust/issues/56105>
|
||||||
= note: downstream crates may implement trait `Marker` for type `&_`
|
|
||||||
= note: this behavior recently changed as a result of a bug fix; see rust-lang/rust#56105 for details
|
= note: this behavior recently changed as a result of a bug fix; see rust-lang/rust#56105 for details
|
||||||
note: the lint level is defined here
|
note: the lint level is defined here
|
||||||
--> $DIR/negative-coherence-placeholder-region-constraints-on-unification.rs:4:11
|
--> $DIR/negative-coherence-placeholder-region-constraints-on-unification.rs:4:11
|
||||||
|
14
tests/ui/coherence/normalize-for-errors.current.stderr
Normal file
14
tests/ui/coherence/normalize-for-errors.current.stderr
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
error[E0119]: conflicting implementations of trait `MyTrait<_>` for type `(Box<(MyType,)>, _)`
|
||||||
|
--> $DIR/normalize-for-errors.rs:17:1
|
||||||
|
|
|
||||||
|
LL | impl<T: Copy, S: Iterator> MyTrait<S> for (T, S::Item) {}
|
||||||
|
| ------------------------------------------------------ first implementation here
|
||||||
|
LL |
|
||||||
|
LL | impl<S: Iterator> MyTrait<S> for (Box<<(MyType,) as Mirror>::Assoc>, S::Item) {}
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation for `(Box<(MyType,)>, _)`
|
||||||
|
|
|
||||||
|
= note: upstream crates may add a new impl of trait `std::marker::Copy` for type `std::boxed::Box<(MyType,)>` in future versions
|
||||||
|
|
||||||
|
error: aborting due to 1 previous error
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0119`.
|
@ -1,5 +1,5 @@
|
|||||||
error[E0119]: conflicting implementations of trait `MyTrait<_>` for type `(Box<(MyType,)>, <_ as Iterator>::Item)`
|
error[E0119]: conflicting implementations of trait `MyTrait<_>` for type `(Box<(MyType,)>, <_ as Iterator>::Item)`
|
||||||
--> $DIR/normalize-for-errors.rs:13:1
|
--> $DIR/normalize-for-errors.rs:17:1
|
||||||
|
|
|
|
||||||
LL | impl<T: Copy, S: Iterator> MyTrait<S> for (T, S::Item) {}
|
LL | impl<T: Copy, S: Iterator> MyTrait<S> for (T, S::Item) {}
|
||||||
| ------------------------------------------------------ first implementation here
|
| ------------------------------------------------------ first implementation here
|
@ -1,3 +1,7 @@
|
|||||||
|
//@ revisions: current next
|
||||||
|
//@ ignore-compare-mode-next-solver (explicit revisions)
|
||||||
|
//@[next] compile-flags: -Znext-solver
|
||||||
|
|
||||||
struct MyType;
|
struct MyType;
|
||||||
trait MyTrait<S> {}
|
trait MyTrait<S> {}
|
||||||
|
|
||||||
@ -14,6 +18,6 @@ impl<S: Iterator> MyTrait<S> for (Box<<(MyType,) as Mirror>::Assoc>, S::Item) {}
|
|||||||
//~^ ERROR conflicting implementations of trait `MyTrait<_>` for type `(Box<(MyType,)>,
|
//~^ ERROR conflicting implementations of trait `MyTrait<_>` for type `(Box<(MyType,)>,
|
||||||
//~| NOTE conflicting implementation for `(Box<(MyType,)>,
|
//~| NOTE conflicting implementation for `(Box<(MyType,)>,
|
||||||
//~| NOTE upstream crates may add a new impl of trait `std::marker::Copy` for type `std::boxed::Box<(MyType,)>` in future versions
|
//~| NOTE upstream crates may add a new impl of trait `std::marker::Copy` for type `std::boxed::Box<(MyType,)>` in future versions
|
||||||
//~| NOTE upstream crates may add a new impl of trait `std::clone::Clone` for type `std::boxed::Box<(MyType,)>` in future versions
|
//[next]~| NOTE upstream crates may add a new impl of trait `std::clone::Clone` for type `std::boxed::Box<(MyType,)>` in future versions
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
WARN rustc_infer::infer::relate::generalize may incompletely handle alias type: AliasTy { args: [*const ?1t, '^0.Named(DefId(0:27 ~ associated_type[f554]::{impl#3}::'a#1), "'a")], def_id: DefId(0:5 ~ associated_type[f554]::ToUnit::Unit), .. }
|
WARN rustc_infer::infer::relate::generalize may incompletely handle alias type: AliasTy { args: [*const ?1t, '^0.Named(DefId(0:27 ~ associated_type[f554]::{impl#3}::'a#1), "'a")], def_id: DefId(0:5 ~ associated_type[f554]::ToUnit::Unit), .. }
|
||||||
WARN rustc_infer::infer::relate::generalize may incompletely handle alias type: AliasTy { args: [*const ?1t, '^0.Named(DefId(0:27 ~ associated_type[f554]::{impl#3}::'a#1), "'a")], def_id: DefId(0:5 ~ associated_type[f554]::ToUnit::Unit), .. }
|
WARN rustc_infer::infer::relate::generalize may incompletely handle alias type: AliasTy { args: [*const ?1t, '^0.Named(DefId(0:27 ~ associated_type[f554]::{impl#3}::'a#1), "'a")], def_id: DefId(0:5 ~ associated_type[f554]::ToUnit::Unit), .. }
|
||||||
error[E0119]: conflicting implementations of trait `Overlap<for<'a> fn(&'a (), ())>` for type `for<'a> fn(&'a (), ())`
|
error[E0119]: conflicting implementations of trait `Overlap<for<'a> fn(&'a (), ())>` for type `for<'a> fn(&'a (), ())`
|
||||||
--> $DIR/associated-type.rs:32:1
|
--> $DIR/associated-type.rs:31:1
|
||||||
|
|
|
|
||||||
LL | impl<T> Overlap<T> for T {
|
LL | impl<T> Overlap<T> for T {
|
||||||
| ------------------------ first implementation here
|
| ------------------------ first implementation here
|
||||||
@ -17,7 +17,7 @@ LL | | for<'a> *const T: ToUnit<'a>,
|
|||||||
= note: this behavior recently changed as a result of a bug fix; see rust-lang/rust#56105 for details
|
= note: this behavior recently changed as a result of a bug fix; see rust-lang/rust#56105 for details
|
||||||
|
|
||||||
error[E0284]: type annotations needed: cannot normalize `<for<'a> fn(&'a (), ()) as Overlap<for<'a> fn(&'a (), ())>>::Assoc`
|
error[E0284]: type annotations needed: cannot normalize `<for<'a> fn(&'a (), ()) as Overlap<for<'a> fn(&'a (), ())>>::Assoc`
|
||||||
--> $DIR/associated-type.rs:45:59
|
--> $DIR/associated-type.rs:44:59
|
||||||
|
|
|
|
||||||
LL | foo::<for<'a> fn(&'a (), ()), for<'a> fn(&'a (), ())>(3usize);
|
LL | foo::<for<'a> fn(&'a (), ()), for<'a> fn(&'a (), ())>(3usize);
|
||||||
| ^^^^^^ cannot normalize `<for<'a> fn(&'a (), ()) as Overlap<for<'a> fn(&'a (), ())>>::Assoc`
|
| ^^^^^^ cannot normalize `<for<'a> fn(&'a (), ()) as Overlap<for<'a> fn(&'a (), ())>>::Assoc`
|
||||||
|
@ -1,9 +1,13 @@
|
|||||||
WARN rustc_infer::infer::relate::generalize may incompletely handle alias type: AliasTy { args: [*const ?1t, '^0.Named(DefId(0:27 ~ associated_type[f554]::{impl#3}::'a#1), "'a")], def_id: DefId(0:5 ~ associated_type[f554]::ToUnit::Unit), .. }
|
WARN rustc_infer::infer::relate::generalize may incompletely handle alias type: AliasTy { args: [*const ?1t, '^0.Named(DefId(0:27 ~ associated_type[f554]::{impl#3}::'a#1), "'a")], def_id: DefId(0:5 ~ associated_type[f554]::ToUnit::Unit), .. }
|
||||||
|
WARN rustc_infer::infer::relate::generalize may incompletely handle alias type: AliasTy { args: [*const ?1t, !2_0.Named(DefId(0:27 ~ associated_type[f554]::{impl#3}::'a#1), "'a")], def_id: DefId(0:5 ~ associated_type[f554]::ToUnit::Unit), .. }
|
||||||
WARN rustc_infer::infer::relate::generalize may incompletely handle alias type: AliasTy { args: [*const ?1t, '^0.Named(DefId(0:27 ~ associated_type[f554]::{impl#3}::'a#1), "'a")], def_id: DefId(0:5 ~ associated_type[f554]::ToUnit::Unit), .. }
|
WARN rustc_infer::infer::relate::generalize may incompletely handle alias type: AliasTy { args: [*const ?1t, '^0.Named(DefId(0:27 ~ associated_type[f554]::{impl#3}::'a#1), "'a")], def_id: DefId(0:5 ~ associated_type[f554]::ToUnit::Unit), .. }
|
||||||
|
WARN rustc_infer::infer::relate::generalize may incompletely handle alias type: AliasTy { args: [*const ?1t, !2_0.Named(DefId(0:27 ~ associated_type[f554]::{impl#3}::'a#1), "'a")], def_id: DefId(0:5 ~ associated_type[f554]::ToUnit::Unit), .. }
|
||||||
WARN rustc_infer::infer::relate::generalize may incompletely handle alias type: AliasTy { args: [*const ?1t, '^0.Named(DefId(0:27 ~ associated_type[f554]::{impl#3}::'a#1), "'a")], def_id: DefId(0:5 ~ associated_type[f554]::ToUnit::Unit), .. }
|
WARN rustc_infer::infer::relate::generalize may incompletely handle alias type: AliasTy { args: [*const ?1t, '^0.Named(DefId(0:27 ~ associated_type[f554]::{impl#3}::'a#1), "'a")], def_id: DefId(0:5 ~ associated_type[f554]::ToUnit::Unit), .. }
|
||||||
|
WARN rustc_infer::infer::relate::generalize may incompletely handle alias type: AliasTy { args: [*const ?1t, !2_0.Named(DefId(0:27 ~ associated_type[f554]::{impl#3}::'a#1), "'a")], def_id: DefId(0:5 ~ associated_type[f554]::ToUnit::Unit), .. }
|
||||||
WARN rustc_infer::infer::relate::generalize may incompletely handle alias type: AliasTy { args: [*const ?1t, '^0.Named(DefId(0:27 ~ associated_type[f554]::{impl#3}::'a#1), "'a")], def_id: DefId(0:5 ~ associated_type[f554]::ToUnit::Unit), .. }
|
WARN rustc_infer::infer::relate::generalize may incompletely handle alias type: AliasTy { args: [*const ?1t, '^0.Named(DefId(0:27 ~ associated_type[f554]::{impl#3}::'a#1), "'a")], def_id: DefId(0:5 ~ associated_type[f554]::ToUnit::Unit), .. }
|
||||||
error[E0119]: conflicting implementations of trait `Overlap<for<'a> fn(&'a (), ())>` for type `for<'a> fn(&'a (), ())`
|
WARN rustc_infer::infer::relate::generalize may incompletely handle alias type: AliasTy { args: [*const ?1t, !2_0.Named(DefId(0:27 ~ associated_type[f554]::{impl#3}::'a#1), "'a")], def_id: DefId(0:5 ~ associated_type[f554]::ToUnit::Unit), .. }
|
||||||
--> $DIR/associated-type.rs:32:1
|
error[E0119]: conflicting implementations of trait `Overlap<for<'a> fn(&'a (), _)>` for type `for<'a> fn(&'a (), _)`
|
||||||
|
--> $DIR/associated-type.rs:31:1
|
||||||
|
|
|
|
||||||
LL | impl<T> Overlap<T> for T {
|
LL | impl<T> Overlap<T> for T {
|
||||||
| ------------------------ first implementation here
|
| ------------------------ first implementation here
|
||||||
@ -12,7 +16,7 @@ LL | / impl<T> Overlap<for<'a> fn(&'a (), Assoc<'a, T>)> for T
|
|||||||
LL | |
|
LL | |
|
||||||
LL | | where
|
LL | | where
|
||||||
LL | | for<'a> *const T: ToUnit<'a>,
|
LL | | for<'a> *const T: ToUnit<'a>,
|
||||||
| |_________________________________^ conflicting implementation for `for<'a> fn(&'a (), ())`
|
| |_________________________________^ conflicting implementation for `for<'a> fn(&'a (), _)`
|
||||||
|
|
|
|
||||||
= note: this behavior recently changed as a result of a bug fix; see rust-lang/rust#56105 for details
|
= note: this behavior recently changed as a result of a bug fix; see rust-lang/rust#56105 for details
|
||||||
|
|
||||||
|
@ -1,5 +1,4 @@
|
|||||||
//@ revisions: old next
|
//@ revisions: old next
|
||||||
//@ ignore-compare-mode-next-solver (explicit revisions)
|
|
||||||
//@[next] compile-flags: -Znext-solver
|
//@[next] compile-flags: -Znext-solver
|
||||||
|
|
||||||
// A regression test for #105787
|
// A regression test for #105787
|
||||||
|
@ -1,12 +0,0 @@
|
|||||||
error[E0119]: conflicting implementations of trait `Trait<_>`
|
|
||||||
--> $DIR/opaques.rs:28:1
|
|
||||||
|
|
|
||||||
LL | impl<T> Trait<T> for T {
|
|
||||||
| ---------------------- first implementation here
|
|
||||||
...
|
|
||||||
LL | impl<T> Trait<T> for defining_scope::Alias<T> {
|
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation
|
|
||||||
|
|
||||||
error: aborting due to 1 previous error
|
|
||||||
|
|
||||||
For more information about this error, try `rustc --explain E0119`.
|
|
@ -1,5 +1,5 @@
|
|||||||
error[E0119]: conflicting implementations of trait `Trait<_>`
|
error[E0119]: conflicting implementations of trait `Trait<_>`
|
||||||
--> $DIR/opaques.rs:28:1
|
--> $DIR/opaques.rs:30:1
|
||||||
|
|
|
|
||||||
LL | impl<T> Trait<T> for T {
|
LL | impl<T> Trait<T> for T {
|
||||||
| ---------------------- first implementation here
|
| ---------------------- first implementation here
|
||||||
@ -8,7 +8,7 @@ LL | impl<T> Trait<T> for defining_scope::Alias<T> {
|
|||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation
|
||||||
|
|
||||||
error[E0282]: type annotations needed
|
error[E0282]: type annotations needed
|
||||||
--> $DIR/opaques.rs:11:20
|
--> $DIR/opaques.rs:13:20
|
||||||
|
|
|
|
||||||
LL | pub fn cast<T>(x: Container<Alias<T>, T>) -> Container<T, T> {
|
LL | pub fn cast<T>(x: Container<Alias<T>, T>) -> Container<T, T> {
|
||||||
| ^ cannot infer type
|
| ^ cannot infer type
|
||||||
|
@ -1,8 +1,10 @@
|
|||||||
//@ revisions: current next
|
//@revisions: old next
|
||||||
//@ ignore-compare-mode-next-solver (explicit revisions)
|
|
||||||
//@[next] compile-flags: -Znext-solver
|
//@[next] compile-flags: -Znext-solver
|
||||||
|
|
||||||
// A regression test for #105787
|
// A regression test for #105787
|
||||||
|
|
||||||
|
//@[old] known-bug: #105787
|
||||||
|
//@[old] check-pass
|
||||||
#![feature(type_alias_impl_trait)]
|
#![feature(type_alias_impl_trait)]
|
||||||
mod defining_scope {
|
mod defining_scope {
|
||||||
use super::*;
|
use super::*;
|
||||||
@ -26,7 +28,7 @@ impl<T> Trait<T> for T {
|
|||||||
type Assoc = Box<u32>;
|
type Assoc = Box<u32>;
|
||||||
}
|
}
|
||||||
impl<T> Trait<T> for defining_scope::Alias<T> {
|
impl<T> Trait<T> for defining_scope::Alias<T> {
|
||||||
//~^ ERROR conflicting implementations of trait
|
//[next]~^ ERROR conflicting implementations of trait
|
||||||
type Assoc = usize;
|
type Assoc = usize;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
error[E0210]: type parameter `T` must be covered by another type when it appears before the first local type (`Local`)
|
error[E0210]: type parameter `T` must be covered by another type when it appears before the first local type (`Local`)
|
||||||
--> $DIR/orphan-check-opaque-types-not-covering.rs:14:6
|
--> $DIR/orphan-check-opaque-types-not-covering.rs:17:6
|
||||||
|
|
|
|
||||||
LL | impl<T> foreign::Trait0<Local, T, ()> for Identity<T> {}
|
LL | impl<T> foreign::Trait0<Local, T, ()> for Identity<T> {}
|
||||||
| ^ type parameter `T` must be covered by another type when it appears before the first local type (`Local`)
|
| ^ type parameter `T` must be covered by another type when it appears before the first local type (`Local`)
|
||||||
@ -8,7 +8,7 @@ LL | impl<T> foreign::Trait0<Local, T, ()> for Identity<T> {}
|
|||||||
= note: in this case, 'before' refers to the following order: `impl<..> ForeignTrait<T1, ..., Tn> for T0`, where `T0` is the first and `Tn` is the last
|
= note: in this case, 'before' refers to the following order: `impl<..> ForeignTrait<T1, ..., Tn> for T0`, where `T0` is the first and `Tn` is the last
|
||||||
|
|
||||||
error[E0210]: type parameter `T` must be covered by another type when it appears before the first local type (`Local`)
|
error[E0210]: type parameter `T` must be covered by another type when it appears before the first local type (`Local`)
|
||||||
--> $DIR/orphan-check-opaque-types-not-covering.rs:23:6
|
--> $DIR/orphan-check-opaque-types-not-covering.rs:26:6
|
||||||
|
|
|
|
||||||
LL | impl<T> foreign::Trait1<Local, T> for Opaque<T> {}
|
LL | impl<T> foreign::Trait1<Local, T> for Opaque<T> {}
|
||||||
| ^ type parameter `T` must be covered by another type when it appears before the first local type (`Local`)
|
| ^ type parameter `T` must be covered by another type when it appears before the first local type (`Local`)
|
@ -0,0 +1,21 @@
|
|||||||
|
error[E0210]: type parameter `T` must be covered by another type when it appears before the first local type (`Local`)
|
||||||
|
--> $DIR/orphan-check-opaque-types-not-covering.rs:17:6
|
||||||
|
|
|
||||||
|
LL | impl<T> foreign::Trait0<Local, T, ()> for Identity<T> {}
|
||||||
|
| ^ type parameter `T` must be covered by another type when it appears before the first local type (`Local`)
|
||||||
|
|
|
||||||
|
= note: implementing a foreign trait is only possible if at least one of the types for which it is implemented is local, and no uncovered type parameters appear before that first local type
|
||||||
|
= note: in this case, 'before' refers to the following order: `impl<..> ForeignTrait<T1, ..., Tn> for T0`, where `T0` is the first and `Tn` is the last
|
||||||
|
|
||||||
|
error[E0210]: type parameter `T` must be covered by another type when it appears before the first local type (`Local`)
|
||||||
|
--> $DIR/orphan-check-opaque-types-not-covering.rs:26:6
|
||||||
|
|
|
||||||
|
LL | impl<T> foreign::Trait1<Local, T> for Opaque<T> {}
|
||||||
|
| ^ type parameter `T` must be covered by another type when it appears before the first local type (`Local`)
|
||||||
|
|
|
||||||
|
= note: implementing a foreign trait is only possible if at least one of the types for which it is implemented is local, and no uncovered type parameters appear before that first local type
|
||||||
|
= note: in this case, 'before' refers to the following order: `impl<..> ForeignTrait<T1, ..., Tn> for T0`, where `T0` is the first and `Tn` is the last
|
||||||
|
|
||||||
|
error: aborting due to 2 previous errors
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0210`.
|
@ -1,5 +1,8 @@
|
|||||||
// Opaque types never cover type parameters.
|
// Opaque types never cover type parameters.
|
||||||
|
|
||||||
|
//@ revisions: classic next
|
||||||
|
//@[next] compile-flags: -Znext-solver
|
||||||
|
|
||||||
//@ aux-crate:foreign=parametrized-trait.rs
|
//@ aux-crate:foreign=parametrized-trait.rs
|
||||||
//@ edition:2021
|
//@ edition:2021
|
||||||
|
|
||||||
|
@ -5,6 +5,9 @@
|
|||||||
// first which would've lead to real-word regressions.
|
// first which would've lead to real-word regressions.
|
||||||
|
|
||||||
//@ check-pass
|
//@ check-pass
|
||||||
|
//@ revisions: classic next
|
||||||
|
//@[next] compile-flags: -Znext-solver
|
||||||
|
|
||||||
//@ aux-crate:foreign=parametrized-trait.rs
|
//@ aux-crate:foreign=parametrized-trait.rs
|
||||||
//@ edition:2021
|
//@ edition:2021
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
error[E0210]: type parameter `T` must be covered by another type when it appears before the first local type (`Local`)
|
error[E0210]: type parameter `T` must be covered by another type when it appears before the first local type (`Local`)
|
||||||
--> $DIR/orphan-check-weak-aliases-not-covering.rs:13:6
|
--> $DIR/orphan-check-weak-aliases-not-covering.rs:16:6
|
||||||
|
|
|
|
||||||
LL | impl<T> foreign::Trait1<Local, T> for Identity<T> {}
|
LL | impl<T> foreign::Trait1<Local, T> for Identity<T> {}
|
||||||
| ^ type parameter `T` must be covered by another type when it appears before the first local type (`Local`)
|
| ^ type parameter `T` must be covered by another type when it appears before the first local type (`Local`)
|
@ -0,0 +1,12 @@
|
|||||||
|
error[E0210]: type parameter `T` must be covered by another type when it appears before the first local type (`Local`)
|
||||||
|
--> $DIR/orphan-check-weak-aliases-not-covering.rs:16:6
|
||||||
|
|
|
||||||
|
LL | impl<T> foreign::Trait1<Local, T> for Identity<T> {}
|
||||||
|
| ^ type parameter `T` must be covered by another type when it appears before the first local type (`Local`)
|
||||||
|
|
|
||||||
|
= note: implementing a foreign trait is only possible if at least one of the types for which it is implemented is local, and no uncovered type parameters appear before that first local type
|
||||||
|
= note: in this case, 'before' refers to the following order: `impl<..> ForeignTrait<T1, ..., Tn> for T0`, where `T0` is the first and `Tn` is the last
|
||||||
|
|
||||||
|
error: aborting due to 1 previous error
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0210`.
|
@ -1,5 +1,8 @@
|
|||||||
// Weak aliases might not cover type parameters.
|
// Weak aliases might not cover type parameters.
|
||||||
|
|
||||||
|
//@ revisions: classic next
|
||||||
|
//@[next] compile-flags: -Znext-solver
|
||||||
|
|
||||||
//@ aux-crate:foreign=parametrized-trait.rs
|
//@ aux-crate:foreign=parametrized-trait.rs
|
||||||
//@ edition:2021
|
//@ edition:2021
|
||||||
|
|
||||||
|
@ -0,0 +1,27 @@
|
|||||||
|
error[E0726]: implicit elided lifetime not allowed here
|
||||||
|
--> $DIR/skip-reporting-if-references-err.rs:10:9
|
||||||
|
|
|
||||||
|
LL | impl<T> ToUnit for T {}
|
||||||
|
| ^^^^^^ expected lifetime parameter
|
||||||
|
|
|
||||||
|
help: indicate the anonymous lifetime
|
||||||
|
|
|
||||||
|
LL | impl<T> ToUnit<'_> for T {}
|
||||||
|
| ++++
|
||||||
|
|
||||||
|
error[E0277]: the trait bound `for<'a> (): ToUnit<'a>` is not satisfied
|
||||||
|
--> $DIR/skip-reporting-if-references-err.rs:15:29
|
||||||
|
|
|
||||||
|
LL | impl Overlap for for<'a> fn(<() as ToUnit<'a>>::Unit) {}
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^ the trait `for<'a> ToUnit<'a>` is not implemented for `()`
|
||||||
|
|
||||||
|
error[E0277]: the trait bound `for<'a> (): ToUnit<'a>` is not satisfied
|
||||||
|
--> $DIR/skip-reporting-if-references-err.rs:15:18
|
||||||
|
|
|
||||||
|
LL | impl Overlap for for<'a> fn(<() as ToUnit<'a>>::Unit) {}
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `for<'a> ToUnit<'a>` is not implemented for `()`
|
||||||
|
|
||||||
|
error: aborting due to 3 previous errors
|
||||||
|
|
||||||
|
Some errors have detailed explanations: E0277, E0726.
|
||||||
|
For more information about an error, try `rustc --explain E0277`.
|
@ -1,5 +1,5 @@
|
|||||||
error[E0726]: implicit elided lifetime not allowed here
|
error[E0726]: implicit elided lifetime not allowed here
|
||||||
--> $DIR/skip-reporting-if-references-err.rs:6:9
|
--> $DIR/skip-reporting-if-references-err.rs:10:9
|
||||||
|
|
|
|
||||||
LL | impl<T> ToUnit for T {}
|
LL | impl<T> ToUnit for T {}
|
||||||
| ^^^^^^ expected lifetime parameter
|
| ^^^^^^ expected lifetime parameter
|
@ -1,4 +1,8 @@
|
|||||||
// Regression test for #121006.
|
// Regression test for #121006.
|
||||||
|
//@ revisions: current next
|
||||||
|
//@ ignore-compare-mode-next-solver (explicit revisions)
|
||||||
|
//@[next] compile-flags: -Znext-solver
|
||||||
|
|
||||||
trait ToUnit<'a> {
|
trait ToUnit<'a> {
|
||||||
type Unit;
|
type Unit;
|
||||||
}
|
}
|
||||||
@ -9,5 +13,7 @@ impl<T> ToUnit for T {}
|
|||||||
trait Overlap {}
|
trait Overlap {}
|
||||||
impl<U> Overlap for fn(U) {}
|
impl<U> Overlap for fn(U) {}
|
||||||
impl Overlap for for<'a> fn(<() as ToUnit<'a>>::Unit) {}
|
impl Overlap for for<'a> fn(<() as ToUnit<'a>>::Unit) {}
|
||||||
|
//[current]~^ ERROR the trait bound `for<'a> (): ToUnit<'a>` is not satisfied
|
||||||
|
//[current]~| ERROR the trait bound `for<'a> (): ToUnit<'a>` is not satisfied
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
@ -0,0 +1,13 @@
|
|||||||
|
error[E0119]: conflicting implementations of trait `Overlap<_>` for type `()`
|
||||||
|
--> $DIR/super-trait-knowable-1.rs:16:1
|
||||||
|
|
|
||||||
|
LL | impl<T, U: Sub<T>> Overlap<T> for U {}
|
||||||
|
| ----------------------------------- first implementation here
|
||||||
|
LL | impl<T> Overlap<T> for () {}
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation for `()`
|
||||||
|
|
|
||||||
|
= note: downstream crates may implement trait `Sub<_>` for type `()`
|
||||||
|
|
||||||
|
error: aborting due to 1 previous error
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0119`.
|
@ -3,7 +3,10 @@
|
|||||||
// We therefore elaborate super trait bounds in the implicit negative
|
// We therefore elaborate super trait bounds in the implicit negative
|
||||||
// overlap check.
|
// overlap check.
|
||||||
|
|
||||||
//@ check-pass
|
//@ revisions: current next
|
||||||
|
//@ ignore-compare-mode-next-solver (explicit revisions)
|
||||||
|
//@[next] compile-flags: -Znext-solver
|
||||||
|
//@[next] check-pass
|
||||||
|
|
||||||
trait Super {}
|
trait Super {}
|
||||||
trait Sub<T>: Super {}
|
trait Sub<T>: Super {}
|
||||||
@ -11,5 +14,6 @@ trait Sub<T>: Super {}
|
|||||||
trait Overlap<T> {}
|
trait Overlap<T> {}
|
||||||
impl<T, U: Sub<T>> Overlap<T> for U {}
|
impl<T, U: Sub<T>> Overlap<T> for U {}
|
||||||
impl<T> Overlap<T> for () {}
|
impl<T> Overlap<T> for () {}
|
||||||
|
//[current]~^ ERROR conflicting implementations
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
@ -9,6 +9,9 @@
|
|||||||
// which caused the old solver to emit a `Tensor: TensorValue` goal in
|
// which caused the old solver to emit a `Tensor: TensorValue` goal in
|
||||||
// `fn normalize_to_error` which then failed, causing this test to pass.
|
// `fn normalize_to_error` which then failed, causing this test to pass.
|
||||||
|
|
||||||
|
//@ revisions: current next
|
||||||
|
//@ ignore-compare-mode-next-solver (explicit revisions)
|
||||||
|
//@[next] compile-flags: -Znext-solver
|
||||||
//@ check-pass
|
//@ check-pass
|
||||||
|
|
||||||
pub trait TensorValue {
|
pub trait TensorValue {
|
||||||
|
@ -0,0 +1,13 @@
|
|||||||
|
error[E0119]: conflicting implementations of trait `Overlap<_>` for type `()`
|
||||||
|
--> $DIR/super-trait-knowable-3.rs:19:1
|
||||||
|
|
|
||||||
|
LL | impl<T, U: Bound<W<T>>> Overlap<T> for U {}
|
||||||
|
| ---------------------------------------- first implementation here
|
||||||
|
LL | impl<T> Overlap<T> for () {}
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation for `()`
|
||||||
|
|
|
||||||
|
= note: downstream crates may implement trait `Sub<_>` for type `()`
|
||||||
|
|
||||||
|
error: aborting due to 1 previous error
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0119`.
|
@ -2,7 +2,10 @@
|
|||||||
// super trait bound is in a nested goal so this would not
|
// super trait bound is in a nested goal so this would not
|
||||||
// compile if we were to only elaborate root goals.
|
// compile if we were to only elaborate root goals.
|
||||||
|
|
||||||
//@ check-pass
|
//@ revisions: current next
|
||||||
|
//@ ignore-compare-mode-next-solver (explicit revisions)
|
||||||
|
//@[next] compile-flags: -Znext-solver
|
||||||
|
//@[next] check-pass
|
||||||
|
|
||||||
trait Super {}
|
trait Super {}
|
||||||
trait Sub<T>: Super {}
|
trait Sub<T>: Super {}
|
||||||
@ -14,5 +17,6 @@ impl<T: Sub<U>, U> Bound<W<U>> for T {}
|
|||||||
trait Overlap<T> {}
|
trait Overlap<T> {}
|
||||||
impl<T, U: Bound<W<T>>> Overlap<T> for U {}
|
impl<T, U: Bound<W<T>>> Overlap<T> for U {}
|
||||||
impl<T> Overlap<T> for () {}
|
impl<T> Overlap<T> for () {}
|
||||||
|
//[current]~^ ERROR conflicting implementations of trait `Overlap<_>` for type `()`
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
@ -22,7 +22,6 @@ mod v20 {
|
|||||||
impl v17<512, v0> {
|
impl v17<512, v0> {
|
||||||
pub const fn v21() -> v18 {}
|
pub const fn v21() -> v18 {}
|
||||||
//~^ ERROR cannot find type `v18` in this scope
|
//~^ ERROR cannot find type `v18` in this scope
|
||||||
//~| ERROR duplicate definitions with name `v21`
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<const v10: usize> v17<v10, v2> {
|
impl<const v10: usize> v17<v10, v2> {
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
error[E0432]: unresolved import `v20::v13`
|
error[E0432]: unresolved import `v20::v13`
|
||||||
--> $DIR/unevaluated-const-ice-119731.rs:38:15
|
--> $DIR/unevaluated-const-ice-119731.rs:37:15
|
||||||
|
|
|
|
||||||
LL | pub use v20::{v13, v17};
|
LL | pub use v20::{v13, v17};
|
||||||
| ^^^
|
| ^^^
|
||||||
@ -23,7 +23,7 @@ LL | pub const fn v21() -> v18 {}
|
|||||||
| ^^^ help: a type alias with a similar name exists: `v11`
|
| ^^^ help: a type alias with a similar name exists: `v11`
|
||||||
|
|
||||||
error[E0412]: cannot find type `v18` in this scope
|
error[E0412]: cannot find type `v18` in this scope
|
||||||
--> $DIR/unevaluated-const-ice-119731.rs:31:31
|
--> $DIR/unevaluated-const-ice-119731.rs:30:31
|
||||||
|
|
|
|
||||||
LL | pub type v11 = [[usize; v4]; v4];
|
LL | pub type v11 = [[usize; v4]; v4];
|
||||||
| --------------------------------- similarly named type alias `v11` defined here
|
| --------------------------------- similarly named type alias `v11` defined here
|
||||||
@ -32,7 +32,7 @@ LL | pub const fn v21() -> v18 {
|
|||||||
| ^^^ help: a type alias with a similar name exists: `v11`
|
| ^^^ help: a type alias with a similar name exists: `v11`
|
||||||
|
|
||||||
error[E0422]: cannot find struct, variant or union type `v18` in this scope
|
error[E0422]: cannot find struct, variant or union type `v18` in this scope
|
||||||
--> $DIR/unevaluated-const-ice-119731.rs:33:13
|
--> $DIR/unevaluated-const-ice-119731.rs:32:13
|
||||||
|
|
|
|
||||||
LL | pub type v11 = [[usize; v4]; v4];
|
LL | pub type v11 = [[usize; v4]; v4];
|
||||||
| --------------------------------- similarly named type alias `v11` defined here
|
| --------------------------------- similarly named type alias `v11` defined here
|
||||||
@ -73,29 +73,20 @@ LL + #![feature(adt_const_params)]
|
|||||||
|
|
|
|
||||||
|
|
||||||
error: maximum number of nodes exceeded in constant v20::v17::<v10, v2>::{constant#1}
|
error: maximum number of nodes exceeded in constant v20::v17::<v10, v2>::{constant#1}
|
||||||
--> $DIR/unevaluated-const-ice-119731.rs:28:37
|
--> $DIR/unevaluated-const-ice-119731.rs:27:37
|
||||||
|
|
|
|
||||||
LL | impl<const v10: usize> v17<v10, v2> {
|
LL | impl<const v10: usize> v17<v10, v2> {
|
||||||
| ^^
|
| ^^
|
||||||
|
|
||||||
error: maximum number of nodes exceeded in constant v20::v17::<v10, v2>::{constant#1}
|
error: maximum number of nodes exceeded in constant v20::v17::<v10, v2>::{constant#1}
|
||||||
--> $DIR/unevaluated-const-ice-119731.rs:28:37
|
--> $DIR/unevaluated-const-ice-119731.rs:27:37
|
||||||
|
|
|
|
||||||
LL | impl<const v10: usize> v17<v10, v2> {
|
LL | impl<const v10: usize> v17<v10, v2> {
|
||||||
| ^^
|
| ^^
|
||||||
|
|
|
|
||||||
= note: duplicate diagnostic emitted due to `-Z deduplicate-diagnostics=no`
|
= note: duplicate diagnostic emitted due to `-Z deduplicate-diagnostics=no`
|
||||||
|
|
||||||
error[E0592]: duplicate definitions with name `v21`
|
error: aborting due to 9 previous errors; 2 warnings emitted
|
||||||
--> $DIR/unevaluated-const-ice-119731.rs:23:9
|
|
||||||
|
|
|
||||||
LL | pub const fn v21() -> v18 {}
|
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^ duplicate definitions for `v21`
|
|
||||||
...
|
|
||||||
LL | pub const fn v21() -> v18 {
|
|
||||||
| ------------------------- other definition for `v21`
|
|
||||||
|
|
||||||
error: aborting due to 10 previous errors; 2 warnings emitted
|
Some errors have detailed explanations: E0412, E0422, E0425, E0432.
|
||||||
|
|
||||||
Some errors have detailed explanations: E0412, E0422, E0425, E0432, E0592.
|
|
||||||
For more information about an error, try `rustc --explain E0412`.
|
For more information about an error, try `rustc --explain E0412`.
|
||||||
|
@ -10,5 +10,6 @@ trait Trait {}
|
|||||||
impl<const N: u32> Trait for A<N> {}
|
impl<const N: u32> Trait for A<N> {}
|
||||||
|
|
||||||
impl<const N: u32> Trait for A<N> {}
|
impl<const N: u32> Trait for A<N> {}
|
||||||
|
//~^ ERROR conflicting implementations of trait `Trait` for type `A<_>`
|
||||||
|
|
||||||
pub fn main() {}
|
pub fn main() {}
|
||||||
|
@ -4,6 +4,16 @@ error[E0423]: expected value, found builtin type `u8`
|
|||||||
LL | struct A<const N: u32 = 1, const M: u32 = u8>;
|
LL | struct A<const N: u32 = 1, const M: u32 = u8>;
|
||||||
| ^^ not a value
|
| ^^ not a value
|
||||||
|
|
||||||
error: aborting due to 1 previous error
|
error[E0119]: conflicting implementations of trait `Trait` for type `A<_>`
|
||||||
|
--> $DIR/unknown-alias-defkind-anonconst-ice-116710.rs:12:1
|
||||||
|
|
|
||||||
|
LL | impl<const N: u32> Trait for A<N> {}
|
||||||
|
| --------------------------------- first implementation here
|
||||||
|
LL |
|
||||||
|
LL | impl<const N: u32> Trait for A<N> {}
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation for `A<_>`
|
||||||
|
|
||||||
For more information about this error, try `rustc --explain E0423`.
|
error: aborting due to 2 previous errors
|
||||||
|
|
||||||
|
Some errors have detailed explanations: E0119, E0423.
|
||||||
|
For more information about an error, try `rustc --explain E0119`.
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
error[E0119]: conflicting implementations of trait `LolFrom<&[u8]>` for type `LocalType<u8>`
|
error[E0119]: conflicting implementations of trait `LolFrom<&[_]>` for type `LocalType<_>`
|
||||||
--> $DIR/issue-23563.rs:13:1
|
--> $DIR/issue-23563.rs:13:1
|
||||||
|
|
|
|
||||||
LL | impl<'a, T> LolFrom<&'a [T]> for LocalType<T> {
|
LL | impl<'a, T> LolFrom<&'a [T]> for LocalType<T> {
|
||||||
|
@ -6,8 +6,6 @@ LL | impl<T: std::ops::DerefMut> Foo for T { }
|
|||||||
LL |
|
LL |
|
||||||
LL | impl<T> Foo for &T { }
|
LL | impl<T> Foo for &T { }
|
||||||
| ^^^^^^^^^^^^^^^^^^ conflicting implementation for `&_`
|
| ^^^^^^^^^^^^^^^^^^ conflicting implementation for `&_`
|
||||||
|
|
|
||||||
= note: downstream crates may implement trait `std::ops::DerefMut` for type `&_`
|
|
||||||
|
|
||||||
error: aborting due to 1 previous error
|
error: aborting due to 1 previous error
|
||||||
|
|
||||||
|
@ -3,9 +3,9 @@
|
|||||||
//@ check-pass
|
//@ check-pass
|
||||||
|
|
||||||
// The new trait solver does not return region constraints if the goal
|
// The new trait solver does not return region constraints if the goal
|
||||||
// is still ambiguous. However, the `'!a = 'static` constraint from
|
// is still ambiguous. This causes the following test to fail with ambiguity,
|
||||||
// `(): LeakCheckFailure<'!a, V>` is also returned via the canonical
|
// even though `(): LeakCheckFailure<'!a, V>` would return `'!a: 'static`
|
||||||
// var values, causing this test to compile.
|
// which would have caused a leak check failure.
|
||||||
|
|
||||||
trait Ambig {}
|
trait Ambig {}
|
||||||
impl Ambig for u32 {}
|
impl Ambig for u32 {}
|
||||||
|
@ -11,6 +11,7 @@ type Assoc<'a, T> = <T as ToUnit<'a>>::Unit;
|
|||||||
impl<T> Overlap<T> for T {}
|
impl<T> Overlap<T> for T {}
|
||||||
|
|
||||||
impl<T> Overlap<for<'a> fn(&'a (), Assoc<'a, T>)> for T {}
|
impl<T> Overlap<for<'a> fn(&'a (), Assoc<'a, T>)> for T {}
|
||||||
//~^ ERROR conflicting implementations of trait `Overlap<for<'a> fn(&'a (), _)>`
|
//~^ ERROR 13:17: 13:49: the trait bound `for<'a> T: ToUnit<'a>` is not satisfied [E0277]
|
||||||
|
//~| ERROR 13:36: 13:48: the trait bound `for<'a> T: ToUnit<'a>` is not satisfied [E0277]
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
@ -1,18 +1,27 @@
|
|||||||
WARN rustc_infer::infer::relate::generalize may incompletely handle alias type: AliasTy { args: [?1t, '^0.Named(DefId(0:15 ~ structually_relate_aliases[de75]::{impl#1}::'a), "'a")], def_id: DefId(0:5 ~ structually_relate_aliases[de75]::ToUnit::Unit), .. }
|
WARN rustc_infer::infer::relate::generalize may incompletely handle alias type: AliasTy { args: [?1t, '^0.Named(DefId(0:15 ~ structually_relate_aliases[de75]::{impl#1}::'a), "'a")], def_id: DefId(0:5 ~ structually_relate_aliases[de75]::ToUnit::Unit), .. }
|
||||||
WARN rustc_infer::infer::relate::generalize may incompletely handle alias type: AliasTy { args: [?1t, '^0.Named(DefId(0:15 ~ structually_relate_aliases[de75]::{impl#1}::'a), "'a")], def_id: DefId(0:5 ~ structually_relate_aliases[de75]::ToUnit::Unit), .. }
|
WARN rustc_infer::infer::relate::generalize may incompletely handle alias type: AliasTy { args: [?1t, !2_0.Named(DefId(0:15 ~ structually_relate_aliases[de75]::{impl#1}::'a), "'a")], def_id: DefId(0:5 ~ structually_relate_aliases[de75]::ToUnit::Unit), .. }
|
||||||
WARN rustc_infer::infer::relate::generalize may incompletely handle alias type: AliasTy { args: [?1t, '^0.Named(DefId(0:15 ~ structually_relate_aliases[de75]::{impl#1}::'a), "'a")], def_id: DefId(0:5 ~ structually_relate_aliases[de75]::ToUnit::Unit), .. }
|
error[E0277]: the trait bound `for<'a> T: ToUnit<'a>` is not satisfied
|
||||||
WARN rustc_infer::infer::relate::generalize may incompletely handle alias type: AliasTy { args: [?1t, '^0.Named(DefId(0:15 ~ structually_relate_aliases[de75]::{impl#1}::'a), "'a")], def_id: DefId(0:5 ~ structually_relate_aliases[de75]::ToUnit::Unit), .. }
|
--> $DIR/structually-relate-aliases.rs:13:36
|
||||||
error[E0119]: conflicting implementations of trait `Overlap<for<'a> fn(&'a (), _)>` for type `for<'a> fn(&'a (), _)`
|
|
||||||
--> $DIR/structually-relate-aliases.rs:13:1
|
|
||||||
|
|
|
|
||||||
LL | impl<T> Overlap<T> for T {}
|
|
||||||
| ------------------------ first implementation here
|
|
||||||
LL |
|
|
||||||
LL | impl<T> Overlap<for<'a> fn(&'a (), Assoc<'a, T>)> for T {}
|
LL | impl<T> Overlap<for<'a> fn(&'a (), Assoc<'a, T>)> for T {}
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation for `for<'a> fn(&'a (), _)`
|
| ^^^^^^^^^^^^ the trait `for<'a> ToUnit<'a>` is not implemented for `T`
|
||||||
|
|
|
|
||||||
= note: this behavior recently changed as a result of a bug fix; see rust-lang/rust#56105 for details
|
help: consider restricting type parameter `T`
|
||||||
|
|
|
||||||
|
LL | impl<T: for<'a> ToUnit<'a>> Overlap<for<'a> fn(&'a (), Assoc<'a, T>)> for T {}
|
||||||
|
| ++++++++++++++++++++
|
||||||
|
|
||||||
error: aborting due to 1 previous error
|
error[E0277]: the trait bound `for<'a> T: ToUnit<'a>` is not satisfied
|
||||||
|
--> $DIR/structually-relate-aliases.rs:13:17
|
||||||
|
|
|
||||||
|
LL | impl<T> Overlap<for<'a> fn(&'a (), Assoc<'a, T>)> for T {}
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `for<'a> ToUnit<'a>` is not implemented for `T`
|
||||||
|
|
|
||||||
|
help: consider restricting type parameter `T`
|
||||||
|
|
|
||||||
|
LL | impl<T: for<'a> ToUnit<'a>> Overlap<for<'a> fn(&'a (), Assoc<'a, T>)> for T {}
|
||||||
|
| ++++++++++++++++++++
|
||||||
|
|
||||||
For more information about this error, try `rustc --explain E0119`.
|
error: aborting due to 2 previous errors
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0277`.
|
||||||
|
@ -1,11 +1,11 @@
|
|||||||
error[E0119]: conflicting implementations of trait `AnotherTrait` for type `D<_>`
|
error[E0119]: conflicting implementations of trait `AnotherTrait` for type `D<OpaqueType>`
|
||||||
--> $DIR/auto-trait-coherence.rs:24:1
|
--> $DIR/auto-trait-coherence.rs:24:1
|
||||||
|
|
|
|
||||||
LL | impl<T: Send> AnotherTrait for T {}
|
LL | impl<T: Send> AnotherTrait for T {}
|
||||||
| -------------------------------- first implementation here
|
| -------------------------------- first implementation here
|
||||||
...
|
...
|
||||||
LL | impl AnotherTrait for D<OpaqueType> {
|
LL | impl AnotherTrait for D<OpaqueType> {
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation for `D<_>`
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation for `D<OpaqueType>`
|
||||||
|
|
||||||
error: aborting due to 1 previous error
|
error: aborting due to 1 previous error
|
||||||
|
|
||||||
|
@ -1,3 +1,6 @@
|
|||||||
|
//@ revisions: old next
|
||||||
|
//@[next] compile-flags: -Znext-solver
|
||||||
|
|
||||||
// Tests that type alias impls traits do not leak auto-traits for
|
// Tests that type alias impls traits do not leak auto-traits for
|
||||||
// the purposes of coherence checking
|
// the purposes of coherence checking
|
||||||
#![feature(type_alias_impl_trait)]
|
#![feature(type_alias_impl_trait)]
|
||||||
@ -19,7 +22,8 @@ impl<T: Send> AnotherTrait for T {}
|
|||||||
// (We treat opaque types as "foreign types" that could grow more impls
|
// (We treat opaque types as "foreign types" that could grow more impls
|
||||||
// in the future.)
|
// in the future.)
|
||||||
impl AnotherTrait for D<OpaqueType> {
|
impl AnotherTrait for D<OpaqueType> {
|
||||||
//~^ ERROR conflicting implementations of trait `AnotherTrait` for type `D<_>`
|
//[old]~^ ERROR conflicting implementations of trait `AnotherTrait` for type `D<OpaqueType>`
|
||||||
|
//[next]~^^ ERROR conflicting implementations of trait `AnotherTrait` for type `D<_>`
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
@ -1,12 +0,0 @@
|
|||||||
error[E0119]: conflicting implementations of trait `AnotherTrait` for type `D<_>`
|
|
||||||
--> $DIR/auto-trait-coherence.rs:21:1
|
|
||||||
|
|
|
||||||
LL | impl<T: Send> AnotherTrait for T {}
|
|
||||||
| -------------------------------- first implementation here
|
|
||||||
...
|
|
||||||
LL | impl AnotherTrait for D<OpaqueType> {
|
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation for `D<_>`
|
|
||||||
|
|
||||||
error: aborting due to 1 previous error
|
|
||||||
|
|
||||||
For more information about this error, try `rustc --explain E0119`.
|
|
@ -5,7 +5,7 @@ type T = impl Sized;
|
|||||||
struct Foo;
|
struct Foo;
|
||||||
|
|
||||||
impl Into<T> for Foo {
|
impl Into<T> for Foo {
|
||||||
//~^ ERROR conflicting implementations of trait `Into<_>` for type `Foo`
|
//~^ ERROR conflicting implementations of trait `Into<T>` for type `Foo`
|
||||||
fn into(self) -> T {
|
fn into(self) -> T {
|
||||||
Foo
|
Foo
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
error[E0119]: conflicting implementations of trait `Into<_>` for type `Foo`
|
error[E0119]: conflicting implementations of trait `Into<T>` for type `Foo`
|
||||||
--> $DIR/coherence-treats-tait-ambig.rs:7:1
|
--> $DIR/coherence-treats-tait-ambig.rs:7:1
|
||||||
|
|
|
|
||||||
LL | impl Into<T> for Foo {
|
LL | impl Into<T> for Foo {
|
||||||
|
@ -17,7 +17,7 @@ impl<T: std::fmt::Debug> AnotherTrait for T {}
|
|||||||
|
|
||||||
// This is in error, because we cannot assume that `OpaqueType: !Debug`
|
// This is in error, because we cannot assume that `OpaqueType: !Debug`
|
||||||
impl AnotherTrait for D<OpaqueType> {
|
impl AnotherTrait for D<OpaqueType> {
|
||||||
//~^ ERROR conflicting implementations of trait `AnotherTrait` for type `D<_>`
|
//~^ ERROR conflicting implementations of trait `AnotherTrait` for type `D<OpaqueType>`
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
@ -1,11 +1,13 @@
|
|||||||
error[E0119]: conflicting implementations of trait `AnotherTrait` for type `D<_>`
|
error[E0119]: conflicting implementations of trait `AnotherTrait` for type `D<OpaqueType>`
|
||||||
--> $DIR/negative-reasoning.rs:19:1
|
--> $DIR/negative-reasoning.rs:19:1
|
||||||
|
|
|
|
||||||
LL | impl<T: std::fmt::Debug> AnotherTrait for T {}
|
LL | impl<T: std::fmt::Debug> AnotherTrait for T {}
|
||||||
| ------------------------------------------- first implementation here
|
| ------------------------------------------- first implementation here
|
||||||
...
|
...
|
||||||
LL | impl AnotherTrait for D<OpaqueType> {
|
LL | impl AnotherTrait for D<OpaqueType> {
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation for `D<_>`
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation for `D<OpaqueType>`
|
||||||
|
|
|
||||||
|
= note: upstream crates may add a new impl of trait `std::marker::FnPtr` for type `OpaqueType` in future versions
|
||||||
|
|
||||||
error: aborting due to 1 previous error
|
error: aborting due to 1 previous error
|
||||||
|
|
||||||
|
@ -1,35 +1,34 @@
|
|||||||
|
//~ ERROR overflow evaluating the requirement `([isize; 0], _): Sized
|
||||||
|
|
||||||
trait Foo<A> {
|
trait Foo<A> {
|
||||||
fn get(&self, A: &A) {}
|
fn get(&self, A: &A) { }
|
||||||
}
|
}
|
||||||
|
|
||||||
trait Bar {
|
trait Bar {
|
||||||
type Out;
|
type Out;
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T> Foo<T> for [isize; 0] {
|
impl<T> Foo<T> for [isize;0] {
|
||||||
// OK, T is used in `Foo<T>`.
|
// OK, T is used in `Foo<T>`.
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T, U> Foo<T> for [isize; 1] {
|
impl<T,U> Foo<T> for [isize;1] {
|
||||||
//~^ ERROR the type parameter `U` is not constrained
|
//~^ ERROR the type parameter `U` is not constrained
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T, U> Foo<T> for [isize; 2]
|
impl<T,U> Foo<T> for [isize;2] where T : Bar<Out=U> {
|
||||||
where
|
|
||||||
T: Bar<Out = U>,
|
|
||||||
{
|
|
||||||
// OK, `U` is now constrained by the output type parameter.
|
// OK, `U` is now constrained by the output type parameter.
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T: Bar<Out = U>, U> Foo<T> for [isize; 3] {
|
impl<T:Bar<Out=U>,U> Foo<T> for [isize;3] {
|
||||||
// OK, same as above but written differently.
|
// OK, same as above but written differently.
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T, U> Foo<T> for U {
|
impl<T,U> Foo<T> for U {
|
||||||
//~^ ERROR conflicting implementations of trait `Foo<_>` for type `[isize; 0]`
|
//~^ ERROR conflicting implementations of trait `Foo<_>` for type `[isize; 0]`
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T, U> Bar for T {
|
impl<T,U> Bar for T {
|
||||||
//~^ ERROR the type parameter `U` is not constrained
|
//~^ ERROR the type parameter `U` is not constrained
|
||||||
|
|
||||||
type Out = U;
|
type Out = U;
|
||||||
@ -37,33 +36,28 @@ impl<T, U> Bar for T {
|
|||||||
// Using `U` in an associated type within the impl is not good enough!
|
// Using `U` in an associated type within the impl is not good enough!
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T, U> Bar for T
|
impl<T,U> Bar for T
|
||||||
where
|
where T : Bar<Out=U>
|
||||||
T: Bar<Out = U>,
|
|
||||||
{
|
{
|
||||||
//~^^^^ ERROR the type parameter `U` is not constrained by the impl trait, self type, or predicates
|
//~^^^ ERROR the type parameter `U` is not constrained
|
||||||
//~| ERROR conflicting implementations of trait `Bar`
|
|
||||||
// This crafty self-referential attempt is still no good.
|
// This crafty self-referential attempt is still no good.
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T, U, V> Foo<T> for T
|
impl<T,U,V> Foo<T> for T
|
||||||
where
|
where (T,U): Bar<Out=V>
|
||||||
(T, U): Bar<Out = V>,
|
|
||||||
{
|
{
|
||||||
//~^^^^ ERROR the type parameter `U` is not constrained
|
//~^^^ ERROR the type parameter `U` is not constrained
|
||||||
//~| ERROR the type parameter `V` is not constrained
|
//~| ERROR the type parameter `V` is not constrained
|
||||||
//~| ERROR conflicting implementations of trait `Foo<[isize; 0]>` for type `[isize; 0]`
|
|
||||||
|
|
||||||
// Here, `V` is bound by an output type parameter, but the inputs
|
// Here, `V` is bound by an output type parameter, but the inputs
|
||||||
// are not themselves constrained.
|
// are not themselves constrained.
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T, U, V> Foo<(T, U)> for T
|
impl<T,U,V> Foo<(T,U)> for T
|
||||||
where
|
where (T,U): Bar<Out=V>
|
||||||
(T, U): Bar<Out = V>,
|
|
||||||
{
|
{
|
||||||
//~^^^^ ERROR conflicting implementations of trait `Foo<([isize; 0], _)>` for type `[isize; 0]`
|
|
||||||
// As above, but both T and U ARE constrained.
|
// As above, but both T and U ARE constrained.
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() {}
|
fn main() { }
|
||||||
|
@ -1,76 +1,56 @@
|
|||||||
error[E0119]: conflicting implementations of trait `Foo<_>` for type `[isize; 0]`
|
error[E0119]: conflicting implementations of trait `Foo<_>` for type `[isize; 0]`
|
||||||
--> $DIR/impl-unused-tps.rs:28:1
|
--> $DIR/impl-unused-tps.rs:27:1
|
||||||
|
|
|
|
||||||
LL | impl<T> Foo<T> for [isize; 0] {
|
LL | impl<T> Foo<T> for [isize;0] {
|
||||||
| ----------------------------- first implementation here
|
| ---------------------------- first implementation here
|
||||||
...
|
...
|
||||||
LL | impl<T, U> Foo<T> for U {
|
LL | impl<T,U> Foo<T> for U {
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation for `[isize; 0]`
|
| ^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation for `[isize; 0]`
|
||||||
|
|
||||||
error[E0119]: conflicting implementations of trait `Bar`
|
error[E0275]: overflow evaluating the requirement `([isize; 0], _): Sized`
|
||||||
--> $DIR/impl-unused-tps.rs:40:1
|
|
||||||
|
|
|
|
||||||
LL | impl<T, U> Bar for T {
|
= help: consider increasing the recursion limit by adding a `#![recursion_limit = "256"]` attribute to your crate (`impl_unused_tps`)
|
||||||
| -------------------- first implementation here
|
note: required for `([isize; 0], _)` to implement `Bar`
|
||||||
...
|
--> $DIR/impl-unused-tps.rs:31:11
|
||||||
LL | / impl<T, U> Bar for T
|
|
||||||
LL | | where
|
|
||||||
LL | | T: Bar<Out = U>,
|
|
||||||
| |____________________^ conflicting implementation
|
|
||||||
|
|
||||||
error[E0119]: conflicting implementations of trait `Foo<[isize; 0]>` for type `[isize; 0]`
|
|
||||||
--> $DIR/impl-unused-tps.rs:49:1
|
|
||||||
|
|
|
|
||||||
LL | impl<T> Foo<T> for [isize; 0] {
|
LL | impl<T,U> Bar for T {
|
||||||
| ----------------------------- first implementation here
|
| - ^^^ ^
|
||||||
...
|
| |
|
||||||
LL | / impl<T, U, V> Foo<T> for T
|
| unsatisfied trait bound introduced here
|
||||||
LL | | where
|
= note: 126 redundant requirements hidden
|
||||||
LL | | (T, U): Bar<Out = V>,
|
= note: required for `([isize; 0], _)` to implement `Bar`
|
||||||
| |_________________________^ conflicting implementation for `[isize; 0]`
|
|
||||||
|
|
||||||
error[E0119]: conflicting implementations of trait `Foo<([isize; 0], _)>` for type `[isize; 0]`
|
|
||||||
--> $DIR/impl-unused-tps.rs:61:1
|
|
||||||
|
|
|
||||||
LL | impl<T> Foo<T> for [isize; 0] {
|
|
||||||
| ----------------------------- first implementation here
|
|
||||||
...
|
|
||||||
LL | / impl<T, U, V> Foo<(T, U)> for T
|
|
||||||
LL | | where
|
|
||||||
LL | | (T, U): Bar<Out = V>,
|
|
||||||
| |_________________________^ conflicting implementation for `[isize; 0]`
|
|
||||||
|
|
||||||
error[E0207]: the type parameter `U` is not constrained by the impl trait, self type, or predicates
|
error[E0207]: the type parameter `U` is not constrained by the impl trait, self type, or predicates
|
||||||
--> $DIR/impl-unused-tps.rs:13:9
|
--> $DIR/impl-unused-tps.rs:15:8
|
||||||
|
|
|
|
||||||
LL | impl<T, U> Foo<T> for [isize; 1] {
|
LL | impl<T,U> Foo<T> for [isize;1] {
|
||||||
| ^ unconstrained type parameter
|
| ^ unconstrained type parameter
|
||||||
|
|
||||||
error[E0207]: the type parameter `U` is not constrained by the impl trait, self type, or predicates
|
error[E0207]: the type parameter `U` is not constrained by the impl trait, self type, or predicates
|
||||||
--> $DIR/impl-unused-tps.rs:32:9
|
--> $DIR/impl-unused-tps.rs:31:8
|
||||||
|
|
|
|
||||||
LL | impl<T, U> Bar for T {
|
LL | impl<T,U> Bar for T {
|
||||||
| ^ unconstrained type parameter
|
| ^ unconstrained type parameter
|
||||||
|
|
||||||
error[E0207]: the type parameter `U` is not constrained by the impl trait, self type, or predicates
|
error[E0207]: the type parameter `U` is not constrained by the impl trait, self type, or predicates
|
||||||
--> $DIR/impl-unused-tps.rs:40:9
|
--> $DIR/impl-unused-tps.rs:39:8
|
||||||
|
|
|
|
||||||
LL | impl<T, U> Bar for T
|
LL | impl<T,U> Bar for T
|
||||||
| ^ unconstrained type parameter
|
| ^ unconstrained type parameter
|
||||||
|
|
||||||
error[E0207]: the type parameter `U` is not constrained by the impl trait, self type, or predicates
|
error[E0207]: the type parameter `U` is not constrained by the impl trait, self type, or predicates
|
||||||
--> $DIR/impl-unused-tps.rs:49:9
|
--> $DIR/impl-unused-tps.rs:47:8
|
||||||
|
|
|
|
||||||
LL | impl<T, U, V> Foo<T> for T
|
LL | impl<T,U,V> Foo<T> for T
|
||||||
| ^ unconstrained type parameter
|
| ^ unconstrained type parameter
|
||||||
|
|
||||||
error[E0207]: the type parameter `V` is not constrained by the impl trait, self type, or predicates
|
error[E0207]: the type parameter `V` is not constrained by the impl trait, self type, or predicates
|
||||||
--> $DIR/impl-unused-tps.rs:49:12
|
--> $DIR/impl-unused-tps.rs:47:10
|
||||||
|
|
|
|
||||||
LL | impl<T, U, V> Foo<T> for T
|
LL | impl<T,U,V> Foo<T> for T
|
||||||
| ^ unconstrained type parameter
|
| ^ unconstrained type parameter
|
||||||
|
|
||||||
error: aborting due to 9 previous errors
|
error: aborting due to 7 previous errors
|
||||||
|
|
||||||
Some errors have detailed explanations: E0119, E0207.
|
Some errors have detailed explanations: E0119, E0207, E0275.
|
||||||
For more information about an error, try `rustc --explain E0119`.
|
For more information about an error, try `rustc --explain E0119`.
|
||||||
|
@ -1,8 +1,12 @@
|
|||||||
// Regression test for #48728, an ICE that occurred computing
|
// Regression test for #48728, an ICE that occurred computing
|
||||||
// coherence "help" information.
|
// coherence "help" information.
|
||||||
|
|
||||||
//@ check-pass
|
//@ revisions: current next
|
||||||
#[derive(Clone)]
|
//@ ignore-compare-mode-next-solver (explicit revisions)
|
||||||
|
//@[next] compile-flags: -Znext-solver
|
||||||
|
//@[next] check-pass
|
||||||
|
|
||||||
|
#[derive(Clone)] //[current]~ ERROR conflicting implementations of trait `Clone`
|
||||||
struct Node<T: ?Sized>(Box<T>);
|
struct Node<T: ?Sized>(Box<T>);
|
||||||
|
|
||||||
impl<T: Clone + ?Sized> Clone for Node<[T]> {
|
impl<T: Clone + ?Sized> Clone for Node<[T]> {
|
||||||
|
@ -1,21 +0,0 @@
|
|||||||
warning: the feature `specialization` is incomplete and may not be safe to use and/or cause compiler crashes
|
|
||||||
--> $DIR/default-impl-normalization-ambig-2.rs:2:12
|
|
||||||
|
|
|
||||||
LL | #![feature(specialization)]
|
|
||||||
| ^^^^^^^^^^^^^^
|
|
||||||
|
|
|
||||||
= note: see issue #31844 <https://github.com/rust-lang/rust/issues/31844> for more information
|
|
||||||
= help: consider using `min_specialization` instead, which is more stable and complete
|
|
||||||
= note: `#[warn(incomplete_features)]` on by default
|
|
||||||
|
|
||||||
error[E0277]: the trait bound `u16: Assoc` is not satisfied
|
|
||||||
--> $DIR/default-impl-normalization-ambig-2.rs:17:14
|
|
||||||
|
|
|
||||||
LL | impl Foo for <u16 as Assoc>::Output {}
|
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^ the trait `Assoc` is not implemented for `u16`
|
|
||||||
|
|
|
||||||
= help: the trait `Assoc` is implemented for `u8`
|
|
||||||
|
|
||||||
error: aborting due to 1 previous error; 1 warning emitted
|
|
||||||
|
|
||||||
For more information about this error, try `rustc --explain E0277`.
|
|
@ -1,21 +0,0 @@
|
|||||||
warning: the feature `specialization` is incomplete and may not be safe to use and/or cause compiler crashes
|
|
||||||
--> $DIR/default-item-normalization-ambig-1.rs:2:12
|
|
||||||
|
|
|
||||||
LL | #![feature(specialization)]
|
|
||||||
| ^^^^^^^^^^^^^^
|
|
||||||
|
|
|
||||||
= note: see issue #31844 <https://github.com/rust-lang/rust/issues/31844> for more information
|
|
||||||
= help: consider using `min_specialization` instead, which is more stable and complete
|
|
||||||
= note: `#[warn(incomplete_features)]` on by default
|
|
||||||
|
|
||||||
error[E0119]: conflicting implementations of trait `Y` for type `<() as X>::U`
|
|
||||||
--> $DIR/default-item-normalization-ambig-1.rs:20:1
|
|
||||||
|
|
|
||||||
LL | impl Y for <() as X>::U {}
|
|
||||||
| ----------------------- first implementation here
|
|
||||||
LL | impl Y for <i32 as X>::U {}
|
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation for `<() as X>::U`
|
|
||||||
|
|
||||||
error: aborting due to 1 previous error; 1 warning emitted
|
|
||||||
|
|
||||||
For more information about this error, try `rustc --explain E0119`.
|
|
@ -71,8 +71,7 @@ impl<T: Clone> Redundant for T {
|
|||||||
}
|
}
|
||||||
|
|
||||||
default impl Redundant for i32 {
|
default impl Redundant for i32 {
|
||||||
fn redundant(&self) {}
|
fn redundant(&self) {} //~ ERROR E0520
|
||||||
//~^ ERROR `redundant` specializes an item from a parent `impl`, but that item is not marked `default`
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
@ -1,12 +0,0 @@
|
|||||||
error[E0119]: conflicting implementations of trait `Overlap` for type `u32`
|
|
||||||
--> $DIR/specialization-default-items-drop-coherence.rs:26:1
|
|
||||||
|
|
|
||||||
LL | impl Overlap for u32 {
|
|
||||||
| -------------------- first implementation here
|
|
||||||
...
|
|
||||||
LL | impl Overlap for <u32 as Default>::Id {
|
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation for `u32`
|
|
||||||
|
|
||||||
error: aborting due to 1 previous error
|
|
||||||
|
|
||||||
For more information about this error, try `rustc --explain E0119`.
|
|
@ -1,5 +1,5 @@
|
|||||||
error[E0119]: conflicting implementations of trait `Overlap` for type `u32`
|
error[E0119]: conflicting implementations of trait `Overlap` for type `u32`
|
||||||
--> $DIR/specialization-default-items-drop-coherence.rs:26:1
|
--> $DIR/specialization-default-items-drop-coherence.rs:29:1
|
||||||
|
|
|
|
||||||
LL | impl Overlap for u32 {
|
LL | impl Overlap for u32 {
|
||||||
| -------------------- first implementation here
|
| -------------------- first implementation here
|
||||||
|
@ -1,5 +1,8 @@
|
|||||||
//@ revisions: current next
|
//@ revisions: classic coherence next
|
||||||
//@[next] compile-flags: -Znext-solver
|
//@[next] compile-flags: -Znext-solver
|
||||||
|
//@[coherence] compile-flags: -Znext-solver=coherence
|
||||||
|
//@[classic] check-pass
|
||||||
|
//@[classic] known-bug: #105782
|
||||||
|
|
||||||
// Should fail. Default items completely drop candidates instead of ambiguity,
|
// Should fail. Default items completely drop candidates instead of ambiguity,
|
||||||
// which is unsound during coherence, since coherence requires completeness.
|
// which is unsound during coherence, since coherence requires completeness.
|
||||||
@ -24,7 +27,8 @@ impl Overlap for u32 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl Overlap for <u32 as Default>::Id {
|
impl Overlap for <u32 as Default>::Id {
|
||||||
//~^ ERROR conflicting implementations of trait `Overlap` for type `u32`
|
//[coherence]~^ ERROR conflicting implementations of trait `Overlap` for type `u32`
|
||||||
|
//[next]~^^ ERROR conflicting implementations of trait `Overlap` for type `u32`
|
||||||
type Assoc = Box<usize>;
|
type Assoc = Box<usize>;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
warning: the feature `specialization` is incomplete and may not be safe to use and/or cause compiler crashes
|
warning: the feature `specialization` is incomplete and may not be safe to use and/or cause compiler crashes
|
||||||
--> $DIR/specialization-overlap-projection.rs:4:12
|
--> $DIR/specialization-overlap-projection.rs:10:12
|
||||||
|
|
|
|
||||||
LL | #![feature(specialization)]
|
LL | #![feature(specialization)]
|
||||||
| ^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^
|
||||||
@ -8,23 +8,5 @@ LL | #![feature(specialization)]
|
|||||||
= help: consider using `min_specialization` instead, which is more stable and complete
|
= help: consider using `min_specialization` instead, which is more stable and complete
|
||||||
= note: `#[warn(incomplete_features)]` on by default
|
= note: `#[warn(incomplete_features)]` on by default
|
||||||
|
|
||||||
error[E0119]: conflicting implementations of trait `Foo` for type `u32`
|
warning: 1 warning emitted
|
||||||
--> $DIR/specialization-overlap-projection.rs:19:1
|
|
||||||
|
|
|
||||||
LL | impl Foo for u32 {}
|
|
||||||
| ---------------- first implementation here
|
|
||||||
LL | impl Foo for <u8 as Assoc>::Output {}
|
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation for `u32`
|
|
||||||
|
|
||||||
error[E0119]: conflicting implementations of trait `Foo` for type `u32`
|
|
||||||
--> $DIR/specialization-overlap-projection.rs:21:1
|
|
||||||
|
|
|
||||||
LL | impl Foo for u32 {}
|
|
||||||
| ---------------- first implementation here
|
|
||||||
...
|
|
||||||
LL | impl Foo for <u16 as Assoc>::Output {}
|
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation for `u32`
|
|
||||||
|
|
||||||
error: aborting due to 2 previous errors; 1 warning emitted
|
|
||||||
|
|
||||||
For more information about this error, try `rustc --explain E0119`.
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
warning: the feature `specialization` is incomplete and may not be safe to use and/or cause compiler crashes
|
warning: the feature `specialization` is incomplete and may not be safe to use and/or cause compiler crashes
|
||||||
--> $DIR/specialization-overlap-projection.rs:4:12
|
--> $DIR/specialization-overlap-projection.rs:10:12
|
||||||
|
|
|
|
||||||
LL | #![feature(specialization)]
|
LL | #![feature(specialization)]
|
||||||
| ^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^
|
||||||
@ -9,7 +9,7 @@ LL | #![feature(specialization)]
|
|||||||
= note: `#[warn(incomplete_features)]` on by default
|
= note: `#[warn(incomplete_features)]` on by default
|
||||||
|
|
||||||
error[E0119]: conflicting implementations of trait `Foo` for type `u32`
|
error[E0119]: conflicting implementations of trait `Foo` for type `u32`
|
||||||
--> $DIR/specialization-overlap-projection.rs:19:1
|
--> $DIR/specialization-overlap-projection.rs:25:1
|
||||||
|
|
|
|
||||||
LL | impl Foo for u32 {}
|
LL | impl Foo for u32 {}
|
||||||
| ---------------- first implementation here
|
| ---------------- first implementation here
|
||||||
@ -17,7 +17,7 @@ LL | impl Foo for <u8 as Assoc>::Output {}
|
|||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation for `u32`
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation for `u32`
|
||||||
|
|
||||||
error[E0119]: conflicting implementations of trait `Foo` for type `u32`
|
error[E0119]: conflicting implementations of trait `Foo` for type `u32`
|
||||||
--> $DIR/specialization-overlap-projection.rs:21:1
|
--> $DIR/specialization-overlap-projection.rs:27:1
|
||||||
|
|
|
|
||||||
LL | impl Foo for u32 {}
|
LL | impl Foo for u32 {}
|
||||||
| ---------------- first implementation here
|
| ---------------- first implementation here
|
||||||
|
@ -1,8 +1,13 @@
|
|||||||
|
//@ revisions: current next
|
||||||
|
//@ ignore-compare-mode-next-solver (explicit revisions)
|
||||||
|
//@[next] compile-flags: -Znext-solver
|
||||||
|
//@[current] check-pass
|
||||||
|
|
||||||
// Test that impls on projected self types can resolve overlap, even when the
|
// Test that impls on projected self types can resolve overlap, even when the
|
||||||
// projections involve specialization, so long as the associated type is
|
// projections involve specialization, so long as the associated type is
|
||||||
// provided by the most specialized impl.
|
// provided by the most specialized impl.
|
||||||
#![feature(specialization)]
|
|
||||||
//~^ WARN the feature `specialization` is incomplete and may not be safe to use and/or cause compiler crashes
|
#![feature(specialization)] //~ WARN the feature `specialization` is incomplete
|
||||||
|
|
||||||
trait Assoc {
|
trait Assoc {
|
||||||
type Output;
|
type Output;
|
||||||
@ -18,8 +23,8 @@ impl Assoc for u16 { type Output = u16; }
|
|||||||
trait Foo {}
|
trait Foo {}
|
||||||
impl Foo for u32 {}
|
impl Foo for u32 {}
|
||||||
impl Foo for <u8 as Assoc>::Output {}
|
impl Foo for <u8 as Assoc>::Output {}
|
||||||
//~^ ERROR conflicting implementations of trait `Foo` for type `u32`
|
//[next]~^ ERROR conflicting implementations of trait `Foo` for type `u32`
|
||||||
impl Foo for <u16 as Assoc>::Output {}
|
impl Foo for <u16 as Assoc>::Output {}
|
||||||
//~^ ERROR conflicting implementations of trait `Foo` for type `u32`
|
//[next]~^ ERROR conflicting implementations of trait `Foo` for type `u32`
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
@ -1,30 +0,0 @@
|
|||||||
warning: the feature `specialization` is incomplete and may not be safe to use and/or cause compiler crashes
|
|
||||||
--> $DIR/specialization-overlap-projection.rs:4:12
|
|
||||||
|
|
|
||||||
LL | #![feature(specialization)]
|
|
||||||
| ^^^^^^^^^^^^^^
|
|
||||||
|
|
|
||||||
= note: see issue #31844 <https://github.com/rust-lang/rust/issues/31844> for more information
|
|
||||||
= help: consider using `min_specialization` instead, which is more stable and complete
|
|
||||||
= note: `#[warn(incomplete_features)]` on by default
|
|
||||||
|
|
||||||
error[E0119]: conflicting implementations of trait `Foo` for type `u32`
|
|
||||||
--> $DIR/specialization-overlap-projection.rs:20:1
|
|
||||||
|
|
|
||||||
LL | impl Foo for u32 {}
|
|
||||||
| ---------------- first implementation here
|
|
||||||
LL | impl Foo for <u8 as Assoc>::Output {}
|
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation for `u32`
|
|
||||||
|
|
||||||
error[E0119]: conflicting implementations of trait `Foo` for type `u32`
|
|
||||||
--> $DIR/specialization-overlap-projection.rs:22:1
|
|
||||||
|
|
|
||||||
LL | impl Foo for u32 {}
|
|
||||||
| ---------------- first implementation here
|
|
||||||
...
|
|
||||||
LL | impl Foo for <u16 as Assoc>::Output {}
|
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation for `u32`
|
|
||||||
|
|
||||||
error: aborting due to 2 previous errors; 1 warning emitted
|
|
||||||
|
|
||||||
For more information about this error, try `rustc --explain E0119`.
|
|
@ -8,5 +8,5 @@ fn mk_opaque() -> OpaqueType {
|
|||||||
trait AnotherTrait {}
|
trait AnotherTrait {}
|
||||||
impl<T: Send> AnotherTrait for T {}
|
impl<T: Send> AnotherTrait for T {}
|
||||||
impl AnotherTrait for OpaqueType {}
|
impl AnotherTrait for OpaqueType {}
|
||||||
//~^ ERROR conflicting implementations of trait `AnotherTrait`
|
//~^ ERROR conflicting implementations of trait `AnotherTrait` for type `OpaqueType`
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
@ -1,10 +1,10 @@
|
|||||||
error[E0119]: conflicting implementations of trait `AnotherTrait`
|
error[E0119]: conflicting implementations of trait `AnotherTrait` for type `OpaqueType`
|
||||||
--> $DIR/issue-83613.rs:10:1
|
--> $DIR/issue-83613.rs:10:1
|
||||||
|
|
|
|
||||||
LL | impl<T: Send> AnotherTrait for T {}
|
LL | impl<T: Send> AnotherTrait for T {}
|
||||||
| -------------------------------- first implementation here
|
| -------------------------------- first implementation here
|
||||||
LL | impl AnotherTrait for OpaqueType {}
|
LL | impl AnotherTrait for OpaqueType {}
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation for `OpaqueType`
|
||||||
|
|
||||||
error: aborting due to 1 previous error
|
error: aborting due to 1 previous error
|
||||||
|
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
//~ ERROR overflow evaluating the requirement `A<A<A<A<A<A<A<...>>>>>>>: Send`
|
||||||
struct A<T>(B<T>);
|
struct A<T>(B<T>);
|
||||||
//~^ ERROR recursive types `A` and `B` have infinite size
|
//~^ ERROR recursive types `A` and `B` have infinite size
|
||||||
//~| ERROR `T` is only used recursively
|
//~| ERROR `T` is only used recursively
|
||||||
@ -6,5 +7,5 @@ struct B<T>(A<A<T>>);
|
|||||||
trait Foo {}
|
trait Foo {}
|
||||||
impl<T> Foo for T where T: Send {}
|
impl<T> Foo for T where T: Send {}
|
||||||
impl Foo for B<u8> {}
|
impl Foo for B<u8> {}
|
||||||
//~^ ERROR conflicting implementations of trait `Foo` for type `B<u8>`
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
error[E0072]: recursive types `A` and `B` have infinite size
|
error[E0072]: recursive types `A` and `B` have infinite size
|
||||||
--> $DIR/issue-105231.rs:1:1
|
--> $DIR/issue-105231.rs:2:1
|
||||||
|
|
|
|
||||||
LL | struct A<T>(B<T>);
|
LL | struct A<T>(B<T>);
|
||||||
| ^^^^^^^^^^^ ---- recursive without indirection
|
| ^^^^^^^^^^^ ---- recursive without indirection
|
||||||
@ -16,7 +16,7 @@ LL ~ struct B<T>(Box<A<A<T>>>);
|
|||||||
|
|
|
|
||||||
|
|
||||||
error: type parameter `T` is only used recursively
|
error: type parameter `T` is only used recursively
|
||||||
--> $DIR/issue-105231.rs:1:15
|
--> $DIR/issue-105231.rs:2:15
|
||||||
|
|
|
|
||||||
LL | struct A<T>(B<T>);
|
LL | struct A<T>(B<T>);
|
||||||
| - ^
|
| - ^
|
||||||
@ -27,7 +27,7 @@ LL | struct A<T>(B<T>);
|
|||||||
= note: all type parameters must be used in a non-recursive way in order to constrain their variance
|
= note: all type parameters must be used in a non-recursive way in order to constrain their variance
|
||||||
|
|
||||||
error: type parameter `T` is only used recursively
|
error: type parameter `T` is only used recursively
|
||||||
--> $DIR/issue-105231.rs:4:17
|
--> $DIR/issue-105231.rs:5:17
|
||||||
|
|
|
|
||||||
LL | struct B<T>(A<A<T>>);
|
LL | struct B<T>(A<A<T>>);
|
||||||
| - ^
|
| - ^
|
||||||
@ -37,18 +37,16 @@ LL | struct B<T>(A<A<T>>);
|
|||||||
= help: consider removing `T`, referring to it in a field, or using a marker such as `PhantomData`
|
= help: consider removing `T`, referring to it in a field, or using a marker such as `PhantomData`
|
||||||
= note: all type parameters must be used in a non-recursive way in order to constrain their variance
|
= note: all type parameters must be used in a non-recursive way in order to constrain their variance
|
||||||
|
|
||||||
error[E0119]: conflicting implementations of trait `Foo` for type `B<u8>`
|
error[E0275]: overflow evaluating the requirement `A<A<A<A<A<A<A<...>>>>>>>: Send`
|
||||||
--> $DIR/issue-105231.rs:8:1
|
|
||||||
|
|
|
|
||||||
LL | impl<T> Foo for T where T: Send {}
|
|
||||||
| ------------------------------- first implementation here
|
|
||||||
LL | impl Foo for B<u8> {}
|
|
||||||
| ^^^^^^^^^^^^^^^^^^ conflicting implementation for `B<u8>`
|
|
||||||
|
|
|
||||||
= note: overflow evaluating the requirement `B<u8>: Send`
|
|
||||||
= help: consider increasing the recursion limit by adding a `#![recursion_limit = "256"]` attribute to your crate (`issue_105231`)
|
= help: consider increasing the recursion limit by adding a `#![recursion_limit = "256"]` attribute to your crate (`issue_105231`)
|
||||||
|
note: required because it appears within the type `B<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<u8>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>`
|
||||||
|
--> $DIR/issue-105231.rs:5:8
|
||||||
|
|
|
||||||
|
LL | struct B<T>(A<A<T>>);
|
||||||
|
| ^
|
||||||
|
|
||||||
error: aborting due to 4 previous errors
|
error: aborting due to 4 previous errors
|
||||||
|
|
||||||
Some errors have detailed explanations: E0072, E0119.
|
Some errors have detailed explanations: E0072, E0275.
|
||||||
For more information about an error, try `rustc --explain E0072`.
|
For more information about an error, try `rustc --explain E0072`.
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
//~ ERROR overflow
|
||||||
// A regression test for #111729 checking that we correctly
|
// A regression test for #111729 checking that we correctly
|
||||||
// track recursion depth for obligations returned by confirmation.
|
// track recursion depth for obligations returned by confirmation.
|
||||||
use std::panic::RefUnwindSafe;
|
use std::panic::RefUnwindSafe;
|
||||||
@ -17,7 +18,6 @@ impl<T: RefUnwindSafe> Database for T {
|
|||||||
type Storage = SalsaStorage;
|
type Storage = SalsaStorage;
|
||||||
}
|
}
|
||||||
impl Database for RootDatabase {
|
impl Database for RootDatabase {
|
||||||
//~^ ERROR conflicting implementations of trait `Database` for type `RootDatabase`
|
|
||||||
type Storage = SalsaStorage;
|
type Storage = SalsaStorage;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,12 +1,24 @@
|
|||||||
error[E0119]: conflicting implementations of trait `Database` for type `RootDatabase`
|
error[E0275]: overflow evaluating the requirement `Runtime<RootDatabase>: RefUnwindSafe`
|
||||||
--> $DIR/cycle-via-builtin-auto-trait-impl.rs:19:1
|
|
|
||||||
|
= help: consider increasing the recursion limit by adding a `#![recursion_limit = "256"]` attribute to your crate (`cycle_via_builtin_auto_trait_impl`)
|
||||||
|
note: required because it appears within the type `RootDatabase`
|
||||||
|
--> $DIR/cycle-via-builtin-auto-trait-impl.rs:13:8
|
||||||
|
|
|
||||||
|
LL | struct RootDatabase {
|
||||||
|
| ^^^^^^^^^^^^
|
||||||
|
note: required for `RootDatabase` to implement `Database`
|
||||||
|
--> $DIR/cycle-via-builtin-auto-trait-impl.rs:17:24
|
||||||
|
|
|
|
||||||
LL | impl<T: RefUnwindSafe> Database for T {
|
LL | impl<T: RefUnwindSafe> Database for T {
|
||||||
| ------------------------------------- first implementation here
|
| ------------- ^^^^^^^^ ^
|
||||||
...
|
| |
|
||||||
LL | impl Database for RootDatabase {
|
| unsatisfied trait bound introduced here
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation for `RootDatabase`
|
note: required because it appears within the type `Runtime<RootDatabase>`
|
||||||
|
--> $DIR/cycle-via-builtin-auto-trait-impl.rs:24:8
|
||||||
|
|
|
||||||
|
LL | struct Runtime<DB: Database> {
|
||||||
|
| ^^^^^^^
|
||||||
|
|
||||||
error: aborting due to 1 previous error
|
error: aborting due to 1 previous error
|
||||||
|
|
||||||
For more information about this error, try `rustc --explain E0119`.
|
For more information about this error, try `rustc --explain E0275`.
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user