Skip to content

Commit e7cfe98

Browse files
committed
Auto merge of rust-lang#122273 - matthiaskrgr:rollup-cjnrh8i, r=matthiaskrgr
Rollup of 10 pull requests Successful merges: - rust-lang#112136 (Add std::ffi::c_str module) - rust-lang#113525 (Dynamically size sigaltstk in std) - rust-lang#121685 (Fixing shellcheck comments on lvi test script) - rust-lang#121833 (Suggest correct path in include_bytes!) - rust-lang#121860 (Add a tidy check that checks whether the fluent slugs only appear once) - rust-lang#122125 (Revert back to Git-for-Windows for MinGW CI builds) - rust-lang#122221 (match lowering: define a convenient struct) - rust-lang#122244 (fix: LocalWaker memory leak and some stability attributes) - rust-lang#122251 (Add test to check unused_lifetimes don't duplicate "parameter is never used" error) - rust-lang#122264 (add myself to rotation) r? `@ghost` `@rustbot` modify labels: rollup
2 parents 094a620 + fa0f5b0 commit e7cfe98

File tree

33 files changed

+574
-205
lines changed

33 files changed

+574
-205
lines changed

INSTALL.md

+13-7
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,15 @@ toolchain.
145145

146146
1. Download the latest [MSYS2 installer][msys2] and go through the installer.
147147

