diff options
| author | Gianni Ciccarelli <gianni.ciccarelli@gmail.com> | 2017-04-24 09:56:54 +0000 |
|---|---|---|
| committer | Gianni Ciccarelli <gianni.ciccarelli@gmail.com> | 2017-04-25 05:28:22 +0000 |
| commit | 715811d0be05dcdc55b44f97d9fd2cd1eb7eee05 (patch) | |
| tree | c893a210beed2ccc862c0154255461010915c50b /src/librustc/traits | |
| parent | b0fca5f790e86a4235c64095f4ac55d325253b92 (diff) | |
| download | rust-715811d0be05dcdc55b44f97d9fd2cd1eb7eee05.tar.gz rust-715811d0be05dcdc55b44f97d9fd2cd1eb7eee05.zip | |
support `default impl` for specialization
pr review
Diffstat (limited to 'src/librustc/traits')
| -rw-r--r-- | src/librustc/traits/project.rs | 25 | ||||
| -rw-r--r-- | src/librustc/traits/util.rs | 21 |
2 files changed, 23 insertions, 23 deletions
diff --git a/src/librustc/traits/project.rs b/src/librustc/traits/project.rs index f417ad5b3d9..7675b2d00eb 100644 --- a/src/librustc/traits/project.rs +++ b/src/librustc/traits/project.rs @@ -33,7 +33,6 @@ use ty::subst::Subst; use ty::{self, ToPredicate, ToPolyTraitRef, Ty, TyCtxt}; use ty::fold::{TypeFoldable, TypeFolder}; use util::common::FN_OUTPUT_NAME; -use hir::{self}; /// Depending on the stage of compilation, we want projection to be /// more or less conservative. @@ -924,28 +923,8 @@ fn assemble_candidates_from_impls<'cx, 'gcx, 'tcx>( // being invoked). node_item.item.defaultness.has_value() } else { - let is_default = match selcx.tcx() - .map - .as_local_node_id(node_item.node.def_id()) { - Some(node_id) => { - let item = selcx.tcx().map.expect_item(node_id); - if let hir::ItemImpl(_, _, defaultness, ..) = item.node { - defaultness.is_default() - } else { - false - } - } - None => { - selcx.tcx() - .global_tcx() - .sess - .cstore - .impl_defaultness(node_item.node.def_id()) - .is_default() - } - }; - - node_item.item.defaultness.is_default() || is_default + node_item.item.defaultness.is_default() || + selcx.tcx().impl_is_default(node_item.node.def_id()) }; // Only reveal a specializable default if we're past type-checking diff --git a/src/librustc/traits/util.rs b/src/librustc/traits/util.rs index d4245ec9b24..4aa7950de8f 100644 --- a/src/librustc/traits/util.rs +++ b/src/librustc/traits/util.rs @@ -13,6 +13,7 @@ use ty::subst::{Subst, Substs}; use ty::{self, Ty, TyCtxt, ToPredicate, ToPolyTraitRef}; use ty::outlives::Component; use util::nodemap::FxHashSet; +use hir::{self}; use super::{Obligation, ObligationCause, PredicateObligation, SelectionContext, Normalized}; @@ -504,6 +505,26 @@ impl<'a, 'gcx, 'tcx> TyCtxt<'a, 'gcx, 'tcx> { }; ty::Binder((trait_ref, sig.skip_binder().output())) } + + pub fn impl_is_default(self, node_item_def_id: DefId) -> bool { + match self.hir.as_local_node_id(node_item_def_id) { + Some(node_id) => { + let item = self.hir.expect_item(node_id); + if let hir::ItemImpl(_, _, defaultness, ..) = item.node { + defaultness.is_default() + } else { + false + } + } + None => { + self.global_tcx() + .sess + .cstore + .impl_defaultness(node_item_def_id) + .is_default() + } + } + } } pub enum TupleArgumentsFlag { Yes, No } |
