Add support for const operands and options to global_asm!
On x86, the default syntax is also switched to Intel to match asm!.
Currently `global_asm!` only supports `const` operands and the `att_syntax` option. In the future, `sym` operands will also be supported. However there is no plan to support any of the other operand types or options since they don't make sense in the context of `global_asm!`.
r? `@nagisa`
have on_completion record subcycles
have on_completion record subcycles
Rework `on_completion` method so that it removes all
provisional cache entries that are "below" a completed
node (while leaving those entries that are not below
the node).
This corrects an imprecise result that could in turn lead
to an incremental compilation failure. Under the old
scheme, if you had:
* A depends on...
* B depends on A
* C depends on...
* D depends on C
* T: 'static
then the provisional results for A, B, C, and D would all
be entangled. Thus, if A was `EvaluatedToOkModuloRegions`
(because of that final condition), then the result for C and
D would also be demoted to "ok modulo regions".
In reality, though, the result for C depends only on C and itself,
and is not dependent on regions. If we happen to evaluate the
cycle starting from C, we would never reach A, and hence the
result would be "ok".
Under the new scheme, the provisional results for C and D
are moved to the permanent cache immediately and are not affected
by the result of A.
Fixes#83538
r? `@Aaron1011`
Fix diagnostic for cross crate private tuple struct constructors
Fixes#78708.
There was already some limited support for certain cross-crate scenarios but that didn't handle a tuple struct rexported from an inner module for example (e.g. the NonZero* types as seen in #85049).
```Rust
➜ cat bug.rs
fn main() {
let _x = std::num::NonZeroU32(12);
let n = std::num::NonZeroU32::new(1).unwrap();
match n {
std::num::NonZeroU32(i) => {},
}
}
```
**Before:**
<details>
```Rust
➜ rustc +nightly bug.rs
error[E0423]: expected function, tuple struct or tuple variant, found struct `std::num::NonZeroU32`
--> bug.rs:2:14
|
2 | let _x = std::num::NonZeroU32(12);
| ^^^^^^^^^^^^^^^^^^^^^^^^ help: use struct literal syntax instead: `std::num::NonZeroU32 { 0: val }`
|
::: /home/luqman/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/num/nonzero.rs:148:1
[snip]
error[E0532]: expected tuple struct or tuple variant, found struct `std::num::NonZeroU32`
--> bug.rs:5:9
|
5 | std::num::NonZeroU32(i) => {},
| ^^^^^^^^^^^^^^^^^^^^^^^ help: use struct pattern syntax instead: `std::num::NonZeroU32 { 0 }`
|
::: /home/luqman/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/num/nonzero.rs:148:1
[snip]
error: aborting due to 2 previous errors
Some errors have detailed explanations: E0423, E0532.
For more information about an error, try `rustc --explain E0423`.
```
</details>
**After:**
<details>
```Rust
➜ /rust/build/x86_64-unknown-linux-gnu/stage1/bin/rustc bug.rs
error[E0423]: cannot initialize a tuple struct which contains private fields
--> bug.rs:2:14
|
2 | let _x = std::num::NonZeroU32(12);
| ^^^^^^^^^^^^^^^^^^^^
|
note: constructor is not visible here due to private fields
--> /rust/library/core/src/num/nonzero.rs:148:1
[snip]
error[E0532]: cannot match against a tuple struct which contains private fields
--> bug.rs:5:9
|
5 | std::num::NonZeroU32(i) => {},
| ^^^^^^^^^^^^^^^^^^^^
|
note: constructor is not visible here due to private fields
--> bug.rs:5:30
|
5 | std::num::NonZeroU32(i) => {},
| ^ private field
error: aborting due to 2 previous errors
Some errors have detailed explanations: E0423, E0532.
For more information about an error, try `rustc --explain E0423`.
```
</details>
One question is if we should only collect the needed info for the cross-crate case after encountering an error instead of always doing it. Perf run perhaps to gauge the impact.
Remove rustc_args_required_const attribute
Now that stdarch no longer needs it (thanks `@Amanieu!),` we can kill the `rustc_args_required_const` attribute. This means that lifetime extension of references to temporaries is the only remaining job that promotion is performing. :-)
r? `@oli-obk`
Fixes https://github.com/rust-lang/rust/issues/69493
Introduce the beginning of a THIR unsafety checker
This poses the foundations for the THIR unsafety checker, so that it can be implemented incrementally:
- implements a rudimentary `Visitor` for the THIR (which will definitely need some tweaking in the future)
- introduces a new `-Zthir-unsafeck` flag which tells the compiler to use THIR unsafeck instead of MIR unsafeck
- implements detection of unsafe functions
- adds revisions to the UI tests to test THIR unsafeck alongside MIR unsafeck
This uses a very simple query design, where bodies are unsafety-checked on a body per body basis. This however has some big flaws:
- the unsafety-checker builds the THIR itself, which means a lot of work is duplicated with MIR building constructing its own copy of the THIR
- unsafety-checking closures is currently completely wrong: closures should take into account the "safety context" in which they are created, here we are considering that closures are always a safe context
I had intended to fix these problems in follow-up PRs since they are always gated under the `-Zthir-unsafeck` flag (which is explicitely noted to be unsound).
r? `@nikomatsakis`
cc https://github.com/rust-lang/project-thir-unsafeck/issues/3https://github.com/rust-lang/project-thir-unsafeck/issues/7
Rework `on_completion` method so that it removes all
provisional cache entries that are "below" a completed
node (while leaving those entries that are not below
the node).
This corrects an imprecise result that could in turn lead
to an incremental compilation failure. Under the old
scheme, if you had:
* A depends on...
* B depends on A
* C depends on...
* D depends on C
* T: 'static
then the provisional results for A, B, C, and D would all
be entangled. Thus, if A was `EvaluatedToOkModuloRegions`
(because of that final condition), then the result for C and
D would also be demoted to "ok modulo regions".
In reality, though, the result for C depends only on C and itself,
and is not dependent on regions. If we happen to evaluate the
cycle starting from C, we would never reach A, and hence the
result would be "ok".
Under the new scheme, the provisional results for C and D
are moved to the permanent cache immediately and are not affected
by the result of A.
This attribute will cause us to invoke evaluate on every where clause of an
invoked function and to generate an error with the result.
Without this, it is very difficult to observe the effects of invoking the trait
evaluator.
Suggest adding a type parameter for impls
Add a new suggestion upon encountering an unknown type in a `impl` that suggests adding a new type parameter. This diagnostic suggests to add a new type parameter even though it may be a const parameter, however after adding the parameter and running rustc again a follow up error steers the user to change the type parameter to a const parameter.
```rust
struct X<const C: ()>();
impl X<C> {}
```
suggests
```
error[E0412]: cannot find type `C` in this scope
--> bar.rs:2:8
|
1 | struct X<const C: ()>();
| ------------------------ similarly named struct `X` defined here
2 | impl X<C> {}
| ^
|
help: a struct with a similar name exists
|
2 | impl X<X> {}
| ^
help: you might be missing a type parameter
|
2 | impl<C> X<C> {}
| ^^^
```
After adding a type parameter the code now becomes
```rust
struct X<const C: ()>();
impl<C> X<C> {}
```
and the error now fully steers the user towards the correct code
```
error[E0747]: type provided when a constant was expected
--> bar.rs:2:11
|
2 | impl<C> X<C> {}
| ^
|
help: consider changing this type parameter to be a `const` generic
|
2 | impl<const C: ()> X<C> {}
| ^^^^^^^^^^^
```
r? `@estebank`
Somewhat related #84946
Add asm!() support for PowerPC
This includes GPRs and FPRs only.
Note that this does not include PowerPC64.
For my reference, this was mostly duplicated from PR #73214.
Handle more span edge cases in generics diagnostics
This should fix invalid suggestions that didn't account for empty bracket pairs (`<>`) or type bindings.
Recover from invalid `struct` item syntax
Parse unsupported "default field const values":
```rust
struct S {
field: Type = const_val,
}
```
Recover from small `:` typo and provide suggestion:
```rust
struct S {
field; Type,
field2= Type,
}
```
Add auto traits and clone trait migrations for RFC2229
This PR
- renames the existent RFC2229 migration `disjoint_capture_drop_reorder` to `disjoint_capture_migration`
- add additional migrations for auto traits and clone trait
Closesrust-lang/project-rfc-2229#29Closesrust-lang/project-rfc-2229#28
r? `@nikomatsakis`
Fix `--remap-path-prefix` not correctly remapping `rust-src` component paths and unify handling of path mapping with virtualized paths
This PR fixes#73167 ("Binaries end up containing path to the rust-src component despite `--remap-path-prefix`") by preventing real local filesystem paths from reaching compilation output if the path is supposed to be remapped.
`RealFileName::Named` introduced in #72767 is now renamed as `LocalPath`, because this variant wraps a (most likely) valid local filesystem path.
`RealFileName::Devirtualized` is renamed as `Remapped` to be used for remapped path from a real path via `--remap-path-prefix` argument, as well as real path inferred from a virtualized (during compiler bootstrapping) `/rustc/...` path. The `local_path` field is now an `Option<PathBuf>`, as it will be set to `None` before serialisation, so it never reaches any build output. Attempting to serialise a non-`None` `local_path` will cause an assertion faliure.
When a path is remapped, a `RealFileName::Remapped` variant is created. The original path is preserved in `local_path` field and the remapped path is saved in `virtual_name` field. Previously, the `local_path` is directly modified which goes against its purpose of "suitable for reading from the file system on the local host".
`rustc_span::SourceFile`'s fields `unmapped_path` (introduced by #44940) and `name_was_remapped` (introduced by #41508 when `--remap-path-prefix` feature originally added) are removed, as these two pieces of information can be inferred from the `name` field: if it's anything other than a `FileName::Real(_)`, or if it is a `FileName::Real(RealFileName::LocalPath(_))`, then clearly `name_was_remapped` would've been false and `unmapped_path` would've been `None`. If it is a `FileName::Real(RealFileName::Remapped{local_path, virtual_name})`, then `name_was_remapped` would've been true and `unmapped_path` would've been `Some(local_path)`.
cc `@eddyb` who implemented `/rustc/...` path devirtualisation
This PR implements span quoting, allowing proc-macros to produce spans
pointing *into their own crate*. This is used by the unstable
`proc_macro::quote!` macro, allowing us to get error messages like this:
```
error[E0412]: cannot find type `MissingType` in this scope
--> $DIR/auxiliary/span-from-proc-macro.rs:37:20
|
LL | pub fn error_from_attribute(_args: TokenStream, _input: TokenStream) -> TokenStream {
| ----------------------------------------------------------------------------------- in this expansion of procedural macro `#[error_from_attribute]`
...
LL | field: MissingType
| ^^^^^^^^^^^ not found in this scope
|
::: $DIR/span-from-proc-macro.rs:8:1
|
LL | #[error_from_attribute]
| ----------------------- in this macro invocation
```
Here, `MissingType` occurs inside the implementation of the proc-macro
`#[error_from_attribute]`. Previosuly, this would always result in a
span pointing at `#[error_from_attribute]`
This will make many proc-macro-related error message much more useful -
when a proc-macro generates code containing an error, users will get an
error message pointing directly at that code (within the macro
definition), instead of always getting a span pointing at the macro
invocation site.
This is implemented as follows:
* When a proc-macro crate is being *compiled*, it causes the `quote!`
macro to get run. This saves all of the sapns in the input to `quote!`
into the metadata of *the proc-macro-crate* (which we are currently
compiling). The `quote!` macro then expands to a call to
`proc_macro::Span::recover_proc_macro_span(id)`, where `id` is an
opaque identifier for the span in the crate metadata.
* When the same proc-macro crate is *run* (e.g. it is loaded from disk
and invoked by some consumer crate), the call to
`proc_macro::Span::recover_proc_macro_span` causes us to load the span
from the proc-macro crate's metadata. The proc-macro then produces a
`TokenStream` containing a `Span` pointing into the proc-macro crate
itself.
The recursive nature of 'quote!' can be difficult to understand at
first. The file `src/test/ui/proc-macro/quote-debug.stdout` shows
the output of the `quote!` macro, which should make this eaier to
understand.
This PR also supports custom quoting spans in custom quote macros (e.g.
the `quote` crate). All span quoting goes through the
`proc_macro::quote_span` method, which can be called by a custom quote
macro to perform span quoting. An example of this usage is provided in
`src/test/ui/proc-macro/auxiliary/custom-quote.rs`
Custom quoting currently has a few limitations:
In order to quote a span, we need to generate a call to
`proc_macro::Span::recover_proc_macro_span`. However, proc-macros
support renaming the `proc_macro` crate, so we can't simply hardcode
this path. Previously, the `quote_span` method used the path
`crate::Span` - however, this only works when it is called by the
builtin `quote!` macro in the same crate. To support being called from
arbitrary crates, we need access to the name of the `proc_macro` crate
to generate a path. This PR adds an additional argument to `quote_span`
to specify the name of the `proc_macro` crate. Howver, this feels kind
of hacky, and we may want to change this before stabilizing anything
quote-related.
Additionally, using `quote_span` currently requires enabling the
`proc_macro_internals` feature. The builtin `quote!` macro
has an `#[allow_internal_unstable]` attribute, but this won't work for
custom quote implementations. This will likely require some additional
tricks to apply `allow_internal_unstable` to the span of
`proc_macro::Span::recover_proc_macro_span`.
Parse unsupported "default field const values":
```rust
struct S {
field: Type = const_val,
}
```
Recover from small `:` typo and provide suggestion:
```rust
struct S {
field; Type,
field2= Type,
}
```
Use .name_str() to format primitive types in error messages
This pull request fixes#84976. The problem described there is caused by this code
506e75cbf8/compiler/rustc_middle/src/ty/error.rs (L161-L166)
using `Debug` formatting (`{:?}`), while the proper solution is to call `name_str()` of `ty::IntTy`, `ty::UintTy` and `ty::FloatTy`, respectively.
Emit errors/warns on some wrong uses of rustdoc attributes
This PR adds a few diagnostics:
- error if conflicting `#[doc(inline)]`/`#[doc(no_inline)]` are found
- introduce the `invalid_doc_attributes` lint (warn-by-default) which triggers:
- if a crate-level attribute is used on a non-`crate` item
- if `#[doc(inline)]`/`#[doc(no_inline)]` is used on a non-`use` item
The code could probably be improved but I wanted to get feedback first. Also, some of those changes could be considered breaking changes, so I don't know what the procedure would be? ~~And finally, for the warnings, they are currently hard warnings, maybe it would be better to introduce a lint?~~ (EDIT: introduced the `invalid_doc_attributes` lint)
Closes#80275.
r? `@jyn514`
Show nicer error when an 'unstable fingerprints' error occurs
An example of the error produced by this PR:
```
error: internal compiler error: encountered incremental compilation error with evaluate_obligation(9f2ad55260c30262-c36667639674ad83)
|
= help: This is a known issue with the compiler. Run `cargo clean -p syn` or `cargo clean` to allow your project to compile
= note: Please follow the instructions below to create a bug report with the provided information
thread 'rustc' panicked at 'Found unstable fingerprints for evaluate_obligation(9f2ad55260c30262-c36667639674ad83): Ok(EvaluatedToOk)', /home/aaron/repos/rust/compiler/rustc_query_system/src/query/plumbing.rs:595:9
stack backtrace:
0: rust_begin_unwind
at /home/aaron/repos/rust/library/std/src/panicking.rs:493:5
1: std::panicking::begin_panic_fmt
at /home/aaron/repos/rust/library/std/src/panicking.rs:435:5
2: rustc_query_system::query::plumbing::incremental_verify_ich
at /home/aaron/repos/rust/compiler/rustc_query_system/src/query/plumbing.rs:595:9
3: rustc_query_system::query::plumbing::load_from_disk_and_cache_in_memory
at /home/aaron/repos/rust/compiler/rustc_query_system/src/query/plumbing.rs:557:9
4: rustc_query_system::query::plumbing::try_execute_query::{{closure}}::{{closure}}
at /home/aaron/repos/rust/compiler/rustc_query_system/src/query/plumbing.rs:473:21
5: core::option::Option<T>::map
at /home/aaron/repos/rust/library/core/src/option.rs:487:29
6: rustc_query_system::query::plumbing::try_execute_query::{{closure}}
at /home/aaron/repos/rust/compiler/rustc_query_system/src/query/plumbing.rs:471:13
7: stacker::maybe_grow
at /home/aaron/.cargo/registry/src/github.com-1ecc6299db9ec823/stacker-0.1.12/src/lib.rs:55:9
8: rustc_data_structures::stack::ensure_sufficient_stack
at /home/aaron/repos/rust/compiler/rustc_data_structures/src/stack.rs:16:5
9: <rustc_query_impl::plumbing::QueryCtxt as rustc_query_system::query::QueryContext>::start_query::{{closure}}::{{closure}}
at /home/aaron/repos/rust/compiler/rustc_query_impl/src/plumbing.rs:169:17
10: rustc_middle::ty::context::tls::enter_context::{{closure}}
at /home/aaron/repos/rust/compiler/rustc_middle/src/ty/context.rs:1736:50
11: rustc_middle::ty::context::tls::set_tlv
at /home/aaron/repos/rust/compiler/rustc_middle/src/ty/context.rs:1720:9
12: rustc_middle::ty::context::tls::enter_context
at /home/aaron/repos/rust/compiler/rustc_middle/src/ty/context.rs:1736:9
13: <rustc_query_impl::plumbing::QueryCtxt as rustc_query_system::query::QueryContext>::start_query::{{closure}}
at /home/aaron/repos/rust/compiler/rustc_query_impl/src/plumbing.rs:168:13
14: rustc_middle::ty::context::tls::with_related_context::{{closure}}
at /home/aaron/repos/rust/compiler/rustc_middle/src/ty/context.rs:1780:13
15: rustc_middle::ty::context::tls::with_context::{{closure}}
at /home/aaron/repos/rust/compiler/rustc_middle/src/ty/context.rs:1764:40
16: rustc_middle::ty::context::tls::with_context_opt
at /home/aaron/repos/rust/compiler/rustc_middle/src/ty/context.rs:1753:22
17: rustc_middle::ty::context::tls::with_context
at /home/aaron/repos/rust/compiler/rustc_middle/src/ty/context.rs:1764:9
18: rustc_middle::ty::context::tls::with_related_context
at /home/aaron/repos/rust/compiler/rustc_middle/src/ty/context.rs:1777:9
19: <rustc_query_impl::plumbing::QueryCtxt as rustc_query_system::query::QueryContext>::start_query
at /home/aaron/repos/rust/compiler/rustc_query_impl/src/plumbing.rs:157:9
20: rustc_query_system::query::plumbing::try_execute_query
at /home/aaron/repos/rust/compiler/rustc_query_system/src/query/plumbing.rs:469:22
21: rustc_query_system::query::plumbing::get_query_impl
at /home/aaron/repos/rust/compiler/rustc_query_system/src/query/plumbing.rs:674:5
22: rustc_query_system::query::plumbing::get_query
at /home/aaron/repos/rust/compiler/rustc_query_system/src/query/plumbing.rs:785:9
23: <rustc_query_impl::Queries as rustc_middle::ty::query::QueryEngine>::evaluate_obligation
at /home/aaron/repos/rust/compiler/rustc_query_impl/src/plumbing.rs:603:17
24: rustc_middle::ty::query::TyCtxtAt::evaluate_obligation
at /home/aaron/repos/rust/compiler/rustc_middle/src/ty/query/mod.rs:204:17
25: rustc_middle::ty::query::<impl rustc_middle::ty::context::TyCtxt>::evaluate_obligation
at /home/aaron/repos/rust/compiler/rustc_middle/src/ty/query/mod.rs:185:17
26: <rustc_infer::infer::InferCtxt as rustc_trait_selection::traits::query::evaluate_obligation::InferCtxtExt>::evaluate_obligation
at /home/aaron/repos/rust/compiler/rustc_trait_selection/src/traits/query/evaluate_obligation.rs:72:9
27: <rustc_infer::infer::InferCtxt as rustc_trait_selection::traits::query::evaluate_obligation::InferCtxtExt>::evaluate_obligation_no_overflow
at /home/aaron/repos/rust/compiler/rustc_trait_selection/src/traits/query/evaluate_obligation.rs:82:15
28: <rustc_infer::infer::InferCtxt as rustc_trait_selection::traits::query::evaluate_obligation::InferCtxtExt>::predicate_must_hold_modulo_regions
at /home/aaron/repos/rust/compiler/rustc_trait_selection/src/traits/query/evaluate_obligation.rs:58:9
29: rustc_trait_selection::traits::type_known_to_meet_bound_modulo_regions
at /home/aaron/repos/rust/compiler/rustc_trait_selection/src/traits/mod.rs:146:18
30: rustc_ty_utils::common_traits::is_item_raw::{{closure}}
at /home/aaron/repos/rust/compiler/rustc_ty_utils/src/common_traits.rs:33:9
31: rustc_infer::infer::InferCtxtBuilder::enter
at /home/aaron/repos/rust/compiler/rustc_infer/src/infer/mod.rs:582:9
32: rustc_ty_utils::common_traits::is_item_raw
at /home/aaron/repos/rust/compiler/rustc_ty_utils/src/common_traits.rs:32:5
33: rustc_query_system::query::config::QueryVtable<CTX,K,V>::compute
at /home/aaron/repos/rust/compiler/rustc_query_system/src/query/config.rs:44:9
34: rustc_query_system::query::plumbing::load_from_disk_and_cache_in_memory::{{closure}}
at /home/aaron/repos/rust/compiler/rustc_query_system/src/query/plumbing.rs:544:67
35: rustc_middle::dep_graph::<impl rustc_query_system::dep_graph::DepKind for rustc_middle::dep_graph::dep_node::DepKind>::with_deps::{{closure}}::{{closure}}
at /home/aaron/repos/rust/compiler/rustc_middle/src/dep_graph/mod.rs:77:46
36: rustc_middle::ty::context::tls::enter_context::{{closure}}
at /home/aaron/repos/rust/compiler/rustc_middle/src/ty/context.rs:1736:50
37: rustc_middle::ty::context::tls::set_tlv
at /home/aaron/repos/rust/compiler/rustc_middle/src/ty/context.rs:1720:9
38: rustc_middle::ty::context::tls::enter_context
at /home/aaron/repos/rust/compiler/rustc_middle/src/ty/context.rs:1736:9
39: rustc_middle::dep_graph::<impl rustc_query_system::dep_graph::DepKind for rustc_middle::dep_graph::dep_node::DepKind>::with_deps::{{closure}}
at /home/aaron/repos/rust/compiler/rustc_middle/src/dep_graph/mod.rs:77:13
40: rustc_middle::ty::context::tls::with_context::{{closure}}
at /home/aaron/repos/rust/compiler/rustc_middle/src/ty/context.rs:1764:40
41: rustc_middle::ty::context::tls::with_context_opt
at /home/aaron/repos/rust/compiler/rustc_middle/src/ty/context.rs:1753:22
42: rustc_middle::ty::context::tls::with_context
at /home/aaron/repos/rust/compiler/rustc_middle/src/ty/context.rs:1764:9
43: rustc_middle::dep_graph::<impl rustc_query_system::dep_graph::DepKind for rustc_middle::dep_graph::dep_node::DepKind>::with_deps
at /home/aaron/repos/rust/compiler/rustc_middle/src/dep_graph/mod.rs:74:9
44: rustc_query_system::dep_graph::graph::DepGraph<K>::with_ignore
at /home/aaron/repos/rust/compiler/rustc_query_system/src/dep_graph/graph.rs:167:9
45: rustc_query_system::query::plumbing::load_from_disk_and_cache_in_memory
at /home/aaron/repos/rust/compiler/rustc_query_system/src/query/plumbing.rs:544:22
46: rustc_query_system::query::plumbing::try_execute_query::{{closure}}::{{closure}}
at /home/aaron/repos/rust/compiler/rustc_query_system/src/query/plumbing.rs:473:21
47: core::option::Option<T>::map
at /home/aaron/repos/rust/library/core/src/option.rs:487:29
48: rustc_query_system::query::plumbing::try_execute_query::{{closure}}
at /home/aaron/repos/rust/compiler/rustc_query_system/src/query/plumbing.rs:471:13
49: stacker::maybe_grow
at /home/aaron/.cargo/registry/src/github.com-1ecc6299db9ec823/stacker-0.1.12/src/lib.rs:55:9
50: rustc_data_structures::stack::ensure_sufficient_stack
at /home/aaron/repos/rust/compiler/rustc_data_structures/src/stack.rs:16:5
51: <rustc_query_impl::plumbing::QueryCtxt as rustc_query_system::query::QueryContext>::start_query::{{closure}}::{{closure}}
at /home/aaron/repos/rust/compiler/rustc_query_impl/src/plumbing.rs:169:17
52: rustc_middle::ty::context::tls::enter_context::{{closure}}
at /home/aaron/repos/rust/compiler/rustc_middle/src/ty/context.rs:1736:50
53: rustc_middle::ty::context::tls::set_tlv
at /home/aaron/repos/rust/compiler/rustc_middle/src/ty/context.rs:1720:9
54: rustc_middle::ty::context::tls::enter_context
at /home/aaron/repos/rust/compiler/rustc_middle/src/ty/context.rs:1736:9
55: <rustc_query_impl::plumbing::QueryCtxt as rustc_query_system::query::QueryContext>::start_query::{{closure}}
at /home/aaron/repos/rust/compiler/rustc_query_impl/src/plumbing.rs:168:13
56: rustc_middle::ty::context::tls::with_related_context::{{closure}}
at /home/aaron/repos/rust/compiler/rustc_middle/src/ty/context.rs:1780:13
57: rustc_middle::ty::context::tls::with_context::{{closure}}
at /home/aaron/repos/rust/compiler/rustc_middle/src/ty/context.rs:1764:40
58: rustc_middle::ty::context::tls::with_context_opt
at /home/aaron/repos/rust/compiler/rustc_middle/src/ty/context.rs:1753:22
59: rustc_middle::ty::context::tls::with_context
at /home/aaron/repos/rust/compiler/rustc_middle/src/ty/context.rs:1764:9
60: rustc_middle::ty::context::tls::with_related_context
at /home/aaron/repos/rust/compiler/rustc_middle/src/ty/context.rs:1777:9
61: <rustc_query_impl::plumbing::QueryCtxt as rustc_query_system::query::QueryContext>::start_query
at /home/aaron/repos/rust/compiler/rustc_query_impl/src/plumbing.rs:157:9
62: rustc_query_system::query::plumbing::try_execute_query
at /home/aaron/repos/rust/compiler/rustc_query_system/src/query/plumbing.rs:469:22
63: rustc_query_system::query::plumbing::get_query_impl
at /home/aaron/repos/rust/compiler/rustc_query_system/src/query/plumbing.rs:674:5
64: rustc_query_system::query::plumbing::get_query
at /home/aaron/repos/rust/compiler/rustc_query_system/src/query/plumbing.rs:785:9
65: rustc_middle::ty::query::TyCtxtAt::is_unpin_raw
at /home/aaron/repos/rust/compiler/rustc_middle/src/ty/query/mod.rs:204:17
66: rustc_middle::ty::util::<impl rustc_middle::ty::TyS>::is_unpin
at /home/aaron/repos/rust/compiler/rustc_middle/src/ty/util.rs:727:38
67: rustc_middle::ty::layout::<impl rustc_target::abi::TyAndLayoutMethods<C> for &rustc_middle::ty::TyS>::pointee_info_at
at /home/aaron/repos/rust/compiler/rustc_middle/src/ty/layout.rs:2341:32
68: rustc_target::abi::TyAndLayout<Ty>::pointee_info_at
at /home/aaron/repos/rust/compiler/rustc_target/src/abi/mod.rs:1164:9
69: <rustc_target::abi::call::FnAbi<&rustc_middle::ty::TyS> as rustc_middle::ty::layout::FnAbiExt<C>>::new_internal::{{closure}}
at /home/aaron/repos/rust/compiler/rustc_middle/src/ty/layout.rs:2781:36
70: <rustc_target::abi::call::FnAbi<&rustc_middle::ty::TyS> as rustc_middle::ty::layout::FnAbiExt<C>>::new_internal::{{closure}}::{{closure}}
at /home/aaron/repos/rust/compiler/rustc_middle/src/ty/layout.rs:2840:17
71: rustc_target::abi::call::ArgAbi<Ty>::new
at /home/aaron/repos/rust/compiler/rustc_target/src/abi/call/mod.rs:457:53
72: <rustc_target::abi::call::FnAbi<&rustc_middle::ty::TyS> as rustc_middle::ty::layout::FnAbiExt<C>>::new_internal::{{closure}}
at /home/aaron/repos/rust/compiler/rustc_middle/src/ty/layout.rs:2838:27
73: <rustc_target::abi::call::FnAbi<&rustc_middle::ty::TyS> as rustc_middle::ty::layout::FnAbiExt<C>>::new_internal::{{closure}}
at /home/aaron/repos/rust/compiler/rustc_middle/src/ty/layout.rs:2870:32
74: core::iter::adapters::map::map_fold::{{closure}}
at /home/aaron/repos/rust/library/core/src/iter/adapters/map.rs:82:28
75: <core::iter::adapters::enumerate::Enumerate<I> as core::iter::traits::iterator::Iterator>::fold::enumerate::{{closure}}
at /home/aaron/repos/rust/library/core/src/iter/adapters/enumerate.rs:104:27
76: core::ops::function::impls::<impl core::ops::function::FnMut<A> for &mut F>::call_mut
at /home/aaron/repos/rust/library/core/src/ops/function.rs:269:13
77: core::ops::function::impls::<impl core::ops::function::FnMut<A> for &mut F>::call_mut
at /home/aaron/repos/rust/library/core/src/ops/function.rs:269:13
78: core::iter::adapters::map::map_fold::{{closure}}
at /home/aaron/repos/rust/library/core/src/iter/adapters/map.rs:82:21
79: core::iter::traits::iterator::Iterator::fold
at /home/aaron/repos/rust/library/core/src/iter/traits/iterator.rs:2146:21
80: <core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::fold
at /home/aaron/repos/rust/library/core/src/iter/adapters/map.rs:122:9
81: <core::iter::adapters::cloned::Cloned<I> as core::iter::traits::iterator::Iterator>::fold
at /home/aaron/repos/rust/library/core/src/iter/adapters/cloned.rs:58:9
82: <core::iter::adapters::chain::Chain<A,B> as core::iter::traits::iterator::Iterator>::fold
at /home/aaron/repos/rust/library/core/src/iter/adapters/chain.rs:119:19
83: <core::iter::adapters::chain::Chain<A,B> as core::iter::traits::iterator::Iterator>::fold
at /home/aaron/repos/rust/library/core/src/iter/adapters/chain.rs:119:19
84: <core::iter::adapters::enumerate::Enumerate<I> as core::iter::traits::iterator::Iterator>::fold
at /home/aaron/repos/rust/library/core/src/iter/adapters/enumerate.rs:110:9
85: <core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::fold
at /home/aaron/repos/rust/library/core/src/iter/adapters/map.rs:122:9
86: core::iter::traits::iterator::Iterator::for_each
at /home/aaron/repos/rust/library/core/src/iter/traits/iterator.rs:776:9
87: <alloc::vec::Vec<T,A> as alloc::vec::spec_extend::SpecExtend<T,I>>::spec_extend
at /home/aaron/repos/rust/library/alloc/src/vec/spec_extend.rs:40:17
88: <alloc::vec::Vec<T> as alloc::vec::spec_from_iter_nested::SpecFromIterNested<T,I>>::from_iter
at /home/aaron/repos/rust/library/alloc/src/vec/spec_from_iter_nested.rs:56:9
89: <alloc::vec::Vec<T> as alloc::vec::spec_from_iter::SpecFromIter<T,I>>::from_iter
at /home/aaron/repos/rust/library/alloc/src/vec/spec_from_iter.rs:36:9
90: <alloc::vec::Vec<T> as core::iter::traits::collect::FromIterator<T>>::from_iter
at /home/aaron/repos/rust/library/alloc/src/vec/mod.rs:2448:9
91: core::iter::traits::iterator::Iterator::collect
at /home/aaron/repos/rust/library/core/src/iter/traits/iterator.rs:1788:9
92: <rustc_target::abi::call::FnAbi<&rustc_middle::ty::TyS> as rustc_middle::ty::layout::FnAbiExt<C>>::new_internal
at /home/aaron/repos/rust/compiler/rustc_middle/src/ty/layout.rs:2864:19
93: <rustc_target::abi::call::FnAbi<&rustc_middle::ty::TyS> as rustc_middle::ty::layout::FnAbiExt<C>>::of_instance
at /home/aaron/repos/rust/compiler/rustc_middle/src/ty/layout.rs:2670:9
94: rustc_codegen_llvm::mono_item::<impl rustc_codegen_ssa::traits::declare::PreDefineMethods for rustc_codegen_llvm::context::CodegenCx>::predefine_fn
at /home/aaron/repos/rust/compiler/rustc_codegen_llvm/src/mono_item.rs:57:22
95: <rustc_middle::mir::mono::MonoItem as rustc_codegen_ssa::mono_item::MonoItemExt>::predefine
at /home/aaron/repos/rust/compiler/rustc_codegen_ssa/src/mono_item.rs:76:17
96: rustc_codegen_llvm::base::compile_codegen_unit::module_codegen
at /home/aaron/repos/rust/compiler/rustc_codegen_llvm/src/base.rs:122:17
97: rustc_query_system::dep_graph::graph::DepGraph<K>::with_task_impl::{{closure}}
at /home/aaron/repos/rust/compiler/rustc_query_system/src/dep_graph/graph.rs:235:62
98: rustc_middle::dep_graph::<impl rustc_query_system::dep_graph::DepKind for rustc_middle::dep_graph::dep_node::DepKind>::with_deps::{{closure}}::{{closure}}
at /home/aaron/repos/rust/compiler/rustc_middle/src/dep_graph/mod.rs:77:46
99: rustc_middle::ty::context::tls::enter_context::{{closure}}
at /home/aaron/repos/rust/compiler/rustc_middle/src/ty/context.rs:1736:50
100: rustc_middle::ty::context::tls::set_tlv
at /home/aaron/repos/rust/compiler/rustc_middle/src/ty/context.rs:1720:9
101: rustc_middle::ty::context::tls::enter_context
at /home/aaron/repos/rust/compiler/rustc_middle/src/ty/context.rs:1736:9
102: rustc_middle::dep_graph::<impl rustc_query_system::dep_graph::DepKind for rustc_middle::dep_graph::dep_node::DepKind>::with_deps::{{closure}}
at /home/aaron/repos/rust/compiler/rustc_middle/src/dep_graph/mod.rs:77:13
103: rustc_middle::ty::context::tls::with_context::{{closure}}
at /home/aaron/repos/rust/compiler/rustc_middle/src/ty/context.rs:1764:40
104: rustc_middle::ty::context::tls::with_context_opt
at /home/aaron/repos/rust/compiler/rustc_middle/src/ty/context.rs:1753:22
105: rustc_middle::ty::context::tls::with_context
at /home/aaron/repos/rust/compiler/rustc_middle/src/ty/context.rs:1764:9
106: rustc_middle::dep_graph::<impl rustc_query_system::dep_graph::DepKind for rustc_middle::dep_graph::dep_node::DepKind>::with_deps
at /home/aaron/repos/rust/compiler/rustc_middle/src/dep_graph/mod.rs:74:9
107: rustc_query_system::dep_graph::graph::DepGraph<K>::with_task_impl
at /home/aaron/repos/rust/compiler/rustc_query_system/src/dep_graph/graph.rs:235:26
108: rustc_query_system::dep_graph::graph::DepGraph<K>::with_task
at /home/aaron/repos/rust/compiler/rustc_query_system/src/dep_graph/graph.rs:205:9
109: rustc_codegen_llvm::base::compile_codegen_unit
at /home/aaron/repos/rust/compiler/rustc_codegen_llvm/src/base.rs:103:9
110: <rustc_codegen_llvm::LlvmCodegenBackend as rustc_codegen_ssa::traits::backend::ExtraBackendMethods>::compile_codegen_unit
at /home/aaron/repos/rust/compiler/rustc_codegen_llvm/src/lib.rs:109:9
111: rustc_codegen_ssa::base::codegen_crate
at /home/aaron/repos/rust/compiler/rustc_codegen_ssa/src/base.rs:655:38
112: <rustc_codegen_llvm::LlvmCodegenBackend as rustc_codegen_ssa::traits::backend::CodegenBackend>::codegen_crate
at /home/aaron/repos/rust/compiler/rustc_codegen_llvm/src/lib.rs:270:18
113: rustc_interface::passes::start_codegen::{{closure}}
at /home/aaron/repos/rust/compiler/rustc_interface/src/passes.rs:1021:9
114: rustc_data_structures::profiling::VerboseTimingGuard::run
at /home/aaron/repos/rust/compiler/rustc_data_structures/src/profiling.rs:573:9
115: rustc_session::utils::<impl rustc_session::session::Session>::time
at /home/aaron/repos/rust/compiler/rustc_session/src/utils.rs:16:9
116: rustc_interface::passes::start_codegen
at /home/aaron/repos/rust/compiler/rustc_interface/src/passes.rs:1020:19
117: rustc_interface::queries::Queries::ongoing_codegen::{{closure}}::{{closure}}
at /home/aaron/repos/rust/compiler/rustc_interface/src/queries.rs:296:20
118: rustc_interface::passes::QueryContext::enter::{{closure}}
at /home/aaron/repos/rust/compiler/rustc_interface/src/passes.rs:755:42
119: rustc_middle::ty::context::tls::enter_context::{{closure}}
at /home/aaron/repos/rust/compiler/rustc_middle/src/ty/context.rs:1736:50
120: rustc_middle::ty::context::tls::set_tlv
at /home/aaron/repos/rust/compiler/rustc_middle/src/ty/context.rs:1720:9
121: rustc_middle::ty::context::tls::enter_context
at /home/aaron/repos/rust/compiler/rustc_middle/src/ty/context.rs:1736:9
122: rustc_interface::passes::QueryContext::enter
at /home/aaron/repos/rust/compiler/rustc_interface/src/passes.rs:755:9
123: rustc_interface::queries::Queries::ongoing_codegen::{{closure}}
at /home/aaron/repos/rust/compiler/rustc_interface/src/queries.rs:287:13
124: rustc_interface::queries::Query<T>::compute
at /home/aaron/repos/rust/compiler/rustc_interface/src/queries.rs:40:28
125: rustc_interface::queries::Queries::ongoing_codegen
at /home/aaron/repos/rust/compiler/rustc_interface/src/queries.rs:285:9
126: rustc_driver::run_compiler::{{closure}}::{{closure}}
at /home/aaron/repos/rust/compiler/rustc_driver/src/lib.rs:442:13
127: rustc_interface::queries::<impl rustc_interface::interface::Compiler>::enter
at /home/aaron/repos/rust/compiler/rustc_interface/src/queries.rs:428:19
128: rustc_driver::run_compiler::{{closure}}
at /home/aaron/repos/rust/compiler/rustc_driver/src/lib.rs:337:22
129: rustc_interface::interface::create_compiler_and_run::{{closure}}
at /home/aaron/repos/rust/compiler/rustc_interface/src/interface.rs:208:13
130: rustc_span::with_source_map
at /home/aaron/repos/rust/compiler/rustc_span/src/lib.rs:788:5
131: rustc_interface::interface::create_compiler_and_run
at /home/aaron/repos/rust/compiler/rustc_interface/src/interface.rs:202:5
132: rustc_interface::interface::run_compiler::{{closure}}
at /home/aaron/repos/rust/compiler/rustc_interface/src/interface.rs:224:12
133: rustc_interface::util::setup_callbacks_and_run_in_thread_pool_with_globals::{{closure}}::{{closure}}
at /home/aaron/repos/rust/compiler/rustc_interface/src/util.rs:155:13
134: scoped_tls::ScopedKey<T>::set
at /home/aaron/.cargo/registry/src/github.com-1ecc6299db9ec823/scoped-tls-1.0.0/src/lib.rs:137:9
135: rustc_span::with_session_globals
at /home/aaron/repos/rust/compiler/rustc_span/src/lib.rs:105:5
136: rustc_interface::util::setup_callbacks_and_run_in_thread_pool_with_globals::{{closure}}
at /home/aaron/repos/rust/compiler/rustc_interface/src/util.rs:153:9
137: rustc_interface::util::scoped_thread::{{closure}}
at /home/aaron/repos/rust/compiler/rustc_interface/src/util.rs:128:24
note: Some details are omitted, run with `RUST_BACKTRACE=full` for a verbose backtrace.
error: internal compiler error: unexpected panic
note: the compiler unexpectedly panicked. this is a bug.
note: we would appreciate a bug report: https://github.com/rust-lang/rust/issues/new?labels=C-bug%2C+I-ICE%2C+T-compiler&template=ice.md
note: rustc 1.54.0-dev running on x86_64-unknown-linux-gnu
note: compiler flags: -C opt-level=3 -C embed-bitcode=no -C incremental --crate-type lib
note: some of the compiler flags provided by cargo are hidden
query stack during panic:
#0 [evaluate_obligation] evaluating trait selection obligation `quote::Tokens: std::marker::Unpin`
#1 [is_unpin_raw] computing whether `quote::Tokens` is `Unpin`
end of query stack
error: aborting due to previous error
error: could not compile `syn`
To learn more, run the command again with --verbose.
```
I've left in the panic and ICE following the pretty error, so that we still have all of the debug information available in a bug report.
This message can be reproduced by cloning the repository `https://github.com/Aaron1011/syn-crash`, and running the following shell script (with a `rustup override` set in the directory):
```
set -xe
cargo clean -p syn
cargo clean --release -p syn
git checkout minimize
cargo build --release -j 1
git checkout minimize-change
cargo build --release -j 1
```
r? ``@Mark-Simulacrum``