Skip to content

Commit 4c56655

Browse files
committed
Auto merge of rust-lang#100525 - Dylan-DPC:rollup-4cp6nu0, r=Dylan-DPC
Rollup of 6 pull requests Successful merges: - rust-lang#99582 (Delay a span bug if we see ty/const generic params during writeback) - rust-lang#99861 (orphan check: rationalize our handling of constants) - rust-lang#100026 (Add `Iterator::array_chunks` (take N+1)) - rust-lang#100115 (Suggest removing `let` if `const let` or `let const` is used) - rust-lang#100126 (rustc_target: Update some old naming around self contained linking) - rust-lang#100487 (`assert_{inhabited,zero_valid,uninit_valid}` intrinsics are safe) Failed merges: r? `@ghost` `@rustbot` modify labels: rollup
2 parents 2fbc08e + 9de9786 commit 4c56655

31 files changed

+673
-94
lines changed

compiler/rustc_codegen_ssa/src/back/link.rs

+26-24
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ use rustc_session::utils::NativeLibKind;
2020
use rustc_session::{filesearch, Session};
2121
use rustc_span::symbol::Symbol;
2222
use rustc_span::DebuggerVisualizerFile;
23-
use rustc_target::spec::crt_objects::{CrtObjects, CrtObjectsFallback};
23+
use rustc_target::spec::crt_objects::{CrtObjects, LinkSelfContainedDefault};
2424
use rustc_target::spec::{LinkOutputKind, LinkerFlavor, LldFlavor, SplitDebuginfo};
2525
use rustc_target::spec::{PanicStrategy, RelocModel, RelroLevel, SanitizerSet, Target};
2626

@@ -764,15 +764,15 @@ fn link_natively<'a>(
764764
"Linker does not support -static-pie command line option. Retrying with -static instead."
765765
);
766766
// Mirror `add_(pre,post)_link_objects` to replace CRT objects.
767-
let self_contained = crt_objects_fallback(sess, crate_type);
767+
let self_contained = self_contained(sess, crate_type);
768768
let opts = &sess.target;
769769
let pre_objects = if self_contained {
770-
&opts.pre_link_objects_fallback
770+
&opts.pre_link_objects_self_contained
771771
} else {
772772
&opts.pre_link_objects
773773
};
774774
let post_objects = if self_contained {
775-
&opts.post_link_objects_fallback
775+
&opts.post_link_objects_self_contained
776776
} else {
777777
&opts.post_link_objects
778778
};
@@ -1556,26 +1556,26 @@ fn detect_self_contained_mingw(sess: &Session) -> bool {
15561556
true
15571557
}
15581558

