about summary refs log tree commit diff
diff options
context:
space:
mode:
authorAaron Turon <aturon@mozilla.com>2015-12-30 15:16:43 -0800
committerAaron Turon <aturon@mozilla.com>2016-03-14 15:04:38 -0700
commite81691039854e678381042ce93e13bee6971c3d9 (patch)
tree7f6319b1134f640f445be2d49423bfa8e0988bff
parent9f16c2ce59ac942e1c0415987012100756a44039 (diff)
downloadrust-e81691039854e678381042ce93e13bee6971c3d9.tar.gz
rust-e81691039854e678381042ce93e13bee6971c3d9.zip
Add feature gate
-rw-r--r--src/librustc/middle/traits/specialize.rs10
-rw-r--r--src/libsyntax/feature_gate.rs12
2 files changed, 22 insertions, 0 deletions
diff --git a/src/librustc/middle/traits/specialize.rs b/src/librustc/middle/traits/specialize.rs
index 39cbd36260d..0f47e19eaf3 100644
--- a/src/librustc/middle/traits/specialize.rs
+++ b/src/librustc/middle/traits/specialize.rs
@@ -88,6 +88,16 @@ impl SpecializationGraph {
                 let overlap = traits::overlapping_impls(&infcx, possible_sibling, impl_def_id);
 
                 if let Some(trait_ref) = overlap {
+                    if !tcx.sess.features.borrow().specialization {
+                        // if specialization is not turned on, all overlaps
+                        // should immediately trigger an error
+
+                        return Err(Overlap {
+                            with_impl: possible_sibling,
+                            on_trait_ref: trait_ref,
+                        });
+                    }
+
                     let le = specializes(tcx, impl_def_id, possible_sibling);
                     let ge = specializes(tcx, possible_sibling, impl_def_id);
 
diff --git a/src/libsyntax/feature_gate.rs b/src/libsyntax/feature_gate.rs
index 14a3f93738a..d50eb17c87b 100644
--- a/src/libsyntax/feature_gate.rs
+++ b/src/libsyntax/feature_gate.rs
@@ -248,6 +248,9 @@ const KNOWN_FEATURES: &'static [(&'static str, &'static str, Option<u32>, Status
 
     // `expr?`
     ("question_mark", "1.9.0", Some(31436), Active)
+
+    // impl specialization (RFC 1210)
+    ("specialization", "1.7.0", None, Active),
 ];
 // (changing above list without updating src/doc/reference.md makes @cmr sad)
 
@@ -574,6 +577,7 @@ pub struct Features {
     pub stmt_expr_attributes: bool,
     pub deprecated: bool,
     pub question_mark: bool,
+    pub specialization: bool,
 }
 
 impl Features {
@@ -608,6 +612,7 @@ impl Features {
             stmt_expr_attributes: false,
             deprecated: false,
             question_mark: false,
+            specialization: false,
         }
     }
 }
@@ -1102,6 +1107,12 @@ impl<'a, 'v> Visitor<'v> for PostExpansionVisitor<'a> {
     }
 
     fn visit_impl_item(&mut self, ii: &'v ast::ImplItem) {
+        if ii.defaultness == ast::Defaultness::Default {
+            self.gate_feature("specialization",
+                              ii.span,
+                              "specialization is unstable");
+        }
+
         match ii.node {
             ast::ImplItemKind::Const(..) => {
                 self.gate_feature("associated_consts",
@@ -1212,6 +1223,7 @@ fn check_crate_inner<F>(cm: &CodeMap, span_handler: &Handler,
         stmt_expr_attributes: cx.has_feature("stmt_expr_attributes"),
         deprecated: cx.has_feature("deprecated"),
         question_mark: cx.has_feature("question_mark"),
+        specialization: cx.has_feature("specialization"),
     }
 }