about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorMazdak Farrokhzad <twingoow@gmail.com>2019-09-21 17:40:50 +0200
committerMazdak Farrokhzad <twingoow@gmail.com>2019-10-24 00:32:03 +0200
commit2d182b82ce5ecfe8090ba3d4e78f1cd72c072ef1 (patch)
tree686757127092ea8670e546c998e259a2e0c83b03 /src
parent2e64bb2d37d5f15113e0a7199cd684504c6b8de7 (diff)
downloadrust-2d182b82ce5ecfe8090ba3d4e78f1cd72c072ef1.tar.gz
rust-2d182b82ce5ecfe8090ba3d4e78f1cd72c072ef1.zip
pre-expansion gate trait_alias.
Diffstat (limited to 'src')
-rw-r--r--src/libsyntax/feature_gate/check.rs10
-rw-r--r--src/libsyntax/parse/parser/item.rs2
-rw-r--r--src/libsyntax/sess.rs2
-rw-r--r--src/test/ui/feature-gates/feature-gate-trait-alias.rs9
-rw-r--r--src/test/ui/feature-gates/feature-gate-trait-alias.stderr11
5 files changed, 24 insertions, 10 deletions
diff --git a/src/libsyntax/feature_gate/check.rs b/src/libsyntax/feature_gate/check.rs
index 172511f0f09..97172691a11 100644
--- a/src/libsyntax/feature_gate/check.rs
+++ b/src/libsyntax/feature_gate/check.rs
@@ -423,15 +423,6 @@ impl<'a> Visitor<'a> for PostExpansionVisitor<'a> {
                                    "auto traits are experimental and possibly buggy");
             }
 
-            ast::ItemKind::TraitAlias(..) => {
-                gate_feature_post!(
-                    &self,
-                    trait_alias,
-                    i.span,
-                    "trait aliases are experimental"
-                );
-            }
-
             ast::ItemKind::MacroDef(ast::MacroDef { legacy: false, .. }) => {
                 let msg = "`macro` is experimental";
                 gate_feature_post!(&self, decl_macro, i.span, msg);
@@ -867,6 +858,7 @@ pub fn check_crate(krate: &ast::Crate,
     gate_all!(yields, generators, "yield syntax is experimental");
     gate_all!(or_patterns, "or-patterns syntax is experimental");
     gate_all!(const_extern_fn, "`const extern fn` definitions are unstable");
+    gate_all!(trait_alias, "trait aliases are experimental");
 
     visit::walk_crate(&mut visitor, krate);
 }
diff --git a/src/libsyntax/parse/parser/item.rs b/src/libsyntax/parse/parser/item.rs
index 01dc0c21d4d..c5498236da1 100644
--- a/src/libsyntax/parse/parser/item.rs
+++ b/src/libsyntax/parse/parser/item.rs
@@ -828,6 +828,8 @@ impl<'a> Parser<'a> {
                     .emit();
             }
 
+            self.sess.gated_spans.trait_alias.borrow_mut().push(whole_span);
+
             Ok((ident, ItemKind::TraitAlias(tps, bounds), None))
         } else {
             // It's a normal trait.
diff --git a/src/libsyntax/sess.rs b/src/libsyntax/sess.rs
index e49d3954f8e..b48b2b494c8 100644
--- a/src/libsyntax/sess.rs
+++ b/src/libsyntax/sess.rs
@@ -30,6 +30,8 @@ crate struct GatedSpans {
     crate or_patterns: Lock<Vec<Span>>,
     /// Spans collected for gating `const_extern_fn`, e.g. `const extern fn foo`.
     crate const_extern_fn: Lock<Vec<Span>>,
+    /// Spans collected for gating `trait_alias`, e.g. `trait Foo = Ord + Eq;`.
+    pub trait_alias: Lock<Vec<Span>>,
 }
 
 /// Info about a parsing session.
diff --git a/src/test/ui/feature-gates/feature-gate-trait-alias.rs b/src/test/ui/feature-gates/feature-gate-trait-alias.rs
index 819085addda..4b94d7d6d3b 100644
--- a/src/test/ui/feature-gates/feature-gate-trait-alias.rs
+++ b/src/test/ui/feature-gates/feature-gate-trait-alias.rs
@@ -1,4 +1,13 @@
 trait Foo = Default;
 //~^ ERROR trait aliases are experimental
 
+macro_rules! accept_item {
+    ($i:item) => {}
+}
+
+accept_item! {
+    trait Foo = Ord + Eq;
+    //~^ ERROR trait aliases are experimental
+}
+
 fn main() {}
diff --git a/src/test/ui/feature-gates/feature-gate-trait-alias.stderr b/src/test/ui/feature-gates/feature-gate-trait-alias.stderr
index 9250e27d158..b1bf6ad3491 100644
--- a/src/test/ui/feature-gates/feature-gate-trait-alias.stderr
+++ b/src/test/ui/feature-gates/feature-gate-trait-alias.stderr
@@ -7,6 +7,15 @@ LL | trait Foo = Default;
    = note: for more information, see https://github.com/rust-lang/rust/issues/41517
    = help: add `#![feature(trait_alias)]` to the crate attributes to enable
 
-error: aborting due to previous error
+error[E0658]: trait aliases are experimental
+  --> $DIR/feature-gate-trait-alias.rs:9:5
+   |
+LL |     trait Foo = Ord + Eq;
+   |     ^^^^^^^^^^^^^^^^^^^^^
+   |
+   = note: for more information, see https://github.com/rust-lang/rust/issues/41517
+   = help: add `#![feature(trait_alias)]` to the crate attributes to enable
+
+error: aborting due to 2 previous errors
 
 For more information about this error, try `rustc --explain E0658`.