Skip to content

[beta] Backports #93846

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 5 commits into from
Feb 11, 2022
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
86 changes: 43 additions & 43 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -41,15 +41,15 @@ jobs:
matrix:
include:
- name: mingw-check
os: ubuntu-latest-xl
os: ubuntu-20.04-xl
env: {}
- name: x86_64-gnu-llvm-12
os: ubuntu-latest-xl
os: ubuntu-20.04-xl
env: {}
- name: x86_64-gnu-tools
env:
CI_ONLY_WHEN_SUBMODULES_CHANGED: 1
os: ubuntu-latest-xl
os: ubuntu-20.04-xl
timeout-minutes: 600
runs-on: "${{ matrix.os }}"
steps:
@@ -166,128 +166,128 @@ jobs:
- ARM64
- linux
- name: arm-android
os: ubuntu-latest-xl
os: ubuntu-20.04-xl
env: {}
- name: armhf-gnu
os: ubuntu-latest-xl
os: ubuntu-20.04-xl
env: {}
- name: dist-aarch64-linux
os: ubuntu-latest-xl
os: ubuntu-20.04-xl
env: {}
- name: dist-android
os: ubuntu-latest-xl
os: ubuntu-20.04-xl
env: {}
- name: dist-arm-linux
os: ubuntu-latest-xl
os: ubuntu-20.04-xl
env: {}
- name: dist-armhf-linux
os: ubuntu-latest-xl
os: ubuntu-20.04-xl
env: {}
- name: dist-armv7-linux
os: ubuntu-latest-xl
os: ubuntu-20.04-xl
env: {}
- name: dist-i586-gnu-i586-i686-musl
os: ubuntu-latest-xl
os: ubuntu-20.04-xl
env: {}
- name: dist-i686-linux
os: ubuntu-latest-xl
os: ubuntu-20.04-xl
env: {}
- name: dist-mips-linux
os: ubuntu-latest-xl
os: ubuntu-20.04-xl
env: {}
- name: dist-mips64-linux
os: ubuntu-latest-xl
os: ubuntu-20.04-xl
env: {}
- name: dist-mips64el-linux
os: ubuntu-latest-xl
os: ubuntu-20.04-xl
env: {}
- name: dist-mipsel-linux
os: ubuntu-latest-xl
os: ubuntu-20.04-xl
env: {}
- name: dist-powerpc-linux
os: ubuntu-latest-xl
os: ubuntu-20.04-xl
env: {}
- name: dist-powerpc64-linux
os: ubuntu-latest-xl
os: ubuntu-20.04-xl
env: {}
- name: dist-powerpc64le-linux
os: ubuntu-latest-xl
os: ubuntu-20.04-xl
env: {}
- name: dist-riscv64-linux
os: ubuntu-latest-xl
os: ubuntu-20.04-xl
env: {}
- name: dist-s390x-linux
os: ubuntu-latest-xl
os: ubuntu-20.04-xl
env: {}
- name: dist-various-1
os: ubuntu-latest-xl
os: ubuntu-20.04-xl
env: {}
- name: dist-various-2
os: ubuntu-latest-xl
os: ubuntu-20.04-xl
env: {}
- name: dist-x86_64-freebsd
os: ubuntu-latest-xl
os: ubuntu-20.04-xl
env: {}
- name: dist-x86_64-illumos
os: ubuntu-latest-xl
os: ubuntu-20.04-xl
env: {}
- name: dist-x86_64-linux
os: ubuntu-latest-xl
os: ubuntu-20.04-xl
env: {}
- name: dist-x86_64-linux-alt
env:
IMAGE: dist-x86_64-linux
os: ubuntu-latest-xl
os: ubuntu-20.04-xl
- name: dist-x86_64-musl
os: ubuntu-latest-xl
os: ubuntu-20.04-xl
env: {}
- name: dist-x86_64-netbsd
os: ubuntu-latest-xl
os: ubuntu-20.04-xl
env: {}
- name: i686-gnu
os: ubuntu-latest-xl
os: ubuntu-20.04-xl
env: {}
- name: i686-gnu-nopt
os: ubuntu-latest-xl
os: ubuntu-20.04-xl
env: {}
- name: mingw-check
os: ubuntu-latest-xl
os: ubuntu-20.04-xl
env: {}
- name: test-various
os: ubuntu-latest-xl
os: ubuntu-20.04-xl
env: {}
- name: wasm32
os: ubuntu-latest-xl
os: ubuntu-20.04-xl
env: {}
- name: x86_64-gnu
os: ubuntu-latest-xl
os: ubuntu-20.04-xl
env: {}
- name: x86_64-gnu-stable
env:
IMAGE: x86_64-gnu
RUST_CI_OVERRIDE_RELEASE_CHANNEL: stable
CI_ONLY_WHEN_CHANNEL: nightly
os: ubuntu-latest-xl
os: ubuntu-20.04-xl
- name: x86_64-gnu-aux
os: ubuntu-latest-xl
os: ubuntu-20.04-xl
env: {}
- name: x86_64-gnu-debug
os: ubuntu-latest-xl
os: ubuntu-20.04-xl
env: {}
- name: x86_64-gnu-distcheck
os: ubuntu-latest-xl
os: ubuntu-20.04-xl
env: {}
- name: x86_64-gnu-llvm-12
env:
RUST_BACKTRACE: 1
os: ubuntu-latest-xl
os: ubuntu-20.04-xl
- name: x86_64-gnu-nopt
os: ubuntu-latest-xl
os: ubuntu-20.04-xl
env: {}
- name: x86_64-gnu-tools
env:
DEPLOY_TOOLSTATES_JSON: toolstates-linux.json
os: ubuntu-latest-xl
os: ubuntu-20.04-xl
- name: dist-x86_64-apple
env:
SCRIPT: "./x.py dist --exclude rust-docs --exclude extended && ./x.py dist --target=x86_64-apple-darwin rust-docs && ./x.py dist extended"
@@ -538,7 +538,7 @@ jobs:
matrix:
include:
- name: dist-x86_64-linux
os: ubuntu-latest-xl
os: ubuntu-20.04-xl
env: {}
timeout-minutes: 600
runs-on: "${{ matrix.os }}"
35 changes: 24 additions & 11 deletions compiler/rustc_builtin_macros/src/format.rs
Original file line number Diff line number Diff line change
@@ -23,6 +23,7 @@ enum ArgumentType {

enum Position {
Exact(usize),
Capture(usize),
Named(Symbol),
}

@@ -47,6 +48,8 @@ struct Context<'a, 'b> {
/// * `arg_unique_types` (in simplified JSON): `[["o", "x"], ["o", "x"], ["o", "x"]]`
/// * `names` (in JSON): `{"foo": 2}`
args: Vec<P<ast::Expr>>,
/// The number of arguments that were added by implicit capturing.
num_captured_args: usize,
/// Placeholder slot numbers indexed by argument.
arg_types: Vec<Vec<usize>>,
/// Unique format specs seen for each argument.
@@ -229,6 +232,11 @@ fn parse_args<'a>(
}

impl<'a, 'b> Context<'a, 'b> {
/// The number of arguments that were explicitly given.
fn num_args(&self) -> usize {
self.args.len() - self.num_captured_args
}

fn resolve_name_inplace(&self, p: &mut parse::Piece<'_>) {
// NOTE: the `unwrap_or` branch is needed in case of invalid format
// arguments, e.g., `format_args!("{foo}")`.
@@ -343,7 +351,7 @@ impl<'a, 'b> Context<'a, 'b> {
}

fn describe_num_args(&self) -> Cow<'_, str> {
match self.args.len() {
match self.num_args() {
0 => "no arguments were given".into(),
1 => "there is 1 argument".into(),
x => format!("there are {} arguments", x).into(),
@@ -369,7 +377,7 @@ impl<'a, 'b> Context<'a, 'b> {

let count = self.pieces.len()
+ self.arg_with_formatting.iter().filter(|fmt| fmt.precision_span.is_some()).count();
if self.names.is_empty() && !numbered_position_args && count != self.args.len() {
if self.names.is_empty() && !numbered_position_args && count != self.num_args() {
e = self.ecx.struct_span_err(
sp,
&format!(
@@ -417,7 +425,7 @@ impl<'a, 'b> Context<'a, 'b> {
if let Some(span) = fmt.precision_span {
let span = self.fmtsp.from_inner(span);
match fmt.precision {
parse::CountIsParam(pos) if pos > self.args.len() => {
parse::CountIsParam(pos) if pos > self.num_args() => {
e.span_label(
span,
&format!(
@@ -460,7 +468,7 @@ impl<'a, 'b> Context<'a, 'b> {
if let Some(span) = fmt.width_span {
let span = self.fmtsp.from_inner(span);
match fmt.width {
parse::CountIsParam(pos) if pos > self.args.len() => {
parse::CountIsParam(pos) if pos > self.num_args() => {
e.span_label(
span,
&format!(
@@ -492,12 +500,15 @@ impl<'a, 'b> Context<'a, 'b> {
/// Actually verifies and tracks a given format placeholder
/// (a.k.a. argument).
fn verify_arg_type(&mut self, arg: Position, ty: ArgumentType) {
if let Exact(arg) = arg {
if arg >= self.num_args() {
self.invalid_refs.push((arg, self.curpiece));
return;
}
}

match arg {
Exact(arg) => {
if self.args.len() <= arg {
self.invalid_refs.push((arg, self.curpiece));
return;
}
Exact(arg) | Capture(arg) => {
match ty {
Placeholder(_) => {
// record every (position, type) combination only once
@@ -524,7 +535,7 @@ impl<'a, 'b> Context<'a, 'b> {
match self.names.get(&name) {
Some(&idx) => {
// Treat as positional arg.
self.verify_arg_type(Exact(idx), ty)
self.verify_arg_type(Capture(idx), ty)
}
None => {
// For the moment capturing variables from format strings expanded from macros is
@@ -539,9 +550,10 @@ impl<'a, 'b> Context<'a, 'b> {
} else {
self.fmtsp
};
self.num_captured_args += 1;
self.args.push(self.ecx.expr_ident(span, Ident::new(name, span)));
self.names.insert(name, idx);
self.verify_arg_type(Exact(idx), ty)
self.verify_arg_type(Capture(idx), ty)
} else {
let msg = format!("there is no argument named `{}`", name);
let sp = if self.is_literal {
@@ -1010,6 +1022,7 @@ pub fn expand_preparsed_format_args(
let mut cx = Context {
ecx,
args,
num_captured_args: 0,
arg_types,
arg_unique_types,
names,
3 changes: 3 additions & 0 deletions compiler/rustc_lint/src/builtin.rs
Original file line number Diff line number Diff line change
@@ -3165,7 +3165,10 @@ declare_lint! {
/// of this, GNU assembler [local labels] *must* be used instead of labels
/// with a name. Using named labels might cause assembler or linker errors.
///
/// See the explanation in [Rust By Example] for more details.
///
/// [local labels]: https://sourceware.org/binutils/docs/as/Symbol-Names.html#Local-Labels
/// [Rust By Example]: https://doc.rust-lang.org/nightly/rust-by-example/unsafe/asm.html#labels
pub NAMED_ASM_LABELS,
Deny,
"named labels in inline assembly",
1 change: 1 addition & 0 deletions compiler/rustc_lint/src/context.rs
Original file line number Diff line number Diff line change
@@ -770,6 +770,7 @@ pub trait LintContext: Sized {
}
BuiltinLintDiagnostics::NamedAsmLabel(help) => {
db.help(&help);
db.note("see the asm section of Rust By Example <https://doc.rust-lang.org/nightly/rust-by-example/unsafe/asm.html#labels> for more information");
}
}
// Rewrap `db`, and pass control to the user.
4 changes: 4 additions & 0 deletions compiler/rustc_lint_defs/src/builtin.rs
Original file line number Diff line number Diff line change
@@ -2444,6 +2444,10 @@ declare_lint! {
/// register size, to alert you of possibly using the incorrect width. To
/// fix this, add the suggested modifier to the template, or cast the
/// value to the correct size.
///
/// See [register template modifiers] in the reference for more details.
///
/// [register template modifiers]: https://doc.rust-lang.org/nightly/reference/inline-assembly.html#template-modifiers
pub ASM_SUB_REGISTER,
Warn,
"using only a subset of a register for inline asm inputs",
12 changes: 12 additions & 0 deletions library/core/src/lib.rs
Original file line number Diff line number Diff line change
@@ -375,13 +375,25 @@ pub mod arch {
pub use crate::core_arch::arch::*;

/// Inline assembly.
///
/// Refer to [rust by example] for a usage guide and the [reference] for
/// detailed information about the syntax and available options.
///
/// [rust by example]: https://doc.rust-lang.org/nightly/rust-by-example/unsafe/asm.html
/// [reference]: https://doc.rust-lang.org/nightly/reference/inline-assembly.html
#[stable(feature = "asm", since = "1.59.0")]
#[rustc_builtin_macro]
pub macro asm("assembly template", $(operands,)* $(options($(option),*))?) {
/* compiler built-in */
}

/// Module-level inline assembly.
///
/// Refer to [rust by example] for a usage guide and the [reference] for
/// detailed information about the syntax and available options.
///
/// [rust by example]: https://doc.rust-lang.org/nightly/rust-by-example/unsafe/asm.html
/// [reference]: https://doc.rust-lang.org/nightly/reference/inline-assembly.html
#[stable(feature = "global_asm", since = "1.59.0")]
#[rustc_builtin_macro]
pub macro global_asm("assembly template", $(operands,)* $(options($(option),*))?) {
2 changes: 1 addition & 1 deletion src/ci/github-actions/ci.yml
Original file line number Diff line number Diff line change
@@ -73,7 +73,7 @@ x--expand-yaml-anchors--remove:
env: {}

- &job-linux-xl
os: ubuntu-latest-xl
os: ubuntu-20.04-xl
<<: *base-job

- &job-macos-xl
Loading