1559-
/// Whether we link to our own CRT objects instead of relying on gcc to pull them.
1559+
/// Various toolchain components used during linking are used from rustc distribution
1560+
/// instead of being found somewhere on the host system.
15601561
/// We only provide such support for a very limited number of targets.
1561-
fn crt_objects_fallback(sess: &Session, crate_type: CrateType) -> bool {
1562+
fn self_contained(sess: &Session, crate_type: CrateType) -> bool {
15621563
if let Some(self_contained) = sess.opts.cg.link_self_contained {
15631564
return self_contained;
15641565
}
15651566

1566-
match sess.target.crt_objects_fallback {
1567+
match sess.target.link_self_contained {
1568+
LinkSelfContainedDefault::False => false,
1569+
LinkSelfContainedDefault::True => true,
15671570
// FIXME: Find a better heuristic for "native musl toolchain is available",
15681571
// based on host and linker path, for example.
15691572
// (https://github.com/rust-lang/rust/pull/71769#issuecomment-626330237).
1570-
Some(CrtObjectsFallback::Musl) => sess.crt_static(Some(crate_type)),
1571-
Some(CrtObjectsFallback::Mingw) => {
1573+
LinkSelfContainedDefault::Musl => sess.crt_static(Some(crate_type)),
1574+
LinkSelfContainedDefault::Mingw => {
15721575
sess.host == sess.target
15731576
&& sess.target.vendor != "uwp"
15741577
&& detect_self_contained_mingw(&sess)
15751578
}
1576-
// FIXME: Figure out cases in which WASM needs to link with a native toolchain.
1577-
Some(CrtObjectsFallback::Wasm) => true,
1578-
None => false,
15791579
}
15801580
}
15811581

@@ -1592,7 +1592,7 @@ fn add_pre_link_objects(
15921592
let opts = &sess.target;
15931593
let empty = Default::default();
15941594
let objects = if self_contained {
1595-
&opts.pre_link_objects_fallback
1595+
&opts.pre_link_objects_self_contained
15961596
} else if !(sess.target.os == "fuchsia" && flavor == LinkerFlavor::Gcc) {
15971597
&opts.pre_link_objects
15981598
} else {
@@ -1610,9 +1610,11 @@ fn add_post_link_objects(
16101610
link_output_kind: LinkOutputKind,
16111611
self_contained: bool,
16121612
) {
1613-
let opts = &sess.target;
1614-
let objects =
1615-
if self_contained { &opts.post_link_objects_fallback } else { &opts.post_link_objects };
1613+
let objects = if self_contained {
1614+
&sess.target.post_link_objects_self_contained
1615+
} else {
1616+
&sess.target.post_link_objects
1617+
};
16161618
for obj in objects.get(&link_output_kind).iter().copied().flatten() {
16171619
cmd.add_object(&get_object_file_path(sess, obj, self_contained));
16181620
}
@@ -1891,12 +1893,12 @@ fn linker_with_args<'a>(
18911893
out_filename: &Path,
18921894
codegen_results: &CodegenResults,
18931895
) -> Result<Command, ErrorGuaranteed> {
1894-
let crt_objects_fallback = crt_objects_fallback(sess, crate_type);
1896+
let self_contained = self_contained(sess, crate_type);
18951897
let cmd = &mut *super::linker::get_linker(
18961898
sess,
18971899
path,
18981900
flavor,
1899-
crt_objects_fallback,
1901+
self_contained,
19001902
&codegen_results.crate_info.target_cpu,
19011903
);
19021904
let link_output_kind = link_output_kind(sess, crate_type);
@@ -1923,7 +1925,7 @@ fn linker_with_args<'a>(
19231925
// ------------ Object code and libraries, order-dependent ------------
19241926

19251927
// Pre-link CRT objects.
1926-
add_pre_link_objects(cmd, sess, flavor, link_output_kind, crt_objects_fallback);
1928+
add_pre_link_objects(cmd, sess, flavor, link_output_kind, self_contained);
19271929

19281930
add_linked_symbol_object(
19291931
cmd,
@@ -2033,7 +2035,7 @@ fn linker_with_args<'a>(
20332035
cmd,
20342036
sess,
20352037
link_output_kind,
2036-
crt_objects_fallback,
2038+
self_contained,
20372039
flavor,
20382040
crate_type,
20392041
codegen_results,
@@ -2049,7 +2051,7 @@ fn linker_with_args<'a>(
20492051
// ------------ Object code and libraries, order-dependent ------------
20502052

20512053
// Post-link CRT objects.
2052-
add_post_link_objects(cmd, sess, link_output_kind, crt_objects_fallback);
2054+
add_post_link_objects(cmd, sess, link_output_kind, self_contained);
20532055

20542056
// ------------ Late order-dependent options ------------
20552057

@@ -2066,7 +2068,7 @@ fn add_order_independent_options(
20662068
cmd: &mut dyn Linker,
20672069
sess: &Session,
20682070
link_output_kind: LinkOutputKind,
2069-
crt_objects_fallback: bool,
2071+
self_contained: bool,
20702072
flavor: LinkerFlavor,
20712073
crate_type: CrateType,
20722074
codegen_results: &CodegenResults,
@@ -2098,7 +2100,7 @@ fn add_order_independent_options(
20982100
// Make the binary compatible with data execution prevention schemes.
20992101
cmd.add_no_exec();
21002102

2101-
if crt_objects_fallback {
2103+
if self_contained {
21022104
cmd.no_crt_objects();
21032105
}
21042106

@@ -2127,7 +2129,7 @@ fn add_order_independent_options(
21272129

21282130
cmd.linker_plugin_lto();
21292131

2130-
add_library_search_dirs(cmd, sess, crt_objects_fallback);
2132+
add_library_search_dirs(cmd, sess, self_contained);
21312133

21322134
cmd.output_filename(out_filename);
21332135

compiler/rustc_parse/src/parser/item.rs

+10
Original file line numberDiff line numberDiff line change
@@ -1162,6 +1162,16 @@ impl<'a> Parser<'a> {
11621162
Applicability::MaybeIncorrect,
11631163
)
11641164
.emit();
1165+
} else if self.eat_keyword(kw::Let) {
1166+
let span = self.prev_token.span;
1167+
self.struct_span_err(const_span.to(span), "`const` and `let` are mutually exclusive")
1168+
.span_suggestion(
1169+
const_span.to(span),
1170+
"remove `let`",
1171+
"const",
1172+
Applicability::MaybeIncorrect,
1173+
)
1174+
.emit();
11651175
}
11661176
}
11671177

compiler/rustc_parse/src/parser/stmt.rs

+16
Original file line numberDiff line numberDiff line change
@@ -247,6 +247,22 @@ impl<'a> Parser<'a> {
247247
/// Parses a local variable declaration.
248248
fn parse_local(&mut self, attrs: AttrVec) -> PResult<'a, P<Local>> {
249249
let lo = self.prev_token.span;
250+
251+
if self.token.is_keyword(kw::Const) && self.look_ahead(1, |t| t.is_ident()) {
252+
self.struct_span_err(
253+
lo.to(self.token.span),
254+
"`const` and `let` are mutually exclusive",
255+
)
256+
.span_suggestion(
257+
lo.to(self.token.span),
258+
"remove `let`",
259+
"const",
260+
Applicability::MaybeIncorrect,
261+
)
262+
.emit();
263+
self.bump();
264+
}
265+
250266
let (pat, colon) = self.parse_pat_before_ty(None, RecoverComma::Yes, "`let` bindings")?;
251267

252268
let (err, ty) = if colon {

compiler/rustc_target/src/spec/crt_objects.rs

+22-18
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ pub(super) fn all(obj: &'static str) -> CrtObjects {
6363
])
6464
}
6565

66-
pub(super) fn pre_musl_fallback() -> CrtObjects {
66+
pub(super) fn pre_musl_self_contained() -> CrtObjects {
6767
new(&[
6868
(LinkOutputKind::DynamicNoPicExe, &["crt1.o", "crti.o", "crtbegin.o"]),
6969
(LinkOutputKind::DynamicPicExe, &["Scrt1.o", "crti.o", "crtbeginS.o"]),
@@ -74,7 +74,7 @@ pub(super) fn pre_musl_fallback() -> CrtObjects {
7474
])
7575
}
7676

77-
pub(super) fn post_musl_fallback() -> CrtObjects {
77+
pub(super) fn post_musl_self_contained() -> CrtObjects {
7878
new(&[
7979
(LinkOutputKind::DynamicNoPicExe, &["crtend.o", "crtn.o"]),
8080
(LinkOutputKind::DynamicPicExe, &["crtendS.o", "crtn.o"]),
@@ -85,7 +85,7 @@ pub(super) fn post_musl_fallback() -> CrtObjects {
8585
])
8686
}
8787

88-
pub(super) fn pre_mingw_fallback() -> CrtObjects {
88+
pub(super) fn pre_mingw_self_contained() -> CrtObjects {
8989
new(&[
9090
(LinkOutputKind::DynamicNoPicExe, &["crt2.o", "rsbegin.o"]),
9191
(LinkOutputKind::DynamicPicExe, &["crt2.o", "rsbegin.o"]),
@@ -96,7 +96,7 @@ pub(super) fn pre_mingw_fallback() -> CrtObjects {
9696
])
9797
}
9898

99-
pub(super) fn post_mingw_fallback() -> CrtObjects {
99+
pub(super) fn post_mingw_self_contained() -> CrtObjects {
100100
all("rsend.o")
101101
}
102102

@@ -108,7 +108,7 @@ pub(super) fn post_mingw() -> CrtObjects {
108108
all("rsend.o")
109109
}
110110

111-
pub(super) fn pre_wasi_fallback() -> CrtObjects {
111+
pub(super) fn pre_wasi_self_contained() -> CrtObjects {
112112
// Use crt1-command.o instead of crt1.o to enable support for new-style
113113
// commands. See https://reviews.llvm.org/D81689 for more info.
114114
new(&[
@@ -120,37 +120,41 @@ pub(super) fn pre_wasi_fallback() -> CrtObjects {
120120
])
121121
}
122122

123-
pub(super) fn post_wasi_fallback() -> CrtObjects {
123+
pub(super) fn post_wasi_self_contained() -> CrtObjects {
124124
new(&[])
125125
}
126126

127-
/// Which logic to use to determine whether to fall back to the "self-contained" mode or not.
127+
/// Which logic to use to determine whether to use self-contained linking mode
128+
/// if `-Clink-self-contained` is not specified explicitly.
128129
#[derive(Clone, Copy, PartialEq, Hash, Debug)]
129-
pub enum CrtObjectsFallback {
130+
pub enum LinkSelfContainedDefault {
131+
False,
132+
True,
130133
Musl,
131134
Mingw,
132-
Wasm,
133135
}
134136

135-
impl FromStr for CrtObjectsFallback {
137+
impl FromStr for LinkSelfContainedDefault {
136138
type Err = ();
137139

138-
fn from_str(s: &str) -> Result<CrtObjectsFallback, ()> {
140+
fn from_str(s: &str) -> Result<LinkSelfContainedDefault, ()> {
139141
Ok(match s {
140-
"musl" => CrtObjectsFallback::Musl,
141-
"mingw" => CrtObjectsFallback::Mingw,
142-
"wasm" => CrtObjectsFallback::Wasm,
142+
"false" => LinkSelfContainedDefault::False,
143+
"true" | "wasm" => LinkSelfContainedDefault::True,
144+
"musl" => LinkSelfContainedDefault::Musl,
145+
"mingw" => LinkSelfContainedDefault::Mingw,
143146
_ => return Err(()),
144147
})
145148
}
146149
}
147150

148-
impl ToJson for CrtObjectsFallback {
151+
impl ToJson for LinkSelfContainedDefault {
149152
fn to_json(&self) -> Json {
150153
match *self {
151-
CrtObjectsFallback::Musl => "musl",
152-
CrtObjectsFallback::Mingw => "mingw",
153-
CrtObjectsFallback::Wasm => "wasm",
154+
LinkSelfContainedDefault::False => "false",
155+
LinkSelfContainedDefault::True => "true",
156+
LinkSelfContainedDefault::Musl => "musl",
157+
LinkSelfContainedDefault::Mingw => "mingw",
154158
}
155159
.to_json()
156160
}

compiler/rustc_target/src/spec/linux_musl_base.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
1-
use crate::spec::crt_objects::{self, CrtObjectsFallback};
1+
use crate::spec::crt_objects::{self, LinkSelfContainedDefault};
22
use crate::spec::TargetOptions;
33

44
pub fn opts() -> TargetOptions {
55
let mut base = super::linux_base::opts();
66

77
base.env = "musl".into();
8-
base.pre_link_objects_fallback = crt_objects::pre_musl_fallback();
9-
base.post_link_objects_fallback = crt_objects::post_musl_fallback();
10-
base.crt_objects_fallback = Some(CrtObjectsFallback::Musl);
8+
base.pre_link_objects_self_contained = crt_objects::pre_musl_self_contained();
9+
base.post_link_objects_self_contained = crt_objects::post_musl_self_contained();
10+
base.link_self_contained = LinkSelfContainedDefault::Musl;
1111

1212
// These targets statically link libc by default
1313
base.crt_static_default = true;

0 commit comments

Comments
 (0)