about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2017-07-10 15:39:47 +0000
committerbors <bors@rust-lang.org>2017-07-10 15:39:47 +0000
commiteb9dfb8bd9444d01fc129bfaac180b913299486b (patch)
tree3e320dced01e40a8061215b19cd8eb4de0445196 /src
parentd84693b93dae3958e3504f817face0184c5c3fdd (diff)
parentc512dea1ed4d97792c831eb2d8ec4725e32ac14d (diff)
downloadrust-eb9dfb8bd9444d01fc129bfaac180b913299486b.tar.gz
rust-eb9dfb8bd9444d01fc129bfaac180b913299486b.zip
Auto merge of #43109 - pnkfelix:fix-link_args-gate, r=nikomatsakis
Fix feature gate for `#[link_args(..)]` attribute

Fix feature gate for `#[link_args(..)]` attribute so that it will fire regardless of context of attribute.

See also #29596 and #43106
Diffstat (limited to 'src')
-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() {}