Auto merge of #110101 - JohnTitor:rollup-ol20aw7, r=JohnTitor
Rollup of 6 pull requests Successful merges: - #110058 (Remove `box_syntax` usage) - #110059 (ignore_git → omit_git_hash) - #110060 (Document that `&T` and `&mut T` are `Sync` if `T` is) - #110074 (Make the "codegen" profile of `config.toml` download and build llvm from source.) - #110086 (Add `max_line_length` to `.editorconfig`, matching rustfmt) - #110096 (Tweak tuple indexing suggestion) Failed merges: r? `@ghost` `@rustbot` modify labels: rollup
This commit is contained in:
commit
7cd6f55323
@ -11,6 +11,7 @@ trim_trailing_whitespace = true
|
|||||||
insert_final_newline = true
|
insert_final_newline = true
|
||||||
indent_style = space
|
indent_style = space
|
||||||
indent_size = 4
|
indent_size = 4
|
||||||
|
max_line_length = 100
|
||||||
|
|
||||||
[*.md]
|
[*.md]
|
||||||
# double whitespace at end of line
|
# double whitespace at end of line
|
||||||
|
@ -2810,23 +2810,26 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
|||||||
"cannot index into a value of type `{base_t}`",
|
"cannot index into a value of type `{base_t}`",
|
||||||
);
|
);
|
||||||
// Try to give some advice about indexing tuples.
|
// Try to give some advice about indexing tuples.
|
||||||
if let ty::Tuple(..) = base_t.kind() {
|
if let ty::Tuple(types) = base_t.kind() {
|
||||||
let mut needs_note = true;
|
let mut needs_note = true;
|
||||||
// If the index is an integer, we can show the actual
|
// If the index is an integer, we can show the actual
|
||||||
// fixed expression:
|
// fixed expression:
|
||||||
if let ExprKind::Lit(ref lit) = idx.kind {
|
if let ExprKind::Lit(ref lit) = idx.kind
|
||||||
if let ast::LitKind::Int(i, ast::LitIntType::Unsuffixed) = lit.node {
|
&& let ast::LitKind::Int(i, ast::LitIntType::Unsuffixed) = lit.node
|
||||||
let snip = self.tcx.sess.source_map().span_to_snippet(base.span);
|
&& i < types.len().try_into().expect("expected tuple index to be < usize length")
|
||||||
if let Ok(snip) = snip {
|
{
|
||||||
err.span_suggestion(
|
let snip = self.tcx.sess.source_map().span_to_snippet(base.span);
|
||||||
expr.span,
|
if let Ok(snip) = snip {
|
||||||
"to access tuple elements, use",
|
err.span_suggestion(
|
||||||
format!("{snip}.{i}"),
|
expr.span,
|
||||||
Applicability::MachineApplicable,
|
"to access tuple elements, use",
|
||||||
);
|
format!("{snip}.{i}"),
|
||||||
needs_note = false;
|
Applicability::MachineApplicable,
|
||||||
}
|
);
|
||||||
|
needs_note = false;
|
||||||
}
|
}
|
||||||
|
} else if let ExprKind::Path(..) = idx.peel_borrows().kind {
|
||||||
|
err.span_label(idx.span, "cannot access tuple elements at a variable index");
|
||||||
}
|
}
|
||||||
if needs_note {
|
if needs_note {
|
||||||
err.help(
|
err.help(
|
||||||
|
@ -585,7 +585,7 @@ changelog-seen = 2
|
|||||||
# Having the git information can cause a lot of rebuilds during development.
|
# Having the git information can cause a lot of rebuilds during development.
|
||||||
#
|
#
|
||||||
# FIXME(#76720): this can causes bugs if different compilers reuse the same metadata cache.
|
# FIXME(#76720): this can causes bugs if different compilers reuse the same metadata cache.
|
||||||
#ignore-git = if rust.channel == "dev" { true } else { false }
|
#omit-git-hash = if rust.channel == "dev" { true } else { false }
|
||||||
|
|
||||||
# Whether to create a source tarball by default when running `x dist`.
|
# Whether to create a source tarball by default when running `x dist`.
|
||||||
#
|
#
|
||||||
|
@ -1362,6 +1362,7 @@ mod prim_usize {}
|
|||||||
/// * [`Hash`]
|
/// * [`Hash`]
|
||||||
/// * [`ToSocketAddrs`]
|
/// * [`ToSocketAddrs`]
|
||||||
/// * [`Send`] \(`&T` references also require <code>T: [Sync]</code>)
|
/// * [`Send`] \(`&T` references also require <code>T: [Sync]</code>)
|
||||||
|
/// * [`Sync`]
|
||||||
///
|
///
|
||||||
/// [`std::fmt`]: fmt
|
/// [`std::fmt`]: fmt
|
||||||
/// [`Hash`]: hash::Hash
|
/// [`Hash`]: hash::Hash
|
||||||
|
@ -1362,6 +1362,7 @@ mod prim_usize {}
|
|||||||
/// * [`Hash`]
|
/// * [`Hash`]
|
||||||
/// * [`ToSocketAddrs`]
|
/// * [`ToSocketAddrs`]
|
||||||
/// * [`Send`] \(`&T` references also require <code>T: [Sync]</code>)
|
/// * [`Send`] \(`&T` references also require <code>T: [Sync]</code>)
|
||||||
|
/// * [`Sync`]
|
||||||
///
|
///
|
||||||
/// [`std::fmt`]: fmt
|
/// [`std::fmt`]: fmt
|
||||||
/// [`Hash`]: hash::Hash
|
/// [`Hash`]: hash::Hash
|
||||||
|
@ -19,7 +19,7 @@ pub enum GitInfo {
|
|||||||
#[default]
|
#[default]
|
||||||
Absent,
|
Absent,
|
||||||
/// This is a git repository.
|
/// This is a git repository.
|
||||||
/// If the info should be used (`ignore_git` is false), this will be
|
/// If the info should be used (`omit_git_hash` is false), this will be
|
||||||
/// `Some`, otherwise it will be `None`.
|
/// `Some`, otherwise it will be `None`.
|
||||||
Present(Option<Info>),
|
Present(Option<Info>),
|
||||||
/// This is not a git repostory, but the info can be fetched from the
|
/// This is not a git repostory, but the info can be fetched from the
|
||||||
@ -35,7 +35,7 @@ pub struct Info {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl GitInfo {
|
impl GitInfo {
|
||||||
pub fn new(ignore_git: bool, dir: &Path) -> GitInfo {
|
pub fn new(omit_git_hash: bool, dir: &Path) -> GitInfo {
|
||||||
// See if this even begins to look like a git dir
|
// See if this even begins to look like a git dir
|
||||||
if !dir.join(".git").exists() {
|
if !dir.join(".git").exists() {
|
||||||
match read_commit_info_file(dir) {
|
match read_commit_info_file(dir) {
|
||||||
@ -52,7 +52,7 @@ impl GitInfo {
|
|||||||
|
|
||||||
// If we're ignoring the git info, we don't actually need to collect it, just make sure this
|
// If we're ignoring the git info, we don't actually need to collect it, just make sure this
|
||||||
// was a git repo in the first place.
|
// was a git repo in the first place.
|
||||||
if ignore_git {
|
if omit_git_hash {
|
||||||
return GitInfo::Present(None);
|
return GitInfo::Present(None);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -77,7 +77,7 @@ pub struct Config {
|
|||||||
pub tools: Option<HashSet<String>>,
|
pub tools: Option<HashSet<String>>,
|
||||||
pub sanitizers: bool,
|
pub sanitizers: bool,
|
||||||
pub profiler: bool,
|
pub profiler: bool,
|
||||||
pub ignore_git: bool,
|
pub omit_git_hash: bool,
|
||||||
pub exclude: Vec<TaskPath>,
|
pub exclude: Vec<TaskPath>,
|
||||||
pub include_default_paths: bool,
|
pub include_default_paths: bool,
|
||||||
pub rustc_error_format: Option<String>,
|
pub rustc_error_format: Option<String>,
|
||||||
@ -764,7 +764,7 @@ define_config! {
|
|||||||
verbose_tests: Option<bool> = "verbose-tests",
|
verbose_tests: Option<bool> = "verbose-tests",
|
||||||
optimize_tests: Option<bool> = "optimize-tests",
|
optimize_tests: Option<bool> = "optimize-tests",
|
||||||
codegen_tests: Option<bool> = "codegen-tests",
|
codegen_tests: Option<bool> = "codegen-tests",
|
||||||
ignore_git: Option<bool> = "ignore-git",
|
omit_git_hash: Option<bool> = "omit-git-hash",
|
||||||
dist_src: Option<bool> = "dist-src",
|
dist_src: Option<bool> = "dist-src",
|
||||||
save_toolstates: Option<String> = "save-toolstates",
|
save_toolstates: Option<String> = "save-toolstates",
|
||||||
codegen_backends: Option<Vec<String>> = "codegen-backends",
|
codegen_backends: Option<Vec<String>> = "codegen-backends",
|
||||||
@ -1097,7 +1097,7 @@ impl Config {
|
|||||||
let mut debuginfo_level_tools = None;
|
let mut debuginfo_level_tools = None;
|
||||||
let mut debuginfo_level_tests = None;
|
let mut debuginfo_level_tests = None;
|
||||||
let mut optimize = None;
|
let mut optimize = None;
|
||||||
let mut ignore_git = None;
|
let mut omit_git_hash = None;
|
||||||
|
|
||||||
if let Some(rust) = toml.rust {
|
if let Some(rust) = toml.rust {
|
||||||
debug = rust.debug;
|
debug = rust.debug;
|
||||||
@ -1118,7 +1118,7 @@ impl Config {
|
|||||||
.map(|v| v.expect("invalid value for rust.split_debuginfo"))
|
.map(|v| v.expect("invalid value for rust.split_debuginfo"))
|
||||||
.unwrap_or(SplitDebuginfo::default_for_platform(&config.build.triple));
|
.unwrap_or(SplitDebuginfo::default_for_platform(&config.build.triple));
|
||||||
optimize = rust.optimize;
|
optimize = rust.optimize;
|
||||||
ignore_git = rust.ignore_git;
|
omit_git_hash = rust.omit_git_hash;
|
||||||
config.rust_new_symbol_mangling = rust.new_symbol_mangling;
|
config.rust_new_symbol_mangling = rust.new_symbol_mangling;
|
||||||
set(&mut config.rust_optimize_tests, rust.optimize_tests);
|
set(&mut config.rust_optimize_tests, rust.optimize_tests);
|
||||||
set(&mut config.codegen_tests, rust.codegen_tests);
|
set(&mut config.codegen_tests, rust.codegen_tests);
|
||||||
@ -1175,8 +1175,8 @@ impl Config {
|
|||||||
|
|
||||||
// rust_info must be set before is_ci_llvm_available() is called.
|
// rust_info must be set before is_ci_llvm_available() is called.
|
||||||
let default = config.channel == "dev";
|
let default = config.channel == "dev";
|
||||||
config.ignore_git = ignore_git.unwrap_or(default);
|
config.omit_git_hash = omit_git_hash.unwrap_or(default);
|
||||||
config.rust_info = GitInfo::new(config.ignore_git, &config.src);
|
config.rust_info = GitInfo::new(config.omit_git_hash, &config.src);
|
||||||
|
|
||||||
if let Some(llvm) = toml.llvm {
|
if let Some(llvm) = toml.llvm {
|
||||||
match llvm.ccache {
|
match llvm.ccache {
|
||||||
|
@ -9,6 +9,8 @@ compiler-docs = true
|
|||||||
assertions = true
|
assertions = true
|
||||||
# enable warnings during the llvm compilation
|
# enable warnings during the llvm compilation
|
||||||
enable-warnings = true
|
enable-warnings = true
|
||||||
|
# build llvm from source
|
||||||
|
download-ci-llvm = false
|
||||||
|
|
||||||
[rust]
|
[rust]
|
||||||
# This enables `RUSTC_LOG=debug`, avoiding confusing situations
|
# This enables `RUSTC_LOG=debug`, avoiding confusing situations
|
||||||
|
@ -358,14 +358,14 @@ impl Build {
|
|||||||
#[cfg(not(unix))]
|
#[cfg(not(unix))]
|
||||||
let is_sudo = false;
|
let is_sudo = false;
|
||||||
|
|
||||||
let ignore_git = config.ignore_git;
|
let omit_git_hash = config.omit_git_hash;
|
||||||
let rust_info = channel::GitInfo::new(ignore_git, &src);
|
let rust_info = channel::GitInfo::new(omit_git_hash, &src);
|
||||||
let cargo_info = channel::GitInfo::new(ignore_git, &src.join("src/tools/cargo"));
|
let cargo_info = channel::GitInfo::new(omit_git_hash, &src.join("src/tools/cargo"));
|
||||||
let rust_analyzer_info =
|
let rust_analyzer_info =
|
||||||
channel::GitInfo::new(ignore_git, &src.join("src/tools/rust-analyzer"));
|
channel::GitInfo::new(omit_git_hash, &src.join("src/tools/rust-analyzer"));
|
||||||
let clippy_info = channel::GitInfo::new(ignore_git, &src.join("src/tools/clippy"));
|
let clippy_info = channel::GitInfo::new(omit_git_hash, &src.join("src/tools/clippy"));
|
||||||
let miri_info = channel::GitInfo::new(ignore_git, &src.join("src/tools/miri"));
|
let miri_info = channel::GitInfo::new(omit_git_hash, &src.join("src/tools/miri"));
|
||||||
let rustfmt_info = channel::GitInfo::new(ignore_git, &src.join("src/tools/rustfmt"));
|
let rustfmt_info = channel::GitInfo::new(omit_git_hash, &src.join("src/tools/rustfmt"));
|
||||||
|
|
||||||
// we always try to use git for LLVM builds
|
// we always try to use git for LLVM builds
|
||||||
let in_tree_llvm_info = channel::GitInfo::new(false, &src.join("src/llvm-project"));
|
let in_tree_llvm_info = channel::GitInfo::new(false, &src.join("src/llvm-project"));
|
||||||
@ -1233,7 +1233,7 @@ impl Build {
|
|||||||
match &self.config.channel[..] {
|
match &self.config.channel[..] {
|
||||||
"stable" => num.to_string(),
|
"stable" => num.to_string(),
|
||||||
"beta" => {
|
"beta" => {
|
||||||
if self.rust_info().is_managed_git_subrepository() && !self.config.ignore_git {
|
if self.rust_info().is_managed_git_subrepository() && !self.config.omit_git_hash {
|
||||||
format!("{}-beta.{}", num, self.beta_prerelease_version())
|
format!("{}-beta.{}", num, self.beta_prerelease_version())
|
||||||
} else {
|
} else {
|
||||||
format!("{}-beta", num)
|
format!("{}-beta", num)
|
||||||
|
@ -320,7 +320,7 @@ pub fn prepare_tool_cargo(
|
|||||||
cargo.env("CFG_RELEASE_NUM", &builder.version);
|
cargo.env("CFG_RELEASE_NUM", &builder.version);
|
||||||
cargo.env("DOC_RUST_LANG_ORG_CHANNEL", builder.doc_rust_lang_org_channel());
|
cargo.env("DOC_RUST_LANG_ORG_CHANNEL", builder.doc_rust_lang_org_channel());
|
||||||
|
|
||||||
let info = GitInfo::new(builder.config.ignore_git, &dir);
|
let info = GitInfo::new(builder.config.omit_git_hash, &dir);
|
||||||
if let Some(sha) = info.sha() {
|
if let Some(sha) = info.sha() {
|
||||||
cargo.env("CFG_COMMIT_HASH", sha);
|
cargo.env("CFG_COMMIT_HASH", sha);
|
||||||
}
|
}
|
||||||
|
@ -24,6 +24,6 @@ RUN sh /scripts/sccache.sh
|
|||||||
# We are disabling CI LLVM since distcheck is an offline build.
|
# We are disabling CI LLVM since distcheck is an offline build.
|
||||||
ENV NO_DOWNLOAD_CI_LLVM 1
|
ENV NO_DOWNLOAD_CI_LLVM 1
|
||||||
|
|
||||||
ENV RUST_CONFIGURE_ARGS --build=x86_64-unknown-linux-gnu --set rust.ignore-git=false
|
ENV RUST_CONFIGURE_ARGS --build=x86_64-unknown-linux-gnu --set rust.omit-git-hash=false
|
||||||
ENV SCRIPT python3 ../x.py --stage 2 test distcheck
|
ENV SCRIPT python3 ../x.py --stage 2 test distcheck
|
||||||
ENV DIST_SRC 1
|
ENV DIST_SRC 1
|
||||||
|
@ -16,18 +16,26 @@ and one for deallocation. A freestanding program that uses the `Box`
|
|||||||
sugar for dynamic allocations via `malloc` and `free`:
|
sugar for dynamic allocations via `malloc` and `free`:
|
||||||
|
|
||||||
```rust,ignore (libc-is-finicky)
|
```rust,ignore (libc-is-finicky)
|
||||||
#![feature(lang_items, box_syntax, start, libc, core_intrinsics, rustc_private)]
|
#![feature(lang_items, start, libc, core_intrinsics, rustc_private, rustc_attrs)]
|
||||||
#![no_std]
|
#![no_std]
|
||||||
use core::intrinsics;
|
use core::intrinsics;
|
||||||
use core::panic::PanicInfo;
|
use core::panic::PanicInfo;
|
||||||
|
use core::ptr::NonNull;
|
||||||
|
|
||||||
extern crate libc;
|
extern crate libc;
|
||||||
|
|
||||||
struct Unique<T>(*mut T);
|
struct Unique<T>(NonNull<T>);
|
||||||
|
|
||||||
#[lang = "owned_box"]
|
#[lang = "owned_box"]
|
||||||
pub struct Box<T>(Unique<T>);
|
pub struct Box<T>(Unique<T>);
|
||||||
|
|
||||||
|
impl<T> Box<T> {
|
||||||
|
pub fn new(x: T) -> Self {
|
||||||
|
#[rustc_box]
|
||||||
|
Box::new(x)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[lang = "exchange_malloc"]
|
#[lang = "exchange_malloc"]
|
||||||
unsafe fn allocate(size: usize, _align: usize) -> *mut u8 {
|
unsafe fn allocate(size: usize, _align: usize) -> *mut u8 {
|
||||||
let p = libc::malloc(size as libc::size_t) as *mut u8;
|
let p = libc::malloc(size as libc::size_t) as *mut u8;
|
||||||
@ -47,13 +55,13 @@ unsafe fn box_free<T: ?Sized>(ptr: *mut T) {
|
|||||||
|
|
||||||
#[start]
|
#[start]
|
||||||
fn main(_argc: isize, _argv: *const *const u8) -> isize {
|
fn main(_argc: isize, _argv: *const *const u8) -> isize {
|
||||||
let _x = box 1;
|
let _x = Box::new(1);
|
||||||
|
|
||||||
0
|
0
|
||||||
}
|
}
|
||||||
|
|
||||||
#[lang = "eh_personality"] extern fn rust_eh_personality() {}
|
#[lang = "eh_personality"] extern fn rust_eh_personality() {}
|
||||||
#[lang = "panic_impl"] extern fn rust_begin_panic(info: &PanicInfo) -> ! { unsafe { intrinsics::abort() } }
|
#[lang = "panic_impl"] extern fn rust_begin_panic(_info: &PanicInfo) -> ! { intrinsics::abort() }
|
||||||
#[no_mangle] pub extern fn rust_eh_register_frames () {}
|
#[no_mangle] pub extern fn rust_eh_register_frames () {}
|
||||||
#[no_mangle] pub extern fn rust_eh_unregister_frames () {}
|
#[no_mangle] pub extern fn rust_eh_unregister_frames () {}
|
||||||
```
|
```
|
||||||
|
@ -37,7 +37,7 @@ additional checks for code style, safety, etc. Now let's write a plugin
|
|||||||
that warns about any item named `lintme`.
|
that warns about any item named `lintme`.
|
||||||
|
|
||||||
```rust,ignore (requires-stage-2)
|
```rust,ignore (requires-stage-2)
|
||||||
#![feature(box_syntax, rustc_private)]
|
#![feature(rustc_private)]
|
||||||
|
|
||||||
extern crate rustc_ast;
|
extern crate rustc_ast;
|
||||||
|
|
||||||
@ -68,7 +68,7 @@ impl EarlyLintPass for Pass {
|
|||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
fn __rustc_plugin_registrar(reg: &mut Registry) {
|
fn __rustc_plugin_registrar(reg: &mut Registry) {
|
||||||
reg.lint_store.register_lints(&[&TEST_LINT]);
|
reg.lint_store.register_lints(&[&TEST_LINT]);
|
||||||
reg.lint_store.register_early_pass(|| box Pass);
|
reg.lint_store.register_early_pass(|| Box::new(Pass));
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
fn main() {
|
fn main() {
|
||||||
let z = ();
|
let z = (10,);
|
||||||
let _ = z[0]; //~ ERROR cannot index into a value of type `()`
|
let _ = z[0]; //~ ERROR cannot index into a value of type `({integer},)`
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
error[E0608]: cannot index into a value of type `()`
|
error[E0608]: cannot index into a value of type `({integer},)`
|
||||||
--> $DIR/index_message.rs:3:13
|
--> $DIR/index_message.rs:3:13
|
||||||
|
|
|
|
||||||
LL | let _ = z[0];
|
LL | let _ = z[0];
|
||||||
|
@ -8,4 +8,9 @@ fn main() {
|
|||||||
let i = 0_usize;
|
let i = 0_usize;
|
||||||
let _ = tup[i];
|
let _ = tup[i];
|
||||||
//~^ ERROR cannot index into a value of type
|
//~^ ERROR cannot index into a value of type
|
||||||
|
|
||||||
|
// the case where the index is out of bounds
|
||||||
|
let tup = (10,);
|
||||||
|
let _ = tup[3];
|
||||||
|
//~^ ERROR cannot index into a value of type
|
||||||
}
|
}
|
||||||
|
@ -8,10 +8,20 @@ error[E0608]: cannot index into a value of type `({integer}, {integer}, {integer
|
|||||||
--> $DIR/issue-27842.rs:9:13
|
--> $DIR/issue-27842.rs:9:13
|
||||||
|
|
|
|
||||||
LL | let _ = tup[i];
|
LL | let _ = tup[i];
|
||||||
|
| ^^^^-^
|
||||||
|
| |
|
||||||
|
| cannot access tuple elements at a variable index
|
||||||
|
|
|
||||||
|
= help: to access tuple elements, use tuple indexing syntax (e.g., `tuple.0`)
|
||||||
|
|
||||||
|
error[E0608]: cannot index into a value of type `({integer},)`
|
||||||
|
--> $DIR/issue-27842.rs:14:13
|
||||||
|
|
|
||||||
|
LL | let _ = tup[3];
|
||||||
| ^^^^^^
|
| ^^^^^^
|
||||||
|
|
|
|
||||||
= help: to access tuple elements, use tuple indexing syntax (e.g., `tuple.0`)
|
= help: to access tuple elements, use tuple indexing syntax (e.g., `tuple.0`)
|
||||||
|
|
||||||
error: aborting due to 2 previous errors
|
error: aborting due to 3 previous errors
|
||||||
|
|
||||||
For more information about this error, try `rustc --explain E0608`.
|
For more information about this error, try `rustc --explain E0608`.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user