about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--src/libsyntax/feature_gate.rs13
-rw-r--r--src/test/compile-fail/gated-link-args.rs18
2 files changed, 20 insertions, 11 deletions
diff --git a/src/libsyntax/feature_gate.rs b/src/libsyntax/feature_gate.rs
index 9adba7f50cc..448f95c93a0 100644
--- a/src/libsyntax/feature_gate.rs
+++ b/src/libsyntax/feature_gate.rs
@@ -551,7 +551,12 @@ pub const BUILTIN_ATTRIBUTES: &'static [(&'static str, AttributeType, AttributeG
     ("ignore", Normal, Ungated),
     ("no_implicit_prelude", Normal, Ungated),
     ("reexport_test_harness_main", Normal, Ungated),
-    ("link_args", Normal, Ungated),
+    ("link_args", Normal, Gated(Stability::Unstable,
+                                "link_args",
+                                "the `link_args` attribute is experimental and not \
+                                 portable across platforms, it is recommended to \
+                                 use `#[link(name = \"foo\")] instead",
+                                cfg_fn!(link_args))),
     ("macro_escape", Normal, Ungated),
 
     // RFC #1445.
@@ -1184,12 +1189,6 @@ impl<'a> Visitor<'a> for PostExpansionVisitor<'a> {
             }
 
             ast::ItemKind::ForeignMod(ref foreign_module) => {
-                if attr::contains_name(&i.attrs[..], "link_args") {
-                    gate_feature_post!(&self, link_args, i.span,
-                                      "the `link_args` attribute is not portable \
-                                       across platforms, it is recommended to \
-                                       use `#[link(name = \"foo\")]` instead")
-                }
                 self.check_abi(foreign_module.abi, i.span);
             }
 
diff --git a/src/test/compile-fail/gated-link-args.rs b/src/test/compile-fail/gated-link-args.rs
index d34057e290e..82f5db3042b 100644
--- a/src/test/compile-fail/gated-link-args.rs
+++ b/src/test/compile-fail/gated-link-args.rs
@@ -9,12 +9,22 @@
 // except according to those terms.
 
 // Test that `#[link_args]` attribute is gated by `link_args`
-// feature gate.
+// feature gate, both when it occurs where expected (atop
+// `extern { }` blocks) and where unexpected.
 
 // gate-test-link_args
 
-#[link_args = "aFdEfSeVEEE"]
+// sidestep warning (which is correct, but misleading for
+// purposes of this test)
+#![allow(unused_attributes)]
+
+#![link_args = "-l unexpected_use_as_inner_attr_on_mod"]
+//~^ ERROR the `link_args` attribute is experimental
+
+#[link_args = "-l expected_use_case"]
+//~^ ERROR the `link_args` attribute is experimental
 extern {}
-//~^ ERROR the `link_args` attribute is not portable across platforms
 
-fn main() { }
+#[link_args = "-l unexected_use_on_non_extern_item"]
+//~^ ERROR: the `link_args` attribute is experimental
+fn main() {}