Auto merge of #65716 - JohnTitor:rollup-fkcr85k, r=JohnTitor
Rollup of 14 pull requests Successful merges: - #64145 (Target-feature documented as unsafe) - #65007 (Mention keyword closing policy) - #65417 (Add more coherence tests) - #65507 (Fix test style in unused parentheses lint test) - #65591 (Add long error explanation for E0588) - #65617 (Fix WASI sleep impl) - #65656 (Add option to disable keyboard shortcuts in docs) - #65678 (Add long error explanation for E0728) - #65681 (Code cleanups following up on #65576.) - #65686 (refactor and move `maybe_append` ) - #65688 (Add some tests for fixed ICEs) - #65689 (bring back some Debug instances for Miri) - #65695 (self-profiling: Remove module names from some event-ids in codegen backend.) - #65706 (Add missing space in librustdoc) Failed merges: r? @ghost
This commit is contained in:
commit
f466f52c1b
@ -128,6 +128,14 @@ the master branch to your feature branch.
|
||||
Also, please make sure that fixup commits are squashed into other related
|
||||
commits with meaningful commit messages.
|
||||
|
||||
GitHub allows [closing issues using keywords][closing-keywords]. This feature
|
||||
should be used to keep the issue tracker tidy. However, it is generally preferred
|
||||
to put the "closes #123" text in the PR description rather than the issue commit;
|
||||
particularly during rebasing, citing the issue number in the commit can "spam"
|
||||
the issue in question.
|
||||
|
||||
[closing-keywords]: https://help.github.com/en/articles/closing-issues-using-keywords
|
||||
|
||||
Please make sure your pull request is in compliance with Rust's style
|
||||
guidelines by running
|
||||
|
||||
|
@ -14,6 +14,7 @@
|
||||
- [Targets](targets/index.md)
|
||||
- [Built-in Targets](targets/built-in.md)
|
||||
- [Custom Targets](targets/custom.md)
|
||||
- [Known Issues](targets/known-issues.md)
|
||||
- [Profile-guided Optimization](profile-guided-optimization.md)
|
||||
- [Linker-plugin based LTO](linker-plugin-lto.md)
|
||||
- [Contributing to `rustc`](contributing.md)
|
||||
|
@ -61,6 +61,8 @@ enabling or disabling a feature.
|
||||
To see the valid options and an example of use, run `rustc --print
|
||||
target-features`.
|
||||
|
||||
Using this flag is unsafe and might result in [undefined runtime behavior](../targets/known-issues.md).
|
||||
|
||||
## passes
|
||||
|
||||
This flag can be used to add extra LLVM passes to the compilation.
|
||||
|
@ -145,7 +145,7 @@ of print values are:
|
||||
target CPU may be selected with the `-C target-cpu=val` flag.
|
||||
- `target-features` — List of available target features for the current
|
||||
target. Target features may be enabled with the `-C target-feature=val`
|
||||
flag.
|
||||
flag. This flag is unsafe. See [known issues](targets/known-issues.md) for more details.
|
||||
- `relocation-models` — List of relocation models. Relocation models may be
|
||||
selected with the `-C relocation-model=val` flag.
|
||||
- `code-models` — List of code models. Code models may be selected with the
|
||||
|
@ -11,3 +11,9 @@ To compile to a particular target, use the `--target` flag:
|
||||
```bash
|
||||
$ rustc src/main.rs --target=wasm32-unknown-unknown
|
||||
```
|
||||
## Target Features
|
||||
`x86`, and `ARMv8` are two popular CPU architectures. Their instruction sets form a common baseline across most CPUs. However, some CPUs extend these with custom instruction sets, e.g. vector (`AVX`), bitwise manipulation (`BMI`) or cryptographic (`AES`).
|
||||
|
||||
Developers, who know on which CPUs their compiled code is going to run can choose to add (or remove) CPU specific instruction sets via the `-C target-feature=val` flag.
|
||||
|
||||
Please note, that this flag is generally considered as unsafe. More details can be found in [this section](known-issues.md).
|
||||
|
13
src/doc/rustc/src/targets/known-issues.md
Normal file
13
src/doc/rustc/src/targets/known-issues.md
Normal file
@ -0,0 +1,13 @@
|
||||
# Known Issues
|
||||
This section informs you about known "gotchas". Keep in mind, that this section is (and always will be) incomplete. For suggestions and amendments, feel free to [contribute](../contributing.md) to this guide.
|
||||
|
||||
## Target Features
|
||||
Most target-feature problems arise, when mixing code that have the target-feature _enabled_ with code that have it _disabled_. If you want to avoid undefined behavior, it is recommended to build _all code_ (including the standard library and imported crates) with a common set of target-features.
|
||||
|
||||
By default, compiling your code with the `-C target-feature` flag will not recompile the entire standard library and/or imported crates with matching target features. Therefore, target features are generally considered as unsafe. Using `#[target_feature]` on individual functions makes the function unsafe.
|
||||
|
||||
Examples:
|
||||
|
||||
| Target-Feature | Issue | Seen on | Description | Details |
|
||||
| -------------- | ----- | ------- | ----------- | ------- |
|
||||
| `+soft-float` <br> and <br> `-sse` | Segfaults and ABI mismatches | `x86` and `x86-64` | The `x86` and `x86_64` architecture uses SSE registers (aka `xmm`) for floating point operations. Using software emulated floats ("soft-floats") disables usage of `xmm` registers, but parts of Rust's core libraries (e.g. `std::f32` or `std::f64`) are compiled without soft-floats and expect parameters to be passed in `xmm` registers. This leads to ABI mismatches. <br><br> Attempting to compile with disabled SSE causes the same error, too. | [#63466](https://github.com/rust-lang/rust/issues/63466) |
|
@ -2045,8 +2045,8 @@ so that a generator can then be constructed:
|
||||
async fn bar<T>() -> () {}
|
||||
|
||||
async fn foo() {
|
||||
bar::<String>().await;
|
||||
// ^^^^^^^^ specify type explicitly
|
||||
bar::<String>().await;
|
||||
// ^^^^^^^^ specify type explicitly
|
||||
}
|
||||
```
|
||||
"##,
|
||||
@ -2126,6 +2126,84 @@ static X: u32 = 42;
|
||||
```
|
||||
"##,
|
||||
|
||||
E0728: r##"
|
||||
[`await`] has been used outside [`async`] function or block.
|
||||
|
||||
Erroneous code examples:
|
||||
|
||||
```edition2018,compile_fail,E0728
|
||||
# use std::pin::Pin;
|
||||
# use std::future::Future;
|
||||
# use std::task::{Context, Poll};
|
||||
#
|
||||
# struct WakeOnceThenComplete(bool);
|
||||
#
|
||||
# fn wake_and_yield_once() -> WakeOnceThenComplete {
|
||||
# WakeOnceThenComplete(false)
|
||||
# }
|
||||
#
|
||||
# impl Future for WakeOnceThenComplete {
|
||||
# type Output = ();
|
||||
# fn poll(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<()> {
|
||||
# if self.0 {
|
||||
# Poll::Ready(())
|
||||
# } else {
|
||||
# cx.waker().wake_by_ref();
|
||||
# self.0 = true;
|
||||
# Poll::Pending
|
||||
# }
|
||||
# }
|
||||
# }
|
||||
#
|
||||
fn foo() {
|
||||
wake_and_yield_once().await // `await` is used outside `async` context
|
||||
}
|
||||
```
|
||||
|
||||
[`await`] is used to suspend the current computation until the given
|
||||
future is ready to produce a value. So it is legal only within
|
||||
an [`async`] context, like an `async fn` or an `async` block.
|
||||
|
||||
```edition2018
|
||||
# use std::pin::Pin;
|
||||
# use std::future::Future;
|
||||
# use std::task::{Context, Poll};
|
||||
#
|
||||
# struct WakeOnceThenComplete(bool);
|
||||
#
|
||||
# fn wake_and_yield_once() -> WakeOnceThenComplete {
|
||||
# WakeOnceThenComplete(false)
|
||||
# }
|
||||
#
|
||||
# impl Future for WakeOnceThenComplete {
|
||||
# type Output = ();
|
||||
# fn poll(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<()> {
|
||||
# if self.0 {
|
||||
# Poll::Ready(())
|
||||
# } else {
|
||||
# cx.waker().wake_by_ref();
|
||||
# self.0 = true;
|
||||
# Poll::Pending
|
||||
# }
|
||||
# }
|
||||
# }
|
||||
#
|
||||
async fn foo() {
|
||||
wake_and_yield_once().await // `await` is used within `async` function
|
||||
}
|
||||
|
||||
fn bar(x: u8) -> impl Future<Output = u8> {
|
||||
async move {
|
||||
wake_and_yield_once().await; // `await` is used within `async` block
|
||||
x
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
[`async`]: https://doc.rust-lang.org/std/keyword.async.html
|
||||
[`await`]: https://doc.rust-lang.org/std/keyword.await.html
|
||||
"##,
|
||||
|
||||
E0734: r##"
|
||||
A stability attribute has been used outside of the standard library.
|
||||
|
||||
@ -2218,6 +2296,5 @@ See [RFC 2091] for details on this and other limitations.
|
||||
// E0702, // replaced with a generic attribute input check
|
||||
E0726, // non-explicit (not `'_`) elided lifetime in unsupported position
|
||||
E0727, // `async` generators are not yet supported
|
||||
E0728, // `await` must be in an `async` function or block
|
||||
E0739, // invalid track_caller application/syntax
|
||||
}
|
||||
|
@ -1149,7 +1149,8 @@ options! {CodegenOptions, CodegenSetter, basic_codegen_options,
|
||||
target_cpu: Option<String> = (None, parse_opt_string, [TRACKED],
|
||||
"select target processor (`rustc --print target-cpus` for details)"),
|
||||
target_feature: String = (String::new(), parse_string, [TRACKED],
|
||||
"target specific attributes (`rustc --print target-features` for details)"),
|
||||
"target specific attributes. (`rustc --print target-features` for details). \
|
||||
This feature is unsafe."),
|
||||
passes: Vec<String> = (Vec::new(), parse_list, [TRACKED],
|
||||
"a list of extra LLVM passes to run (space separated)"),
|
||||
llvm_args: Vec<String> = (Vec::new(), parse_list, [TRACKED],
|
||||
|
@ -259,7 +259,7 @@ fn generate_lto_work<B: ExtraBackendMethods>(
|
||||
needs_thin_lto: Vec<(String, B::ThinBuffer)>,
|
||||
import_only_modules: Vec<(SerializedModule<B::ModuleBuffer>, WorkProduct)>
|
||||
) -> Vec<(WorkItem<B>, u64)> {
|
||||
let _prof_timer = cgcx.prof.generic_activity("codegen_run_lto");
|
||||
let _prof_timer = cgcx.prof.generic_activity("codegen_generate_lto_work");
|
||||
|
||||
let (lto_modules, copy_jobs) = if !needs_fat_lto.is_empty() {
|
||||
assert!(needs_thin_lto.is_empty());
|
||||
@ -674,11 +674,11 @@ impl<B: WriteBackendMethods> WorkItem<B> {
|
||||
}
|
||||
}
|
||||
|
||||
pub fn name(&self) -> String {
|
||||
fn profiling_event_id(&self) -> &'static str {
|
||||
match *self {
|
||||
WorkItem::Optimize(ref m) => format!("optimize: {}", m.name),
|
||||
WorkItem::CopyPostLtoArtifacts(ref m) => format!("copy post LTO artifacts: {}", m.name),
|
||||
WorkItem::LTO(ref m) => format!("lto: {}", m.name()),
|
||||
WorkItem::Optimize(_) => "codegen_module_optimize",
|
||||
WorkItem::CopyPostLtoArtifacts(_) => "codegen_copy_artifacts_from_incr_cache",
|
||||
WorkItem::LTO(_) => "codegen_module_perform_lto",
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1587,7 +1587,7 @@ fn spawn_work<B: ExtraBackendMethods>(
|
||||
// as a diagnostic was already sent off to the main thread - just
|
||||
// surface that there was an error in this worker.
|
||||
bomb.result = {
|
||||
let _prof_timer = cgcx.prof.generic_activity(&work.name());
|
||||
let _prof_timer = cgcx.prof.generic_activity(work.profiling_event_id());
|
||||
execute_work_item(&cgcx, work).ok()
|
||||
};
|
||||
});
|
||||
|
@ -406,6 +406,8 @@ pub fn maybe_create_entry_wrapper<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>>(cx: &'
|
||||
rust_main_def_id: DefId,
|
||||
use_start_lang_item: bool,
|
||||
) {
|
||||
// The entry function is either `int main(void)` or `int main(int argc, char **argv)`,
|
||||
// depending on whether the target needs `argc` and `argv` to be passed in.
|
||||
let llfty = if cx.sess().target.target.options.main_needs_argc_argv {
|
||||
cx.type_func(&[cx.type_int(), cx.type_ptr_to(cx.type_i8p())], cx.type_int())
|
||||
} else {
|
||||
@ -440,19 +442,7 @@ pub fn maybe_create_entry_wrapper<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>>(cx: &'
|
||||
|
||||
bx.insert_reference_to_gdb_debug_scripts_section_global();
|
||||
|
||||
let (arg_argc, arg_argv) = if cx.sess().target.target.options.main_needs_argc_argv {
|
||||
// Params from native main() used as args for rust start function
|
||||
let param_argc = bx.get_param(0);
|
||||
let param_argv = bx.get_param(1);
|
||||
let arg_argc = bx.intcast(param_argc, cx.type_isize(), true);
|
||||
let arg_argv = param_argv;
|
||||
(arg_argc, arg_argv)
|
||||
} else {
|
||||
// The Rust start function doesn't need argc and argv, so just pass zeros.
|
||||
let arg_argc = bx.const_int(cx.type_int(), 0);
|
||||
let arg_argv = bx.const_null(cx.type_ptr_to(cx.type_i8p()));
|
||||
(arg_argc, arg_argv)
|
||||
};
|
||||
let (arg_argc, arg_argv) = get_argc_argv(cx, &mut bx);
|
||||
|
||||
let (start_fn, args) = if use_start_lang_item {
|
||||
let start_def_id = cx.tcx().require_lang_item(StartFnLangItem, None);
|
||||
@ -477,6 +467,27 @@ pub fn maybe_create_entry_wrapper<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>>(cx: &'
|
||||
}
|
||||
}
|
||||
|
||||
/// Obtain the `argc` and `argv` values to pass to the rust start function.
|
||||
fn get_argc_argv<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>>(
|
||||
cx: &'a Bx::CodegenCx,
|
||||
bx: &mut Bx
|
||||
) -> (Bx::Value, Bx::Value)
|
||||
{
|
||||
if cx.sess().target.target.options.main_needs_argc_argv {
|
||||
// Params from native `main()` used as args for rust start function
|
||||
let param_argc = bx.get_param(0);
|
||||
let param_argv = bx.get_param(1);
|
||||
let arg_argc = bx.intcast(param_argc, cx.type_isize(), true);
|
||||
let arg_argv = param_argv;
|
||||
(arg_argc, arg_argv)
|
||||
} else {
|
||||
// The Rust start function doesn't need `argc` and `argv`, so just pass zeros.
|
||||
let arg_argc = bx.const_int(cx.type_int(), 0);
|
||||
let arg_argv = bx.const_null(cx.type_ptr_to(cx.type_i8p()));
|
||||
(arg_argc, arg_argv)
|
||||
}
|
||||
}
|
||||
|
||||
pub const CODEGEN_WORKER_ID: usize = ::std::usize::MAX;
|
||||
|
||||
pub fn codegen_crate<B: ExtraBackendMethods>(
|
||||
|
@ -91,7 +91,7 @@ pub struct Frame<'mir, 'tcx, Tag=(), Extra=()> {
|
||||
pub extra: Extra,
|
||||
}
|
||||
|
||||
#[derive(Clone, Eq, PartialEq)]
|
||||
#[derive(Clone, Eq, PartialEq, Debug)] // Miri debug-prints these
|
||||
pub enum StackPopCleanup {
|
||||
/// Jump to the next block in the caller, or cause UB if None (that's a function
|
||||
/// that may never return). Also store layout of return place so
|
||||
@ -113,7 +113,7 @@ pub struct LocalState<'tcx, Tag=(), Id=AllocId> {
|
||||
}
|
||||
|
||||
/// Current value of a local variable
|
||||
#[derive(Clone, PartialEq, Eq)]
|
||||
#[derive(Clone, PartialEq, Eq, Debug)] // Miri debug-prints these
|
||||
pub enum LocalValue<Tag=(), Id=AllocId> {
|
||||
/// This local is not currently alive, and cannot be used at all.
|
||||
Dead,
|
||||
|
@ -194,7 +194,7 @@ a guard.
|
||||
```compile_fail,E0029
|
||||
let string = "salutations !";
|
||||
|
||||
// The ordering relation for strings can't be evaluated at compile time,
|
||||
// The ordering relation for strings cannot be evaluated at compile time,
|
||||
// so this doesn't work:
|
||||
match string {
|
||||
"hello" ..= "world" => {}
|
||||
@ -348,7 +348,7 @@ fn main() {
|
||||
"##,
|
||||
|
||||
E0044: r##"
|
||||
You can't use type or const parameters on foreign items.
|
||||
You cannot use type or const parameters on foreign items.
|
||||
Example of erroneous code:
|
||||
|
||||
```compile_fail,E0044
|
||||
@ -788,7 +788,7 @@ fn some_other_func() {}
|
||||
fn some_function() {
|
||||
SOME_CONST = 14; // error : a constant value cannot be changed!
|
||||
1 = 3; // error : 1 isn't a valid place!
|
||||
some_other_func() = 4; // error : we can't assign value to a function!
|
||||
some_other_func() = 4; // error : we cannot assign value to a function!
|
||||
SomeStruct.x = 12; // error : SomeStruct a structure name but it is used
|
||||
// like a variable!
|
||||
}
|
||||
@ -3891,6 +3891,33 @@ details.
|
||||
[issue #33685]: https://github.com/rust-lang/rust/issues/33685
|
||||
"##,
|
||||
|
||||
E0588: r##"
|
||||
A type with `packed` representation hint has a field with `align`
|
||||
representation hint.
|
||||
|
||||
Erroneous code example:
|
||||
|
||||
```compile_fail,E0588
|
||||
#[repr(align(16))]
|
||||
struct Aligned(i32);
|
||||
|
||||
#[repr(packed)] // error!
|
||||
struct Packed(Aligned);
|
||||
```
|
||||
|
||||
Just like you cannot have both `align` and `packed` representation hints on a
|
||||
same type, a `packed` type cannot contain another type with the `align`
|
||||
representation hint. However, you can do the opposite:
|
||||
|
||||
```
|
||||
#[repr(packed)]
|
||||
struct Packed(i32);
|
||||
|
||||
#[repr(align(16))] // ok!
|
||||
struct Aligned(Packed);
|
||||
```
|
||||
"##,
|
||||
|
||||
E0592: r##"
|
||||
This error occurs when you defined methods or associated functions with same
|
||||
name.
|
||||
@ -4299,7 +4326,7 @@ extern {
|
||||
|
||||
unsafe {
|
||||
printf(::std::ptr::null(), 0f32);
|
||||
// error: can't pass an `f32` to variadic function, cast to `c_double`
|
||||
// error: cannot pass an `f32` to variadic function, cast to `c_double`
|
||||
}
|
||||
```
|
||||
|
||||
@ -5000,7 +5027,7 @@ the future, [RFC 2091] prohibits their implementation without a follow-up RFC.
|
||||
// E0174,
|
||||
// E0182, // merged into E0229
|
||||
E0183,
|
||||
// E0187, // can't infer the kind of the closure
|
||||
// E0187, // cannot infer the kind of the closure
|
||||
// E0188, // can not cast an immutable reference to a mutable pointer
|
||||
// E0189, // deprecated: can only cast a boxed pointer to a boxed object
|
||||
// E0190, // deprecated: can only cast a &-pointer to an &-object
|
||||
@ -5047,7 +5074,6 @@ the future, [RFC 2091] prohibits their implementation without a follow-up RFC.
|
||||
// E0564, // only named lifetimes are allowed in `impl Trait`,
|
||||
// but `{}` was found in the type `{}`
|
||||
E0587, // type has conflicting packed and align representation hints
|
||||
E0588, // packed type cannot transitively contain a `[repr(align)]` type
|
||||
// E0611, // merged into E0616
|
||||
// E0612, // merged into E0609
|
||||
// E0613, // Removed (merged with E0609)
|
||||
|
@ -59,7 +59,7 @@ impl Module<'hir> {
|
||||
fns : Vec::new(),
|
||||
mods : Vec::new(),
|
||||
typedefs : Vec::new(),
|
||||
opaque_tys : Vec::new(),
|
||||
opaque_tys : Vec::new(),
|
||||
statics : Vec::new(),
|
||||
constants : Vec::new(),
|
||||
traits : Vec::new(),
|
||||
|
@ -1241,6 +1241,7 @@ fn settings(root_path: &str, suffix: &str) -> String {
|
||||
("go-to-only-result", "Directly go to item in search if there is only one result",
|
||||
false),
|
||||
("line-numbers", "Show line numbers on code examples", false),
|
||||
("disable-shortcuts", "Disable keyboard shortcuts", false),
|
||||
];
|
||||
format!(
|
||||
"<h1 class='fqn'>\
|
||||
|
@ -79,6 +79,7 @@ function getSearchElement() {
|
||||
"derive",
|
||||
"traitalias"];
|
||||
|
||||
var disableShortcuts = getCurrentValue("rustdoc-disable-shortcuts") !== "true";
|
||||
var search_input = getSearchInput();
|
||||
|
||||
// On the search screen, so you remain on the last tab you opened.
|
||||
@ -294,7 +295,7 @@ function getSearchElement() {
|
||||
|
||||
function handleShortcut(ev) {
|
||||
// Don't interfere with browser shortcuts
|
||||
if (ev.ctrlKey || ev.altKey || ev.metaKey) {
|
||||
if (ev.ctrlKey || ev.altKey || ev.metaKey || disableShortcuts === true) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -31,10 +31,10 @@ impl Thread {
|
||||
let nanos = dur.as_nanos();
|
||||
assert!(nanos <= u64::max_value() as u128);
|
||||
|
||||
const CLOCK_ID: wasi::Userdata = 0x0123_45678;
|
||||
const USERDATA: wasi::Userdata = 0x0123_45678;
|
||||
|
||||
let clock = wasi::raw::__wasi_subscription_u_clock_t {
|
||||
identifier: CLOCK_ID,
|
||||
identifier: 0,
|
||||
clock_id: wasi::CLOCK_MONOTONIC,
|
||||
timeout: nanos as u64,
|
||||
precision: 0,
|
||||
@ -42,7 +42,7 @@ impl Thread {
|
||||
};
|
||||
|
||||
let in_ = [wasi::Subscription {
|
||||
userdata: 0,
|
||||
userdata: USERDATA,
|
||||
type_: wasi::EVENTTYPE_CLOCK,
|
||||
u: wasi::raw::__wasi_subscription_u { clock: clock },
|
||||
}];
|
||||
@ -53,7 +53,7 @@ impl Thread {
|
||||
};
|
||||
match (res, event) {
|
||||
(Ok(1), wasi::Event {
|
||||
userdata: CLOCK_ID,
|
||||
userdata: USERDATA,
|
||||
error: 0,
|
||||
type_: wasi::EVENTTYPE_CLOCK,
|
||||
..
|
||||
|
@ -86,13 +86,6 @@ macro_rules! maybe_recover_from_interpolated_ty_qpath {
|
||||
}
|
||||
}
|
||||
|
||||
fn maybe_append(mut lhs: Vec<Attribute>, mut rhs: Option<Vec<Attribute>>) -> Vec<Attribute> {
|
||||
if let Some(ref mut rhs) = rhs {
|
||||
lhs.append(rhs);
|
||||
}
|
||||
lhs
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Copy, PartialEq)]
|
||||
enum PrevTokenKind {
|
||||
DocComment,
|
||||
|
@ -10,7 +10,6 @@ use crate::ast::{Visibility, VisibilityKind, Mutability, FnHeader, ForeignItem,
|
||||
use crate::ast::{Ty, TyKind, Generics, GenericBounds, TraitRef, EnumDef, VariantData, StructField};
|
||||
use crate::ast::{Mac, MacDelimiter, Block, BindingMode, FnDecl, MethodSig, SelfKind, Param};
|
||||
use crate::parse::token;
|
||||
use crate::parse::parser::maybe_append;
|
||||
use crate::tokenstream::{TokenTree, TokenStream};
|
||||
use crate::symbol::{kw, sym};
|
||||
use crate::source_map::{self, respan, Span};
|
||||
@ -416,10 +415,17 @@ impl<'a> Parser<'a> {
|
||||
) -> PResult<'a, Option<P<Item>>> {
|
||||
let (ident, item, extra_attrs) = info;
|
||||
let span = lo.to(self.prev_span);
|
||||
let attrs = maybe_append(attrs, extra_attrs);
|
||||
let attrs = Self::maybe_append(attrs, extra_attrs);
|
||||
Ok(Some(self.mk_item(span, ident, item, vis, attrs)))
|
||||
}
|
||||
|
||||
fn maybe_append<T>(mut lhs: Vec<T>, mut rhs: Option<Vec<T>>) -> Vec<T> {
|
||||
if let Some(ref mut rhs) = rhs {
|
||||
lhs.append(rhs);
|
||||
}
|
||||
lhs
|
||||
}
|
||||
|
||||
/// This is the fall-through for parsing items.
|
||||
fn parse_macro_use_or_failure(
|
||||
&mut self,
|
||||
|
10
src/test/ui/asm/issue-51431.rs
Normal file
10
src/test/ui/asm/issue-51431.rs
Normal file
@ -0,0 +1,10 @@
|
||||
// ignore-emscripten no asm! support
|
||||
|
||||
#![feature(asm)]
|
||||
|
||||
fn main() {
|
||||
unsafe {
|
||||
asm! {"mov $0,$1"::"0"("bx"),"1"(0x00)}
|
||||
//~^ ERROR: invalid value for constraint in inline assembly
|
||||
}
|
||||
}
|
8
src/test/ui/asm/issue-51431.stderr
Normal file
8
src/test/ui/asm/issue-51431.stderr
Normal file
@ -0,0 +1,8 @@
|
||||
error[E0669]: invalid value for constraint in inline assembly
|
||||
--> $DIR/issue-51431.rs:7:32
|
||||
|
|
||||
LL | asm! {"mov $0,$1"::"0"("bx"),"1"(0x00)}
|
||||
| ^^^^
|
||||
|
||||
error: aborting due to previous error
|
||||
|
9
src/test/ui/associated-const/issue-63496.rs
Normal file
9
src/test/ui/associated-const/issue-63496.rs
Normal file
@ -0,0 +1,9 @@
|
||||
trait A {
|
||||
const C: usize;
|
||||
|
||||
fn f() -> ([u8; A::C], [u8; A::C]);
|
||||
//~^ ERROR: type annotations needed: cannot resolve
|
||||
//~| ERROR: type annotations needed: cannot resolve
|
||||
}
|
||||
|
||||
fn main() {}
|
21
src/test/ui/associated-const/issue-63496.stderr
Normal file
21
src/test/ui/associated-const/issue-63496.stderr
Normal file
@ -0,0 +1,21 @@
|
||||
error[E0283]: type annotations needed: cannot resolve `_: A`
|
||||
--> $DIR/issue-63496.rs:4:21
|
||||
|
|
||||
LL | const C: usize;
|
||||
| --------------- required by `A::C`
|
||||
LL |
|
||||
LL | fn f() -> ([u8; A::C], [u8; A::C]);
|
||||
| ^^^^
|
||||
|
||||
error[E0283]: type annotations needed: cannot resolve `_: A`
|
||||
--> $DIR/issue-63496.rs:4:33
|
||||
|
|
||||
LL | const C: usize;
|
||||
| --------------- required by `A::C`
|
||||
LL |
|
||||
LL | fn f() -> ([u8; A::C], [u8; A::C]);
|
||||
| ^^^^
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0283`.
|
@ -244,4 +244,5 @@ LL | let _ = await bar()?;
|
||||
|
||||
error: aborting due to 35 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0277`.
|
||||
Some errors have detailed explanations: E0277, E0728.
|
||||
For more information about an error, try `rustc --explain E0277`.
|
||||
|
@ -8,3 +8,4 @@ LL | let _gen = || foo().await;
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
For more information about this error, try `rustc --explain E0728`.
|
||||
|
@ -9,3 +9,4 @@ LL | let finished = result.await;
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
For more information about this error, try `rustc --explain E0728`.
|
||||
|
@ -40,4 +40,5 @@ LL | F: Future
|
||||
|
||||
error: aborting due to 4 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0277`.
|
||||
Some errors have detailed explanations: E0277, E0728.
|
||||
For more information about an error, try `rustc --explain E0277`.
|
||||
|
@ -8,3 +8,4 @@ LL | (async || 2333)().await;
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
For more information about this error, try `rustc --explain E0728`.
|
||||
|
@ -9,3 +9,4 @@ LL | let y = do_the_thing().await;
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
For more information about this error, try `rustc --explain E0728`.
|
||||
|
13
src/test/ui/closures/issue-41366.rs
Normal file
13
src/test/ui/closures/issue-41366.rs
Normal file
@ -0,0 +1,13 @@
|
||||
trait T<'x> {
|
||||
type V;
|
||||
}
|
||||
|
||||
impl<'g> T<'g> for u32 {
|
||||
type V = u16;
|
||||
}
|
||||
|
||||
fn main() {
|
||||
(&|_|()) as &dyn for<'x> Fn(<u32 as T<'x>>::V);
|
||||
//~^ ERROR: type mismatch in closure arguments
|
||||
//~| ERROR: type mismatch resolving
|
||||
}
|
22
src/test/ui/closures/issue-41366.stderr
Normal file
22
src/test/ui/closures/issue-41366.stderr
Normal file
@ -0,0 +1,22 @@
|
||||
error[E0631]: type mismatch in closure arguments
|
||||
--> $DIR/issue-41366.rs:10:5
|
||||
|
|
||||
LL | (&|_|()) as &dyn for<'x> Fn(<u32 as T<'x>>::V);
|
||||
| ^^-----^
|
||||
| | |
|
||||
| | found signature of `fn(_) -> _`
|
||||
| expected signature of `for<'x> fn(<u32 as T<'x>>::V) -> _`
|
||||
|
|
||||
= note: required for the cast to the object type `dyn for<'x> std::ops::Fn(<u32 as T<'x>>::V)`
|
||||
|
||||
error[E0271]: type mismatch resolving `for<'x> <[closure@$DIR/issue-41366.rs:10:7: 10:12] as std::ops::FnOnce<(<u32 as T<'x>>::V,)>>::Output == ()`
|
||||
--> $DIR/issue-41366.rs:10:5
|
||||
|
|
||||
LL | (&|_|()) as &dyn for<'x> Fn(<u32 as T<'x>>::V);
|
||||
| ^^^^^^^^ expected bound lifetime parameter 'x, found concrete lifetime
|
||||
|
|
||||
= note: required for the cast to the object type `dyn for<'x> std::ops::Fn(<u32 as T<'x>>::V)`
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0271`.
|
5
src/test/ui/closures/issue-52437.rs
Normal file
5
src/test/ui/closures/issue-52437.rs
Normal file
@ -0,0 +1,5 @@
|
||||
fn main() {
|
||||
[(); &(&'static: loop { |x| {}; }) as *const _ as usize]
|
||||
//~^ ERROR: invalid label name `'static`
|
||||
//~| ERROR: type annotations needed
|
||||
}
|
15
src/test/ui/closures/issue-52437.stderr
Normal file
15
src/test/ui/closures/issue-52437.stderr
Normal file
@ -0,0 +1,15 @@
|
||||
error: invalid label name `'static`
|
||||
--> $DIR/issue-52437.rs:2:13
|
||||
|
|
||||
LL | [(); &(&'static: loop { |x| {}; }) as *const _ as usize]
|
||||
| ^^^^^^^
|
||||
|
||||
error[E0282]: type annotations needed
|
||||
--> $DIR/issue-52437.rs:2:30
|
||||
|
|
||||
LL | [(); &(&'static: loop { |x| {}; }) as *const _ as usize]
|
||||
| ^ consider giving this closure parameter a type
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0282`.
|
17
src/test/ui/coherence/impl-foreign-for-foreign.rs
Normal file
17
src/test/ui/coherence/impl-foreign-for-foreign.rs
Normal file
@ -0,0 +1,17 @@
|
||||
#![feature(re_rebalance_coherence)]
|
||||
|
||||
// compile-flags:--crate-name=test
|
||||
// aux-build:coherence_lib.rs
|
||||
|
||||
extern crate coherence_lib as lib;
|
||||
use lib::*;
|
||||
use std::rc::Rc;
|
||||
|
||||
struct Local;
|
||||
|
||||
impl Remote for i32 {
|
||||
//~^ ERROR only traits defined in the current crate
|
||||
// | can be implemented for arbitrary types [E0117]
|
||||
}
|
||||
|
||||
fn main() {}
|
12
src/test/ui/coherence/impl-foreign-for-foreign.stderr
Normal file
12
src/test/ui/coherence/impl-foreign-for-foreign.stderr
Normal file
@ -0,0 +1,12 @@
|
||||
error[E0117]: only traits defined in the current crate can be implemented for arbitrary types
|
||||
--> $DIR/impl-foreign-for-foreign.rs:12:1
|
||||
|
|
||||
LL | impl Remote for i32 {
|
||||
| ^^^^^^^^^^^^^^^^^^^ impl doesn't use types inside crate
|
||||
|
|
||||
= note: the impl does not reference only types defined in this crate
|
||||
= note: define and implement a trait or new type instead
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
For more information about this error, try `rustc --explain E0117`.
|
25
src/test/ui/coherence/impl-foreign-for-foreign[foreign].rs
Normal file
25
src/test/ui/coherence/impl-foreign-for-foreign[foreign].rs
Normal file
@ -0,0 +1,25 @@
|
||||
#![feature(re_rebalance_coherence)]
|
||||
|
||||
// compile-flags:--crate-name=test
|
||||
// aux-build:coherence_lib.rs
|
||||
|
||||
extern crate coherence_lib as lib;
|
||||
use lib::*;
|
||||
use std::rc::Rc;
|
||||
|
||||
struct Local;
|
||||
|
||||
impl Remote1<Rc<i32>> for i32 {
|
||||
//~^ ERROR only traits defined in the current crate
|
||||
// | can be implemented for arbitrary types [E0117]
|
||||
}
|
||||
impl Remote1<Rc<Local>> for f64 {
|
||||
//~^ ERROR only traits defined in the current crate
|
||||
// | can be implemented for arbitrary types [E0117]
|
||||
}
|
||||
impl<T> Remote1<Rc<T>> for f32 {
|
||||
//~^ ERROR only traits defined in the current crate
|
||||
// | can be implemented for arbitrary types [E0117]
|
||||
}
|
||||
|
||||
fn main() {}
|
@ -0,0 +1,30 @@
|
||||
error[E0117]: only traits defined in the current crate can be implemented for arbitrary types
|
||||
--> $DIR/impl-foreign-for-foreign[foreign].rs:12:1
|
||||
|
|
||||
LL | impl Remote1<Rc<i32>> for i32 {
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ impl doesn't use types inside crate
|
||||
|
|
||||
= note: the impl does not reference only types defined in this crate
|
||||
= note: define and implement a trait or new type instead
|
||||
|
||||
error[E0117]: only traits defined in the current crate can be implemented for arbitrary types
|
||||
--> $DIR/impl-foreign-for-foreign[foreign].rs:16:1
|
||||
|
|
||||
LL | impl Remote1<Rc<Local>> for f64 {
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ impl doesn't use types inside crate
|
||||
|
|
||||
= note: the impl does not reference only types defined in this crate
|
||||
= note: define and implement a trait or new type instead
|
||||
|
||||
error[E0117]: only traits defined in the current crate can be implemented for arbitrary types
|
||||
--> $DIR/impl-foreign-for-foreign[foreign].rs:20:1
|
||||
|
|
||||
LL | impl<T> Remote1<Rc<T>> for f32 {
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ impl doesn't use types inside crate
|
||||
|
|
||||
= note: the impl does not reference only types defined in this crate
|
||||
= note: define and implement a trait or new type instead
|
||||
|
||||
error: aborting due to 3 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0117`.
|
16
src/test/ui/coherence/impl-foreign-for-foreign[local].rs
Normal file
16
src/test/ui/coherence/impl-foreign-for-foreign[local].rs
Normal file
@ -0,0 +1,16 @@
|
||||
#![feature(re_rebalance_coherence)]
|
||||
|
||||
// compile-flags:--crate-name=test
|
||||
// aux-build:coherence_lib.rs
|
||||
// check-pass
|
||||
|
||||
extern crate coherence_lib as lib;
|
||||
use lib::*;
|
||||
use std::rc::Rc;
|
||||
|
||||
struct Local<T>(Rc<T>);
|
||||
|
||||
impl Remote1<Local<i32>> for i32 {}
|
||||
impl<T> Remote1<Local<T>> for f32 {}
|
||||
|
||||
fn main() {}
|
@ -0,0 +1,21 @@
|
||||
#![feature(re_rebalance_coherence)]
|
||||
|
||||
// compile-flags:--crate-name=test
|
||||
// aux-build:coherence_lib.rs
|
||||
|
||||
extern crate coherence_lib as lib;
|
||||
use lib::*;
|
||||
use std::rc::Rc;
|
||||
|
||||
struct Local;
|
||||
|
||||
impl Remote for Box<i32> {
|
||||
//~^ ERROR only traits defined in the current crate
|
||||
// | can be implemented for arbitrary types [E0117]
|
||||
}
|
||||
impl<T> Remote for Box<Rc<T>> {
|
||||
//~^ ERROR only traits defined in the current crate
|
||||
// | can be implemented for arbitrary types [E0117]
|
||||
}
|
||||
|
||||
fn main() {}
|
@ -0,0 +1,21 @@
|
||||
error[E0117]: only traits defined in the current crate can be implemented for arbitrary types
|
||||
--> $DIR/impl-foreign-for-fundamental[foreign].rs:12:1
|
||||
|
|
||||
LL | impl Remote for Box<i32> {
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^ impl doesn't use types inside crate
|
||||
|
|
||||
= note: the impl does not reference only types defined in this crate
|
||||
= note: define and implement a trait or new type instead
|
||||
|
||||
error[E0117]: only traits defined in the current crate can be implemented for arbitrary types
|
||||
--> $DIR/impl-foreign-for-fundamental[foreign].rs:16:1
|
||||
|
|
||||
LL | impl<T> Remote for Box<Rc<T>> {
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ impl doesn't use types inside crate
|
||||
|
|
||||
= note: the impl does not reference only types defined in this crate
|
||||
= note: define and implement a trait or new type instead
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0117`.
|
17
src/test/ui/coherence/impl-foreign-for-fundamental[local].rs
Normal file
17
src/test/ui/coherence/impl-foreign-for-fundamental[local].rs
Normal file
@ -0,0 +1,17 @@
|
||||
#![feature(re_rebalance_coherence)]
|
||||
|
||||
// compile-flags:--crate-name=test
|
||||
// aux-build:coherence_lib.rs
|
||||
// check-pass
|
||||
|
||||
extern crate coherence_lib as lib;
|
||||
use lib::*;
|
||||
use std::rc::Rc;
|
||||
|
||||
struct Local;
|
||||
struct Local1<T>(Rc<T>);
|
||||
|
||||
impl Remote for Box<Local> {}
|
||||
impl<T> Remote for Box<Local1<T>> {}
|
||||
|
||||
fn main() {}
|
15
src/test/ui/coherence/impl-foreign-for-local.rs
Normal file
15
src/test/ui/coherence/impl-foreign-for-local.rs
Normal file
@ -0,0 +1,15 @@
|
||||
#![feature(re_rebalance_coherence)]
|
||||
|
||||
// compile-flags:--crate-name=test
|
||||
// aux-build:coherence_lib.rs
|
||||
// check-pass
|
||||
|
||||
extern crate coherence_lib as lib;
|
||||
use lib::*;
|
||||
use std::rc::Rc;
|
||||
|
||||
struct Local;
|
||||
|
||||
impl Remote for Local {}
|
||||
|
||||
fn main() {}
|
@ -0,0 +1,26 @@
|
||||
#![feature(re_rebalance_coherence)]
|
||||
|
||||
// compile-flags:--crate-name=test
|
||||
// aux-build:coherence_lib.rs
|
||||
|
||||
extern crate coherence_lib as lib;
|
||||
use lib::*;
|
||||
use std::rc::Rc;
|
||||
|
||||
struct Local;
|
||||
struct Local1<T>(Rc<T>);
|
||||
|
||||
impl Remote1<Box<String>> for i32 {
|
||||
//~^ ERROR only traits defined in the current crate
|
||||
// | can be implemented for arbitrary types [E0117]
|
||||
}
|
||||
impl Remote1<Box<Rc<i32>>> for f64 {
|
||||
//~^ ERROR only traits defined in the current crate
|
||||
// | can be implemented for arbitrary types [E0117]
|
||||
}
|
||||
impl<T> Remote1<Box<Rc<T>>> for f32 {
|
||||
//~^ ERROR only traits defined in the current crate
|
||||
// | can be implemented for arbitrary types [E0117]
|
||||
}
|
||||
|
||||
fn main() {}
|
@ -0,0 +1,30 @@
|
||||
error[E0117]: only traits defined in the current crate can be implemented for arbitrary types
|
||||
--> $DIR/impl-foreign[fundemental[foreign]]-for-foreign.rs:13:1
|
||||
|
|
||||
LL | impl Remote1<Box<String>> for i32 {
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ impl doesn't use types inside crate
|
||||
|
|
||||
= note: the impl does not reference only types defined in this crate
|
||||
= note: define and implement a trait or new type instead
|
||||
|
||||
error[E0117]: only traits defined in the current crate can be implemented for arbitrary types
|
||||
--> $DIR/impl-foreign[fundemental[foreign]]-for-foreign.rs:17:1
|
||||
|
|
||||
LL | impl Remote1<Box<Rc<i32>>> for f64 {
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ impl doesn't use types inside crate
|
||||
|
|
||||
= note: the impl does not reference only types defined in this crate
|
||||
= note: define and implement a trait or new type instead
|
||||
|
||||
error[E0117]: only traits defined in the current crate can be implemented for arbitrary types
|
||||
--> $DIR/impl-foreign[fundemental[foreign]]-for-foreign.rs:21:1
|
||||
|
|
||||
LL | impl<T> Remote1<Box<Rc<T>>> for f32 {
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ impl doesn't use types inside crate
|
||||
|
|
||||
= note: the impl does not reference only types defined in this crate
|
||||
= note: define and implement a trait or new type instead
|
||||
|
||||
error: aborting due to 3 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0117`.
|
@ -0,0 +1,18 @@
|
||||
#![feature(re_rebalance_coherence)]
|
||||
|
||||
// compile-flags:--crate-name=test
|
||||
// aux-build:coherence_lib.rs
|
||||
// check-pass
|
||||
|
||||
extern crate coherence_lib as lib;
|
||||
use lib::*;
|
||||
use std::rc::Rc;
|
||||
|
||||
struct Local;
|
||||
struct Local1<T>(Rc<T>);
|
||||
|
||||
impl Remote1<Box<Local>> for i32 {}
|
||||
impl Remote1<Box<Local1<i32>>> for f64 {}
|
||||
impl<T> Remote1<Box<Local1<T>>> for f32 {}
|
||||
|
||||
fn main() {}
|
23
src/test/ui/coherence/impl[t]-foreign-for-foreign[t].rs
Normal file
23
src/test/ui/coherence/impl[t]-foreign-for-foreign[t].rs
Normal file
@ -0,0 +1,23 @@
|
||||
#![feature(re_rebalance_coherence)]
|
||||
|
||||
// compile-flags:--crate-name=test
|
||||
// aux-build:coherence_lib.rs
|
||||
|
||||
extern crate coherence_lib as lib;
|
||||
use lib::*;
|
||||
use std::rc::Rc;
|
||||
use std::sync::Arc;
|
||||
|
||||
struct Local;
|
||||
|
||||
impl Remote for Rc<Local> {
|
||||
//~^ ERROR only traits defined in the current crate
|
||||
// | can be implemented for arbitrary types [E0117]
|
||||
}
|
||||
|
||||
impl<T> Remote for Arc<T> {
|
||||
//~^ ERROR only traits defined in the current crate
|
||||
// | can be implemented for arbitrary types [E0117]
|
||||
}
|
||||
|
||||
fn main() {}
|
21
src/test/ui/coherence/impl[t]-foreign-for-foreign[t].stderr
Normal file
21
src/test/ui/coherence/impl[t]-foreign-for-foreign[t].stderr
Normal file
@ -0,0 +1,21 @@
|
||||
error[E0117]: only traits defined in the current crate can be implemented for arbitrary types
|
||||
--> $DIR/impl[t]-foreign-for-foreign[t].rs:13:1
|
||||
|
|
||||
LL | impl Remote for Rc<Local> {
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^ impl doesn't use types inside crate
|
||||
|
|
||||
= note: the impl does not reference only types defined in this crate
|
||||
= note: define and implement a trait or new type instead
|
||||
|
||||
error[E0117]: only traits defined in the current crate can be implemented for arbitrary types
|
||||
--> $DIR/impl[t]-foreign-for-foreign[t].rs:18:1
|
||||
|
|
||||
LL | impl<T> Remote for Arc<T> {
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^ impl doesn't use types inside crate
|
||||
|
|
||||
= note: the impl does not reference only types defined in this crate
|
||||
= note: define and implement a trait or new type instead
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0117`.
|
17
src/test/ui/coherence/impl[t]-foreign-for-fundamental[t].rs
Normal file
17
src/test/ui/coherence/impl[t]-foreign-for-fundamental[t].rs
Normal file
@ -0,0 +1,17 @@
|
||||
#![feature(re_rebalance_coherence)]
|
||||
|
||||
// compile-flags:--crate-name=test
|
||||
// aux-build:coherence_lib.rs
|
||||
|
||||
extern crate coherence_lib as lib;
|
||||
use lib::*;
|
||||
use std::rc::Rc;
|
||||
|
||||
struct Local;
|
||||
|
||||
impl<T> Remote for Box<T> {
|
||||
//~^ ERROR type parameter `T` must be used as the type parameter for
|
||||
// | some local type (e.g., `MyStruct<T>`)
|
||||
}
|
||||
|
||||
fn main() {}
|
@ -0,0 +1,11 @@
|
||||
error[E0210]: type parameter `T` must be used as the type parameter for some local type (e.g., `MyStruct<T>`)
|
||||
--> $DIR/impl[t]-foreign-for-fundamental[t].rs:12:1
|
||||
|
|
||||
LL | impl<T> Remote for Box<T> {
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^ type parameter `T` must be used as the type parameter for some local type
|
||||
|
|
||||
= note: only traits defined in the current crate can be implemented for a type parameter
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
For more information about this error, try `rustc --explain E0210`.
|
@ -0,0 +1,17 @@
|
||||
#![feature(re_rebalance_coherence)]
|
||||
|
||||
// compile-flags:--crate-name=test
|
||||
// aux-build:coherence_lib.rs
|
||||
// check-pass
|
||||
|
||||
extern crate coherence_lib as lib;
|
||||
use lib::*;
|
||||
use std::rc::Rc;
|
||||
|
||||
struct Local;
|
||||
struct Local1<S>(Rc<S>);
|
||||
|
||||
impl<T> Remote1<Box<Local>> for Rc<T> {}
|
||||
impl<S, T> Remote1<Box<Local1<S>>> for Rc<T> {}
|
||||
|
||||
fn main() {}
|
@ -0,0 +1,17 @@
|
||||
#![feature(re_rebalance_coherence)]
|
||||
|
||||
// compile-flags:--crate-name=test
|
||||
// aux-build:coherence_lib.rs
|
||||
// check-pass
|
||||
|
||||
extern crate coherence_lib as lib;
|
||||
use lib::*;
|
||||
use std::rc::Rc;
|
||||
|
||||
struct Local;
|
||||
struct Local1<S>(Rc<S>);
|
||||
|
||||
impl<T> Remote1<Local> for Rc<T> {}
|
||||
impl<T, S> Remote1<Local1<S>> for Rc<T> {}
|
||||
|
||||
fn main() {}
|
@ -0,0 +1,19 @@
|
||||
#![feature(re_rebalance_coherence)]
|
||||
|
||||
// compile-flags:--crate-name=test
|
||||
// aux-build:coherence_lib.rs
|
||||
// check-pass
|
||||
|
||||
extern crate coherence_lib as lib;
|
||||
use lib::*;
|
||||
use std::rc::Rc;
|
||||
|
||||
struct Local;
|
||||
struct Local1<S>(Rc<S>);
|
||||
|
||||
impl<T> Remote1<Local> for Box<Rc<T>> {}
|
||||
impl<T, S> Remote1<Local1<S>> for Box<Rc<T>> {}
|
||||
impl<T> Remote1<Box<Local>> for Box<Rc<T>> {}
|
||||
impl<T, S> Remote1<Box<Local1<S>>> for Box<Rc<T>> {}
|
||||
|
||||
fn main() {}
|
@ -1,5 +1,4 @@
|
||||
// compile-flags: --error-format pretty-json -Zunstable-options
|
||||
// build-pass (FIXME(62277): could be check-pass?)
|
||||
// compile-flags: --error-format json -Zunstable-options
|
||||
// run-rustfix
|
||||
|
||||
// The output for humans should just highlight the whole span without showing
|
||||
@ -8,13 +7,13 @@
|
||||
// stripping away any starting or ending parenthesis characters—hence this
|
||||
// test of the JSON error format.
|
||||
|
||||
#![warn(unused_parens)]
|
||||
#![deny(unused_parens)]
|
||||
#![allow(unreachable_code)]
|
||||
|
||||
fn main() {
|
||||
// We want to suggest the properly-balanced expression `1 / (2 + 3)`, not
|
||||
// the malformed `1 / (2 + 3`
|
||||
let _a = 1 / (2 + 3);
|
||||
let _a = 1 / (2 + 3); //~ERROR unnecessary parentheses
|
||||
f();
|
||||
}
|
||||
|
||||
|
@ -1,5 +1,4 @@
|
||||
// compile-flags: --error-format pretty-json -Zunstable-options
|
||||
// build-pass (FIXME(62277): could be check-pass?)
|
||||
// compile-flags: --error-format json -Zunstable-options
|
||||
// run-rustfix
|
||||
|
||||
// The output for humans should just highlight the whole span without showing
|
||||
@ -8,13 +7,13 @@
|
||||
// stripping away any starting or ending parenthesis characters—hence this
|
||||
// test of the JSON error format.
|
||||
|
||||
#![warn(unused_parens)]
|
||||
#![deny(unused_parens)]
|
||||
#![allow(unreachable_code)]
|
||||
|
||||
fn main() {
|
||||
// We want to suggest the properly-balanced expression `1 / (2 + 3)`, not
|
||||
// the malformed `1 / (2 + 3`
|
||||
let _a = (1 / (2 + 3));
|
||||
let _a = (1 / (2 + 3)); //~ERROR unnecessary parentheses
|
||||
f();
|
||||
}
|
||||
|
||||
|
@ -1,106 +1,16 @@
|
||||
{
|
||||
"message": "unnecessary parentheses around assigned value",
|
||||
"code": {
|
||||
"code": "unused_parens",
|
||||
"explanation": null
|
||||
},
|
||||
"level": "warning",
|
||||
"spans": [
|
||||
{
|
||||
"file_name": "$DIR/unused_parens_json_suggestion.rs",
|
||||
"byte_start": 654,
|
||||
"byte_end": 667,
|
||||
"line_start": 17,
|
||||
"line_end": 17,
|
||||
"column_start": 14,
|
||||
"column_end": 27,
|
||||
"is_primary": true,
|
||||
"text": [
|
||||
{
|
||||
"text": " let _a = (1 / (2 + 3));",
|
||||
"highlight_start": 14,
|
||||
"highlight_end": 27
|
||||
}
|
||||
],
|
||||
"label": null,
|
||||
"suggested_replacement": null,
|
||||
"suggestion_applicability": null,
|
||||
"expansion": null
|
||||
}
|
||||
],
|
||||
"children": [
|
||||
{
|
||||
"message": "lint level defined here",
|
||||
"code": null,
|
||||
"level": "note",
|
||||
"spans": [
|
||||
{
|
||||
"file_name": "$DIR/unused_parens_json_suggestion.rs",
|
||||
"byte_start": 472,
|
||||
"byte_end": 485,
|
||||
"line_start": 11,
|
||||
"line_end": 11,
|
||||
"column_start": 9,
|
||||
"column_end": 22,
|
||||
"is_primary": true,
|
||||
"text": [
|
||||
{
|
||||
"text": "#![warn(unused_parens)]",
|
||||
"highlight_start": 9,
|
||||
"highlight_end": 22
|
||||
}
|
||||
],
|
||||
"label": null,
|
||||
"suggested_replacement": null,
|
||||
"suggestion_applicability": null,
|
||||
"expansion": null
|
||||
}
|
||||
],
|
||||
"children": [],
|
||||
"rendered": null
|
||||
},
|
||||
{
|
||||
"message": "remove these parentheses",
|
||||
"code": null,
|
||||
"level": "help",
|
||||
"spans": [
|
||||
{
|
||||
"file_name": "$DIR/unused_parens_json_suggestion.rs",
|
||||
"byte_start": 654,
|
||||
"byte_end": 667,
|
||||
"line_start": 17,
|
||||
"line_end": 17,
|
||||
"column_start": 14,
|
||||
"column_end": 27,
|
||||
"is_primary": true,
|
||||
"text": [
|
||||
{
|
||||
"text": " let _a = (1 / (2 + 3));",
|
||||
"highlight_start": 14,
|
||||
"highlight_end": 27
|
||||
}
|
||||
],
|
||||
"label": null,
|
||||
"suggested_replacement": "1 / (2 + 3)",
|
||||
"suggestion_applicability": "MachineApplicable",
|
||||
"expansion": null
|
||||
}
|
||||
],
|
||||
"children": [],
|
||||
"rendered": null
|
||||
}
|
||||
],
|
||||
"rendered": "warning: unnecessary parentheses around assigned value
|
||||
--> $DIR/unused_parens_json_suggestion.rs:17:14
|
||||
{"message":"unnecessary parentheses around assigned value","code":{"code":"unused_parens","explanation":null},"level":"error","spans":[{"file_name":"$DIR/unused_parens_json_suggestion.rs","byte_start":596,"byte_end":609,"line_start":16,"line_end":16,"column_start":14,"column_end":27,"is_primary":true,"text":[{"text":" let _a = (1 / (2 + 3));
|
||||
--> $DIR/unused_parens_json_suggestion.rs:16:14
|
||||
|
|
||||
LL | let _a = (1 / (2 + 3));
|
||||
| ^^^^^^^^^^^^^ help: remove these parentheses
|
||||
|
|
||||
note: lint level defined here
|
||||
--> $DIR/unused_parens_json_suggestion.rs:11:9
|
||||
--> $DIR/unused_parens_json_suggestion.rs:10:9
|
||||
|
|
||||
LL | #![warn(unused_parens)]
|
||||
LL | #![deny(unused_parens)]
|
||||
| ^^^^^^^^^^^^^
|
||||
|
||||
"
|
||||
}
|
||||
"}
|
||||
{"message":"aborting due to previous error","code":null,"level":"error","spans":[],"children":[],"rendered":"error: aborting due to previous error
|
||||
|
||||
"}
|
||||
|
@ -1,5 +1,4 @@
|
||||
// compile-flags: --error-format pretty-json -Zunstable-options
|
||||
// build-pass
|
||||
// compile-flags: --error-format json -Zunstable-options
|
||||
// run-rustfix
|
||||
|
||||
// The output for humans should just highlight the whole span without showing
|
||||
@ -8,14 +7,14 @@
|
||||
// stripping away any starting or ending parenthesis characters—hence this
|
||||
// test of the JSON error format.
|
||||
|
||||
#![warn(unused_parens)]
|
||||
#![deny(unused_parens)]
|
||||
#![allow(unreachable_code)]
|
||||
|
||||
fn main() {
|
||||
|
||||
let _b = false;
|
||||
|
||||
if _b {
|
||||
if _b { //~ ERROR unnecessary parentheses
|
||||
println!("hello");
|
||||
}
|
||||
|
||||
@ -26,29 +25,29 @@ fn main() {
|
||||
fn f() -> bool {
|
||||
let c = false;
|
||||
|
||||
if c {
|
||||
if c { //~ ERROR unnecessary parentheses
|
||||
println!("next");
|
||||
}
|
||||
|
||||
if c {
|
||||
if c { //~ ERROR unnecessary parentheses
|
||||
println!("prev");
|
||||
}
|
||||
|
||||
while false && true {
|
||||
if c {
|
||||
if c { //~ ERROR unnecessary parentheses
|
||||
println!("norm");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
while true && false {
|
||||
for _ in 0 .. 3 {
|
||||
while true && false { //~ ERROR unnecessary parentheses
|
||||
for _ in 0 .. 3 { //~ ERROR unnecessary parentheses
|
||||
println!("e~")
|
||||
}
|
||||
}
|
||||
|
||||
for _ in 0 .. 3 {
|
||||
while true && false {
|
||||
for _ in 0 .. 3 { //~ ERROR unnecessary parentheses
|
||||
while true && false { //~ ERROR unnecessary parentheses
|
||||
println!("e~")
|
||||
}
|
||||
}
|
||||
|
@ -1,5 +1,4 @@
|
||||
// compile-flags: --error-format pretty-json -Zunstable-options
|
||||
// build-pass
|
||||
// compile-flags: --error-format json -Zunstable-options
|
||||
// run-rustfix
|
||||
|
||||
// The output for humans should just highlight the whole span without showing
|
||||
@ -8,14 +7,14 @@
|
||||
// stripping away any starting or ending parenthesis characters—hence this
|
||||
// test of the JSON error format.
|
||||
|
||||
#![warn(unused_parens)]
|
||||
#![deny(unused_parens)]
|
||||
#![allow(unreachable_code)]
|
||||
|
||||
fn main() {
|
||||
|
||||
let _b = false;
|
||||
|
||||
if (_b) {
|
||||
if (_b) { //~ ERROR unnecessary parentheses
|
||||
println!("hello");
|
||||
}
|
||||
|
||||
@ -26,29 +25,29 @@ fn main() {
|
||||
fn f() -> bool {
|
||||
let c = false;
|
||||
|
||||
if(c) {
|
||||
if(c) { //~ ERROR unnecessary parentheses
|
||||
println!("next");
|
||||
}
|
||||
|
||||
if (c){
|
||||
if (c){ //~ ERROR unnecessary parentheses
|
||||
println!("prev");
|
||||
}
|
||||
|
||||
while (false && true){
|
||||
if (c) {
|
||||
if (c) { //~ ERROR unnecessary parentheses
|
||||
println!("norm");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
while(true && false) {
|
||||
for _ in (0 .. 3){
|
||||
while(true && false) { //~ ERROR unnecessary parentheses
|
||||
for _ in (0 .. 3){ //~ ERROR unnecessary parentheses
|
||||
println!("e~")
|
||||
}
|
||||
}
|
||||
|
||||
for _ in (0 .. 3) {
|
||||
while (true && false) {
|
||||
for _ in (0 .. 3) { //~ ERROR unnecessary parentheses
|
||||
while (true && false) { //~ ERROR unnecessary parentheses
|
||||
println!("e~")
|
||||
}
|
||||
}
|
||||
|
@ -1,666 +1,72 @@
|
||||
{
|
||||
"message": "unnecessary parentheses around `if` condition",
|
||||
"code": {
|
||||
"code": "unused_parens",
|
||||
"explanation": null
|
||||
},
|
||||
"level": "warning",
|
||||
"spans": [
|
||||
{
|
||||
"file_name": "$DIR/unused_parens_remove_json_suggestion.rs",
|
||||
"byte_start": 521,
|
||||
"byte_end": 525,
|
||||
"line_start": 18,
|
||||
"line_end": 18,
|
||||
"column_start": 8,
|
||||
"column_end": 12,
|
||||
"is_primary": true,
|
||||
"text": [
|
||||
{
|
||||
"text": " if (_b) {",
|
||||
"highlight_start": 8,
|
||||
"highlight_end": 12
|
||||
}
|
||||
],
|
||||
"label": null,
|
||||
"suggested_replacement": null,
|
||||
"suggestion_applicability": null,
|
||||
"expansion": null
|
||||
}
|
||||
],
|
||||
"children": [
|
||||
{
|
||||
"message": "lint level defined here",
|
||||
"code": null,
|
||||
"level": "note",
|
||||
"spans": [
|
||||
{
|
||||
"file_name": "$DIR/unused_parens_remove_json_suggestion.rs",
|
||||
"byte_start": 435,
|
||||
"byte_end": 448,
|
||||
"line_start": 11,
|
||||
"line_end": 11,
|
||||
"column_start": 9,
|
||||
"column_end": 22,
|
||||
"is_primary": true,
|
||||
"text": [
|
||||
{
|
||||
"text": "#![warn(unused_parens)]",
|
||||
"highlight_start": 9,
|
||||
"highlight_end": 22
|
||||
}
|
||||
],
|
||||
"label": null,
|
||||
"suggested_replacement": null,
|
||||
"suggestion_applicability": null,
|
||||
"expansion": null
|
||||
}
|
||||
],
|
||||
"children": [],
|
||||
"rendered": null
|
||||
},
|
||||
{
|
||||
"message": "remove these parentheses",
|
||||
"code": null,
|
||||
"level": "help",
|
||||
"spans": [
|
||||
{
|
||||
"file_name": "$DIR/unused_parens_remove_json_suggestion.rs",
|
||||
"byte_start": 521,
|
||||
"byte_end": 525,
|
||||
"line_start": 18,
|
||||
"line_end": 18,
|
||||
"column_start": 8,
|
||||
"column_end": 12,
|
||||
"is_primary": true,
|
||||
"text": [
|
||||
{
|
||||
"text": " if (_b) {",
|
||||
"highlight_start": 8,
|
||||
"highlight_end": 12
|
||||
}
|
||||
],
|
||||
"label": null,
|
||||
"suggested_replacement": "_b",
|
||||
"suggestion_applicability": "MachineApplicable",
|
||||
"expansion": null
|
||||
}
|
||||
],
|
||||
"children": [],
|
||||
"rendered": null
|
||||
}
|
||||
],
|
||||
"rendered": "warning: unnecessary parentheses around `if` condition
|
||||
--> $DIR/unused_parens_remove_json_suggestion.rs:18:8
|
||||
{"message":"unnecessary parentheses around `if` condition","code":{"code":"unused_parens","explanation":null},"level":"error","spans":[{"file_name":"$DIR/unused_parens_remove_json_suggestion.rs","byte_start":500,"byte_end":504,"line_start":17,"line_end":17,"column_start":8,"column_end":12,"is_primary":true,"text":[{"text":" if (_b) {
|
||||
--> $DIR/unused_parens_remove_json_suggestion.rs:17:8
|
||||
|
|
||||
LL | if (_b) {
|
||||
| ^^^^ help: remove these parentheses
|
||||
|
|
||||
note: lint level defined here
|
||||
--> $DIR/unused_parens_remove_json_suggestion.rs:11:9
|
||||
--> $DIR/unused_parens_remove_json_suggestion.rs:10:9
|
||||
|
|
||||
LL | #![warn(unused_parens)]
|
||||
LL | #![deny(unused_parens)]
|
||||
| ^^^^^^^^^^^^^
|
||||
|
||||
"
|
||||
}
|
||||
{
|
||||
"message": "unnecessary parentheses around `if` condition",
|
||||
"code": {
|
||||
"code": "unused_parens",
|
||||
"explanation": null
|
||||
},
|
||||
"level": "warning",
|
||||
"spans": [
|
||||
{
|
||||
"file_name": "$DIR/unused_parens_remove_json_suggestion.rs",
|
||||
"byte_start": 618,
|
||||
"byte_end": 621,
|
||||
"line_start": 29,
|
||||
"line_end": 29,
|
||||
"column_start": 7,
|
||||
"column_end": 10,
|
||||
"is_primary": true,
|
||||
"text": [
|
||||
{
|
||||
"text": " if(c) {",
|
||||
"highlight_start": 7,
|
||||
"highlight_end": 10
|
||||
}
|
||||
],
|
||||
"label": null,
|
||||
"suggested_replacement": null,
|
||||
"suggestion_applicability": null,
|
||||
"expansion": null
|
||||
}
|
||||
],
|
||||
"children": [
|
||||
{
|
||||
"message": "remove these parentheses",
|
||||
"code": null,
|
||||
"level": "help",
|
||||
"spans": [
|
||||
{
|
||||
"file_name": "$DIR/unused_parens_remove_json_suggestion.rs",
|
||||
"byte_start": 618,
|
||||
"byte_end": 621,
|
||||
"line_start": 29,
|
||||
"line_end": 29,
|
||||
"column_start": 7,
|
||||
"column_end": 10,
|
||||
"is_primary": true,
|
||||
"text": [
|
||||
{
|
||||
"text": " if(c) {",
|
||||
"highlight_start": 7,
|
||||
"highlight_end": 10
|
||||
}
|
||||
],
|
||||
"label": null,
|
||||
"suggested_replacement": " c",
|
||||
"suggestion_applicability": "MachineApplicable",
|
||||
"expansion": null
|
||||
}
|
||||
],
|
||||
"children": [],
|
||||
"rendered": null
|
||||
}
|
||||
],
|
||||
"rendered": "warning: unnecessary parentheses around `if` condition
|
||||
--> $DIR/unused_parens_remove_json_suggestion.rs:29:7
|
||||
"}
|
||||
{"message":"unnecessary parentheses around `if` condition","code":{"code":"unused_parens","explanation":null},"level":"error","spans":[{"file_name":"$DIR/unused_parens_remove_json_suggestion.rs","byte_start":631,"byte_end":634,"line_start":28,"line_end":28,"column_start":7,"column_end":10,"is_primary":true,"text":[{"text":" if(c) {
|
||||
--> $DIR/unused_parens_remove_json_suggestion.rs:28:7
|
||||
|
|
||||
LL | if(c) {
|
||||
| ^^^ help: remove these parentheses
|
||||
|
||||
"
|
||||
}
|
||||
{
|
||||
"message": "unnecessary parentheses around `if` condition",
|
||||
"code": {
|
||||
"code": "unused_parens",
|
||||
"explanation": null
|
||||
},
|
||||
"level": "warning",
|
||||
"spans": [
|
||||
{
|
||||
"file_name": "$DIR/unused_parens_remove_json_suggestion.rs",
|
||||
"byte_start": 664,
|
||||
"byte_end": 667,
|
||||
"line_start": 33,
|
||||
"line_end": 33,
|
||||
"column_start": 8,
|
||||
"column_end": 11,
|
||||
"is_primary": true,
|
||||
"text": [
|
||||
{
|
||||
"text": " if (c){",
|
||||
"highlight_start": 8,
|
||||
"highlight_end": 11
|
||||
}
|
||||
],
|
||||
"label": null,
|
||||
"suggested_replacement": null,
|
||||
"suggestion_applicability": null,
|
||||
"expansion": null
|
||||
}
|
||||
],
|
||||
"children": [
|
||||
{
|
||||
"message": "remove these parentheses",
|
||||
"code": null,
|
||||
"level": "help",
|
||||
"spans": [
|
||||
{
|
||||
"file_name": "$DIR/unused_parens_remove_json_suggestion.rs",
|
||||
"byte_start": 664,
|
||||
"byte_end": 667,
|
||||
"line_start": 33,
|
||||
"line_end": 33,
|
||||
"column_start": 8,
|
||||
"column_end": 11,
|
||||
"is_primary": true,
|
||||
"text": [
|
||||
{
|
||||
"text": " if (c){",
|
||||
"highlight_start": 8,
|
||||
"highlight_end": 11
|
||||
}
|
||||
],
|
||||
"label": null,
|
||||
"suggested_replacement": "c ",
|
||||
"suggestion_applicability": "MachineApplicable",
|
||||
"expansion": null
|
||||
}
|
||||
],
|
||||
"children": [],
|
||||
"rendered": null
|
||||
}
|
||||
],
|
||||
"rendered": "warning: unnecessary parentheses around `if` condition
|
||||
--> $DIR/unused_parens_remove_json_suggestion.rs:33:8
|
||||
"}
|
||||
{"message":"unnecessary parentheses around `if` condition","code":{"code":"unused_parens","explanation":null},"level":"error","spans":[{"file_name":"$DIR/unused_parens_remove_json_suggestion.rs","byte_start":711,"byte_end":714,"line_start":32,"line_end":32,"column_start":8,"column_end":11,"is_primary":true,"text":[{"text":" if (c){
|
||||
--> $DIR/unused_parens_remove_json_suggestion.rs:32:8
|
||||
|
|
||||
LL | if (c){
|
||||
| ^^^ help: remove these parentheses
|
||||
|
||||
"
|
||||
}
|
||||
{
|
||||
"message": "unnecessary parentheses around `while` condition",
|
||||
"code": {
|
||||
"code": "unused_parens",
|
||||
"explanation": null
|
||||
},
|
||||
"level": "warning",
|
||||
"spans": [
|
||||
{
|
||||
"file_name": "$DIR/unused_parens_remove_json_suggestion.rs",
|
||||
"byte_start": 712,
|
||||
"byte_end": 727,
|
||||
"line_start": 37,
|
||||
"line_end": 37,
|
||||
"column_start": 11,
|
||||
"column_end": 26,
|
||||
"is_primary": true,
|
||||
"text": [
|
||||
{
|
||||
"text": " while (false && true){",
|
||||
"highlight_start": 11,
|
||||
"highlight_end": 26
|
||||
}
|
||||
],
|
||||
"label": null,
|
||||
"suggested_replacement": null,
|
||||
"suggestion_applicability": null,
|
||||
"expansion": null
|
||||
}
|
||||
],
|
||||
"children": [
|
||||
{
|
||||
"message": "remove these parentheses",
|
||||
"code": null,
|
||||
"level": "help",
|
||||
"spans": [
|
||||
{
|
||||
"file_name": "$DIR/unused_parens_remove_json_suggestion.rs",
|
||||
"byte_start": 712,
|
||||
"byte_end": 727,
|
||||
"line_start": 37,
|
||||
"line_end": 37,
|
||||
"column_start": 11,
|
||||
"column_end": 26,
|
||||
"is_primary": true,
|
||||
"text": [
|
||||
{
|
||||
"text": " while (false && true){",
|
||||
"highlight_start": 11,
|
||||
"highlight_end": 26
|
||||
}
|
||||
],
|
||||
"label": null,
|
||||
"suggested_replacement": "false && true ",
|
||||
"suggestion_applicability": "MachineApplicable",
|
||||
"expansion": null
|
||||
}
|
||||
],
|
||||
"children": [],
|
||||
"rendered": null
|
||||
}
|
||||
],
|
||||
"rendered": "warning: unnecessary parentheses around `while` condition
|
||||
--> $DIR/unused_parens_remove_json_suggestion.rs:37:11
|
||||
"}
|
||||
{"message":"unnecessary parentheses around `while` condition","code":{"code":"unused_parens","explanation":null},"level":"error","spans":[{"file_name":"$DIR/unused_parens_remove_json_suggestion.rs","byte_start":793,"byte_end":808,"line_start":36,"line_end":36,"column_start":11,"column_end":26,"is_primary":true,"text":[{"text":" while (false && true){","highlight_start":11,"highlight_end":26}],"label":null,"suggested_replacement":null,"suggestion_applicability":null,"expansion":null}],"children":[{"message":"remove these parentheses","code":null,"level":"help","spans":[{"file_name":"$DIR/unused_parens_remove_json_suggestion.rs","byte_start":793,"byte_end":808,"line_start":36,"line_end":36,"column_start":11,"column_end":26,"is_primary":true,"text":[{"text":" while (false && true){","highlight_start":11,"highlight_end":26}],"label":null,"suggested_replacement":"false && true ","suggestion_applicability":"MachineApplicable","expansion":null}],"children":[],"rendered":null}],"rendered":"error: unnecessary parentheses around `while` condition
|
||||
--> $DIR/unused_parens_remove_json_suggestion.rs:36:11
|
||||
|
|
||||
LL | while (false && true){
|
||||
| ^^^^^^^^^^^^^^^ help: remove these parentheses
|
||||
|
||||
"
|
||||
}
|
||||
{
|
||||
"message": "unnecessary parentheses around `if` condition",
|
||||
"code": {
|
||||
"code": "unused_parens",
|
||||
"explanation": null
|
||||
},
|
||||
"level": "warning",
|
||||
"spans": [
|
||||
{
|
||||
"file_name": "$DIR/unused_parens_remove_json_suggestion.rs",
|
||||
"byte_start": 740,
|
||||
"byte_end": 743,
|
||||
"line_start": 38,
|
||||
"line_end": 38,
|
||||
"column_start": 12,
|
||||
"column_end": 15,
|
||||
"is_primary": true,
|
||||
"text": [
|
||||
{
|
||||
"text": " if (c) {",
|
||||
"highlight_start": 12,
|
||||
"highlight_end": 15
|
||||
}
|
||||
],
|
||||
"label": null,
|
||||
"suggested_replacement": null,
|
||||
"suggestion_applicability": null,
|
||||
"expansion": null
|
||||
}
|
||||
],
|
||||
"children": [
|
||||
{
|
||||
"message": "remove these parentheses",
|
||||
"code": null,
|
||||
"level": "help",
|
||||
"spans": [
|
||||
{
|
||||
"file_name": "$DIR/unused_parens_remove_json_suggestion.rs",
|
||||
"byte_start": 740,
|
||||
"byte_end": 743,
|
||||
"line_start": 38,
|
||||
"line_end": 38,
|
||||
"column_start": 12,
|
||||
"column_end": 15,
|
||||
"is_primary": true,
|
||||
"text": [
|
||||
{
|
||||
"text": " if (c) {",
|
||||
"highlight_start": 12,
|
||||
"highlight_end": 15
|
||||
}
|
||||
],
|
||||
"label": null,
|
||||
"suggested_replacement": "c",
|
||||
"suggestion_applicability": "MachineApplicable",
|
||||
"expansion": null
|
||||
}
|
||||
],
|
||||
"children": [],
|
||||
"rendered": null
|
||||
}
|
||||
],
|
||||
"rendered": "warning: unnecessary parentheses around `if` condition
|
||||
--> $DIR/unused_parens_remove_json_suggestion.rs:38:12
|
||||
"}
|
||||
{"message":"unnecessary parentheses around `if` condition","code":{"code":"unused_parens","explanation":null},"level":"error","spans":[{"file_name":"$DIR/unused_parens_remove_json_suggestion.rs","byte_start":821,"byte_end":824,"line_start":37,"line_end":37,"column_start":12,"column_end":15,"is_primary":true,"text":[{"text":" if (c) {
|
||||
--> $DIR/unused_parens_remove_json_suggestion.rs:37:12
|
||||
|
|
||||
LL | if (c) {
|
||||
| ^^^ help: remove these parentheses
|
||||
|
||||
"
|
||||
}
|
||||
{
|
||||
"message": "unnecessary parentheses around `while` condition",
|
||||
"code": {
|
||||
"code": "unused_parens",
|
||||
"explanation": null
|
||||
},
|
||||
"level": "warning",
|
||||
"spans": [
|
||||
{
|
||||
"file_name": "$DIR/unused_parens_remove_json_suggestion.rs",
|
||||
"byte_start": 803,
|
||||
"byte_end": 818,
|
||||
"line_start": 44,
|
||||
"line_end": 44,
|
||||
"column_start": 10,
|
||||
"column_end": 25,
|
||||
"is_primary": true,
|
||||
"text": [
|
||||
{
|
||||
"text": " while(true && false) {",
|
||||
"highlight_start": 10,
|
||||
"highlight_end": 25
|
||||
}
|
||||
],
|
||||
"label": null,
|
||||
"suggested_replacement": null,
|
||||
"suggestion_applicability": null,
|
||||
"expansion": null
|
||||
}
|
||||
],
|
||||
"children": [
|
||||
{
|
||||
"message": "remove these parentheses",
|
||||
"code": null,
|
||||
"level": "help",
|
||||
"spans": [
|
||||
{
|
||||
"file_name": "$DIR/unused_parens_remove_json_suggestion.rs",
|
||||
"byte_start": 803,
|
||||
"byte_end": 818,
|
||||
"line_start": 44,
|
||||
"line_end": 44,
|
||||
"column_start": 10,
|
||||
"column_end": 25,
|
||||
"is_primary": true,
|
||||
"text": [
|
||||
{
|
||||
"text": " while(true && false) {",
|
||||
"highlight_start": 10,
|
||||
"highlight_end": 25
|
||||
}
|
||||
],
|
||||
"label": null,
|
||||
"suggested_replacement": " true && false",
|
||||
"suggestion_applicability": "MachineApplicable",
|
||||
"expansion": null
|
||||
}
|
||||
],
|
||||
"children": [],
|
||||
"rendered": null
|
||||
}
|
||||
],
|
||||
"rendered": "warning: unnecessary parentheses around `while` condition
|
||||
--> $DIR/unused_parens_remove_json_suggestion.rs:44:10
|
||||
"}
|
||||
{"message":"unnecessary parentheses around `while` condition","code":{"code":"unused_parens","explanation":null},"level":"error","spans":[{"file_name":"$DIR/unused_parens_remove_json_suggestion.rs","byte_start":918,"byte_end":933,"line_start":43,"line_end":43,"column_start":10,"column_end":25,"is_primary":true,"text":[{"text":" while(true && false) {
|
||||
--> $DIR/unused_parens_remove_json_suggestion.rs:43:10
|
||||
|
|
||||
LL | while(true && false) {
|
||||
| ^^^^^^^^^^^^^^^ help: remove these parentheses
|
||||
|
||||
"
|
||||
}
|
||||
{
|
||||
"message": "unnecessary parentheses around `for` head expression",
|
||||
"code": {
|
||||
"code": "unused_parens",
|
||||
"explanation": null
|
||||
},
|
||||
"level": "warning",
|
||||
"spans": [
|
||||
{
|
||||
"file_name": "$DIR/unused_parens_remove_json_suggestion.rs",
|
||||
"byte_start": 838,
|
||||
"byte_end": 846,
|
||||
"line_start": 45,
|
||||
"line_end": 45,
|
||||
"column_start": 18,
|
||||
"column_end": 26,
|
||||
"is_primary": true,
|
||||
"text": [
|
||||
{
|
||||
"text": " for _ in (0 .. 3){",
|
||||
"highlight_start": 18,
|
||||
"highlight_end": 26
|
||||
}
|
||||
],
|
||||
"label": null,
|
||||
"suggested_replacement": null,
|
||||
"suggestion_applicability": null,
|
||||
"expansion": null
|
||||
}
|
||||
],
|
||||
"children": [
|
||||
{
|
||||
"message": "remove these parentheses",
|
||||
"code": null,
|
||||
"level": "help",
|
||||
"spans": [
|
||||
{
|
||||
"file_name": "$DIR/unused_parens_remove_json_suggestion.rs",
|
||||
"byte_start": 838,
|
||||
"byte_end": 846,
|
||||
"line_start": 45,
|
||||
"line_end": 45,
|
||||
"column_start": 18,
|
||||
"column_end": 26,
|
||||
"is_primary": true,
|
||||
"text": [
|
||||
{
|
||||
"text": " for _ in (0 .. 3){",
|
||||
"highlight_start": 18,
|
||||
"highlight_end": 26
|
||||
}
|
||||
],
|
||||
"label": null,
|
||||
"suggested_replacement": "0 .. 3 ",
|
||||
"suggestion_applicability": "MachineApplicable",
|
||||
"expansion": null
|
||||
}
|
||||
],
|
||||
"children": [],
|
||||
"rendered": null
|
||||
}
|
||||
],
|
||||
"rendered": "warning: unnecessary parentheses around `for` head expression
|
||||
--> $DIR/unused_parens_remove_json_suggestion.rs:45:18
|
||||
"}
|
||||
{"message":"unnecessary parentheses around `for` head expression","code":{"code":"unused_parens","explanation":null},"level":"error","spans":[{"file_name":"$DIR/unused_parens_remove_json_suggestion.rs","byte_start":987,"byte_end":995,"line_start":44,"line_end":44,"column_start":18,"column_end":26,"is_primary":true,"text":[{"text":" for _ in (0 .. 3){
|
||||
--> $DIR/unused_parens_remove_json_suggestion.rs:44:18
|
||||
|
|
||||
LL | for _ in (0 .. 3){
|
||||
| ^^^^^^^^ help: remove these parentheses
|
||||
|
||||
"
|
||||
}
|
||||
{
|
||||
"message": "unnecessary parentheses around `for` head expression",
|
||||
"code": {
|
||||
"code": "unused_parens",
|
||||
"explanation": null
|
||||
},
|
||||
"level": "warning",
|
||||
"spans": [
|
||||
{
|
||||
"file_name": "$DIR/unused_parens_remove_json_suggestion.rs",
|
||||
"byte_start": 905,
|
||||
"byte_end": 913,
|
||||
"line_start": 50,
|
||||
"line_end": 50,
|
||||
"column_start": 14,
|
||||
"column_end": 22,
|
||||
"is_primary": true,
|
||||
"text": [
|
||||
{
|
||||
"text": " for _ in (0 .. 3) {",
|
||||
"highlight_start": 14,
|
||||
"highlight_end": 22
|
||||
}
|
||||
],
|
||||
"label": null,
|
||||
"suggested_replacement": null,
|
||||
"suggestion_applicability": null,
|
||||
"expansion": null
|
||||
}
|
||||
],
|
||||
"children": [
|
||||
{
|
||||
"message": "remove these parentheses",
|
||||
"code": null,
|
||||
"level": "help",
|
||||
"spans": [
|
||||
{
|
||||
"file_name": "$DIR/unused_parens_remove_json_suggestion.rs",
|
||||
"byte_start": 905,
|
||||
"byte_end": 913,
|
||||
"line_start": 50,
|
||||
"line_end": 50,
|
||||
"column_start": 14,
|
||||
"column_end": 22,
|
||||
"is_primary": true,
|
||||
"text": [
|
||||
{
|
||||
"text": " for _ in (0 .. 3) {",
|
||||
"highlight_start": 14,
|
||||
"highlight_end": 22
|
||||
}
|
||||
],
|
||||
"label": null,
|
||||
"suggested_replacement": "0 .. 3",
|
||||
"suggestion_applicability": "MachineApplicable",
|
||||
"expansion": null
|
||||
}
|
||||
],
|
||||
"children": [],
|
||||
"rendered": null
|
||||
}
|
||||
],
|
||||
"rendered": "warning: unnecessary parentheses around `for` head expression
|
||||
--> $DIR/unused_parens_remove_json_suggestion.rs:50:14
|
||||
"}
|
||||
{"message":"unnecessary parentheses around `for` head expression","code":{"code":"unused_parens","explanation":null},"level":"error","spans":[{"file_name":"$DIR/unused_parens_remove_json_suggestion.rs","byte_start":1088,"byte_end":1096,"line_start":49,"line_end":49,"column_start":14,"column_end":22,"is_primary":true,"text":[{"text":" for _ in (0 .. 3) {
|
||||
--> $DIR/unused_parens_remove_json_suggestion.rs:49:14
|
||||
|
|
||||
LL | for _ in (0 .. 3) {
|
||||
| ^^^^^^^^ help: remove these parentheses
|
||||
|
||||
"
|
||||
}
|
||||
{
|
||||
"message": "unnecessary parentheses around `while` condition",
|
||||
"code": {
|
||||
"code": "unused_parens",
|
||||
"explanation": null
|
||||
},
|
||||
"level": "warning",
|
||||
"spans": [
|
||||
{
|
||||
"file_name": "$DIR/unused_parens_remove_json_suggestion.rs",
|
||||
"byte_start": 930,
|
||||
"byte_end": 945,
|
||||
"line_start": 51,
|
||||
"line_end": 51,
|
||||
"column_start": 15,
|
||||
"column_end": 30,
|
||||
"is_primary": true,
|
||||
"text": [
|
||||
{
|
||||
"text": " while (true && false) {",
|
||||
"highlight_start": 15,
|
||||
"highlight_end": 30
|
||||
}
|
||||
],
|
||||
"label": null,
|
||||
"suggested_replacement": null,
|
||||
"suggestion_applicability": null,
|
||||
"expansion": null
|
||||
}
|
||||
],
|
||||
"children": [
|
||||
{
|
||||
"message": "remove these parentheses",
|
||||
"code": null,
|
||||
"level": "help",
|
||||
"spans": [
|
||||
{
|
||||
"file_name": "$DIR/unused_parens_remove_json_suggestion.rs",
|
||||
"byte_start": 930,
|
||||
"byte_end": 945,
|
||||
"line_start": 51,
|
||||
"line_end": 51,
|
||||
"column_start": 15,
|
||||
"column_end": 30,
|
||||
"is_primary": true,
|
||||
"text": [
|
||||
{
|
||||
"text": " while (true && false) {",
|
||||
"highlight_start": 15,
|
||||
"highlight_end": 30
|
||||
}
|
||||
],
|
||||
"label": null,
|
||||
"suggested_replacement": "true && false",
|
||||
"suggestion_applicability": "MachineApplicable",
|
||||
"expansion": null
|
||||
}
|
||||
],
|
||||
"children": [],
|
||||
"rendered": null
|
||||
}
|
||||
],
|
||||
"rendered": "warning: unnecessary parentheses around `while` condition
|
||||
--> $DIR/unused_parens_remove_json_suggestion.rs:51:15
|
||||
"}
|
||||
{"message":"unnecessary parentheses around `while` condition","code":{"code":"unused_parens","explanation":null},"level":"error","spans":[{"file_name":"$DIR/unused_parens_remove_json_suggestion.rs","byte_start":1147,"byte_end":1162,"line_start":50,"line_end":50,"column_start":15,"column_end":30,"is_primary":true,"text":[{"text":" while (true && false) {
|
||||
--> $DIR/unused_parens_remove_json_suggestion.rs:50:15
|
||||
|
|
||||
LL | while (true && false) {
|
||||
| ^^^^^^^^^^^^^^^ help: remove these parentheses
|
||||
|
||||
"
|
||||
}
|
||||
"}
|
||||
{"message":"aborting due to 9 previous errors","code":null,"level":"error","spans":[],"children":[],"rendered":"error: aborting due to 9 previous errors
|
||||
|
||||
"}
|
||||
|
@ -56,3 +56,4 @@ LL | | }
|
||||
|
||||
error: aborting due to 8 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0588`.
|
||||
|
Loading…
x
Reference in New Issue
Block a user