]> git.lizzy.rs Git - rust.git/log
rust.git
4 years agorustup https://github.com/rust-lang/rust/pull/72342, allow unused_crate_dependencies
Matthias Krüger [Wed, 27 May 2020 11:55:57 +0000 (13:55 +0200)]
rustup https://github.com/rust-lang/rust/pull/72342, allow unused_crate_dependencies

4 years agoAuto merge of #5651 - ebroto:names_as_early_passes, r=flip1995
bors [Tue, 26 May 2020 23:12:16 +0000 (23:12 +0000)]
Auto merge of #5651 - ebroto:names_as_early_passes, r=flip1995

Register redundant_field_names and non_expressive_names as early passes

Similar names was moved to a pre-expansion pass to solve #2927, so I'm avoiding linting on code from expansion, which makes the dogfood (mostly, see below) pass.

I had to change new_without_default though, and although I understand why it was not triggering before, TBH I don't see why the binding inside the nested `if_chain` is being linted now. Any ideas? (it seems legit though as the code can be changed by the user)

changelog: Register redundant_field_names and non_expressive_names as early passes

Fixes #5356
Fixes #5521

4 years agoAuto merge of #5650 - imbsky:actions-cache-v2, r=flip1995
bors [Tue, 26 May 2020 22:44:56 +0000 (22:44 +0000)]
Auto merge of #5650 - imbsky:actions-cache-v2, r=flip1995

Bump actions/cache from v1 to v2

We just released v2. That includes a lot of improvements.
https://github.com/actions/cache/releases/tag/v2.0.0

changelog: none

4 years agoAvoid triggering similar names on code from expansion
Eduardo Broto [Tue, 26 May 2020 22:06:50 +0000 (00:06 +0200)]
Avoid triggering similar names on code from expansion

4 years agoBump actions/cache from v1 to v2
Sora Morimoto [Tue, 26 May 2020 21:25:38 +0000 (06:25 +0900)]
Bump actions/cache from v1 to v2

4 years agoFix fallout in similar_names
flip1995 [Tue, 12 May 2020 14:50:00 +0000 (16:50 +0200)]
Fix fallout in similar_names

4 years agoFix fallout in redundant_field_names
flip1995 [Tue, 12 May 2020 14:26:55 +0000 (16:26 +0200)]
Fix fallout in redundant_field_names

4 years agoRegister redundant_field_names and non_expressive_names as early passes
flip1995 [Thu, 23 Apr 2020 22:14:03 +0000 (00:14 +0200)]
Register redundant_field_names and non_expressive_names as early passes

4 years agoAuto merge of #5648 - returntrip:master, r=matthiaskrgr
bors [Tue, 26 May 2020 15:23:50 +0000 (15:23 +0000)]
Auto merge of #5648 - returntrip:master, r=matthiaskrgr

Add license symlink

To make it easier for Linux distributions to ship the licenses text within the rustc_tools_util crate directory.

changelog: none

4 years agoAuto merge of #5609 - phansch:empty-line-after-outer-attr-fix, r=flip1995
bors [Tue, 26 May 2020 15:10:35 +0000 (15:10 +0000)]
Auto merge of #5609 - phansch:empty-line-after-outer-attr-fix, r=flip1995

Make empty_line_after_outer_attr an early lint

Fixes #5567

Unfortunately I couldn't find a way to reproduce the issue without syn/quote. Considering that most real-world macros use syn and/or quote, I think it's okay to pull them in anyway.

changelog: Fix false positive in [`empty_line_after_outer_attr`]

4 years agoBe less specific about quote and syn versions
Philipp Hansch [Tue, 26 May 2020 14:51:04 +0000 (16:51 +0200)]
Be less specific about quote and syn versions

4 years agoUsing dev-dependencies doesn't seem to work w/ compiletest
Philipp Hansch [Sun, 17 May 2020 17:13:33 +0000 (19:13 +0200)]
Using dev-dependencies doesn't seem to work w/ compiletest

4 years agoSpecify quote and syn versions
Philipp Hansch [Sun, 17 May 2020 17:09:07 +0000 (19:09 +0200)]
Specify quote and syn versions

4 years agoMake empty_line_after_outer_attr an early lint
Philipp Hansch [Sun, 17 May 2020 16:14:43 +0000 (18:14 +0200)]
Make empty_line_after_outer_attr an early lint

4 years agoAuto merge of #5638 - ebroto:issue_5628_add_suggestion_for_reversed_empty_ranges...
bors [Tue, 26 May 2020 11:56:16 +0000 (11:56 +0000)]
Auto merge of #5638 - ebroto:issue_5628_add_suggestion_for_reversed_empty_ranges, r=phansch

reversed_empty_ranges: add suggestion for &slice[N..N]

As discussed in the issue thread, the user accepted this solution. Let me know if this is what we want, or if changing the way we lint the N..N case is prefered.

changelog: reversed_empty_ranges: add suggestion for &slice[N..N]

Closes #5628

4 years agoAuto merge of #5562 - flip1995:clippyup_up, r=phansch
bors [Tue, 26 May 2020 11:42:15 +0000 (11:42 +0000)]
Auto merge of #5562 - flip1995:clippyup_up, r=phansch

Update contributing section about syncing Clippy

