]> git.lizzy.rs Git - rust.git/blobdiff - src/librustc/traits/project.rs
support `default impl` for specialization
[rust.git] / src / librustc / traits / project.rs
index 3d8f9e41c675b877e8fba6edf51f4155ceba7aed..f417ad5b3d9d5761785644b8e3410266281e39ec 100644 (file)
@@ -33,6 +33,7 @@
 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.
@@ -923,7 +924,28 @@ fn assemble_candidates_from_impls<'cx, 'gcx, 'tcx>(
                         // being invoked).
                         node_item.item.defaultness.has_value()
                     } else {
-                        node_item.item.defaultness.is_default()
+                        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
                     };
 
                     // Only reveal a specializable default if we're past type-checking