Auto merge of #87619 - 12101111:fix-native_link_modifiers_bundle, r=petrochenkov
Fix feature gate checking of static-nobundle and native_link_modifiers Feature native_link_modifiers_bundle don't need feature static-nobundle to work. Also check the feature gates when using native_link_modifiers from command line options. Current nighly compiler don't check those feature gate. ``` > touch lib.rs > rustc +nightly lib.rs -L /usr/lib -l static:+bundle=dl --crate-type=rlib > rustc +nightly lib.rs -L /usr/lib -l dylib:+as-needed=dl --crate-type=dylib -Ctarget-feature=-crt-static > rustc +nightly lib.rs -L /usr/lib -l static:-bundle=dl --crate-type=rlib 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`. ``` First found this in https://github.com/rust-lang/rust/pull/85600#discussion_r676612655
This commit is contained in:
commit
7b52ad00cb
8 changed files with 75 additions and 43 deletions
|
@ -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 },
|
||||
|
@ -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 {
|
||||
|
|
|
@ -1609,8 +1609,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 },
|
||||
|
@ -1620,17 +1632,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,
|
||||
|
@ -1646,14 +1690,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);
|
||||
|
@ -1700,7 +1736,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()
|
||||
|
@ -1714,13 +1749,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)
|
||||
}
|
||||
};
|
||||
|
|
|
@ -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() {}
|
|
@ -0,0 +1,3 @@
|
|||
// compile-flags: -l static:-bundle=nonexistent
|
||||
|
||||
fn main() {}
|
|
@ -0,0 +1,2 @@
|
|||
error: linking modifiers are currently unstable, the `-Z unstable-options` flag must also be passed to use it
|
||||
|
|
@ -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() {}
|
||||
|
|
|
@ -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`.
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Add table
Reference in a new issue