Auto merge of #64546 - weiznich:bugfix/rfc-2451-rerebalance-tests, r=nikomatsakis

Bugfix/rfc 2451 rerebalance tests

r? @nikomatsakis

Fixes #64412
Depends/Contains on #64414

cc #55437 and #63599
This commit is contained in:
bors 2019-09-29 09:52:58 +00:00
commit d046ffddc4
34 changed files with 531 additions and 17 deletions

View file

@ -378,7 +378,15 @@ fn orphan_check_trait_ref<'tcx>(
// Let Ti be the first such type.
// - No uncovered type parameters P1..=Pn may appear in T0..Ti (excluding Ti)
//
for input_ty in trait_ref.input_types() {
fn uncover_fundamental_ty(ty: Ty<'_>) -> Vec<Ty<'_>> {
if fundamental_ty(ty) {
ty.walk_shallow().flat_map(|ty| uncover_fundamental_ty(ty)).collect()
} else {
vec![ty]
}
}
for input_ty in trait_ref.input_types().flat_map(uncover_fundamental_ty) {
debug!("orphan_check_trait_ref: check ty `{:?}`", input_ty);
if ty_is_local(tcx, input_ty, in_crate) {
debug!("orphan_check_trait_ref: ty_is_local `{:?}`", input_ty);

View file

@ -5,11 +5,11 @@ pub trait Remote {
}
pub trait Remote1<T> {
fn foo(&self, t: T) { }
fn foo(&self, _t: T) { }
}
pub trait Remote2<T, U> {
fn foo(&self, t: T, u: U) { }
fn foo(&self, _t: T, _u: U) { }
}
pub struct Pair<T,U>(T,U);

View file

@ -0,0 +1,17 @@
#![feature(re_rebalance_coherence)]
// compile-flags:--crate-name=test
// aux-build:coherence_lib.rs
extern crate coherence_lib as lib;
use lib::*;
use std::rc::Rc;
struct Local;
impl Remote1<u32> for f64 {
//~^ ERROR only traits defined in the current crate
// | can be implemented for arbitrary types [E0117]
}
fn main() {}

View file

@ -0,0 +1,12 @@
error[E0117]: only traits defined in the current crate can be implemented for arbitrary types
--> $DIR/impl-foreign[foreign]-for-foreign.rs:12:1
|
LL | impl Remote1<u32> for f64 {
| ^^^^^^^^^^^^^^^^^^^^^^^^^ impl doesn't use types inside crate
|
= note: the impl does not reference only types defined in this crate
= note: define and implement a trait or new type instead
error: aborting due to previous error
For more information about this error, try `rustc --explain E0117`.

View file

@ -0,0 +1,16 @@
#![feature(re_rebalance_coherence)]
// compile-flags:--crate-name=test
// aux-build:coherence_lib.rs
// check-pass
extern crate coherence_lib as lib;
use lib::*;
use std::rc::Rc;
struct Local;
impl Remote1<u32> for Local {
}
fn main() {}

View file

@ -0,0 +1,14 @@
#![feature(re_rebalance_coherence)]
// check-pass
// compile-flags:--crate-name=test
// aux-build:coherence_lib.rs
extern crate coherence_lib as lib;
use lib::*;
use std::rc::Rc;
struct Local;
impl<T> Remote2<Rc<T>, Local> for usize { }
fn main() {}

View file

@ -0,0 +1,20 @@
#![feature(re_rebalance_coherence)]
// compile-flags:--crate-name=test
// aux-build:coherence_lib.rs
extern crate coherence_lib as lib;
use lib::*;
use std::rc::Rc;
struct Local;
impl<T> Remote1<u32> for Box<T> {
//~^ ERROR type parameter `T` must be used as the type parameter for some local type
}
impl<'a, T> Remote1<u32> for &'a T {
//~^ ERROR type parameter `T` must be used as the type parameter for some local type
}
fn main() {}

View file

@ -0,0 +1,19 @@
error[E0210]: type parameter `T` must be used as the type parameter for some local type (e.g., `MyStruct<T>`)
--> $DIR/impl[t]-foreign[foreign]-for-fundamental[t].rs:12:1
|
LL | impl<T> Remote1<u32> for Box<T> {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ type parameter `T` must be used as the type parameter for some local type
|
= note: only traits defined in the current crate can be implemented for a type parameter
error[E0210]: type parameter `T` must be used as the type parameter for some local type (e.g., `MyStruct<T>`)
--> $DIR/impl[t]-foreign[foreign]-for-fundamental[t].rs:16:1
|
LL | impl<'a, T> Remote1<u32> for &'a T {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ type parameter `T` must be used as the type parameter for some local type
|
= note: only traits defined in the current crate can be implemented for a type parameter
error: aborting due to 2 previous errors
For more information about this error, try `rustc --explain E0210`.

View file

@ -0,0 +1,16 @@
#![feature(re_rebalance_coherence)]
// compile-flags:--crate-name=test
// aux-build:coherence_lib.rs
extern crate coherence_lib as lib;
use lib::*;
use std::rc::Rc;
struct Local;
impl<T> Remote1<u32> for T {
//~^ ERROR type parameter `T` must be used as the type parameter for some local type
}
fn main() {}

View file

@ -0,0 +1,11 @@
error[E0210]: type parameter `T` must be used as the type parameter for some local type (e.g., `MyStruct<T>`)
--> $DIR/impl[t]-foreign[foreign]-for-t.rs:12:1
|
LL | impl<T> Remote1<u32> for T {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ type parameter `T` must be used as the type parameter for some local type
|
= note: only traits defined in the current crate can be implemented for a type parameter
error: aborting due to previous error
For more information about this error, try `rustc --explain E0210`.

View file

@ -0,0 +1,20 @@
#![feature(re_rebalance_coherence)]
// compile-flags:--crate-name=test
// aux-build:coherence_lib.rs
extern crate coherence_lib as lib;
use lib::*;
use std::rc::Rc;
struct Local;
impl<T> Remote1<Box<T>> for u32 {
//~^ ERROR type parameter `T` must be used as the type parameter for some local type
}
impl<'a, T> Remote1<&'a T> for u32 {
//~^ ERROR type parameter `T` must be used as the type parameter for some local type
}
fn main() {}

View file

@ -0,0 +1,19 @@
error[E0210]: type parameter `T` must be used as the type parameter for some local type (e.g., `MyStruct<T>`)
--> $DIR/impl[t]-foreign[fundamental[t]]-for-foreign.rs:12:1
|
LL | impl<T> Remote1<Box<T>> for u32 {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ type parameter `T` must be used as the type parameter for some local type
|
= note: only traits defined in the current crate can be implemented for a type parameter
error[E0210]: type parameter `T` must be used as the type parameter for some local type (e.g., `MyStruct<T>`)
--> $DIR/impl[t]-foreign[fundamental[t]]-for-foreign.rs:16:1
|
LL | impl<'a, T> Remote1<&'a T> for u32 {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ type parameter `T` must be used as the type parameter for some local type
|
= note: only traits defined in the current crate can be implemented for a type parameter
error: aborting due to 2 previous errors
For more information about this error, try `rustc --explain E0210`.

View file

@ -0,0 +1,19 @@
#![feature(re_rebalance_coherence)]
// compile-flags:--crate-name=test
// aux-build:coherence_lib.rs
extern crate coherence_lib as lib;
use lib::*;
use std::rc::Rc;
struct Local;
impl<'a, T> Remote1<Box<T>> for &'a T {
//~^ ERROR type parameter `T` must be used as the type parameter for some local type
}
impl<'a, T> Remote1<&'a T> for Box<T> {
//~^ ERROR type parameter `T` must be used as the type parameter for some local type
}
fn main() {}

View file

@ -0,0 +1,19 @@
error[E0210]: type parameter `T` must be used as the type parameter for some local type (e.g., `MyStruct<T>`)
--> $DIR/impl[t]-foreign[fundamental[t]]-for-fundamental[t].rs:12:1
|
LL | impl<'a, T> Remote1<Box<T>> for &'a T {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ type parameter `T` must be used as the type parameter for some local type
|
= note: only traits defined in the current crate can be implemented for a type parameter
error[E0210]: type parameter `T` must be used as the type parameter for some local type (e.g., `MyStruct<T>`)
--> $DIR/impl[t]-foreign[fundamental[t]]-for-fundamental[t].rs:15:1
|
LL | impl<'a, T> Remote1<&'a T> for Box<T> {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ type parameter `T` must be used as the type parameter for some local type
|
= note: only traits defined in the current crate can be implemented for a type parameter
error: aborting due to 2 previous errors
For more information about this error, try `rustc --explain E0210`.

View file

@ -0,0 +1,17 @@
#![feature(re_rebalance_coherence)]
// compile-flags:--crate-name=test
// aux-build:coherence_lib.rs
// check-pass
extern crate coherence_lib as lib;
use lib::*;
use std::rc::Rc;
struct Local;
impl<T> Remote1<Box<T>> for Local {}
impl<'a, T> Remote1<&'a T> for Local {}
fn main() {}

View file

@ -0,0 +1,19 @@
#![feature(re_rebalance_coherence)]
// compile-flags:--crate-name=test
// aux-build:coherence_lib.rs
extern crate coherence_lib as lib;
use lib::*;
use std::rc::Rc;
struct Local;
impl<T> Remote1<Box<T>> for T {
//~^ ERROR type parameter `T` must be used as the type parameter for some local type
}
impl<'a, T> Remote1<&'a T> for T {
//~^ ERROR type parameter `T` must be used as the type parameter for some local type
}
fn main() {}

View file

@ -0,0 +1,19 @@
error[E0210]: type parameter `T` must be used as the type parameter for some local type (e.g., `MyStruct<T>`)
--> $DIR/impl[t]-foreign[fundamental[t]]-for-t.rs:12:1
|
LL | impl<T> Remote1<Box<T>> for T {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ type parameter `T` must be used as the type parameter for some local type
|
= note: only traits defined in the current crate can be implemented for a type parameter
error[E0210]: type parameter `T` must be used as the type parameter for some local type (e.g., `MyStruct<T>`)
--> $DIR/impl[t]-foreign[fundamental[t]]-for-t.rs:15:1
|
LL | impl<'a, T> Remote1<&'a T> for T {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ type parameter `T` must be used as the type parameter for some local type
|
= note: only traits defined in the current crate can be implemented for a type parameter
error: aborting due to 2 previous errors
For more information about this error, try `rustc --explain E0210`.

View file

@ -0,0 +1,20 @@
#![feature(re_rebalance_coherence)]
// compile-flags:--crate-name=test
// aux-build:coherence_lib.rs
extern crate coherence_lib as lib;
use lib::*;
use std::rc::Rc;
struct Local;
impl<T> Remote2<Box<T>, Local> for u32 {
//~^ ERROR type parameter `T` must be used as the type parameter for some local type
}
impl<'a, T> Remote2<&'a T, Local> for u32 {
//~^ ERROR type parameter `T` must be used as the type parameter for some local type
}
fn main() {}

View file

@ -0,0 +1,19 @@
error[E0210]: type parameter `T` must be used as the type parameter for some local type (e.g., `MyStruct<T>`)
--> $DIR/impl[t]-foreign[fundamental[t]_local]-for-foreign.rs:12:1
|
LL | impl<T> Remote2<Box<T>, Local> for u32 {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ type parameter `T` must be used as the type parameter for some local type
|
= note: only traits defined in the current crate can be implemented for a type parameter
error[E0210]: type parameter `T` must be used as the type parameter for some local type (e.g., `MyStruct<T>`)
--> $DIR/impl[t]-foreign[fundamental[t]_local]-for-foreign.rs:16:1
|
LL | impl<'a, T> Remote2<&'a T, Local> for u32 {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ type parameter `T` must be used as the type parameter for some local type
|
= note: only traits defined in the current crate can be implemented for a type parameter
error: aborting due to 2 previous errors
For more information about this error, try `rustc --explain E0210`.

View file

@ -0,0 +1,16 @@
#![feature(re_rebalance_coherence)]
// compile-flags:--crate-name=test
// aux-build:coherence_lib.rs
// check-pass
extern crate coherence_lib as lib;
use lib::*;
use std::rc::Rc;
struct Local;
impl<T> Remote1<Local> for Rc<T> {}
impl<T> Remote1<Local> for Vec<Box<T>> {}
fn main() {}

View file

@ -0,0 +1,20 @@
#![feature(re_rebalance_coherence)]
// compile-flags:--crate-name=test
// aux-build:coherence_lib.rs
extern crate coherence_lib as lib;
use lib::*;
use std::rc::Rc;
struct Local;
impl<T> Remote1<Local> for Box<T> {
//~^ ERROR type parameter `T` must be used as the type parameter for some local type
}
impl<T> Remote1<Local> for &T {
//~^ ERROR type parameter `T` must be used as the type parameter for some local type
}
fn main() {}

View file

@ -0,0 +1,19 @@
error[E0210]: type parameter `T` must be used as the type parameter for some local type (e.g., `MyStruct<T>`)
--> $DIR/impl[t]-foreign[local]-for-fundamental[t].rs:12:1
|
LL | impl<T> Remote1<Local> for Box<T> {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ type parameter `T` must be used as the type parameter for some local type
|
= note: only traits defined in the current crate can be implemented for a type parameter
error[E0210]: type parameter `T` must be used as the type parameter for some local type (e.g., `MyStruct<T>`)
--> $DIR/impl[t]-foreign[local]-for-fundamental[t].rs:16:1
|
LL | impl<T> Remote1<Local> for &T {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ type parameter `T` must be used as the type parameter for some local type
|
= note: only traits defined in the current crate can be implemented for a type parameter
error: aborting due to 2 previous errors
For more information about this error, try `rustc --explain E0210`.

View file

@ -0,0 +1,15 @@
#![feature(re_rebalance_coherence)]
// compile-flags:--crate-name=test
// aux-build:coherence_lib.rs
// check-pass
extern crate coherence_lib as lib;
use lib::*;
use std::rc::Rc;
struct Local;
impl Remote1<Local> for Local {}
fn main() {}

View file

@ -0,0 +1,16 @@
#![feature(re_rebalance_coherence)]
// compile-flags:--crate-name=test
// aux-build:coherence_lib.rs
extern crate coherence_lib as lib;
use lib::*;
use std::rc::Rc;
struct Local;
impl<T> Remote1<Local> for T {
//~^ ERROR type parameter `T` must be used as the type parameter for some local type
}
fn main() {}

View file

@ -0,0 +1,11 @@
error[E0210]: type parameter `T` must be used as the type parameter for some local type (e.g., `MyStruct<T>`)
--> $DIR/impl[t]-foreign[local]-for-t.rs:12:1
|
LL | impl<T> Remote1<Local> for T {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ type parameter `T` must be used as the type parameter for some local type
|
= note: only traits defined in the current crate can be implemented for a type parameter
error: aborting due to previous error
For more information about this error, try `rustc --explain E0210`.

View file

@ -0,0 +1,19 @@
#![feature(re_rebalance_coherence)]
// compile-flags:--crate-name=test
// aux-build:coherence_lib.rs
// check-pass
extern crate coherence_lib as lib;
use lib::*;
use std::rc::Rc;
struct Local;
struct Local2<T>(Rc<T>);
impl<T> Remote2<Local, Box<T>> for u32 {}
impl<'a, T> Remote2<Local, &'a T> for u32 {}
impl<T> Remote2<Local2<T>, Box<T>> for u32 {}
impl<'a, T> Remote2<Local2<T>, &'a T> for u32 {}
fn main() {}

View file

@ -0,0 +1,16 @@
#![feature(re_rebalance_coherence)]
// compile-flags:--crate-name=test
// aux-build:coherence_lib.rs
extern crate coherence_lib as lib;
use lib::*;
use std::rc::Rc;
struct Local;
impl<T> Remote1<T> for u32 {
//~^ ERROR type parameter `T` must be used as the type parameter for some local type
}
fn main() {}

View file

@ -0,0 +1,11 @@
error[E0210]: type parameter `T` must be used as the type parameter for some local type (e.g., `MyStruct<T>`)
--> $DIR/impl[t]-foreign[t]-for-foreign.rs:12:1
|
LL | impl<T> Remote1<T> for u32 {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ type parameter `T` must be used as the type parameter for some local type
|
= note: only traits defined in the current crate can be implemented for a type parameter
error: aborting due to previous error
For more information about this error, try `rustc --explain E0210`.

View file

@ -0,0 +1,20 @@
#![feature(re_rebalance_coherence)]
// compile-flags:--crate-name=test
// aux-build:coherence_lib.rs
extern crate coherence_lib as lib;
use lib::*;
use std::rc::Rc;
struct Local;
impl<T> Remote1<T> for Box<T> {
//~^ ERROR type parameter `T` must be used as the type parameter for some local type
}
impl<'a, A, B> Remote1<A> for &'a B {
//~^ ERROR type parameter `B` must be used as the type parameter for some local type
}
fn main() {}

View file

@ -0,0 +1,19 @@
error[E0210]: type parameter `T` must be used as the type parameter for some local type (e.g., `MyStruct<T>`)
--> $DIR/impl[t]-foreign[t]-for-fundamental.rs:12:1
|
LL | impl<T> Remote1<T> for Box<T> {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ type parameter `T` must be used as the type parameter for some local type
|
= note: only traits defined in the current crate can be implemented for a type parameter
error[E0210]: type parameter `B` must be used as the type parameter for some local type (e.g., `MyStruct<B>`)
--> $DIR/impl[t]-foreign[t]-for-fundamental.rs:16:1
|
LL | impl<'a, A, B> Remote1<A> for &'a B {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ type parameter `B` must be used as the type parameter for some local type
|
= note: only traits defined in the current crate can be implemented for a type parameter
error: aborting due to 2 previous errors
For more information about this error, try `rustc --explain E0210`.

View file

@ -0,0 +1,15 @@
#![feature(re_rebalance_coherence)]
// compile-flags:--crate-name=test
// aux-build:coherence_lib.rs
// check-pass
extern crate coherence_lib as lib;
use lib::*;
use std::rc::Rc;
struct Local;
impl<T> Remote1<T> for Local {}
fn main() {}

View file

@ -0,0 +1,16 @@
#![feature(re_rebalance_coherence)]
// compile-flags:--crate-name=test
// aux-build:coherence_lib.rs
extern crate coherence_lib as lib;
use lib::*;
use std::rc::Rc;
struct Local;
impl<T> Remote1<T> for T {
//~^ ERROR type parameter `T` must be used as the type parameter for some local type
}
fn main() {}

View file

@ -0,0 +1,11 @@
error[E0210]: type parameter `T` must be used as the type parameter for some local type (e.g., `MyStruct<T>`)
--> $DIR/impl[t]-foreign[t]-for-t.rs:12:1
|
LL | impl<T> Remote1<T> for T {
| ^^^^^^^^^^^^^^^^^^^^^^^^ type parameter `T` must be used as the type parameter for some local type
|
= note: only traits defined in the current crate can be implemented for a type parameter
error: aborting due to previous error
For more information about this error, try `rustc --explain E0210`.

View file

@ -1,14 +0,0 @@
#![allow(dead_code)]
#![feature(re_rebalance_coherence)]
// run-pass
// aux-build:re_rebalance_coherence_lib.rs
extern crate re_rebalance_coherence_lib as lib;
use lib::*;
struct Oracle;
impl Backend for Oracle {}
impl<'a, T:'a, Tab> QueryFragment<Oracle> for BatchInsert<'a, T, Tab> {}
fn main() {}