Auto merge of #118646 - matthiaskrgr:rollup-jnscl9z, r=matthiaskrgr
Rollup of 8 pull requests Successful merges: - #117922 (Tweak unclosed generics errors) - #118471 (Fix typos in README.md) - #118594 (Remove mention of rust to make the error message generic.) - #118598 (Remove the `precise_pointer_size_matching` feature gate) - #118606 (Fix `x` not to quit after `x` prints `settings.json`) - #118608 (Use default params until effects in desugaring) - #118614 (Update books) - #118637 (rustc_symbol_mangling,rustc_interface,rustc_driver_impl: Enforce `rustc::potential_query_instability` lint) r? `@ghost` `@rustbot` modify labels: rollup
This commit is contained in:
commit
ec94480d98
@ -12,7 +12,7 @@ If you wish to _contribute_ to the compiler, you should read
|
||||
[CONTRIBUTING.md](CONTRIBUTING.md) instead.
|
||||
|
||||
<details>
|
||||
<summary>Table of content</summary>
|
||||
<summary>Table of Contents</summary>
|
||||
|
||||
- [Quick Start](#quick-start)
|
||||
- [Installing from Source](#installing-from-source)
|
||||
|
@ -13,7 +13,6 @@
|
||||
#![feature(let_chains)]
|
||||
#![feature(panic_update_hook)]
|
||||
#![recursion_limit = "256"]
|
||||
#![allow(rustc::potential_query_instability)]
|
||||
#![deny(rustc::untranslatable_diagnostic)]
|
||||
#![deny(rustc::diagnostic_outside_of_impl)]
|
||||
|
||||
|
@ -158,6 +158,9 @@ macro_rules! declare_features {
|
||||
/// Allows using `#[plugin_registrar]` on functions.
|
||||
(removed, plugin_registrar, "1.54.0", Some(29597), None,
|
||||
Some("plugins are no longer supported")),
|
||||
/// Allows exhaustive integer pattern matching with `usize::MAX`/`isize::MIN`/`isize::MAX`.
|
||||
(removed, precise_pointer_size_matching, "1.32.0", Some(56354), None,
|
||||
Some("removed in favor of half-open ranges")),
|
||||
(removed, proc_macro_expr, "1.27.0", Some(54727), None,
|
||||
Some("subsumed by `#![feature(proc_macro_hygiene)]`")),
|
||||
(removed, proc_macro_gen, "1.27.0", Some(54727), None,
|
||||
|
@ -543,8 +543,6 @@ pub fn internal(&self, feature: Symbol) -> bool {
|
||||
(unstable, offset_of_enum, "1.75.0", Some(106655), None),
|
||||
/// Allows using `#[optimize(X)]`.
|
||||
(unstable, optimize_attribute, "1.34.0", Some(54882), None),
|
||||
/// Allows exhaustive integer pattern matching on `usize` and `isize`.
|
||||
(unstable, precise_pointer_size_matching, "1.32.0", Some(56354), None),
|
||||
/// Allows macro attributes on expressions, statements and non-inline modules.
|
||||
(unstable, proc_macro_hygiene, "1.30.0", Some(54727), None),
|
||||
/// Allows `&raw const $place_expr` and `&raw mut $place_expr` expressions.
|
||||
|
@ -243,6 +243,31 @@ pub fn create_args_for_parent_generic_args<'tcx, 'a>(
|
||||
match (args_iter.peek(), params.peek()) {
|
||||
(Some(&arg), Some(¶m)) => {
|
||||
match (arg, ¶m.kind, arg_count.explicit_late_bound) {
|
||||
(
|
||||
GenericArg::Const(hir::ConstArg {
|
||||
is_desugared_from_effects: true,
|
||||
..
|
||||
}),
|
||||
GenericParamDefKind::Const { is_host_effect: false, .. }
|
||||
| GenericParamDefKind::Type { .. }
|
||||
| GenericParamDefKind::Lifetime,
|
||||
_,
|
||||
) => {
|
||||
// SPECIAL CASE FOR DESUGARED EFFECT PARAMS
|
||||
// This comes from the following example:
|
||||
//
|
||||
// ```
|
||||
// #[const_trait]
|
||||
// pub trait PartialEq<Rhs: ?Sized = Self> {}
|
||||
// impl const PartialEq for () {}
|
||||
// ```
|
||||
//
|
||||
// Since this is a const impl, we need to insert `<false>` at the end of
|
||||
// `PartialEq`'s generics, but this errors since `Rhs` isn't specified.
|
||||
// To work around this, we infer all arguments until we reach the host param.
|
||||
args.push(ctx.inferred_kind(Some(&args), param, infer_args));
|
||||
params.next();
|
||||
}
|
||||
(GenericArg::Lifetime(_), GenericParamDefKind::Lifetime, _)
|
||||
| (
|
||||
GenericArg::Type(_) | GenericArg::Infer(_),
|
||||
|
@ -6,7 +6,6 @@
|
||||
#![feature(let_chains)]
|
||||
#![feature(try_blocks)]
|
||||
#![recursion_limit = "256"]
|
||||
#![allow(rustc::potential_query_instability)]
|
||||
#![deny(rustc::untranslatable_diagnostic)]
|
||||
#![deny(rustc::diagnostic_outside_of_impl)]
|
||||
|
||||
|
@ -306,6 +306,8 @@ fn early_lint_checks(tcx: TyCtxt<'_>, (): ()) {
|
||||
|
||||
// Gate identifiers containing invalid Unicode codepoints that were recovered during lexing.
|
||||
sess.parse_sess.bad_unicode_identifiers.with_lock(|identifiers| {
|
||||
// We will soon sort, so the initial order does not matter.
|
||||
#[allow(rustc::potential_query_instability)]
|
||||
let mut identifiers: Vec<_> = identifiers.drain().collect();
|
||||
identifiers.sort_by_key(|&(key, _)| key);
|
||||
for (ident, mut spans) in identifiers.into_iter() {
|
||||
@ -431,6 +433,9 @@ fn write_out_deps(tcx: TyCtxt<'_>, outputs: &OutputFilenames, out_filenames: &[P
|
||||
escape_dep_filename(&file.prefer_local().to_string())
|
||||
};
|
||||
|
||||
// The entries will be used to declare dependencies beween files in a
|
||||
// Makefile-like output, so the iteration order does not matter.
|
||||
#[allow(rustc::potential_query_instability)]
|
||||
let extra_tracked_files =
|
||||
file_depinfo.iter().map(|path_sym| normalize_path(PathBuf::from(path_sym.as_str())));
|
||||
files.extend(extra_tracked_files);
|
||||
@ -486,6 +491,8 @@ fn write_out_deps(tcx: TyCtxt<'_>, outputs: &OutputFilenames, out_filenames: &[P
|
||||
// Emit special comments with information about accessed environment variables.
|
||||
let env_depinfo = sess.parse_sess.env_depinfo.borrow();
|
||||
if !env_depinfo.is_empty() {
|
||||
// We will soon sort, so the initial order does not matter.
|
||||
#[allow(rustc::potential_query_instability)]
|
||||
let mut envs: Vec<_> = env_depinfo
|
||||
.iter()
|
||||
.map(|(k, v)| (escape_dep_env(*k), v.map(escape_dep_env)))
|
||||
|
@ -867,12 +867,6 @@ fn report_non_exhaustive_match<'p, 'tcx>(
|
||||
exhaustively",
|
||||
));
|
||||
}
|
||||
if cx.tcx.sess.is_nightly_build() {
|
||||
err.help(format!(
|
||||
"add `#![feature(precise_pointer_size_matching)]` to the crate attributes to \
|
||||
enable precise `{ty}` matching",
|
||||
));
|
||||
}
|
||||
} else if ty == cx.tcx.types.str_ {
|
||||
err.note("`&str` cannot be matched exhaustively, so a wildcard `_` is necessary");
|
||||
} else if cx.is_foreign_non_exhaustive_enum(ty) {
|
||||
|
@ -326,8 +326,7 @@ fn intersection(&self, other: &Self) -> Option<Self> {
|
||||
/// `NegInfinity..PosInfinity`. In other words, as far as `IntRange` is concerned, there are
|
||||
/// values before `isize::MIN` and after `usize::MAX`/`isize::MAX`.
|
||||
/// This is to avoid e.g. `0..(u32::MAX as usize)` from being exhaustive on one architecture and
|
||||
/// not others. See discussions around the `precise_pointer_size_matching` feature for more
|
||||
/// details.
|
||||
/// not others. This was decided in <https://github.com/rust-lang/rfcs/pull/2591>.
|
||||
///
|
||||
/// These infinities affect splitting subtly: it is possible to get `NegInfinity..0` and
|
||||
/// `usize::MAX+1..PosInfinity` in the output. Diagnostics must be careful to handle these
|
||||
@ -380,7 +379,7 @@ fn split(
|
||||
/// Whether the range denotes the fictitious values before `isize::MIN` or after
|
||||
/// `usize::MAX`/`isize::MAX` (see doc of [`IntRange::split`] for why these exist).
|
||||
pub(crate) fn is_beyond_boundaries<'tcx>(&self, ty: Ty<'tcx>, tcx: TyCtxt<'tcx>) -> bool {
|
||||
ty.is_ptr_sized_integral() && !tcx.features().precise_pointer_size_matching && {
|
||||
ty.is_ptr_sized_integral() && {
|
||||
// The two invalid ranges are `NegInfinity..isize::MIN` (represented as
|
||||
// `NegInfinity..0`), and `{u,i}size::MAX+1..PosInfinity`. `to_diagnostic_pat_range_bdy`
|
||||
// converts `MAX+1` to `PosInfinity`, and we couldn't have `PosInfinity` in `self.lo`
|
||||
@ -941,11 +940,8 @@ pub(super) fn for_ty<'p, 'tcx>(cx: &MatchCheckCtxt<'p, 'tcx>, ty: Ty<'tcx>) -> S
|
||||
}
|
||||
}
|
||||
&ty::Int(ity) => {
|
||||
let range = if ty.is_ptr_sized_integral()
|
||||
&& !cx.tcx.features().precise_pointer_size_matching
|
||||
{
|
||||
// The min/max values of `isize` are not allowed to be observed unless the
|
||||
// `precise_pointer_size_matching` feature is enabled.
|
||||
let range = if ty.is_ptr_sized_integral() {
|
||||
// The min/max values of `isize` are not allowed to be observed.
|
||||
IntRange { lo: NegInfinity, hi: PosInfinity }
|
||||
} else {
|
||||
let bits = Integer::from_int_ty(&cx.tcx, ity).size().bits() as u128;
|
||||
@ -956,11 +952,8 @@ pub(super) fn for_ty<'p, 'tcx>(cx: &MatchCheckCtxt<'p, 'tcx>, ty: Ty<'tcx>) -> S
|
||||
Self::Integers { range_1: range, range_2: None }
|
||||
}
|
||||
&ty::Uint(uty) => {
|
||||
let range = if ty.is_ptr_sized_integral()
|
||||
&& !cx.tcx.features().precise_pointer_size_matching
|
||||
{
|
||||
// The max value of `usize` is not allowed to be observed unless the
|
||||
// `precise_pointer_size_matching` feature is enabled.
|
||||
let range = if ty.is_ptr_sized_integral() {
|
||||
// The max value of `usize` is not allowed to be observed.
|
||||
let lo = MaybeInfiniteInt::new_finite(cx.tcx, ty, 0);
|
||||
IntRange { lo, hi: PosInfinity }
|
||||
} else {
|
||||
|
@ -673,15 +673,6 @@ fn is_ident_eq_keyword(found: &TokenKind, expected: &TokenType) -> bool {
|
||||
);
|
||||
}
|
||||
|
||||
// Add suggestion for a missing closing angle bracket if '>' is included in expected_tokens
|
||||
// there are unclosed angle brackets
|
||||
if self.unmatched_angle_bracket_count > 0
|
||||
&& self.token.kind == TokenKind::Eq
|
||||
&& expected.iter().any(|tok| matches!(tok, TokenType::Token(TokenKind::Gt)))
|
||||
{
|
||||
err.span_label(self.prev_token.span, "maybe try to close unmatched angle bracket");
|
||||
}
|
||||
|
||||
let sp = if self.token == token::Eof {
|
||||
// This is EOF; don't want to point at the following char, but rather the last token.
|
||||
self.prev_token.span
|
||||
@ -811,6 +802,7 @@ pub(super) fn attr_on_non_tail_expr(&self, expr: &Expr) {
|
||||
}
|
||||
err.emit();
|
||||
}
|
||||
|
||||
fn check_too_many_raw_str_terminators(&mut self, err: &mut Diagnostic) -> bool {
|
||||
let sm = self.sess.source_map();
|
||||
match (&self.prev_token.kind, &self.token.kind) {
|
||||
@ -1986,6 +1978,39 @@ pub(super) fn try_macro_suggestion(&mut self) -> PResult<'a, P<Expr>> {
|
||||
}
|
||||
}
|
||||
|
||||
/// When trying to close a generics list and encountering code like
|
||||
/// ```text
|
||||
/// impl<S: Into<std::borrow::Cow<'static, str>> From<S> for Canonical {}
|
||||
/// // ^ missing > here
|
||||
/// ```
|
||||
/// we provide a structured suggestion on the error from `expect_gt`.
|
||||
pub(super) fn expect_gt_or_maybe_suggest_closing_generics(
|
||||
&mut self,
|
||||
params: &[ast::GenericParam],
|
||||
) -> PResult<'a, ()> {
|
||||
let Err(mut err) = self.expect_gt() else {
|
||||
return Ok(());
|
||||
};
|
||||
// Attempt to find places where a missing `>` might belong.
|
||||
if let [.., ast::GenericParam { bounds, .. }] = params
|
||||
&& let Some(poly) = bounds
|
||||
.iter()
|
||||
.filter_map(|bound| match bound {
|
||||
ast::GenericBound::Trait(poly, _) => Some(poly),
|
||||
_ => None,
|
||||
})
|
||||
.last()
|
||||
{
|
||||
err.span_suggestion_verbose(
|
||||
poly.span.shrink_to_hi(),
|
||||
"you might have meant to end the type parameters here",
|
||||
">",
|
||||
Applicability::MaybeIncorrect,
|
||||
);
|
||||
}
|
||||
Err(err)
|
||||
}
|
||||
|
||||
pub(super) fn recover_seq_parse_error(
|
||||
&mut self,
|
||||
delim: Delimiter,
|
||||
|
@ -279,7 +279,7 @@ pub(super) fn parse_generics(&mut self) -> PResult<'a, ast::Generics> {
|
||||
let span_lo = self.token.span;
|
||||
let (params, span) = if self.eat_lt() {
|
||||
let params = self.parse_generic_params()?;
|
||||
self.expect_gt()?;
|
||||
self.expect_gt_or_maybe_suggest_closing_generics(¶ms)?;
|
||||
(params, span_lo.to(self.prev_token.span))
|
||||
} else {
|
||||
(ThinVec::new(), self.prev_token.span.shrink_to_hi())
|
||||
|
@ -93,7 +93,6 @@
|
||||
#![allow(internal_features)]
|
||||
#![feature(never_type)]
|
||||
#![recursion_limit = "256"]
|
||||
#![allow(rustc::potential_query_instability)]
|
||||
#![deny(rustc::untranslatable_diagnostic)]
|
||||
#![deny(rustc::diagnostic_outside_of_impl)]
|
||||
|
||||
|
@ -549,12 +549,13 @@ fn run(self, builder: &Builder<'_>) -> Self::Output {
|
||||
if config.dry_run() {
|
||||
return;
|
||||
}
|
||||
t!(create_vscode_settings_maybe(&config));
|
||||
while !t!(create_vscode_settings_maybe(&config)) {}
|
||||
}
|
||||
}
|
||||
|
||||
/// Create a `.vscode/settings.json` file for rustc development, or just print it
|
||||
fn create_vscode_settings_maybe(config: &Config) -> io::Result<()> {
|
||||
/// If this method should be re-called, it returns `false`.
|
||||
fn create_vscode_settings_maybe(config: &Config) -> io::Result<bool> {
|
||||
let (current_hash, historical_hashes) = SETTINGS_HASHES.split_last().unwrap();
|
||||
let vscode_settings = config.src.join(".vscode").join("settings.json");
|
||||
// If None, no settings.json exists
|
||||
@ -567,7 +568,7 @@ fn create_vscode_settings_maybe(config: &Config) -> io::Result<()> {
|
||||
hasher.update(¤t);
|
||||
let hash = hex::encode(hasher.finalize().as_slice());
|
||||
if hash == *current_hash {
|
||||
return Ok(());
|
||||
return Ok(true);
|
||||
} else if historical_hashes.contains(&hash.as_str()) {
|
||||
mismatched_settings = Some(true);
|
||||
} else {
|
||||
@ -587,13 +588,13 @@ fn create_vscode_settings_maybe(config: &Config) -> io::Result<()> {
|
||||
_ => (),
|
||||
}
|
||||
let should_create = match prompt_user(
|
||||
"Would you like to create/update `settings.json`, or only print suggested settings?: [y/p/N]",
|
||||
"Would you like to create/update settings.json? (Press 'p' to preview values): [y/N]",
|
||||
)? {
|
||||
Some(PromptResult::Yes) => true,
|
||||
Some(PromptResult::Print) => false,
|
||||
_ => {
|
||||
println!("Ok, skipping settings!");
|
||||
return Ok(());
|
||||
return Ok(true);
|
||||
}
|
||||
};
|
||||
if should_create {
|
||||
@ -620,5 +621,5 @@ fn create_vscode_settings_maybe(config: &Config) -> io::Result<()> {
|
||||
} else {
|
||||
println!("\n{RUST_ANALYZER_SETTINGS}");
|
||||
}
|
||||
Ok(())
|
||||
Ok(should_create)
|
||||
}
|
||||
|
@ -1 +1 @@
|
||||
Subproject commit 1842257814919fa62e81bdecd5e8f95be2839dbb
|
||||
Subproject commit 83d015105e6d490fc30d6c95da1e56152a50e228
|
@ -1 +1 @@
|
||||
Subproject commit cd8193e972f61b92117095fc73b67af767b4d6bc
|
||||
Subproject commit 692d216f5a1151e8852ddb308ba64040e634c876
|
@ -1 +1 @@
|
||||
Subproject commit a6581246f96837113968c02187db24f742af3908
|
||||
Subproject commit da0a06aada31a324ae84a9eaee344f6a944b9683
|
@ -1 +1 @@
|
||||
Subproject commit ddb8b1309f9e905804cea1e248a4572fed6b464b
|
||||
Subproject commit 904bb5aa7b21adad58ffae610e2830c7b0f813b0
|
@ -673,7 +673,7 @@ fn short_item_info(
|
||||
format!("Deprecating in {version}")
|
||||
}
|
||||
}
|
||||
DeprecatedSince::Future => String::from("Deprecating in a future Rust version"),
|
||||
DeprecatedSince::Future => String::from("Deprecating in a future version"),
|
||||
DeprecatedSince::NonStandard(since) => {
|
||||
format!("Deprecated since {}", Escape(since.as_str()))
|
||||
}
|
||||
|
@ -12,7 +12,7 @@
|
||||
// @has deprecated_future_staged_api/index.html '//*[@class="stab deprecated"]' \
|
||||
// 'Deprecation planned'
|
||||
// @has deprecated_future_staged_api/struct.S2.html '//*[@class="stab deprecated"]' \
|
||||
// 'Deprecating in a future Rust version: literally never'
|
||||
// 'Deprecating in a future version: literally never'
|
||||
#[deprecated(since = "TBD", note = "literally never")]
|
||||
#[stable(feature = "deprecated_future_staged_api", since = "1.0.0")]
|
||||
pub struct S2;
|
||||
|
@ -6,7 +6,6 @@ LL | match 0usize {
|
||||
|
|
||||
= note: the matched value is of type `usize`
|
||||
= note: `usize` does not have a fixed maximum value, so half-open ranges are necessary to match exhaustively
|
||||
= help: add `#![feature(precise_pointer_size_matching)]` to the crate attributes to enable precise `usize` matching
|
||||
help: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern or an explicit pattern as shown
|
||||
|
|
||||
LL ~ 0..=usize::MAX => {},
|
||||
@ -21,7 +20,6 @@ LL | match 0isize {
|
||||
|
|
||||
= note: the matched value is of type `isize`
|
||||
= note: `isize` does not have fixed minimum and maximum values, so half-open ranges are necessary to match exhaustively
|
||||
= help: add `#![feature(precise_pointer_size_matching)]` to the crate attributes to enable precise `isize` matching
|
||||
help: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern, a match arm with multiple or-patterns as shown, or multiple match arms
|
||||
|
|
||||
LL ~ isize::MIN..=isize::MAX => {},
|
||||
|
@ -2,9 +2,7 @@ error: expected one of `!`, `(`, `+`, `,`, `::`, `<`, or `>`, found `=`
|
||||
--> $DIR/trait-path-expected-token.rs:5:33
|
||||
|
|
||||
LL | fn f1<'a>(arg : Box<dyn X<Y = B = &'a ()>>) {}
|
||||
| - ^ expected one of 7 possible tokens
|
||||
| |
|
||||
| maybe try to close unmatched angle bracket
|
||||
| ^ expected one of 7 possible tokens
|
||||
|
||||
error: aborting due to 1 previous error
|
||||
|
||||
|
@ -10,9 +10,7 @@ error: expected one of `,`, `:`, or `>`, found `=`
|
||||
--> $DIR/trait-path-expressions.rs:16:36
|
||||
|
|
||||
LL | fn f2<'a>(arg : Box<dyn X< { 1 } = 32 >>) {}
|
||||
| - ^ expected one of `,`, `:`, or `>`
|
||||
| |
|
||||
| maybe try to close unmatched angle bracket
|
||||
| ^ expected one of `,`, `:`, or `>`
|
||||
|
|
||||
help: you might have meant to end the type parameters here
|
||||
|
|
||||
|
@ -8,9 +8,7 @@ error: expected one of `>`, a const expression, lifetime, or type, found `=`
|
||||
--> $DIR/trait-path-missing-gen_arg.rs:11:30
|
||||
|
|
||||
LL | fn f1<'a>(arg : Box<dyn X< = 32 >>) {}
|
||||
| - ^ expected one of `>`, a const expression, lifetime, or type
|
||||
| |
|
||||
| maybe try to close unmatched angle bracket
|
||||
| ^ expected one of `>`, a const expression, lifetime, or type
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
|
||||
|
@ -2,9 +2,7 @@ error: expected one of `!`, `(`, `+`, `,`, `::`, `:`, `<`, or `>`, found `=`
|
||||
--> $DIR/trait-path-segments.rs:6:36
|
||||
|
|
||||
LL | fn f1<'a>(arg : Box<dyn X<X::Y = u32>>) {}
|
||||
| - ^ expected one of 8 possible tokens
|
||||
| |
|
||||
| maybe try to close unmatched angle bracket
|
||||
| ^ expected one of 8 possible tokens
|
||||
|
|
||||
help: you might have meant to end the type parameters here
|
||||
|
|
||||
@ -15,9 +13,7 @@ error: expected one of `,`, `::`, `:`, or `>`, found `=`
|
||||
--> $DIR/trait-path-segments.rs:17:35
|
||||
|
|
||||
LL | impl<T : X<<Self as X>::Y<'a> = &'a u32>> Z for T {}
|
||||
| - ^ expected one of `,`, `::`, `:`, or `>`
|
||||
| |
|
||||
| maybe try to close unmatched angle bracket
|
||||
| ^ expected one of `,`, `::`, `:`, or `>`
|
||||
|
|
||||
help: you might have meant to end the type parameters here
|
||||
|
|
||||
@ -28,9 +24,7 @@ error: expected one of `!`, `+`, `,`, `::`, `:`, or `>`, found `=`
|
||||
--> $DIR/trait-path-segments.rs:28:25
|
||||
|
|
||||
LL | impl<T : X<X::Y<'a> = &'a u32>> Z for T {}
|
||||
| - ^ expected one of `!`, `+`, `,`, `::`, `:`, or `>`
|
||||
| |
|
||||
| maybe try to close unmatched angle bracket
|
||||
| ^ expected one of `!`, `+`, `,`, `::`, `:`, or `>`
|
||||
|
|
||||
help: you might have meant to end the type parameters here
|
||||
|
|
||||
|
@ -2,9 +2,7 @@ error: expected one of `,`, `:`, or `>`, found `=`
|
||||
--> $DIR/trait-path-types.rs:6:37
|
||||
|
|
||||
LL | fn f<'a>(arg : Box<dyn X< [u8; 1] = u32>>) {}
|
||||
| - ^ expected one of `,`, `:`, or `>`
|
||||
| |
|
||||
| maybe try to close unmatched angle bracket
|
||||
| ^ expected one of `,`, `:`, or `>`
|
||||
|
|
||||
help: you might have meant to end the type parameters here
|
||||
|
|
||||
@ -15,9 +13,7 @@ error: expected one of `,`, `:`, or `>`, found `=`
|
||||
--> $DIR/trait-path-types.rs:11:37
|
||||
|
|
||||
LL | fn f1<'a>(arg : Box<dyn X<(Y<'a>) = &'a ()>>) {}
|
||||
| - ^ expected one of `,`, `:`, or `>`
|
||||
| |
|
||||
| maybe try to close unmatched angle bracket
|
||||
| ^ expected one of `,`, `:`, or `>`
|
||||
|
|
||||
help: you might have meant to end the type parameters here
|
||||
|
|
||||
@ -28,9 +24,7 @@ error: expected one of `,`, `:`, or `>`, found `=`
|
||||
--> $DIR/trait-path-types.rs:16:33
|
||||
|
|
||||
LL | fn f1<'a>(arg : Box<dyn X< 'a = u32 >>) {}
|
||||
| -- ^ expected one of `,`, `:`, or `>`
|
||||
| |
|
||||
| maybe try to close unmatched angle bracket
|
||||
| ^ expected one of `,`, `:`, or `>`
|
||||
|
|
||||
help: you might have meant to end the type parameters here
|
||||
|
|
||||
|
2
tests/ui/generics/unclosed-generics-in-impl-def.rs
Normal file
2
tests/ui/generics/unclosed-generics-in-impl-def.rs
Normal file
@ -0,0 +1,2 @@
|
||||
impl<S: Into<std::borrow::Cow<'static, str>> From<S> for Canonical {} //~ ERROR expected
|
||||
fn main() {}
|
13
tests/ui/generics/unclosed-generics-in-impl-def.stderr
Normal file
13
tests/ui/generics/unclosed-generics-in-impl-def.stderr
Normal file
@ -0,0 +1,13 @@
|
||||
error: expected one of `+`, `,`, `::`, `=`, or `>`, found `From`
|
||||
--> $DIR/unclosed-generics-in-impl-def.rs:1:46
|
||||
|
|
||||
LL | impl<S: Into<std::borrow::Cow<'static, str>> From<S> for Canonical {}
|
||||
| ^^^^ expected one of `+`, `,`, `::`, `=`, or `>`
|
||||
|
|
||||
help: you might have meant to end the type parameters here
|
||||
|
|
||||
LL | impl<S: Into<std::borrow::Cow<'static, str>>> From<S> for Canonical {}
|
||||
| +
|
||||
|
||||
error: aborting due to 1 previous error
|
||||
|
@ -2,9 +2,8 @@ error: expected one of `,`, `:`, or `>`, found `=`
|
||||
--> $DIR/issue-34334.rs:2:29
|
||||
|
|
||||
LL | let sr: Vec<(u32, _, _) = vec![];
|
||||
| -- - ^ expected one of `,`, `:`, or `>`
|
||||
| | |
|
||||
| | maybe try to close unmatched angle bracket
|
||||
| -- ^ expected one of `,`, `:`, or `>`
|
||||
| |
|
||||
| while parsing the type for `sr`
|
||||
|
|
||||
help: you might have meant to end the type parameters here
|
||||
|
@ -2,9 +2,8 @@ error: expected one of `,`, `:`, or `>`, found `=`
|
||||
--> $DIR/missing-closing-angle-bracket-eq-constraint.rs:7:23
|
||||
|
|
||||
LL | let v : Vec<(u32,_) = vec![];
|
||||
| - - ^ expected one of `,`, `:`, or `>`
|
||||
| | |
|
||||
| | maybe try to close unmatched angle bracket
|
||||
| - ^ expected one of `,`, `:`, or `>`
|
||||
| |
|
||||
| while parsing the type for `v`
|
||||
|
|
||||
help: you might have meant to end the type parameters here
|
||||
@ -29,9 +28,8 @@ error: expected one of `,`, `:`, or `>`, found `=`
|
||||
--> $DIR/missing-closing-angle-bracket-eq-constraint.rs:18:18
|
||||
|
|
||||
LL | let v : Vec<'a = vec![];
|
||||
| - -- ^ expected one of `,`, `:`, or `>`
|
||||
| | |
|
||||
| | maybe try to close unmatched angle bracket
|
||||
| - ^ expected one of `,`, `:`, or `>`
|
||||
| |
|
||||
| while parsing the type for `v`
|
||||
|
|
||||
help: you might have meant to end the type parameters here
|
||||
|
@ -1,17 +0,0 @@
|
||||
error[E0004]: non-exhaustive patterns: type `usize` is non-empty
|
||||
--> $DIR/pointer-sized-int.rs:59:11
|
||||
|
|
||||
LL | match 7usize {}
|
||||
| ^^^^^^
|
||||
|
|
||||
= note: the matched value is of type `usize`
|
||||
help: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern as shown
|
||||
|
|
||||
LL ~ match 7usize {
|
||||
LL + _ => todo!(),
|
||||
LL + }
|
||||
|
|
||||
|
||||
error: aborting due to 1 previous error
|
||||
|
||||
For more information about this error, try `rustc --explain E0004`.
|
@ -1,12 +1,11 @@
|
||||
error[E0004]: non-exhaustive patterns: `usize::MAX..` not covered
|
||||
--> $DIR/pointer-sized-int.rs:14:11
|
||||
--> $DIR/pointer-sized-int.rs:13:11
|
||||
|
|
||||
LL | match 0usize {
|
||||
| ^^^^^^ pattern `usize::MAX..` not covered
|
||||
|
|
||||
= note: the matched value is of type `usize`
|
||||
= note: `usize` does not have a fixed maximum value, so half-open ranges are necessary to match exhaustively
|
||||
= help: add `#![feature(precise_pointer_size_matching)]` to the crate attributes to enable precise `usize` matching
|
||||
help: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern or an explicit pattern as shown
|
||||
|
|
||||
LL ~ 0..=usize::MAX => {},
|
||||
@ -14,14 +13,13 @@ LL + usize::MAX.. => todo!()
|
||||
|
|
||||
|
||||
error[E0004]: non-exhaustive patterns: `..isize::MIN` and `isize::MAX..` not covered
|
||||
--> $DIR/pointer-sized-int.rs:19:11
|
||||
--> $DIR/pointer-sized-int.rs:18:11
|
||||
|
|
||||
LL | match 0isize {
|
||||
| ^^^^^^ patterns `..isize::MIN` and `isize::MAX..` not covered
|
||||
|
|
||||
= note: the matched value is of type `isize`
|
||||
= note: `isize` does not have fixed minimum and maximum values, so half-open ranges are necessary to match exhaustively
|
||||
= help: add `#![feature(precise_pointer_size_matching)]` to the crate attributes to enable precise `isize` matching
|
||||
help: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern, a match arm with multiple or-patterns as shown, or multiple match arms
|
||||
|
|
||||
LL ~ isize::MIN..=isize::MAX => {},
|
||||
@ -29,133 +27,124 @@ LL + ..isize::MIN | isize::MAX.. => todo!()
|
||||
|
|
||||
|
||||
error[E0004]: non-exhaustive patterns: `usize::MAX..` not covered
|
||||
--> $DIR/pointer-sized-int.rs:24:8
|
||||
--> $DIR/pointer-sized-int.rs:23:8
|
||||
|
|
||||
LL | m!(0usize, 0..=usize::MAX);
|
||||
| ^^^^^^ pattern `usize::MAX..` not covered
|
||||
|
|
||||
= note: the matched value is of type `usize`
|
||||
= note: `usize` does not have a fixed maximum value, so half-open ranges are necessary to match exhaustively
|
||||
= help: add `#![feature(precise_pointer_size_matching)]` to the crate attributes to enable precise `usize` matching
|
||||
help: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern or an explicit pattern as shown
|
||||
|
|
||||
LL | match $s { $($t)+ => {}, usize::MAX.. => todo!() }
|
||||
| +++++++++++++++++++++++++
|
||||
|
||||
error[E0004]: non-exhaustive patterns: `usize::MAX..` not covered
|
||||
--> $DIR/pointer-sized-int.rs:26:8
|
||||
--> $DIR/pointer-sized-int.rs:25:8
|
||||
|
|
||||
LL | m!(0usize, 0..5 | 5..=usize::MAX);
|
||||
| ^^^^^^ pattern `usize::MAX..` not covered
|
||||
|
|
||||
= note: the matched value is of type `usize`
|
||||
= note: `usize` does not have a fixed maximum value, so half-open ranges are necessary to match exhaustively
|
||||
= help: add `#![feature(precise_pointer_size_matching)]` to the crate attributes to enable precise `usize` matching
|
||||
help: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern or an explicit pattern as shown
|
||||
|
|
||||
LL | match $s { $($t)+ => {}, usize::MAX.. => todo!() }
|
||||
| +++++++++++++++++++++++++
|
||||
|
||||
error[E0004]: non-exhaustive patterns: `usize::MAX..` not covered
|
||||
--> $DIR/pointer-sized-int.rs:28:8
|
||||
--> $DIR/pointer-sized-int.rs:27:8
|
||||
|
|
||||
LL | m!(0usize, 0..usize::MAX | usize::MAX);
|
||||
| ^^^^^^ pattern `usize::MAX..` not covered
|
||||
|
|
||||
= note: the matched value is of type `usize`
|
||||
= note: `usize` does not have a fixed maximum value, so half-open ranges are necessary to match exhaustively
|
||||
= help: add `#![feature(precise_pointer_size_matching)]` to the crate attributes to enable precise `usize` matching
|
||||
help: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern or an explicit pattern as shown
|
||||
|
|
||||
LL | match $s { $($t)+ => {}, usize::MAX.. => todo!() }
|
||||
| +++++++++++++++++++++++++
|
||||
|
||||
error[E0004]: non-exhaustive patterns: `(usize::MAX.., _)` not covered
|
||||
--> $DIR/pointer-sized-int.rs:30:8
|
||||
--> $DIR/pointer-sized-int.rs:29:8
|
||||
|
|
||||
LL | m!((0usize, true), (0..5, true) | (5..=usize::MAX, true) | (0..=usize::MAX, false));
|
||||
| ^^^^^^^^^^^^^^ pattern `(usize::MAX.., _)` not covered
|
||||
|
|
||||
= note: the matched value is of type `(usize, bool)`
|
||||
= note: `usize` does not have a fixed maximum value, so half-open ranges are necessary to match exhaustively
|
||||
= help: add `#![feature(precise_pointer_size_matching)]` to the crate attributes to enable precise `usize` matching
|
||||
help: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern or an explicit pattern as shown
|
||||
|
|
||||
LL | match $s { $($t)+ => {}, (usize::MAX.., _) => todo!() }
|
||||
| ++++++++++++++++++++++++++++++
|
||||
|
||||
error[E0004]: non-exhaustive patterns: `..isize::MIN` and `isize::MAX..` not covered
|
||||
--> $DIR/pointer-sized-int.rs:39:8
|
||||
--> $DIR/pointer-sized-int.rs:38:8
|
||||
|
|
||||
LL | m!(0isize, isize::MIN..=isize::MAX);
|
||||
| ^^^^^^ patterns `..isize::MIN` and `isize::MAX..` not covered
|
||||
|
|
||||
= note: the matched value is of type `isize`
|
||||
= note: `isize` does not have fixed minimum and maximum values, so half-open ranges are necessary to match exhaustively
|
||||
= help: add `#![feature(precise_pointer_size_matching)]` to the crate attributes to enable precise `isize` matching
|
||||
help: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern, a match arm with multiple or-patterns as shown, or multiple match arms
|
||||
|
|
||||
LL | match $s { $($t)+ => {}, ..isize::MIN | isize::MAX.. => todo!() }
|
||||
| ++++++++++++++++++++++++++++++++++++++++
|
||||
|
||||
error[E0004]: non-exhaustive patterns: `..isize::MIN` and `isize::MAX..` not covered
|
||||
--> $DIR/pointer-sized-int.rs:41:8
|
||||
--> $DIR/pointer-sized-int.rs:40:8
|
||||
|
|
||||
LL | m!(0isize, isize::MIN..5 | 5..=isize::MAX);
|
||||
| ^^^^^^ patterns `..isize::MIN` and `isize::MAX..` not covered
|
||||
|
|
||||
= note: the matched value is of type `isize`
|
||||
= note: `isize` does not have fixed minimum and maximum values, so half-open ranges are necessary to match exhaustively
|
||||
= help: add `#![feature(precise_pointer_size_matching)]` to the crate attributes to enable precise `isize` matching
|
||||
help: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern, a match arm with multiple or-patterns as shown, or multiple match arms
|
||||
|
|
||||
LL | match $s { $($t)+ => {}, ..isize::MIN | isize::MAX.. => todo!() }
|
||||
| ++++++++++++++++++++++++++++++++++++++++
|
||||
|
||||
error[E0004]: non-exhaustive patterns: `..isize::MIN` and `isize::MAX..` not covered
|
||||
--> $DIR/pointer-sized-int.rs:43:8
|
||||
--> $DIR/pointer-sized-int.rs:42:8
|
||||
|
|
||||
LL | m!(0isize, isize::MIN..=-1 | 0 | 1..=isize::MAX);
|
||||
| ^^^^^^ patterns `..isize::MIN` and `isize::MAX..` not covered
|
||||
|
|
||||
= note: the matched value is of type `isize`
|
||||
= note: `isize` does not have fixed minimum and maximum values, so half-open ranges are necessary to match exhaustively
|
||||
= help: add `#![feature(precise_pointer_size_matching)]` to the crate attributes to enable precise `isize` matching
|
||||
help: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern, a match arm with multiple or-patterns as shown, or multiple match arms
|
||||
|
|
||||
LL | match $s { $($t)+ => {}, ..isize::MIN | isize::MAX.. => todo!() }
|
||||
| ++++++++++++++++++++++++++++++++++++++++
|
||||
|
||||
error[E0004]: non-exhaustive patterns: `..isize::MIN` and `isize::MAX..` not covered
|
||||
--> $DIR/pointer-sized-int.rs:45:8
|
||||
--> $DIR/pointer-sized-int.rs:44:8
|
||||
|
|
||||
LL | m!(0isize, isize::MIN..isize::MAX | isize::MAX);
|
||||
| ^^^^^^ patterns `..isize::MIN` and `isize::MAX..` not covered
|
||||
|
|
||||
= note: the matched value is of type `isize`
|
||||
= note: `isize` does not have fixed minimum and maximum values, so half-open ranges are necessary to match exhaustively
|
||||
= help: add `#![feature(precise_pointer_size_matching)]` to the crate attributes to enable precise `isize` matching
|
||||
help: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern, a match arm with multiple or-patterns as shown, or multiple match arms
|
||||
|
|
||||
LL | match $s { $($t)+ => {}, ..isize::MIN | isize::MAX.. => todo!() }
|
||||
| ++++++++++++++++++++++++++++++++++++++++
|
||||
|
||||
error[E0004]: non-exhaustive patterns: `(..isize::MIN, _)` and `(isize::MAX.., _)` not covered
|
||||
--> $DIR/pointer-sized-int.rs:48:9
|
||||
--> $DIR/pointer-sized-int.rs:47:9
|
||||
|
|
||||
LL | (0isize, true),
|
||||
| ^^^^^^^^^^^^^^ patterns `(..isize::MIN, _)` and `(isize::MAX.., _)` not covered
|
||||
|
|
||||
= note: the matched value is of type `(isize, bool)`
|
||||
= note: `isize` does not have fixed minimum and maximum values, so half-open ranges are necessary to match exhaustively
|
||||
= help: add `#![feature(precise_pointer_size_matching)]` to the crate attributes to enable precise `isize` matching
|
||||
help: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern, a match arm with multiple or-patterns as shown, or multiple match arms
|
||||
|
|
||||
LL | match $s { $($t)+ => {}, (..isize::MIN, _) | (isize::MAX.., _) => todo!() }
|
||||
| ++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||
|
||||
error[E0004]: non-exhaustive patterns: type `usize` is non-empty
|
||||
--> $DIR/pointer-sized-int.rs:59:11
|
||||
--> $DIR/pointer-sized-int.rs:58:11
|
||||
|
|
||||
LL | match 7usize {}
|
||||
| ^^^^^^
|
||||
|
@ -1,6 +1,5 @@
|
||||
// revisions: allow deny
|
||||
// revisions: deny
|
||||
#![feature(exclusive_range_pattern)]
|
||||
#![cfg_attr(allow, feature(precise_pointer_size_matching))]
|
||||
#![allow(overlapping_range_endpoints)]
|
||||
|
||||
macro_rules! m {
|
||||
@ -12,23 +11,23 @@ macro_rules! m {
|
||||
#[rustfmt::skip]
|
||||
fn main() {
|
||||
match 0usize {
|
||||
//[deny]~^ ERROR non-exhaustive patterns
|
||||
//~^ ERROR non-exhaustive patterns
|
||||
0..=usize::MAX => {}
|
||||
}
|
||||
|
||||
match 0isize {
|
||||
//[deny]~^ ERROR non-exhaustive patterns
|
||||
//~^ ERROR non-exhaustive patterns
|
||||
isize::MIN..=isize::MAX => {}
|
||||
}
|
||||
|
||||
m!(0usize, 0..=usize::MAX);
|
||||
//[deny]~^ ERROR non-exhaustive patterns
|
||||
//~^ ERROR non-exhaustive patterns
|
||||
m!(0usize, 0..5 | 5..=usize::MAX);
|
||||
//[deny]~^ ERROR non-exhaustive patterns
|
||||
//~^ ERROR non-exhaustive patterns
|
||||
m!(0usize, 0..usize::MAX | usize::MAX);
|
||||
//[deny]~^ ERROR non-exhaustive patterns
|
||||
//~^ ERROR non-exhaustive patterns
|
||||
m!((0usize, true), (0..5, true) | (5..=usize::MAX, true) | (0..=usize::MAX, false));
|
||||
//[deny]~^ ERROR non-exhaustive patterns
|
||||
//~^ ERROR non-exhaustive patterns
|
||||
|
||||
m!(0usize, 0..);
|
||||
m!(0usize, 0..5 | 5..);
|
||||
@ -37,18 +36,18 @@ fn main() {
|
||||
m!(0usize, 0..=usize::MAX | usize::MAX..);
|
||||
|
||||
m!(0isize, isize::MIN..=isize::MAX);
|
||||
//[deny]~^ ERROR non-exhaustive patterns
|
||||
//~^ ERROR non-exhaustive patterns
|
||||
m!(0isize, isize::MIN..5 | 5..=isize::MAX);
|
||||
//[deny]~^ ERROR non-exhaustive patterns
|
||||
//~^ ERROR non-exhaustive patterns
|
||||
m!(0isize, isize::MIN..=-1 | 0 | 1..=isize::MAX);
|
||||
//[deny]~^ ERROR non-exhaustive patterns
|
||||
//~^ ERROR non-exhaustive patterns
|
||||
m!(0isize, isize::MIN..isize::MAX | isize::MAX);
|
||||
//[deny]~^ ERROR non-exhaustive patterns
|
||||
//~^ ERROR non-exhaustive patterns
|
||||
m!(
|
||||
(0isize, true),
|
||||
(isize::MIN..5, true) | (5..=isize::MAX, true) | (isize::MIN..=isize::MAX, false)
|
||||
);
|
||||
//[deny]~^^^ ERROR non-exhaustive patterns
|
||||
//~^^^ ERROR non-exhaustive patterns
|
||||
|
||||
m!(0isize, ..0 | 0..);
|
||||
m!(0isize, ..5 | 5..);
|
||||
|
@ -6,7 +6,6 @@ LL | match 0usize {
|
||||
|
|
||||
= note: the matched value is of type `usize`
|
||||
= note: `usize` does not have a fixed maximum value, so half-open ranges are necessary to match exhaustively
|
||||
= help: add `#![feature(precise_pointer_size_matching)]` to the crate attributes to enable precise `usize` matching
|
||||
help: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern or an explicit pattern as shown
|
||||
|
|
||||
LL ~ 0..=usize::MAX => {},
|
||||
@ -21,7 +20,6 @@ LL | match 0isize {
|
||||
|
|
||||
= note: the matched value is of type `isize`
|
||||
= note: `isize` does not have fixed minimum and maximum values, so half-open ranges are necessary to match exhaustively
|
||||
= help: add `#![feature(precise_pointer_size_matching)]` to the crate attributes to enable precise `isize` matching
|
||||
help: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern, a match arm with multiple or-patterns as shown, or multiple match arms
|
||||
|
|
||||
LL ~ isize::MIN..=isize::MAX => {},
|
||||
|
@ -6,7 +6,6 @@ LL | match 0 {
|
||||
|
|
||||
= note: the matched value is of type `usize`
|
||||
= note: `usize` does not have a fixed maximum value, so half-open ranges are necessary to match exhaustively
|
||||
= help: add `#![feature(precise_pointer_size_matching)]` to the crate attributes to enable precise `usize` matching
|
||||
help: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern or an explicit pattern as shown
|
||||
|
|
||||
LL ~ 1..=usize::MAX => (),
|
||||
@ -21,7 +20,6 @@ LL | match (0usize, 0usize) {
|
||||
|
|
||||
= note: the matched value is of type `(usize, usize)`
|
||||
= note: `usize` does not have a fixed maximum value, so half-open ranges are necessary to match exhaustively
|
||||
= help: add `#![feature(precise_pointer_size_matching)]` to the crate attributes to enable precise `usize` matching
|
||||
help: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern or an explicit pattern as shown
|
||||
|
|
||||
LL ~ (1..=usize::MAX, 1..=usize::MAX) => (),
|
||||
@ -36,7 +34,6 @@ LL | match (0isize, 0usize) {
|
||||
|
|
||||
= note: the matched value is of type `(isize, usize)`
|
||||
= note: `isize` does not have fixed minimum and maximum values, so half-open ranges are necessary to match exhaustively
|
||||
= help: add `#![feature(precise_pointer_size_matching)]` to the crate attributes to enable precise `isize` matching
|
||||
help: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern, a match arm with multiple or-patterns as shown, or multiple match arms
|
||||
|
|
||||
LL ~ (isize::MIN..=isize::MAX, 1..=usize::MAX) => (),
|
||||
@ -74,7 +71,6 @@ note: `Option<usize>` defined here
|
||||
= note: not covered
|
||||
= note: the matched value is of type `Option<usize>`
|
||||
= note: `usize` does not have a fixed maximum value, so half-open ranges are necessary to match exhaustively
|
||||
= help: add `#![feature(precise_pointer_size_matching)]` to the crate attributes to enable precise `usize` matching
|
||||
help: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern or an explicit pattern as shown
|
||||
|
|
||||
LL ~ None => (),
|
||||
@ -98,7 +94,6 @@ note: `Option<Option<Option<usize>>>` defined here
|
||||
= note: not covered
|
||||
= note: the matched value is of type `Option<Option<Option<usize>>>`
|
||||
= note: `usize` does not have a fixed maximum value, so half-open ranges are necessary to match exhaustively
|
||||
= help: add `#![feature(precise_pointer_size_matching)]` to the crate attributes to enable precise `usize` matching
|
||||
help: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern or an explicit pattern as shown
|
||||
|
|
||||
LL ~ None => (),
|
||||
@ -118,7 +113,6 @@ LL | struct A<T> {
|
||||
| ^
|
||||
= note: the matched value is of type `A<usize>`
|
||||
= note: `usize` does not have a fixed maximum value, so half-open ranges are necessary to match exhaustively
|
||||
= help: add `#![feature(precise_pointer_size_matching)]` to the crate attributes to enable precise `usize` matching
|
||||
help: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern or an explicit pattern as shown
|
||||
|
|
||||
LL ~ A { a: 1..=usize::MAX } => (),
|
||||
@ -138,7 +132,6 @@ LL | struct B<T, U>(T, U);
|
||||
| ^
|
||||
= note: the matched value is of type `B<isize, usize>`
|
||||
= note: `isize` does not have fixed minimum and maximum values, so half-open ranges are necessary to match exhaustively
|
||||
= help: add `#![feature(precise_pointer_size_matching)]` to the crate attributes to enable precise `isize` matching
|
||||
help: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern, a match arm with multiple or-patterns as shown, or multiple match arms
|
||||
|
|
||||
LL ~ B(isize::MIN..=isize::MAX, 1..=usize::MAX) => (),
|
||||
@ -158,7 +151,6 @@ LL | struct B<T, U>(T, U);
|
||||
| ^
|
||||
= note: the matched value is of type `B<isize, usize>`
|
||||
= note: `usize` does not have a fixed maximum value, so half-open ranges are necessary to match exhaustively
|
||||
= help: add `#![feature(precise_pointer_size_matching)]` to the crate attributes to enable precise `usize` matching
|
||||
help: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern or an explicit pattern as shown
|
||||
|
|
||||
LL ~ B(_, 1..=usize::MAX) => (),
|
||||
|
@ -0,0 +1,15 @@
|
||||
// Ensure that we don't get a mismatch error when inserting the host param
|
||||
// at the end of generic args when the generics have defaulted params.
|
||||
//
|
||||
// check-pass
|
||||
|
||||
#![feature(const_trait_impl, effects)]
|
||||
|
||||
#[const_trait]
|
||||
pub trait Foo<Rhs: ?Sized = Self> {
|
||||
/* stuff */
|
||||
}
|
||||
|
||||
impl const Foo for () {}
|
||||
|
||||
fn main() {}
|
@ -21,8 +21,7 @@ trait Add<Rhs = Self> {
|
||||
fn add(self, rhs: Rhs) -> Self::Output;
|
||||
}
|
||||
|
||||
// FIXME(effects) we shouldn't need to have to specify `Rhs`.
|
||||
impl const Add<i32> for i32 {
|
||||
impl const Add for i32 {
|
||||
type Output = i32;
|
||||
fn add(self, rhs: i32) -> i32 {
|
||||
loop {}
|
||||
@ -353,8 +352,7 @@ fn eq(&self, other: &&B) -> bool {
|
||||
}
|
||||
}
|
||||
|
||||
// FIXME(effects): again, this should not error without Rhs specified
|
||||
impl PartialEq<str> for str {
|
||||
impl PartialEq for str {
|
||||
fn eq(&self, other: &str) -> bool {
|
||||
loop {}
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
error[E0493]: destructor of `Self` cannot be evaluated at compile-time
|
||||
--> $DIR/minicore.rs:503:9
|
||||
--> $DIR/minicore.rs:501:9
|
||||
|
|
||||
LL | *self = source.clone()
|
||||
| ^^^^^
|
||||
@ -8,7 +8,7 @@ LL | *self = source.clone()
|
||||
| value is dropped here
|
||||
|
||||
error[E0493]: destructor of `T` cannot be evaluated at compile-time
|
||||
--> $DIR/minicore.rs:513:35
|
||||
--> $DIR/minicore.rs:511:35
|
||||
|
|
||||
LL | const fn drop<T: ~const Destruct>(_: T) {}
|
||||
| ^ - value is dropped here
|
||||
|
Loading…
Reference in New Issue
Block a user