mirror of
https://github.com/rust-lang/rust.git
synced 2025-05-14 02:49:40 +00:00
Auto merge of #108640 - matthiaskrgr:rollup-rii4t5t, r=matthiaskrgr
Rollup of 5 pull requests Successful merges: - #108516 (Restrict `#[rustc_box]` to `Box::new` calls) - #108575 (Erase **all** regions when probing for associated types on ambiguity in astconv) - #108585 (Run compiler test suite in parallel on Fuchsia) - #108606 (Add test case for mismatched open/close delims) - #108609 (Highlight whole expression for E0599) Failed merges: r? `@ghost` `@rustbot` modify labels: rollup
This commit is contained in:
commit
7e966bcd03
@ -22,9 +22,6 @@ ast_lowering_misplaced_impl_trait =
|
|||||||
ast_lowering_misplaced_assoc_ty_binding =
|
ast_lowering_misplaced_assoc_ty_binding =
|
||||||
associated type bounds are only allowed in where clauses and function signatures, not in {$position}
|
associated type bounds are only allowed in where clauses and function signatures, not in {$position}
|
||||||
|
|
||||||
ast_lowering_rustc_box_attribute_error =
|
|
||||||
#[rustc_box] requires precisely one argument and no other attributes are allowed
|
|
||||||
|
|
||||||
ast_lowering_underscore_expr_lhs_assign =
|
ast_lowering_underscore_expr_lhs_assign =
|
||||||
in expressions, `_` can only be used on the left-hand side of an assignment
|
in expressions, `_` can only be used on the left-hand side of an assignment
|
||||||
.label = `_` not allowed here
|
.label = `_` not allowed here
|
||||||
|
@ -87,13 +87,6 @@ pub struct MisplacedAssocTyBinding<'a> {
|
|||||||
pub position: DiagnosticArgFromDisplay<'a>,
|
pub position: DiagnosticArgFromDisplay<'a>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Diagnostic, Clone, Copy)]
|
|
||||||
#[diag(ast_lowering_rustc_box_attribute_error)]
|
|
||||||
pub struct RustcBoxAttributeError {
|
|
||||||
#[primary_span]
|
|
||||||
pub span: Span,
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Diagnostic, Clone, Copy)]
|
#[derive(Diagnostic, Clone, Copy)]
|
||||||
#[diag(ast_lowering_underscore_expr_lhs_assign)]
|
#[diag(ast_lowering_underscore_expr_lhs_assign)]
|
||||||
pub struct UnderscoreExprLhsAssign {
|
pub struct UnderscoreExprLhsAssign {
|
||||||
|
@ -2,7 +2,7 @@ use super::errors::{
|
|||||||
AsyncGeneratorsNotSupported, AsyncNonMoveClosureNotSupported, AwaitOnlyInAsyncFnAndBlocks,
|
AsyncGeneratorsNotSupported, AsyncNonMoveClosureNotSupported, AwaitOnlyInAsyncFnAndBlocks,
|
||||||
BaseExpressionDoubleDot, ClosureCannotBeStatic, FunctionalRecordUpdateDestructuringAssignemnt,
|
BaseExpressionDoubleDot, ClosureCannotBeStatic, FunctionalRecordUpdateDestructuringAssignemnt,
|
||||||
GeneratorTooManyParameters, InclusiveRangeWithNoEnd, NotSupportedForLifetimeBinderAsyncClosure,
|
GeneratorTooManyParameters, InclusiveRangeWithNoEnd, NotSupportedForLifetimeBinderAsyncClosure,
|
||||||
RustcBoxAttributeError, UnderscoreExprLhsAssign,
|
UnderscoreExprLhsAssign,
|
||||||
};
|
};
|
||||||
use super::ResolverAstLoweringExt;
|
use super::ResolverAstLoweringExt;
|
||||||
use super::{ImplTraitContext, LoweringContext, ParamMode, ParenthesizedGenericArgs};
|
use super::{ImplTraitContext, LoweringContext, ParamMode, ParenthesizedGenericArgs};
|
||||||
@ -83,15 +83,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
|
|||||||
}
|
}
|
||||||
ExprKind::Tup(elts) => hir::ExprKind::Tup(self.lower_exprs(elts)),
|
ExprKind::Tup(elts) => hir::ExprKind::Tup(self.lower_exprs(elts)),
|
||||||
ExprKind::Call(f, args) => {
|
ExprKind::Call(f, args) => {
|
||||||
if e.attrs.get(0).map_or(false, |a| a.has_name(sym::rustc_box)) {
|
if let Some(legacy_args) = self.resolver.legacy_const_generic_args(f) {
|
||||||
if let [inner] = &args[..] && e.attrs.len() == 1 {
|
|
||||||
let kind = hir::ExprKind::Box(self.lower_expr(&inner));
|
|
||||||
return hir::Expr { hir_id, kind, span: self.lower_span(e.span) };
|
|
||||||
} else {
|
|
||||||
let guar = self.tcx.sess.emit_err(RustcBoxAttributeError { span: e.span });
|
|
||||||
hir::ExprKind::Err(guar)
|
|
||||||
}
|
|
||||||
} else if let Some(legacy_args) = self.resolver.legacy_const_generic_args(f) {
|
|
||||||
self.lower_legacy_const_generics((**f).clone(), args.clone(), &legacy_args)
|
self.lower_legacy_const_generics((**f).clone(), args.clone(), &legacy_args)
|
||||||
} else {
|
} else {
|
||||||
let f = self.lower_expr(f);
|
let f = self.lower_expr(f);
|
||||||
|
@ -2399,8 +2399,10 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
|
|||||||
infcx
|
infcx
|
||||||
.can_eq(
|
.can_eq(
|
||||||
ty::ParamEnv::empty(),
|
ty::ParamEnv::empty(),
|
||||||
tcx.erase_regions(impl_.self_ty()),
|
impl_.self_ty(),
|
||||||
tcx.erase_regions(qself_ty),
|
// Must fold past escaping bound vars too,
|
||||||
|
// since we have those at this point in astconv.
|
||||||
|
tcx.fold_regions(qself_ty, |_, _| tcx.lifetimes.re_erased),
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
&& tcx.impl_polarity(impl_def_id) != ty::ImplPolarity::Negative
|
&& tcx.impl_polarity(impl_def_id) != ty::ImplPolarity::Negative
|
||||||
|
@ -333,6 +333,9 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
|||||||
rcvr_ty.prefix_string(self.tcx),
|
rcvr_ty.prefix_string(self.tcx),
|
||||||
ty_str_reported,
|
ty_str_reported,
|
||||||
);
|
);
|
||||||
|
if tcx.sess.source_map().is_multiline(sugg_span) {
|
||||||
|
err.span_label(sugg_span.with_hi(span.lo()), "");
|
||||||
|
}
|
||||||
let ty_str = if short_ty_str.len() < ty_str.len() && ty_str.len() > 10 {
|
let ty_str = if short_ty_str.len() < ty_str.len() && ty_str.len() > 10 {
|
||||||
short_ty_str
|
short_ty_str
|
||||||
} else {
|
} else {
|
||||||
|
@ -374,3 +374,9 @@ mir_build_suggest_let_else = you might want to use `let else` to handle the {$co
|
|||||||
} matched
|
} matched
|
||||||
|
|
||||||
mir_build_suggest_attempted_int_lit = alternatively, you could prepend the pattern with an underscore to define a new named variable; identifiers cannot begin with digits
|
mir_build_suggest_attempted_int_lit = alternatively, you could prepend the pattern with an underscore to define a new named variable; identifiers cannot begin with digits
|
||||||
|
|
||||||
|
|
||||||
|
mir_build_rustc_box_attribute_error = `#[rustc_box]` attribute used incorrectly
|
||||||
|
.attributes = no other attributes may be applied
|
||||||
|
.not_box = `#[rustc_box]` may only be applied to a `Box::new()` call
|
||||||
|
.missing_box = `#[rustc_box]` requires the `owned_box` lang item
|
||||||
|
@ -888,3 +888,22 @@ pub enum MiscPatternSuggestion {
|
|||||||
start_span: Span,
|
start_span: Span,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Diagnostic)]
|
||||||
|
#[diag(mir_build_rustc_box_attribute_error)]
|
||||||
|
pub struct RustcBoxAttributeError {
|
||||||
|
#[primary_span]
|
||||||
|
pub span: Span,
|
||||||
|
#[subdiagnostic]
|
||||||
|
pub reason: RustcBoxAttrReason,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Subdiagnostic)]
|
||||||
|
pub enum RustcBoxAttrReason {
|
||||||
|
#[note(mir_build_attributes)]
|
||||||
|
Attributes,
|
||||||
|
#[note(mir_build_not_box)]
|
||||||
|
NotBoxNew,
|
||||||
|
#[note(mir_build_missing_box)]
|
||||||
|
MissingBox,
|
||||||
|
}
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
use crate::errors;
|
||||||
use crate::thir::cx::region::Scope;
|
use crate::thir::cx::region::Scope;
|
||||||
use crate::thir::cx::Cx;
|
use crate::thir::cx::Cx;
|
||||||
use crate::thir::util::UserAnnotatedTyHelpers;
|
use crate::thir::util::UserAnnotatedTyHelpers;
|
||||||
@ -18,7 +19,7 @@ use rustc_middle::ty::subst::InternalSubsts;
|
|||||||
use rustc_middle::ty::{
|
use rustc_middle::ty::{
|
||||||
self, AdtKind, InlineConstSubsts, InlineConstSubstsParts, ScalarInt, Ty, UpvarSubsts, UserType,
|
self, AdtKind, InlineConstSubsts, InlineConstSubstsParts, ScalarInt, Ty, UpvarSubsts, UserType,
|
||||||
};
|
};
|
||||||
use rustc_span::Span;
|
use rustc_span::{sym, Span};
|
||||||
use rustc_target::abi::VariantIdx;
|
use rustc_target::abi::VariantIdx;
|
||||||
|
|
||||||
impl<'tcx> Cx<'tcx> {
|
impl<'tcx> Cx<'tcx> {
|
||||||
@ -262,6 +263,7 @@ impl<'tcx> Cx<'tcx> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[instrument(level = "debug", skip(self), ret)]
|
||||||
fn make_mirror_unadjusted(&mut self, expr: &'tcx hir::Expr<'tcx>) -> Expr<'tcx> {
|
fn make_mirror_unadjusted(&mut self, expr: &'tcx hir::Expr<'tcx>) -> Expr<'tcx> {
|
||||||
let tcx = self.tcx;
|
let tcx = self.tcx;
|
||||||
let expr_ty = self.typeck_results().expr_ty(expr);
|
let expr_ty = self.typeck_results().expr_ty(expr);
|
||||||
@ -322,6 +324,34 @@ impl<'tcx> Cx<'tcx> {
|
|||||||
fn_span: expr.span,
|
fn_span: expr.span,
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
let attrs = tcx.hir().attrs(expr.hir_id);
|
||||||
|
if attrs.iter().any(|a| a.name_or_empty() == sym::rustc_box) {
|
||||||
|
if attrs.len() != 1 {
|
||||||
|
tcx.sess.emit_err(errors::RustcBoxAttributeError {
|
||||||
|
span: attrs[0].span,
|
||||||
|
reason: errors::RustcBoxAttrReason::Attributes,
|
||||||
|
});
|
||||||
|
} else if let Some(box_item) = tcx.lang_items().owned_box() {
|
||||||
|
if let hir::ExprKind::Path(hir::QPath::TypeRelative(ty, fn_path)) = fun.kind
|
||||||
|
&& let hir::TyKind::Path(hir::QPath::Resolved(_, path)) = ty.kind
|
||||||
|
&& path.res.opt_def_id().map_or(false, |did| did == box_item)
|
||||||
|
&& fn_path.ident.name == sym::new
|
||||||
|
&& let [value] = args
|
||||||
|
{
|
||||||
|
return Expr { temp_lifetime, ty: expr_ty, span: expr.span, kind: ExprKind::Box { value: self.mirror_expr(value) } }
|
||||||
|
} else {
|
||||||
|
tcx.sess.emit_err(errors::RustcBoxAttributeError {
|
||||||
|
span: expr.span,
|
||||||
|
reason: errors::RustcBoxAttrReason::NotBoxNew
|
||||||
|
});
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
tcx.sess.emit_err(errors::RustcBoxAttributeError {
|
||||||
|
span: attrs[0].span,
|
||||||
|
reason: errors::RustcBoxAttrReason::MissingBox,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
let adt_data =
|
let adt_data =
|
||||||
if let hir::ExprKind::Path(hir::QPath::Resolved(_, ref path)) = fun.kind {
|
if let hir::ExprKind::Path(hir::QPath::Resolved(_, ref path)) = fun.kind {
|
||||||
// Tuple-like ADTs are represented as ExprKind::Call. We convert them here.
|
// Tuple-like ADTs are represented as ExprKind::Call. We convert them here.
|
||||||
|
@ -9,6 +9,7 @@ https://doc.rust-lang.org/stable/rustc/platform-support/fuchsia.html#aarch64-unk
|
|||||||
|
|
||||||
import argparse
|
import argparse
|
||||||
from dataclasses import dataclass
|
from dataclasses import dataclass
|
||||||
|
import fcntl
|
||||||
import glob
|
import glob
|
||||||
import hashlib
|
import hashlib
|
||||||
import json
|
import json
|
||||||
@ -146,6 +147,9 @@ class TestEnvironment:
|
|||||||
def zxdb_script_path(self):
|
def zxdb_script_path(self):
|
||||||
return os.path.join(self.tmp_dir(), "zxdb_script")
|
return os.path.join(self.tmp_dir(), "zxdb_script")
|
||||||
|
|
||||||
|
def pm_lockfile_path(self):
|
||||||
|
return os.path.join(self.tmp_dir(), "pm.lock")
|
||||||
|
|
||||||
def log_info(self, msg):
|
def log_info(self, msg):
|
||||||
print(msg)
|
print(msg)
|
||||||
|
|
||||||
@ -460,6 +464,9 @@ class TestEnvironment:
|
|||||||
stderr=self.subprocess_output(),
|
stderr=self.subprocess_output(),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# Create lockfiles
|
||||||
|
open(self.pm_lockfile_path(), 'a').close()
|
||||||
|
|
||||||
# Write to file
|
# Write to file
|
||||||
self.write_to_file()
|
self.write_to_file()
|
||||||
|
|
||||||
@ -676,19 +683,25 @@ class TestEnvironment:
|
|||||||
log("Publishing package to repo...")
|
log("Publishing package to repo...")
|
||||||
|
|
||||||
# Publish package to repo
|
# Publish package to repo
|
||||||
subprocess.check_call(
|
with open(self.pm_lockfile_path(), 'w') as pm_lockfile:
|
||||||
[
|
fcntl.lockf(pm_lockfile.fileno(), fcntl.LOCK_EX)
|
||||||
self.tool_path("pm"),
|
subprocess.check_call(
|
||||||
"publish",
|
[
|
||||||
"-a",
|
self.tool_path("pm"),
|
||||||
"-repo",
|
"publish",
|
||||||
self.repo_dir(),
|
"-a",
|
||||||
"-f",
|
"-repo",
|
||||||
far_path,
|
self.repo_dir(),
|
||||||
],
|
"-f",
|
||||||
stdout=log_file,
|
far_path,
|
||||||
stderr=log_file,
|
],
|
||||||
)
|
stdout=log_file,
|
||||||
|
stderr=log_file,
|
||||||
|
)
|
||||||
|
# This lock should be released automatically when the pm
|
||||||
|
# lockfile is closed, but we'll be polite and unlock it now
|
||||||
|
# since the spec leaves some wiggle room.
|
||||||
|
fcntl.lockf(pm_lockfile.fileno(), fcntl.LOCK_UN)
|
||||||
|
|
||||||
log("Running ffx test...")
|
log("Running ffx test...")
|
||||||
|
|
||||||
|
@ -716,7 +716,7 @@ run the full `tests/ui` test suite:
|
|||||||
--stage=2 \
|
--stage=2 \
|
||||||
test tests/ui \
|
test tests/ui \
|
||||||
--target x86_64-unknown-fuchsia \
|
--target x86_64-unknown-fuchsia \
|
||||||
--run=always --jobs 1 \
|
--run=always \
|
||||||
--test-args --target-rustcflags \
|
--test-args --target-rustcflags \
|
||||||
--test-args -Lnative=${SDK_PATH}/arch/{x64|arm64}/sysroot/lib \
|
--test-args -Lnative=${SDK_PATH}/arch/{x64|arm64}/sysroot/lib \
|
||||||
--test-args --target-rustcflags \
|
--test-args --target-rustcflags \
|
||||||
@ -728,9 +728,6 @@ run the full `tests/ui` test suite:
|
|||||||
)
|
)
|
||||||
```
|
```
|
||||||
|
|
||||||
*Note: The test suite cannot be run in parallel at the moment, so `x.py`
|
|
||||||
must be run with `--jobs 1` to ensure only one test runs at a time.*
|
|
||||||
|
|
||||||
By default, `x.py` compiles test binaries with `panic=unwind`. If you built your
|
By default, `x.py` compiles test binaries with `panic=unwind`. If you built your
|
||||||
Rust toolchain with `-Cpanic=abort`, you need to tell `x.py` to compile test
|
Rust toolchain with `-Cpanic=abort`, you need to tell `x.py` to compile test
|
||||||
binaries with `panic=abort` as well:
|
binaries with `panic=abort` as well:
|
||||||
@ -907,7 +904,7 @@ through our `x.py` invocation. The full invocation is:
|
|||||||
--stage=2 \
|
--stage=2 \
|
||||||
test tests/${TEST} \
|
test tests/${TEST} \
|
||||||
--target x86_64-unknown-fuchsia \
|
--target x86_64-unknown-fuchsia \
|
||||||
--run=always --jobs 1 \
|
--run=always \
|
||||||
--test-args --target-rustcflags \
|
--test-args --target-rustcflags \
|
||||||
--test-args -Lnative=${SDK_PATH}/arch/{x64|arm64}/sysroot/lib \
|
--test-args -Lnative=${SDK_PATH}/arch/{x64|arm64}/sysroot/lib \
|
||||||
--test-args --target-rustcflags \
|
--test-args --target-rustcflags \
|
||||||
|
@ -287,15 +287,12 @@ impl<'a> VecArgs<'a> {
|
|||||||
Some(VecArgs::Repeat(&args[0], &args[1]))
|
Some(VecArgs::Repeat(&args[0], &args[1]))
|
||||||
} else if match_def_path(cx, fun_def_id, &paths::SLICE_INTO_VEC) && args.len() == 1 {
|
} else if match_def_path(cx, fun_def_id, &paths::SLICE_INTO_VEC) && args.len() == 1 {
|
||||||
// `vec![a, b, c]` case
|
// `vec![a, b, c]` case
|
||||||
if_chain! {
|
if let hir::ExprKind::Call(_, [arg]) = &args[0].kind
|
||||||
if let hir::ExprKind::Box(boxed) = args[0].kind;
|
&& let hir::ExprKind::Array(args) = arg.kind {
|
||||||
if let hir::ExprKind::Array(args) = boxed.kind;
|
Some(VecArgs::Vec(args))
|
||||||
then {
|
} else {
|
||||||
return Some(VecArgs::Vec(args));
|
None
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
None
|
|
||||||
} else if match_def_path(cx, fun_def_id, &paths::VEC_NEW) && args.is_empty() {
|
} else if match_def_path(cx, fun_def_id, &paths::VEC_NEW) && args.is_empty() {
|
||||||
Some(VecArgs::Vec(&[]))
|
Some(VecArgs::Vec(&[]))
|
||||||
} else {
|
} else {
|
||||||
|
@ -1432,12 +1432,13 @@ impl<'test> TestCx<'test> {
|
|||||||
expect_help: bool,
|
expect_help: bool,
|
||||||
expect_note: bool,
|
expect_note: bool,
|
||||||
) -> bool {
|
) -> bool {
|
||||||
match actual_error.kind {
|
!actual_error.msg.is_empty()
|
||||||
Some(ErrorKind::Help) => expect_help,
|
&& match actual_error.kind {
|
||||||
Some(ErrorKind::Note) => expect_note,
|
Some(ErrorKind::Help) => expect_help,
|
||||||
Some(ErrorKind::Error) | Some(ErrorKind::Warning) => true,
|
Some(ErrorKind::Note) => expect_note,
|
||||||
Some(ErrorKind::Suggestion) | None => false,
|
Some(ErrorKind::Error) | Some(ErrorKind::Warning) => true,
|
||||||
}
|
Some(ErrorKind::Suggestion) | None => false,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn should_emit_metadata(&self, pm: Option<PassMode>) -> Emit {
|
fn should_emit_metadata(&self, pm: Option<PassMode>) -> Emit {
|
||||||
|
18
tests/ui/attributes/rustc-box.rs
Normal file
18
tests/ui/attributes/rustc-box.rs
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
#![feature(rustc_attrs, stmt_expr_attributes)]
|
||||||
|
|
||||||
|
fn foo(_: u32, _: u32) {}
|
||||||
|
fn bar(_: u32) {}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
#[rustc_box]
|
||||||
|
Box::new(1); // OK
|
||||||
|
#[rustc_box]
|
||||||
|
Box::pin(1); //~ ERROR `#[rustc_box]` attribute used incorrectly
|
||||||
|
#[rustc_box]
|
||||||
|
foo(1, 1); //~ ERROR `#[rustc_box]` attribute used incorrectly
|
||||||
|
#[rustc_box]
|
||||||
|
bar(1); //~ ERROR `#[rustc_box]` attribute used incorrectly
|
||||||
|
#[rustc_box] //~ ERROR `#[rustc_box]` attribute used incorrectly
|
||||||
|
#[rustfmt::skip]
|
||||||
|
Box::new(1);
|
||||||
|
}
|
34
tests/ui/attributes/rustc-box.stderr
Normal file
34
tests/ui/attributes/rustc-box.stderr
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
error: `#[rustc_box]` attribute used incorrectly
|
||||||
|
--> $DIR/rustc-box.rs:10:5
|
||||||
|
|
|
||||||
|
LL | Box::pin(1);
|
||||||
|
| ^^^^^^^^^^^
|
||||||
|
|
|
||||||
|
= note: `#[rustc_box]` may only be applied to a `Box::new()` call
|
||||||
|
|
||||||
|
error: `#[rustc_box]` attribute used incorrectly
|
||||||
|
--> $DIR/rustc-box.rs:12:5
|
||||||
|
|
|
||||||
|
LL | foo(1, 1);
|
||||||
|
| ^^^^^^^^^
|
||||||
|
|
|
||||||
|
= note: `#[rustc_box]` may only be applied to a `Box::new()` call
|
||||||
|
|
||||||
|
error: `#[rustc_box]` attribute used incorrectly
|
||||||
|
--> $DIR/rustc-box.rs:14:5
|
||||||
|
|
|
||||||
|
LL | bar(1);
|
||||||
|
| ^^^^^^
|
||||||
|
|
|
||||||
|
= note: `#[rustc_box]` may only be applied to a `Box::new()` call
|
||||||
|
|
||||||
|
error: `#[rustc_box]` attribute used incorrectly
|
||||||
|
--> $DIR/rustc-box.rs:15:5
|
||||||
|
|
|
||||||
|
LL | #[rustc_box]
|
||||||
|
| ^^^^^^^^^^^^
|
||||||
|
|
|
||||||
|
= note: no other attributes may be applied
|
||||||
|
|
||||||
|
error: aborting due to 4 previous errors
|
||||||
|
|
@ -48,14 +48,17 @@ LL | .two(0, /* isize */);
|
|||||||
error[E0599]: `Foo` is not an iterator
|
error[E0599]: `Foo` is not an iterator
|
||||||
--> $DIR/method-call-err-msg.rs:19:7
|
--> $DIR/method-call-err-msg.rs:19:7
|
||||||
|
|
|
|
||||||
LL | pub struct Foo;
|
LL | pub struct Foo;
|
||||||
| --------------
|
| --------------
|
||||||
| |
|
| |
|
||||||
| method `take` not found for this struct
|
| method `take` not found for this struct
|
||||||
| doesn't satisfy `Foo: Iterator`
|
| doesn't satisfy `Foo: Iterator`
|
||||||
...
|
...
|
||||||
LL | .take()
|
LL | / y.zero()
|
||||||
| ^^^^ `Foo` is not an iterator
|
LL | | .take()
|
||||||
|
| | -^^^^ `Foo` is not an iterator
|
||||||
|
| |______|
|
||||||
|
|
|
||||||
|
|
|
|
||||||
= note: the following trait bounds were not satisfied:
|
= note: the following trait bounds were not satisfied:
|
||||||
`Foo: Iterator`
|
`Foo: Iterator`
|
||||||
|
6
tests/ui/parser/issues/issue-104367.rs
Normal file
6
tests/ui/parser/issues/issue-104367.rs
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
#[derive(A)]
|
||||||
|
struct S {
|
||||||
|
d: [u32; {
|
||||||
|
#![cfg] {
|
||||||
|
#![w,) //~ ERROR mismatched closing delimiter
|
||||||
|
//~ ERROR this file contains an unclosed delimiter
|
26
tests/ui/parser/issues/issue-104367.stderr
Normal file
26
tests/ui/parser/issues/issue-104367.stderr
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
error: mismatched closing delimiter: `)`
|
||||||
|
--> $DIR/issue-104367.rs:5:15
|
||||||
|
|
|
||||||
|
LL | #![w,)
|
||||||
|
| ^ ^ mismatched closing delimiter
|
||||||
|
| |
|
||||||
|
| unclosed delimiter
|
||||||
|
|
||||||
|
error: this file contains an unclosed delimiter
|
||||||
|
--> $DIR/issue-104367.rs:6:71
|
||||||
|
|
|
||||||
|
LL | struct S {
|
||||||
|
| - unclosed delimiter
|
||||||
|
LL | d: [u32; {
|
||||||
|
| - - unclosed delimiter
|
||||||
|
| |
|
||||||
|
| unclosed delimiter
|
||||||
|
LL | #![cfg] {
|
||||||
|
| - unclosed delimiter
|
||||||
|
LL | #![w,)
|
||||||
|
| - missing open `(` for this delimiter
|
||||||
|
LL |
|
||||||
|
| ^
|
||||||
|
|
||||||
|
error: aborting due to 2 previous errors
|
||||||
|
|
3
tests/ui/parser/issues/issue-105209.rs
Normal file
3
tests/ui/parser/issues/issue-105209.rs
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
// compile-flags: -Zunpretty=ast-tree
|
||||||
|
#![c={#![c[)x //~ ERROR mismatched closing delimiter
|
||||||
|
//~ ERROR this file contains an unclosed delimiter
|
22
tests/ui/parser/issues/issue-105209.stderr
Normal file
22
tests/ui/parser/issues/issue-105209.stderr
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
error: mismatched closing delimiter: `)`
|
||||||
|
--> $DIR/issue-105209.rs:2:11
|
||||||
|
|
|
||||||
|
LL | #![c={#![c[)x
|
||||||
|
| ^^ mismatched closing delimiter
|
||||||
|
| |
|
||||||
|
| unclosed delimiter
|
||||||
|
|
||||||
|
error: this file contains an unclosed delimiter
|
||||||
|
--> $DIR/issue-105209.rs:3:68
|
||||||
|
|
|
||||||
|
LL | #![c={#![c[)x
|
||||||
|
| - - - - missing open `(` for this delimiter
|
||||||
|
| | | |
|
||||||
|
| | | unclosed delimiter
|
||||||
|
| | unclosed delimiter
|
||||||
|
| unclosed delimiter
|
||||||
|
LL |
|
||||||
|
| ^
|
||||||
|
|
||||||
|
error: aborting due to 2 previous errors
|
||||||
|
|
8
tests/ui/suggestions/suggest-trait-in-ufcs-in-hrtb.rs
Normal file
8
tests/ui/suggestions/suggest-trait-in-ufcs-in-hrtb.rs
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
pub struct Bar<S>(S);
|
||||||
|
|
||||||
|
pub trait Foo {}
|
||||||
|
|
||||||
|
impl<S> Foo for Bar<S> where for<'a> <&'a S>::Item: Foo {}
|
||||||
|
//~^ ERROR ambiguous associated type
|
||||||
|
|
||||||
|
fn main() {}
|
@ -0,0 +1,9 @@
|
|||||||
|
error[E0223]: ambiguous associated type
|
||||||
|
--> $DIR/suggest-trait-in-ufcs-in-hrtb.rs:5:38
|
||||||
|
|
|
||||||
|
LL | impl<S> Foo for Bar<S> where for<'a> <&'a S>::Item: Foo {}
|
||||||
|
| ^^^^^^^^^^^^^ help: use the fully-qualified path: `<&'a S as IntoIterator>::Item`
|
||||||
|
|
||||||
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0223`.
|
@ -24,8 +24,17 @@ note: required by a bound in `cloned`
|
|||||||
error[E0599]: the method `collect` exists for struct `Cloned<TakeWhile<&mut IntoIter<u8>, [closure@issue-31173.rs:7:21]>>`, but its trait bounds were not satisfied
|
error[E0599]: the method `collect` exists for struct `Cloned<TakeWhile<&mut IntoIter<u8>, [closure@issue-31173.rs:7:21]>>`, but its trait bounds were not satisfied
|
||||||
--> $DIR/issue-31173.rs:12:10
|
--> $DIR/issue-31173.rs:12:10
|
||||||
|
|
|
|
||||||
LL | .collect();
|
LL | let temp: Vec<u8> = it
|
||||||
| ^^^^^^^ method cannot be called due to unsatisfied trait bounds
|
| _________________________-
|
||||||
|
LL | | .take_while(|&x| {
|
||||||
|
LL | | found_e = true;
|
||||||
|
LL | | false
|
||||||
|
LL | | })
|
||||||
|
LL | | .cloned()
|
||||||
|
LL | | .collect();
|
||||||
|
| | -^^^^^^^ method cannot be called due to unsatisfied trait bounds
|
||||||
|
| |_________|
|
||||||
|
|
|
||||||
--> $SRC_DIR/core/src/iter/adapters/take_while.rs:LL:COL
|
--> $SRC_DIR/core/src/iter/adapters/take_while.rs:LL:COL
|
||||||
|
|
|
|
||||||
= note: doesn't satisfy `<_ as Iterator>::Item = &_`
|
= note: doesn't satisfy `<_ as Iterator>::Item = &_`
|
||||||
|
Loading…
Reference in New Issue
Block a user