Skip to content

Commit

Permalink
Coherence should allow fundamental types to impl traits
Browse files Browse the repository at this point in the history
  • Loading branch information
ohadravid committed Oct 26, 2019
1 parent f466f52 commit 8f988bd
Show file tree
Hide file tree
Showing 3 changed files with 42 additions and 4 deletions.
14 changes: 10 additions & 4 deletions src/librustc/traits/coherence.rs
Expand Up @@ -378,15 +378,21 @@ 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)
//
fn uncover_fundamental_ty(ty: Ty<'_>) -> Vec<Ty<'_>> {
if fundamental_ty(ty) {
ty.walk_shallow().flat_map(|ty| uncover_fundamental_ty(ty)).collect()
fn uncover_fundamental_ty<'a>(
tcx: TyCtxt<'_>,
ty: Ty<'a>,
in_crate: InCrate,
) -> Vec<Ty<'a>> {
if fundamental_ty(ty) && !ty_is_local(tcx, ty, in_crate) {
ty.walk_shallow().flat_map(|ty| uncover_fundamental_ty(tcx, ty, in_crate)).collect()
} else {
vec![ty]
}
}

for input_ty in trait_ref.input_types().flat_map(uncover_fundamental_ty) {
for input_ty in
trait_ref.input_types().flat_map(|ty| uncover_fundamental_ty(tcx, ty, in_crate))
{
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);
Expand Down
@@ -0,0 +1,16 @@
#![feature(fundamental)]
#![feature(re_rebalance_coherence)]

// compile-flags:--crate-name=test
// aux-build:coherence_lib.rs
// check-pass

extern crate coherence_lib as lib;
use lib::*;

#[fundamental]
struct Local;

impl Remote for Local {}

fn main() {}
@@ -0,0 +1,16 @@
#![feature(fundamental)]
#![feature(re_rebalance_coherence)]

// compile-flags:--crate-name=test
// aux-build:coherence_lib.rs
// check-pass

extern crate coherence_lib as lib;
use lib::*;

#[fundamental]
struct MyBox<T>(T);

impl<T> Remote for MyBox<T> {}

fn main() {}

0 comments on commit 8f988bd

Please sign in to comment.