Skip to content

Commit

Permalink
Fix feature gate checking of static-nobundle and native_link_modifiers
Browse files Browse the repository at this point in the history
  • Loading branch information
12101111 committed Aug 8, 2021
1 parent 2b4196e commit d935a14
Show file tree
Hide file tree
Showing 8 changed files with 75 additions and 43 deletions.
20 changes: 9 additions & 11 deletions compiler/rustc_metadata/src/native_libs.rs
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,15 @@ impl ItemLikeVisitor<'tcx> for Collector<'tcx> {
modifier `-bundle` with library kind `static`",
)
.emit();
if !self.tcx.features().static_nobundle {
feature_err(
&self.tcx.sess.parse_sess,
sym::static_nobundle,
item.span(),
"kind=\"static-nobundle\" is unstable",
)
.emit();
}
NativeLibKind::Static { bundle: Some(false), whole_archive: None }
}
"dylib" => NativeLibKind::Dylib { as_needed: None },
Expand Down Expand Up @@ -252,17 +261,6 @@ impl Collector<'tcx> {
)
.emit();
}
if matches!(lib.kind, NativeLibKind::Static { bundle: Some(false), .. })
&& !self.tcx.features().static_nobundle
{
feature_err(
&self.tcx.sess.parse_sess,
sym::static_nobundle,
span.unwrap_or(rustc_span::DUMMY_SP),
"kind=\"static-nobundle\" is unstable",
)
.emit();
}
// this just unwraps lib.name; we already established that it isn't empty above.
if let (NativeLibKind::RawDylib, Some(lib_name)) = (lib.kind, lib.name) {
let span = match span {
Expand Down
67 changes: 48 additions & 19 deletions compiler/rustc_session/src/config.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1618,8 +1618,20 @@ fn select_debuginfo(
}
}

fn parse_native_lib_kind(kind: &str, error_format: ErrorOutputType) -> NativeLibKind {
match kind {
fn parse_native_lib_kind(
matches: &getopts::Matches,
kind: &str,
error_format: ErrorOutputType,
) -> (NativeLibKind, Option<bool>) {
let is_nightly = nightly_options::match_is_nightly_build(matches);
let enable_unstable = nightly_options::is_unstable_enabled(matches);

let (kind, modifiers) = match kind.split_once(':') {
None => (kind, None),
Some((kind, modifiers)) => (kind, Some(modifiers)),
};

let kind = match kind {
"dylib" => NativeLibKind::Dylib { as_needed: None },
"framework" => NativeLibKind::Framework { as_needed: None },
"static" => NativeLibKind::Static { bundle: None, whole_archive: None },
Expand All @@ -1629,17 +1641,49 @@ fn parse_native_lib_kind(kind: &str, error_format: ErrorOutputType) -> NativeLib
"library kind `static-nobundle` has been superseded by specifying \
`-bundle` on library kind `static`. Try `static:-bundle`",
);
if modifiers.is_some() {
early_error(
error_format,
"linking modifier can't be used with library kind `static-nobundle`",
)
}
if !is_nightly {
early_error(
error_format,
"library kind `static-nobundle` are currently unstable and only accepted on \
the nightly compiler",
);
}
NativeLibKind::Static { bundle: Some(false), whole_archive: None }
}
s => early_error(
error_format,
&format!("unknown library kind `{}`, expected one of dylib, framework, or static", s),
),
};
match modifiers {
None => (kind, None),
Some(modifiers) => {
if !is_nightly {
early_error(
error_format,
"linking modifiers are currently unstable and only accepted on \
the nightly compiler",
);
}
if !enable_unstable {
early_error(
error_format,
"linking modifiers are currently unstable, \
the `-Z unstable-options` flag must also be passed to use it",
)
}
parse_native_lib_modifiers(kind, modifiers, error_format)
}
}
}

fn parse_native_lib_modifiers(
is_nightly: bool,
mut kind: NativeLibKind,
modifiers: &str,
error_format: ErrorOutputType,
Expand All @@ -1655,14 +1699,6 @@ fn parse_native_lib_modifiers(
),
};

if !is_nightly {
early_error(
error_format,
"linking modifiers are currently unstable and only accepted on \
the nightly compiler",
);
}

match (modifier, &mut kind) {
("bundle", NativeLibKind::Static { bundle, .. }) => {
*bundle = Some(value);
Expand Down Expand Up @@ -1709,7 +1745,6 @@ fn parse_native_lib_modifiers(
}

fn parse_libs(matches: &getopts::Matches, error_format: ErrorOutputType) -> Vec<NativeLib> {
let is_nightly = nightly_options::match_is_nightly_build(matches);
matches
.opt_strs("l")
.into_iter()
Expand All @@ -1723,13 +1758,7 @@ fn parse_libs(matches: &getopts::Matches, error_format: ErrorOutputType) -> Vec<
let (name, kind, verbatim) = match s.split_once('=') {
None => (s, NativeLibKind::Unspecified, None),
Some((kind, name)) => {
let (kind, verbatim) = match kind.split_once(':') {
None => (parse_native_lib_kind(kind, error_format), None),
Some((kind, modifiers)) => {
let kind = parse_native_lib_kind(kind, error_format);
parse_native_lib_modifiers(is_nightly, kind, modifiers, error_format)
}
};
let (kind, verbatim) = parse_native_lib_kind(matches, kind, error_format);
(name.to_string(), kind, verbatim)
}
};
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
// Test native_link_modifiers_bundle don't need static-nobundle
// check-pass

#![feature(native_link_modifiers)]
#![feature(native_link_modifiers_bundle)]

#[link(name = "foo", kind = "static", modifiers = "-bundle")]
extern "C" {}

fn main() {}
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
// compile-flags: -l static:-bundle=nonexistent

fn main() {}
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
error: linking modifiers are currently unstable, the `-Z unstable-options` flag must also be passed to use it

4 changes: 1 addition & 3 deletions src/test/ui/feature-gates/feature-gate-static-nobundle-2.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,4 @@
//~ ERROR kind="static-nobundle" is unstable
// Test the behavior of rustc when non-existent library is statically linked

// check-pass
// compile-flags: -l static-nobundle=nonexistent

fn main() {}
Original file line number Diff line number Diff line change
@@ -1,10 +1,2 @@
warning: library kind `static-nobundle` has been superseded by specifying `-bundle` on library kind `static`. Try `static:-bundle`

error[E0658]: kind="static-nobundle" is unstable
|
= note: see issue #37403 <https://github.com/rust-lang/rust/issues/37403> for more information
= help: add `#![feature(static_nobundle)]` to the crate attributes to enable

error: aborting due to previous error

For more information about this error, try `rustc --explain E0658`.
4 changes: 2 additions & 2 deletions src/test/ui/feature-gates/feature-gate-static-nobundle.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,10 @@ LL | #[link(name = "foo", kind = "static-nobundle")]
| ^^^^^^^^^^^^^^^^^^^^^^^^

error[E0658]: kind="static-nobundle" is unstable
--> $DIR/feature-gate-static-nobundle.rs:1:1
--> $DIR/feature-gate-static-nobundle.rs:1:22
|
LL | #[link(name = "foo", kind = "static-nobundle")]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
| ^^^^^^^^^^^^^^^^^^^^^^^^
|
= note: see issue #37403 <https://github.com/rust-lang/rust/issues/37403> for more information
= help: add `#![feature(static_nobundle)]` to the crate attributes to enable
Expand Down

0 comments on commit d935a14

Please sign in to comment.