[Rendered](https://github.com/flip1995/rust-clippy/blob/clippyup_up/CONTRIBUTING.md#fixing-build-failures-caused-by-rust)

r? @oli-obk Did I get the sync process right?

changelog: none

4 years agoAuto merge of #5636 - ebroto:issue_5041, r=phansch
bors [Tue, 26 May 2020 06:23:58 +0000 (06:23 +0000)]
Auto merge of #5636 - ebroto:issue_5041, r=phansch

multiple_crate_versions: skip dev and build deps

changelog: multiple_crate_versions: skip dev and build deps

Closes #5041

4 years agoAuto merge of #5647 - ebroto:5644_allow_ptr_arg_in_arg_position, r=flip1995
bors [Mon, 25 May 2020 21:47:07 +0000 (21:47 +0000)]
Auto merge of #5647 - ebroto:5644_allow_ptr_arg_in_arg_position, r=flip1995

ptr_arg: honor `allow` attribute on arguments

The `intravisit::Visitor` impl for `LateContextAndPass` only takes into account the attributes of a function parameter inside the `check_param` method. `ptr_arg` starts its heuristics at `check_item` / `check_impl_item` / `check_trait_item`, so the `allow` is not taken into account automatically.

changelog: ptr_arg: honor `allow` attribute on arguments

Fixes #5644

4 years agoptr_arg: honor `allow` attr on arguments
Eduardo Broto [Mon, 25 May 2020 21:09:06 +0000 (23:09 +0200)]
ptr_arg: honor `allow` attr on arguments

4 years agoTo make it easier for Linux distributions, ship the licenses text within
returntrip [Mon, 25 May 2020 21:06:08 +0000 (23:06 +0200)]
To make it easier for Linux distributions, ship the licenses text within
each crate directory.

4 years agoAuto merge of #4429 - jeremystucki:or_fun_call, r=flip1995
bors [Mon, 25 May 2020 20:15:34 +0000 (20:15 +0000)]
Auto merge of #4429 - jeremystucki:or_fun_call, r=flip1995

Update 'or_fun_call' to ignore calls to len

Resolves #1653

changelog: Update `or_fun_call`: Allow calls to `len` for Slice, Array & Vec.

4 years agoUpdate ui test
Jeremy Stucki [Mon, 25 May 2020 19:38:46 +0000 (21:38 +0200)]
Update ui test

4 years agoFix build
Jeremy Stucki [Mon, 25 May 2020 19:23:39 +0000 (21:23 +0200)]
Fix build

4 years agoIgnore calls to 'len'
Jeremy Stucki [Wed, 21 Aug 2019 19:19:28 +0000 (21:19 +0200)]
Ignore calls to 'len'

4 years agoAdd tests
Jeremy Stucki [Wed, 21 Aug 2019 19:18:43 +0000 (21:18 +0200)]
Add tests

4 years agoAuto merge of #5641 - ThibsG:DocCommonTools, r=flip1995
bors [Mon, 25 May 2020 19:33:52 +0000 (19:33 +0000)]
Auto merge of #5641 - ThibsG:DocCommonTools, r=flip1995

Add common lint tools doc

This PR starts adding some documentation about linting tools.

`Retrieving all methods of a type` is not covered at this time.

fixes partially: #3843

changelog: none

4 years agoAuto merge of #5635 - montrivo:bugfix/option_option_test_case, r=flip1995
bors [Mon, 25 May 2020 19:22:08 +0000 (19:22 +0000)]
Auto merge of #5635 - montrivo:bugfix/option_option_test_case, r=flip1995

option_option test case #4298

Adds regression test case for #4298.

The bug seems still present although rust Playground said otherwise.

changelog: none

4 years agoreversed_empty_ranges: add suggestion for &slice[N..N]
Eduardo Broto [Sat, 23 May 2020 20:07:03 +0000 (22:07 +0200)]
reversed_empty_ranges: add suggestion for &slice[N..N]

4 years agoAdd common lint tools doc
ThibsG [Sat, 23 May 2020 07:35:56 +0000 (09:35 +0200)]
Add common lint tools doc

4 years agoUse find_map instead of find() + map()
Eduardo Broto [Sun, 24 May 2020 19:17:54 +0000 (21:17 +0200)]
Use find_map instead of find() + map()

4 years agomultiple_crate_versions: skip dev and build deps
Eduardo Broto [Fri, 22 May 2020 20:39:19 +0000 (22:39 +0200)]
multiple_crate_versions: skip dev and build deps

4 years agoMake the name of the crate available in cargo UI tests
Eduardo Broto [Fri, 22 May 2020 20:30:28 +0000 (22:30 +0200)]
Make the name of the crate available in cargo UI tests

4 years agoAuto merge of #5616 - euclio:no-derive-suggestion, r=phansch,flip1995
bors [Mon, 25 May 2020 17:19:00 +0000 (17:19 +0000)]
Auto merge of #5616 - euclio:no-derive-suggestion, r=phansch,flip1995

new_without_default: do not suggest deriving

---

changelog: do not suggest deriving `Default` in `new_without_default`

This commit changes the behavior of the `new_without_default` lint to not suggest deriving `Default`. This suggestion is misleading if the `new` implementation does something different than what a derived `Default` implementation would do, because then the two methods would not be equivalent.

Instead, the `can_derive_default` check is removed, and we always suggest implementing `Default` in terms of `new()`.

4 years agoAuto merge of #5639 - nickrtorres:unnecessary-mut-passed-doc-cleanup, r=phansch
bors [Mon, 25 May 2020 17:02:12 +0000 (17:02 +0000)]
Auto merge of #5639 - nickrtorres:unnecessary-mut-passed-doc-cleanup, r=phansch

Clarify the documentation of the `unnecessary_mut_passed` lint

fixes #5433 by replacing "giving" with "passing"

changelog: Clarifies documentation for `unnecessary_mut_passed`

4 years agoAuto merge of #5646 - flip1995:rustup, r=matthiaskrgr
bors [Mon, 25 May 2020 16:42:50 +0000 (16:42 +0000)]
Auto merge of #5646 - flip1995:rustup, r=matthiaskrgr

Rustup

r? @phansch

changelog: none

4 years agoAlso fetch origin before merging master into the rustup branch
Philipp Krones [Mon, 25 May 2020 15:11:07 +0000 (17:11 +0200)]
Also fetch origin before merging master into the rustup branch

4 years agoClarify the documentation of the `unnecessary_mut_passed` lint
Nick Torres [Sat, 23 May 2020 23:14:38 +0000 (16:14 -0700)]
Clarify the documentation of the `unnecessary_mut_passed` lint

4 years agoUse `OnceCell` instead of `Once`
Dylan MacKenzie [Sat, 16 May 2020 04:44:28 +0000 (21:44 -0700)]
Use `OnceCell` instead of `Once`

4 years agooption_option test case #4298
Tim Nielens [Fri, 22 May 2020 17:09:24 +0000 (19:09 +0200)]
option_option test case #4298

4 years agonew_without_default: do not suggest deriving
Andy Russell [Mon, 18 May 2020 22:35:49 +0000 (18:35 -0400)]
new_without_default: do not suggest deriving

4 years agoAuto merge of #5632 - flip1995:rustup, r=phansch
bors [Fri, 22 May 2020 13:00:38 +0000 (13:00 +0000)]
Auto merge of #5632 - flip1995:rustup, r=phansch

Rustup

changelog: none

4 years agoFix dogfood fallout
flip1995 [Fri, 22 May 2020 12:45:51 +0000 (14:45 +0200)]
Fix dogfood fallout

4 years agoAlso install llvm-tools on toolchain setup
flip1995 [Fri, 22 May 2020 00:40:39 +0000 (02:40 +0200)]
Also install llvm-tools on toolchain setup

4 years agoAuto merge of #5614 - ebroto:test_cargo_lints, r=flip1995
bors [Thu, 21 May 2020 14:43:56 +0000 (14:43 +0000)]
Auto merge of #5614 - ebroto:test_cargo_lints, r=flip1995

Test cargo lints

changelog: Add infrastructure to test cargo lints

Closes #5603

4 years agoRelax fs layout so that multiple pass/fail manifests are possible
Eduardo Broto [Thu, 21 May 2020 13:34:48 +0000 (15:34 +0200)]
Relax fs layout so that multiple pass/fail manifests are possible

4 years agoAvoid triggering match_wildcard_for_single_variants
Eduardo Broto [Thu, 21 May 2020 12:47:13 +0000 (14:47 +0200)]
Avoid triggering match_wildcard_for_single_variants

4 years agoAddress comments from PR review
Eduardo Broto [Thu, 21 May 2020 12:46:04 +0000 (14:46 +0200)]
Address comments from PR review

4 years agoAdd documentation for testing cargo lints
Eduardo Broto [Mon, 18 May 2020 19:39:56 +0000 (21:39 +0200)]
Add documentation for testing cargo lints

4 years agoAdapt `cargo dev new_lint` to create tests for cargo lints
Eduardo Broto [Mon, 18 May 2020 19:03:37 +0000 (21:03 +0200)]
Adapt `cargo dev new_lint` to create tests for cargo lints

4 years agoAdd test for multiple_crate_versions
Eduardo Broto [Mon, 18 May 2020 18:58:02 +0000 (20:58 +0200)]
Add test for multiple_crate_versions

Make the output of the lint deterministic by sorting the versions

4 years agoAdd test for cargo_common_metadata
Eduardo Broto [Mon, 18 May 2020 18:56:33 +0000 (20:56 +0200)]
Add test for cargo_common_metadata

Fix missing `authors` entry in the provided example

4 years agoAdd test for wildcard_dependencies
Eduardo Broto [Mon, 18 May 2020 18:55:12 +0000 (20:55 +0200)]
Add test for wildcard_dependencies

4 years agoAdapt compile-test to run tests for cargo lints
Eduardo Broto [Mon, 18 May 2020 18:54:09 +0000 (20:54 +0200)]
Adapt compile-test to run tests for cargo lints

4 years agoAuto merge of #5611 - rrbutani:master, r=flip1995
bors [Wed, 20 May 2020 14:15:12 +0000 (14:15 +0000)]
Auto merge of #5611 - rrbutani:master, r=flip1995

Add to the list of words clippy::doc_markdown ignores

"TypeScript" is the only one of these I actually ran into organically; I can remove the others if they're too much.

changelog: Add to the list of words `clippy::doc_markdown` ignores

4 years agoAuto merge of #5622 - elichai:2020-05-match_wild_err_arm, r=flip1995
bors [Wed, 20 May 2020 14:02:06 +0000 (14:02 +0000)]
Auto merge of #5622 - elichai:2020-05-match_wild_err_arm, r=flip1995

Downgrade `match_wild_err_arm` to pedantic and update help messages

Hi,
This fixes #3688 and downgrades `match_wild_err_arm` to pedantic.
There are a lot of different reasons in that issue, for me the biggest are:
1. Rust's errors aren't like Java's exceptions because they're type safe and in most cases the type of error can't change by itself.
2. Sometimes matching can be more ergonomic, and before the `track_caller` feature got introduced it was actually easier to track the panic location with explicit `panic!` than with `expect`.

Currently clippy is failing to build because of a breaking change in https://github.com/rust-lang/rust/pull/69171 I tried fixing it but it is too complex for my little knowledge of clippy and rustc so I'll leave that to people who know what they're doing :)

Another thing, if rustc is breaking clippy a lot then maybe it's better to use something like `miri` does, where it's hard codes the latest tested rustc commit and they keep bumping it, that way when you develop locally it should work even if there was a breaking change (https://github.com/rust-lang/miri/blob/master/rustup-toolchain#L23-L29)

changelog: Downgrade `match_wild_err_arm` to pedantic

4 years agoUpdate future-not-send stderr output
Elichai Turkel [Wed, 20 May 2020 13:46:30 +0000 (16:46 +0300)]
Update future-not-send stderr output

4 years agointroduce newtype'd `Predicate<'tcx>`
Bastian Kauschke [Mon, 11 May 2020 20:06:41 +0000 (22:06 +0200)]
introduce newtype'd `Predicate<'tcx>`

4 years agoMake match_wild_err_arm pedantic, and update help messages
Elichai Turkel [Wed, 20 May 2020 10:23:51 +0000 (13:23 +0300)]
Make match_wild_err_arm pedantic, and update help messages

4 years agorename `Predicate` to `PredicateKind`, introduce alias
Bastian Kauschke [Mon, 11 May 2020 19:09:57 +0000 (21:09 +0200)]
rename `Predicate` to `PredicateKind`, introduce alias

4 years agoAuto merge of #5582 - vtmargaryan:match_wildcard_for_single_variants, r=flip1995
bors [Wed, 20 May 2020 12:51:28 +0000 (12:51 +0000)]
Auto merge of #5582 - vtmargaryan:match_wildcard_for_single_variants, r=flip1995

New lint: `match_wildcard_for_single_variants`

changelog: Added a new lint match_wildcard_for_single_variants to warn on enum matches where a wildcard is used to match a single variant

Closes #5556

4 years agoAuto merge of #5621 - flip1995:rustup, r=phansch
bors [Wed, 20 May 2020 12:09:24 +0000 (12:09 +0000)]
Auto merge of #5621 - flip1995:rustup, r=phansch

Rustup

@oli-obk Do you know, how we can enforce (ui-)tests pass in rust-lang/rust for Clippy? I can open a PR for this, if you tell me what would be necessary for this.

changelog: none

4 years agoFix dogfood fallout
flip1995 [Wed, 20 May 2020 11:32:53 +0000 (13:32 +0200)]
Fix dogfood fallout

4 years agoUpdate test after const_ptr functions are must_use now
flip1995 [Tue, 19 May 2020 14:12:03 +0000 (16:12 +0200)]
Update test after const_ptr functions are must_use now

4 years agoMerge remote-tracking branch 'upstream/master' into rustup3
flip1995 [Wed, 20 May 2020 11:25:05 +0000 (13:25 +0200)]
Merge remote-tracking branch 'upstream/master' into rustup3

4 years agoAuto merge of #69171 - Amanieu:new-asm, r=nagisa,nikomatsakis
bors [Tue, 19 May 2020 18:32:40 +0000 (18:32 +0000)]
Auto merge of #69171 - Amanieu:new-asm, r=nagisa,nikomatsakis

Implement new asm! syntax from RFC 2850

This PR implements the new `asm!` syntax proposed in https://github.com/rust-lang/rfcs/pull/2850.

# Design

A large part of this PR revolves around taking an `asm!` macro invocation and plumbing it through all of the compiler layers down to LLVM codegen. Throughout the various stages, an `InlineAsm` generally consists of 3 components:

- The template string, which is stored as an array of `InlineAsmTemplatePiece`. Each piece represents either a literal or a placeholder for an operand (just like format strings).
```rust
pub enum InlineAsmTemplatePiece {
    String(String),
    Placeholder { operand_idx: usize, modifier: Option<char>, span: Span },
}
```

- The list of operands to the `asm!` (`in`, `[late]out`, `in[late]out`, `sym`, `const`). These are represented differently at each stage of lowering, but follow a common pattern:
  - `in`, `out` and `inout` all have an associated register class (`reg`) or explicit register (`"eax"`).
  - `inout` has 2 forms: one with a single expression that is both read from and written to, and one with two separate expressions for the input and output parts.
  - `out` and `inout` have a `late` flag (`lateout` / `inlateout`) to indicate that the register allocator is allowed to reuse an input register for this output.
  - `out` and the split variant of `inout` allow `_` to be specified for an output, which means that the output is discarded. This is used to allocate scratch registers for assembly code.
  - `sym` is a bit special since it only accepts a path expression, which must point to a `static` or a `fn`.

- The options set at the end of the `asm!` macro. The only one that is particularly of interest to rustc is `NORETURN` which makes `asm!` return `!` instead of `()`.
```rust
bitflags::bitflags! {
    pub struct InlineAsmOptions: u8 {
        const PURE = 1 << 0;
        const NOMEM = 1 << 1;
        const READONLY = 1 << 2;
        const PRESERVES_FLAGS = 1 << 3;
        const NORETURN = 1 << 4;
        const NOSTACK = 1 << 5;
    }
}
```

## AST

`InlineAsm` is represented as an expression in the AST:

```rust
pub struct InlineAsm {
    pub template: Vec<InlineAsmTemplatePiece>,
    pub operands: Vec<(InlineAsmOperand, Span)>,
    pub options: InlineAsmOptions,
}

pub enum InlineAsmRegOrRegClass {
    Reg(Symbol),
    RegClass(Symbol),
}

pub enum InlineAsmOperand {
    In {
        reg: InlineAsmRegOrRegClass,
        expr: P<Expr>,
    },
    Out {
        reg: InlineAsmRegOrRegClass,
        late: bool,
        expr: Option<P<Expr>>,
    },
    InOut {
        reg: InlineAsmRegOrRegClass,
        late: bool,
        expr: P<Expr>,
    },
    SplitInOut {
        reg: InlineAsmRegOrRegClass,
        late: bool,
        in_expr: P<Expr>,
        out_expr: Option<P<Expr>>,
    },
    Const {
        expr: P<Expr>,
    },
    Sym {
        expr: P<Expr>,
    },
}
```

The `asm!` macro is implemented in librustc_builtin_macros and outputs an `InlineAsm` AST node. The template string is parsed using libfmt_macros, positional and named operands are resolved to explicit operand indicies. Since target information is not available to macro invocations, validation of the registers and register classes is deferred to AST lowering.

## HIR

`InlineAsm` is represented as an expression in the HIR:

```rust
pub struct InlineAsm<'hir> {
    pub template: &'hir [InlineAsmTemplatePiece],
    pub operands: &'hir [InlineAsmOperand<'hir>],
    pub options: InlineAsmOptions,
}

pub enum InlineAsmRegOrRegClass {
    Reg(InlineAsmReg),
    RegClass(InlineAsmRegClass),
}

pub enum InlineAsmOperand<'hir> {
    In {
        reg: InlineAsmRegOrRegClass,
        expr: Expr<'hir>,
    },
    Out {
        reg: InlineAsmRegOrRegClass,
        late: bool,
        expr: Option<Expr<'hir>>,
    },
    InOut {
        reg: InlineAsmRegOrRegClass,
        late: bool,
        expr: Expr<'hir>,
    },
    SplitInOut {
        reg: InlineAsmRegOrRegClass,
        late: bool,
        in_expr: Expr<'hir>,
        out_expr: Option<Expr<'hir>>,
    },
    Const {
        expr: Expr<'hir>,
    },
    Sym {
        expr: Expr<'hir>,
    },
}
```

AST lowering is where `InlineAsmRegOrRegClass` is converted from `Symbol`s to an actual register or register class. If any modifiers are specified for a template string placeholder, these are validated against the set allowed for that operand type. Finally, explicit registers for inputs and outputs are checked for conflicts (same register used for different operands).

## Type checking

Each register class has a whitelist of types that it may be used with. After the types of all operands have been determined, the `intrinsicck` pass will check that these types are in the whitelist. It also checks that split `inout` operands have compatible types and that `const` operands are integers or floats. Suggestions are emitted where needed if a template modifier should be used for an operand based on the type that was passed into it.

## HAIR

`InlineAsm` is represented as an expression in the HAIR:

```rust
crate enum ExprKind<'tcx> {
    // [..]
    InlineAsm {
        template: &'tcx [InlineAsmTemplatePiece],
        operands: Vec<InlineAsmOperand<'tcx>>,
        options: InlineAsmOptions,
    },
}
crate enum InlineAsmOperand<'tcx> {
    In {
        reg: InlineAsmRegOrRegClass,
        expr: ExprRef<'tcx>,
    },
    Out {
        reg: InlineAsmRegOrRegClass,
        late: bool,
        expr: Option<ExprRef<'tcx>>,
    },
    InOut {
        reg: InlineAsmRegOrRegClass,
        late: bool,
        expr: ExprRef<'tcx>,
    },
    SplitInOut {
        reg: InlineAsmRegOrRegClass,
        late: bool,
        in_expr: ExprRef<'tcx>,
        out_expr: Option<ExprRef<'tcx>>,
    },
    Const {
        expr: ExprRef<'tcx>,
    },
    SymFn {
        expr: ExprRef<'tcx>,
    },
    SymStatic {
        expr: ExprRef<'tcx>,
    },
}
```

The only significant change compared to HIR is that `Sym` has been lowered to either a `SymFn` whose `expr` is a `Literal` ZST of the `fn`, or a `SymStatic` whose `expr` is a `StaticRef`.

## MIR

`InlineAsm` is represented as a `Terminator` in the MIR:

```rust
pub enum TerminatorKind<'tcx> {
    // [..]

    /// Block ends with an inline assembly block. This is a terminator since
    /// inline assembly is allowed to diverge.
    InlineAsm {
        /// The template for the inline assembly, with placeholders.
        template: &'tcx [InlineAsmTemplatePiece],

        /// The operands for the inline assembly, as `Operand`s or `Place`s.
        operands: Vec<InlineAsmOperand<'tcx>>,

        /// Miscellaneous options for the inline assembly.
        options: InlineAsmOptions,

        /// Destination block after the inline assembly returns, unless it is
        /// diverging (InlineAsmOptions::NORETURN).
        destination: Option<BasicBlock>,
    },
}

pub enum InlineAsmOperand<'tcx> {
    In {
        reg: InlineAsmRegOrRegClass,
        value: Operand<'tcx>,
    },
    Out {
        reg: InlineAsmRegOrRegClass,
        late: bool,
        place: Option<Place<'tcx>>,
    },
    InOut {
        reg: InlineAsmRegOrRegClass,
        late: bool,
        in_value: Operand<'tcx>,
        out_place: Option<Place<'tcx>>,
    },
    Const {
        value: Operand<'tcx>,
    },
    SymFn {
        value: Box<Constant<'tcx>>,
    },
    SymStatic {
        value: Box<Constant<'tcx>>,
    },
}
```

As part of HAIR lowering, `InOut` and `SplitInOut` operands are lowered to a split form with a separate `in_value` and `out_place`.

Semantically, the `InlineAsm` terminator is similar to the `Call` terminator except that it has multiple output places where a `Call` only has a single return place output.

The constant promotion pass is used to ensure that `const` operands are actually constants (using the same logic as `#[rustc_args_required_const]`).

## Codegen

Operands are lowered one more time before being passed to LLVM codegen:

```rust
pub enum InlineAsmOperandRef<'tcx, B: BackendTypes + ?Sized> {
    In {
        reg: InlineAsmRegOrRegClass,
        value: OperandRef<'tcx, B::Value>,
    },
    Out {
        reg: InlineAsmRegOrRegClass,
        late: bool,
        place: Option<PlaceRef<'tcx, B::Value>>,
    },
    InOut {
        reg: InlineAsmRegOrRegClass,
        late: bool,
        in_value: OperandRef<'tcx, B::Value>,
        out_place: Option<PlaceRef<'tcx, B::Value>>,
    },
    Const {
        string: String,
    },
    SymFn {
        instance: Instance<'tcx>,
    },
    SymStatic {
        def_id: DefId,
    },
}
```

The operands are lowered to LLVM operands and constraint codes as follow:
- `out` and the output part of `inout` operands are added first, as required by LLVM. Late output operands have a `=` prefix added to their constraint code, non-late output operands have a `=&` prefix added to their constraint code.
- `in` operands are added normally.
- `inout` operands are tied to the matching output operand.
- `sym` operands are passed as function pointers or pointers, using the `"s"` constraint.
- `const` operands are formatted to a string and directly inserted in the template string.

The template string is converted to LLVM form:
- `$` characters are escaped as `$$`.
- `const` operands are converted to strings and inserted directly.
- Placeholders are formatted as `${X:M}` where `X` is the operand index and `M` is the modifier character. Modifiers are converted from the Rust form to the LLVM form.

The various options are converted to clobber constraints or LLVM attributes, refer to the [RFC](https://github.com/Amanieu/rfcs/blob/inline-asm/text/0000-inline-asm.md#mapping-to-llvm-ir) for more details.

Note that LLVM is sometimes rather picky about what types it accepts for certain constraint codes so we sometimes need to insert conversions to/from a supported type. See the target-specific ISelLowering.cpp files in LLVM for details.

# Adding support for new architectures

Adding inline assembly support to an architecture is mostly a matter of defining the registers and register classes for that architecture. All the definitions for register classes are located in `src/librustc_target/asm/`.

Additionally you will need to implement lowering of these register classes to LLVM constraint codes in `src/librustc_codegen_llvm/asm.rs`.

4 years agoAdd note, that a merge commit after push is necessary
flip1995 [Tue, 19 May 2020 14:36:14 +0000 (16:36 +0200)]
Add note, that a merge commit after push is necessary

4 years agoAdd note that a subtree fix and stack limit increase is required
flip1995 [Tue, 19 May 2020 13:18:16 +0000 (15:18 +0200)]
Add note that a subtree fix and stack limit increase is required

4 years agoAuto merge of #68717 - petrochenkov:stabexpat, r=varkor
bors [Tue, 19 May 2020 03:11:32 +0000 (03:11 +0000)]
Auto merge of #68717 - petrochenkov:stabexpat, r=varkor

Stabilize fn-like proc macros in expression, pattern and statement positions

I.e. all the positions in which stable `macro_rules` macros are supported.

Depends on https://github.com/rust-lang/rust/pull/68716 ("Stabilize `Span::mixed_site`").

cc https://github.com/rust-lang/rust/issues/54727
cc https://github.com/rust-lang/rust/issues/54727#issuecomment-580647446

Stabilization report: https://github.com/rust-lang/rust/pull/68717#issuecomment-623197503.

4 years agoHandle InlineAsm in clippy
Amanieu d'Antras [Wed, 6 May 2020 14:03:53 +0000 (15:03 +0100)]
Handle InlineAsm in clippy

4 years agoAdd to the list of words clippy::doc_markdown ignores
Rahul Butani [Mon, 18 May 2020 03:21:02 +0000 (22:21 -0500)]
Add to the list of words clippy::doc_markdown ignores

4 years agoMerge commit 'e214ea82ad0a751563acf67e1cd9279cf302db3a' into clippyup
flip1995 [Sun, 17 May 2020 15:36:26 +0000 (17:36 +0200)]
Merge commit 'e214ea82ad0a751563acf67e1cd9279cf302db3a' into clippyup

4 years agoAuto merge of #5568 - ThibsG:RenameIdentityConversionLint, r=flip1995
bors [Sun, 17 May 2020 11:29:04 +0000 (11:29 +0000)]
Auto merge of #5568 - ThibsG:RenameIdentityConversionLint, r=flip1995

Rename lint `identity_conversion` to `useless_conversion`

Lint name `identity_conversion` was misleading, so this PR renames it to `useless_conversion`.

As decision has not really came up in the issue comments, this PR will probably need discussion.

fixes #3106

changelog: Rename lint `identity_conversion` to `useless_conversion`

4 years agoAuto merge of #5529 - alex-700:improve-option-and-then-some-lint, r=phansch
bors [Sun, 17 May 2020 10:58:56 +0000 (10:58 +0000)]
Auto merge of #5529 - alex-700:improve-option-and-then-some-lint, r=phansch

Improve `option_and_then_some` lint

fixed #5492

changelog: Improve and generalize `option_and_then_some` and rename it to `bind_instead_of_map`.

4 years agoimprove and generalize `option_and_then_some` lint
Aleksei Latyshev [Sat, 25 Apr 2020 20:33:11 +0000 (23:33 +0300)]
improve and generalize `option_and_then_some` lint

- rename it to bind_instead_of_map

4 years agoAuto merge of #5608 - flip1995:rustup, r=phansch
bors [Sun, 17 May 2020 05:41:39 +0000 (05:41 +0000)]
Auto merge of #5608 - flip1995:rustup, r=phansch

Rustup with git subtree

The commits from the last rustup #5587, are again included in this rustup, since I rebased the rustup. Lesson learned: never rebase, only merge when working with git subtree.

changelog: none

4 years agoBetter explain remotes in the sync process.
Philipp Krones [Sat, 16 May 2020 23:38:01 +0000 (01:38 +0200)]
Better explain remotes in the sync process.

4 years agoRun fmt
flip1995 [Sat, 16 May 2020 23:18:43 +0000 (01:18 +0200)]
Run fmt

4 years agoRe-remove util/dev
flip1995 [Sat, 16 May 2020 23:14:28 +0000 (01:14 +0200)]
Re-remove util/dev

Maybe someday, git subtree will do it right

4 years agoMerge remote-tracking branch 'upstream/master' into rustup
flip1995 [Sat, 16 May 2020 23:13:02 +0000 (01:13 +0200)]
Merge remote-tracking branch 'upstream/master' into rustup

4 years agosimplify multispan_sugg interface
Aleksei Latyshev [Sat, 25 Apr 2020 17:52:00 +0000 (20:52 +0300)]
simplify multispan_sugg interface

- add `multispan_sugg_with_applicability`
- not it gets `&str` instead of `String`, like in `diag.multispan_suggestion`

4 years agoRename lint `identity_conversion` to `useless_conversion`
ThibsG [Mon, 4 May 2020 15:09:02 +0000 (17:09 +0200)]
Rename lint `identity_conversion` to `useless_conversion`

4 years agoAuto merge of #5563 - ThibsG:MergeLints, r=flip1995
bors [Sat, 16 May 2020 20:17:11 +0000 (20:17 +0000)]
Auto merge of #5563 - ThibsG:MergeLints, r=flip1995

Merge some lints together

This PR merges following lints:

- `block_in_if_condition_expr` and `block_in_if_condition_stmt` → `blocks_in_if_conditions`
- `option_map_unwrap_or`, `option_map_unwrap_or_else` and `result_map_unwrap_or_else` → `map_unwrap`
- `option_unwrap_used` and `result_unwrap_used` → `unwrap_used`
- `option_expect_used` and `result_expect_used` → `expect_used`
- `wrong_pub_self_convention` into `wrong_self_convention`
- `for_loop_over_option` and `for_loop_over_result` → `for_loops_over_fallibles`

Lints that have already been merged since the issue was created:
- [x] `new_without_default` and `new_without_default_derive` → `new_without_default`

Need more discussion:
- `string_add` and `string_add_assign`: do we agree to merge them or not? Is there something more to do? → **not merge finally**
- `identity_op` and `modulo_one` → `useless_arithmetic`: seems outdated, since `modulo_arithmetic` has been created.

fixes #1078

changelog: Merging some lints together:
- `block_in_if_condition_expr` and `block_in_if_condition_stmt` → `blocks_in_if_conditions`
- `option_map_unwrap_or`, `option_map_unwrap_or_else` and `result_map_unwrap_or_else` → `map_unwrap_or`
- `option_unwrap_used` and `result_unwrap_used` → `unwrap_used`
- `option_expect_used` and `result_expect_used` → `expect_used`
- `for_loop_over_option` and `for_loop_over_result` → `for_loops_over_fallibles`

4 years agoRollup merge of #72047 - Julian-Wollersberger:literal_error_reporting_cleanup, r...
Ralf Jung [Sat, 16 May 2020 17:46:31 +0000 (19:46 +0200)]
Rollup merge of #72047 - Julian-Wollersberger:literal_error_reporting_cleanup, r=petrochenkov

Literal error reporting cleanup

While doing some performance work, I noticed some code duplication in `librustc_parser/lexer/mod.rs`, so I cleaned it up.

This PR is probably best reviewed commit by commit.

I'm not sure what the API stability practices for `librustc_lexer` are. Four public methods in `unescape.rs` can be removed, but two are used by clippy, so I left them in for now.
I could open a PR for Rust-Analyzer when this one lands.

But how do I open a PR for clippy? (Git submodules are frustrating to work with)

4 years agoAuto merge of #5596 - ebroto:issue_5212, r=phansch
bors [Sat, 16 May 2020 08:49:15 +0000 (08:49 +0000)]
Auto merge of #5596 - ebroto:issue_5212, r=phansch

Fix comparison_chain false positive

changelog: comparison_chain: fix false positives when the binary operation is the same.

Fixes #5212

4 years agoAuto merge of #5602 - ebroto:issue_3430, r=phansch
bors [Sat, 16 May 2020 08:33:47 +0000 (08:33 +0000)]
Auto merge of #5602 - ebroto:issue_3430, r=phansch

identity_op: allow `1 << 0`

I went for accepting `1 << 0` verbatim instead of something more general as it seems to be what everyone in the issue thread needed.

changelog: identity_op: allow `1 << 0` as it's a common pattern in bit manipulation code.

Fixes #3430

4 years agoRollup merge of #72090 - RalfJung:rustc_driver-exit-code, r=oli-obk
Dylan DPC [Sat, 16 May 2020 00:37:23 +0000 (02:37 +0200)]
Rollup merge of #72090 - RalfJung:rustc_driver-exit-code, r=oli-obk

rustc_driver: factor out computing the exit code

In a recent Miri PR I [added a convenience wrapper](https://github.com/rust-lang/miri/pull/1405/files#diff-c3d602c5c8035a16699ce9c015bfeceaR125) around `catch_fatal_errors` and `run_compiler` that @oli-obk suggested I could upstream. However, after seeing what could be shared between `rustc_driver::main`, clippy and Miri, really the only thing I found is computing the exit code -- so that's what this PR does.

What prevents using the Miri convenience function in `rustc_driver::main` and clippy is that they do extra work inside `catch_fatal_errors`, and while I could abstract that away, clippy actually *computes the callbacks* inside there, and I fond no good way to abstract that and thus gave up. Maybe the clippy thing could be moved out, I am not sure if it ever can actually raise a `FatalErrorMarker` -- someone more knowledgeable in clippy would have to do that.

4 years agoRollup merge of #71948 - csmoe:issue-61076, r=oli-obk
Dylan DPC [Sat, 16 May 2020 00:37:21 +0000 (02:37 +0200)]
Rollup merge of #71948 - csmoe:issue-61076, r=oli-obk

Suggest to await future before ? operator

Closes https://github.com/rust-lang/rust/issues/71811
cc #61076

4 years agoAuto merge of #5599 - dtolnay:letif, r=flip1995
bors [Fri, 15 May 2020 21:55:43 +0000 (21:55 +0000)]
Auto merge of #5599 - dtolnay:letif, r=flip1995

Downgrade useless_let_if_seq to nursery

I feel that this lint has the wrong balance of incorrect suggestions for a default-enabled lint.

The immediate code I faced was something like:

```rust
fn main() {
    let mut good = do1();
    if !do2() {
        good = false;
    }
    if good {
        println!("good");
    }
}

fn do1() -> bool { println!("1"); false }
fn do2() -> bool { println!("2"); false }
```

On this code Clippy calls it unidiomatic and suggests the following diff, which has different behavior in a way that I don't necessarily want.

```diff
- let mut good = do1();
- if !do2() {
-     good = false;
- }
+ let good = if !do2() {
+     false
+ } else {
+     do1()
+ };
```

On exploring issues filed about this lint, I have found that other users have also struggled with inappropriate suggestions (https://github.com/rust-lang/rust-clippy/issues/4124, https://github.com/rust-lang/rust-clippy/issues/3043, https://github.com/rust-lang/rust-clippy/issues/2918, https://github.com/rust-lang/rust-clippy/issues/2176) and suggestions that make the code worse (https://github.com/rust-lang/rust-clippy/issues/3769, https://github.com/rust-lang/rust-clippy/issues/2749). Overall I believe that this lint is still at nursery quality for now and should not be enabled.

---

changelog: Remove useless_let_if_seq from default set of enabled lints

4 years agoAdd more test cases for match_wildcard_for_single_variants
Vardan Margaryan [Fri, 15 May 2020 21:19:30 +0000 (00:19 +0300)]
Add more test cases for match_wildcard_for_single_variants

4 years agoFix check for missing enum variants from match expressions
Vardan Margaryan [Fri, 15 May 2020 21:06:52 +0000 (00:06 +0300)]
Fix check for missing enum variants from match expressions

TupleStruct matches are checked for exhaustiveness

4 years agoRevert "Fix cases of match_wildcard_for_single_variants lint when it is spanned on...
Vardan Margaryan [Fri, 15 May 2020 19:33:37 +0000 (22:33 +0300)]
Revert "Fix cases of match_wildcard_for_single_variants lint when it is spanned on Option"

This reverts commit 494830797744c09d6de3b2b2452ab185d2204005.

4 years agoidentity_op: allow `1 << 0`
Eduardo Broto [Fri, 15 May 2020 19:17:37 +0000 (21:17 +0200)]
identity_op: allow `1 << 0`

4 years agoFix CHANGELOG.md and lint names plural
ThibsG [Fri, 15 May 2020 16:20:07 +0000 (18:20 +0200)]
Fix CHANGELOG.md and lint names plural

4 years agoAuto merge of #5592 - ebroto:extend_unused_unit, r=flip1995
bors [Fri, 15 May 2020 14:47:11 +0000 (14:47 +0000)]
Auto merge of #5592 - ebroto:extend_unused_unit, r=flip1995

unused_unit: lint also in type parameters and where clauses

changelog: unused_unit now also lints in type parameters and where clauses

Fixes #5585

4 years agoimplement type_implments_trait query
csmoe [Thu, 14 May 2020 15:07:46 +0000 (23:07 +0800)]
implement type_implments_trait query

4 years agoRename lint `map_unwrap` to `map_unwrap_or` and register lints as renamed
ThibsG [Sun, 3 May 2020 17:58:27 +0000 (19:58 +0200)]
Rename lint `map_unwrap` to `map_unwrap_or` and register lints as renamed

4 years agoFix example code of wildcard_enum_match_arm lint
Vardan Margaryan [Thu, 14 May 2020 19:41:05 +0000 (22:41 +0300)]
Fix example code of wildcard_enum_match_arm lint

4 years agoApply suggestions from PR review
Vardan Margaryan [Thu, 14 May 2020 19:40:33 +0000 (22:40 +0300)]
Apply suggestions from PR review

4 years agoFix cases of match_wildcard_for_single_variants lint when it is spanned on Option
Vardan Margaryan [Sun, 10 May 2020 15:34:29 +0000 (18:34 +0300)]
Fix cases of match_wildcard_for_single_variants lint when it is spanned on Option

4 years agoFix trivial cases of new match_wildcard_for_single_variants lint
Vardan Margaryan [Sun, 10 May 2020 15:33:12 +0000 (18:33 +0300)]
Fix trivial cases of new match_wildcard_for_single_variants lint