148+
2. Download and install [Git for Windows](https://git-scm.com/download/win).
149+
Make sure that it's in your Windows PATH. To enable access to it from within
150+
MSYS2, edit the relevant `mingw[32|64].ini` file in your MSYS2 installation
151+
directory and uncomment the line `MSYS2_PATH_TYPE=inherit`.
152+
153+
You could install and use MSYS2's version of git instead with `pacman`,
154+
however this is not recommended as it's excrutiatingly slow, and not frequently
155+
tested for compatability.
156+
148157
2. Start a MINGW64 or MINGW32 shell (depending on whether you want 32-bit
149158
or 64-bit Rust) either from your start menu, or by running `mingw64.exe`
150159
or `mingw32.exe` from your MSYS2 installation directory (e.g. `C:\msys64`).
@@ -160,8 +169,7 @@ toolchain.
160169
# Note that it is important that you do **not** use the 'python2', 'cmake',
161170
# and 'ninja' packages from the 'msys2' subsystem.
162171
# The build has historically been known to fail with these packages.
163-
pacman -S git \
164-
make \
172+
pacman -S make \
165173
diffutils \
166174
tar \
167175
mingw-w64-x86_64-python \
@@ -176,11 +184,9 @@ toolchain.
176184
python x.py setup dist && python x.py build && python x.py install
177185
```
178186

179-
If you want to use the native versions of Git, Python, or CMake you can remove
180-
them from the above pacman command and install them from another source. Make
181-
sure that they're in your Windows PATH, and edit the relevant `mingw[32|64].ini`
182-
file in your MSYS2 installation directory by uncommenting the line
183-
`MSYS2_PATH_TYPE=inherit` to include them in your MSYS2 PATH.
187+
If you want to try the native Windows versions of Python or CMake, you can remove
188+
them from the above pacman command and install them from another source. Follow
189+
the instructions in step 2 to get them on PATH.
184190

185191
Using Windows native Python can be helpful if you get errors when building LLVM.
186192
You may also want to use Git for Windows, as it is often *much* faster. Turning

compiler/rustc_builtin_macros/src/source_util.rs

+120-30
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,20 @@ use rustc_ast::ptr::P;
33
use rustc_ast::token;
44
use rustc_ast::tokenstream::TokenStream;
55
use rustc_ast_pretty::pprust;
6+
use rustc_data_structures::sync::Lrc;
67
use rustc_expand::base::{
7-
check_zero_tts, get_single_str_from_tts, parse_expr, resolve_path, DummyResult, ExtCtxt,
8-
MacEager, MacResult,
8+
check_zero_tts, get_single_str_from_tts, get_single_str_spanned_from_tts, parse_expr,
9+
resolve_path, DummyResult, ExtCtxt, MacEager, MacResult,
910
};
1011
use rustc_expand::module::DirOwnership;
1112
use rustc_parse::new_parser_from_file;
1213
use rustc_parse::parser::{ForceCollect, Parser};
1314
use rustc_session::lint::builtin::INCOMPLETE_INCLUDE;
15+
use rustc_span::source_map::SourceMap;
1416
use rustc_span::symbol::Symbol;
1517
use rustc_span::{Pos, Span};
16-
1718
use smallvec::SmallVec;
19+
use std::path::{Path, PathBuf};
1820
use std::rc::Rc;
1921

2022
// These macros all relate to the file system; they either return
@@ -180,32 +182,22 @@ pub fn expand_include_str(
180182
tts: TokenStream,
181183
) -> Box<dyn MacResult + 'static> {
182184
let sp = cx.with_def_site_ctxt(sp);
183-
let file = match get_single_str_from_tts(cx, sp, tts, "include_str!") {
184-
Ok(file) => file,
185+
let (path, path_span) = match get_single_str_spanned_from_tts(cx, sp, tts, "include_str!") {
186+
Ok(res) => res,
185187
Err(guar) => return DummyResult::any(sp, guar),
186188
};
187-
let file = match resolve_path(&cx.sess, file.as_str(), sp) {
188-
Ok(f) => f,
189-
Err(err) => {
190-
let guar = err.emit();
191-
return DummyResult::any(sp, guar);
192-
}
193-
};
194-
match cx.source_map().load_binary_file(&file) {
189+
match load_binary_file(cx, path.as_str().as_ref(), sp, path_span) {
195190
Ok(bytes) => match std::str::from_utf8(&bytes) {
196191
Ok(src) => {
197192
let interned_src = Symbol::intern(src);
198193
MacEager::expr(cx.expr_str(sp, interned_src))
199194
}
200195
Err(_) => {
201-
let guar = cx.dcx().span_err(sp, format!("{} wasn't a utf-8 file", file.display()));
196+
let guar = cx.dcx().span_err(sp, format!("`{path}` wasn't a utf-8 file"));
202197
DummyResult::any(sp, guar)
203198
}
204199
},
205-
Err(e) => {
206-
let guar = cx.dcx().span_err(sp, format!("couldn't read {}: {}", file.display(), e));
207-
DummyResult::any(sp, guar)
208-
}
200+
Err(dummy) => dummy,
209201
}
210202
}
211203

@@ -215,25 +207,123 @@ pub fn expand_include_bytes(
215207
tts: TokenStream,
216208
) -> Box<dyn MacResult + 'static> {
217209
let sp = cx.with_def_site_ctxt(sp);
218-
let file = match get_single_str_from_tts(cx, sp, tts, "include_bytes!") {
219-
Ok(file) => file,
210+
let (path, path_span) = match get_single_str_spanned_from_tts(cx, sp, tts, "include_bytes!") {
211+
Ok(res) => res,
220212
Err(guar) => return DummyResult::any(sp, guar),
221213
};
222-
let file = match resolve_path(&cx.sess, file.as_str(), sp) {
223-
Ok(f) => f,
214+
match load_binary_file(cx, path.as_str().as_ref(), sp, path_span) {
215+
Ok(bytes) => {
216+
let expr = cx.expr(sp, ast::ExprKind::IncludedBytes(bytes));
217+
MacEager::expr(expr)
218+
}
219+
Err(dummy) => dummy,
220+
}
221+
}
222+
223+
fn load_binary_file(
224+
cx: &mut ExtCtxt<'_>,
225+
original_path: &Path,
226+
macro_span: Span,
227+
path_span: Span,
228+
) -> Result<Lrc<[u8]>, Box<dyn MacResult>> {
229+
let resolved_path = match resolve_path(&cx.sess, original_path, macro_span) {
230+
Ok(path) => path,
224231
Err(err) => {
225232
let guar = err.emit();
226-
return DummyResult::any(sp, guar);
233+
return Err(DummyResult::any(macro_span, guar));
227234
}
228235
};
229-
match cx.source_map().load_binary_file(&file) {
230-
Ok(bytes) => {
231-
let expr = cx.expr(sp, ast::ExprKind::IncludedBytes(bytes));
232-
MacEager::expr(expr)
236+
match cx.source_map().load_binary_file(&resolved_path) {
237+
Ok(data) => Ok(data),
238+
Err(io_err) => {
239+
let mut err = cx.dcx().struct_span_err(
240+
macro_span,
241+
format!("couldn't read `{}`: {io_err}", resolved_path.display()),
242+
);
243+
244+
if original_path.is_relative() {
245+
let source_map = cx.sess.source_map();
246+
let new_path = source_map
247+
.span_to_filename(macro_span.source_callsite())
248+
.into_local_path()
249+
.and_then(|src| find_path_suggestion(source_map, src.parent()?, original_path))
250+
.and_then(|path| path.into_os_string().into_string().ok());
251+
252+
if let Some(new_path) = new_path {
253+
err.span_suggestion(
254+
path_span,
255+
"there is a file with the same name in a different directory",
256+
format!("\"{}\"", new_path.escape_debug()),
257+
rustc_lint_defs::Applicability::MachineApplicable,
258+
);
259+
}
260+
}
261+
let guar = err.emit();
262+
Err(DummyResult::any(macro_span, guar))
233263
}
234-
Err(e) => {
235-
let guar = cx.dcx().span_err(sp, format!("couldn't read {}: {}", file.display(), e));
236-
DummyResult::any(sp, guar)
264+
}
265+
}
266+
267+
fn find_path_suggestion(
268+
source_map: &SourceMap,
269+
base_dir: &Path,
270+
wanted_path: &Path,
271+
) -> Option<PathBuf> {
272+
// Fix paths that assume they're relative to cargo manifest dir
273+
let mut base_c = base_dir.components();
274+
let mut wanted_c = wanted_path.components();
275+
let mut without_base = None;
276+
while let Some(wanted_next) = wanted_c.next() {
277+
if wanted_c.as_path().file_name().is_none() {
278+
break;
279+
}
280+
// base_dir may be absolute
281+
while let Some(base_next) = base_c.next() {
282+
if base_next == wanted_next {
283+
without_base = Some(wanted_c.as_path());
284+
break;
285+
}
286+
}
287+
}
288+
let root_absolute = without_base.into_iter().map(PathBuf::from);
289+
290+
let base_dir_components = base_dir.components().count();
291+
// Avoid going all the way to the root dir
292+
let max_parent_components = if base_dir.is_relative() {
293+
base_dir_components + 1
294+
} else {
295+
base_dir_components.saturating_sub(1)
296+
};
297+
298+
// Try with additional leading ../
299+
let mut prefix = PathBuf::new();
300+
let add = std::iter::from_fn(|| {
301+
prefix.push("..");
302+
Some(prefix.join(wanted_path))
303+
})
304+
.take(max_parent_components.min(3));
305+
306+
// Try without leading directories
307+
let mut trimmed_path = wanted_path;
308+
let remove = std::iter::from_fn(|| {
309+
let mut components = trimmed_path.components();
310+
let removed = components.next()?;
311+
trimmed_path = components.as_path();
312+
let _ = trimmed_path.file_name()?; // ensure there is a file name left
313+
Some([
314+
Some(trimmed_path.to_path_buf()),
315+
(removed != std::path::Component::ParentDir)
316+
.then(|| Path::new("..").join(trimmed_path)),
317+
])
318+
})
319+
.flatten()
320+
.flatten()
321+
.take(4);
322+
323+
for new_path in root_absolute.chain(add).chain(remove) {
324+
if source_map.file_exists(&base_dir.join(&new_path)) {
325+
return Some(new_path);
237326
}
238327
}
328+
None
239329
}

compiler/rustc_const_eval/messages.ftl

-3
Original file line numberDiff line numberDiff line change
@@ -146,9 +146,6 @@ const_eval_intern_kind = {$kind ->
146146
*[other] {""}
147147
}
148148
149-
const_eval_invalid_align =
150-
align has to be a power of 2
151-
152149
const_eval_invalid_align_details =
153150
invalid align passed to `{$name}`: {$align} is {$err_kind ->
154151
[not_power_of_two] not a power of 2

compiler/rustc_expand/src/base.rs

+26-15
Original file line numberDiff line numberDiff line change
@@ -1233,21 +1233,18 @@ pub fn resolve_path(sess: &Session, path: impl Into<PathBuf>, span: Span) -> PRe
12331233
// after macro expansion (that is, they are unhygienic).
12341234
if !path.is_absolute() {
12351235
let callsite = span.source_callsite();
1236-
let mut result = match sess.source_map().span_to_filename(callsite) {
1237-
FileName::Real(name) => name
1238-
.into_local_path()
1239-
.expect("attempting to resolve a file path in an external file"),
1240-
FileName::DocTest(path, _) => path,
1241-
other => {
1242-
return Err(sess.dcx().create_err(errors::ResolveRelativePath {
1243-
span,
1244-
path: sess.source_map().filename_for_diagnostics(&other).to_string(),
1245-
}));
1246-
}
1236+
let source_map = sess.source_map();
1237+
let Some(mut base_path) = source_map.span_to_filename(callsite).into_local_path() else {
1238+
return Err(sess.dcx().create_err(errors::ResolveRelativePath {
1239+
span,
1240+
path: source_map
1241+
.filename_for_diagnostics(&source_map.span_to_filename(callsite))
1242+
.to_string(),
1243+
}));
12471244
};
1248-
result.pop();
1249-
result.push(path);
1250-
Ok(result)
1245+
base_path.pop();
1246+
base_path.push(path);
1247+
Ok(base_path)
12511248
} else {
12521249
Ok(path)
12531250
}
@@ -1344,6 +1341,15 @@ pub fn get_single_str_from_tts(
13441341
tts: TokenStream,
13451342
name: &str,
13461343
) -> Result<Symbol, ErrorGuaranteed> {
1344+
get_single_str_spanned_from_tts(cx, span, tts, name).map(|(s, _)| s)
1345+
}
1346+
1347+
pub fn get_single_str_spanned_from_tts(
1348+
cx: &mut ExtCtxt<'_>,
1349+
span: Span,
1350+
tts: TokenStream,
1351+
name: &str,
1352+
) -> Result<(Symbol, Span), ErrorGuaranteed> {
13471353
let mut p = cx.new_parser_from_tts(tts);
13481354
if p.token == token::Eof {
13491355
let guar = cx.dcx().emit_err(errors::OnlyOneArgument { span, name });
@@ -1355,7 +1361,12 @@ pub fn get_single_str_from_tts(
13551361
if p.token != token::Eof {
13561362
cx.dcx().emit_err(errors::OnlyOneArgument { span, name });
13571363
}
1358-
expr_to_string(cx, ret, "argument must be a string literal").map(|(s, _)| s)
1364+
expr_to_spanned_string(cx, ret, "argument must be a string literal")
1365+
.map_err(|err| match err {
1366+
Ok((err, _)) => err.emit(),
1367+
Err(guar) => guar,
1368+
})
1369+
.map(|(symbol, _style, span)| (symbol, span))
13591370
}
13601371

13611372
/// Extracts comma-separated expressions from `tts`.

compiler/rustc_infer/messages.ftl

-8
Original file line numberDiff line numberDiff line change
@@ -181,14 +181,6 @@ infer_more_targeted = {$has_param_name ->
181181
182182
infer_msl_introduces_static = introduces a `'static` lifetime requirement
183183
infer_msl_unmet_req = because this has an unmet lifetime requirement
184-
infer_need_type_info_in_coroutine =
185-
type inside {$coroutine_kind ->
186-
[async_block] `async` block
187-
[async_closure] `async` closure
188-
[async_fn] `async fn` body
189-
*[coroutine] coroutine
190-
} must be known in this context
191-
192184
193185
infer_nothing = {""}
194186

compiler/rustc_lint/messages.ftl

-2
Original file line numberDiff line numberDiff line change
@@ -562,8 +562,6 @@ lint_suspicious_double_ref_clone =
562562
lint_suspicious_double_ref_deref =
563563
using `.deref()` on a double reference, which returns `{$ty}` instead of dereferencing the inner type
564564
565-
lint_trivial_untranslatable_diag = diagnostic with static strings only
566-
567565
lint_ty_qualified = usage of qualified `ty::{$ty}`
568566
.suggestion = try importing it and using it unqualified
569567

0 commit comments

Comments
 (0)