Auto merge of #61460 - Centril:rollup-8txhjx4, r=Centril
Rollup of 6 pull requests Successful merges: - #61380 (Fix some issues with `unwrap_usize` instead of `assert_usize`) - #61423 (codegen: change `$6d$` to `$u6d$`) - #61438 (Point at individual type args on arg count mismatch) - #61441 (Tweak wording when encountering `fn` call in pattern) - #61451 (Fix missing semicolon in doc) - #61458 (Fix typo in AsRef doc) Failed merges: r? @ghost
This commit is contained in:
commit
d461555e44
33 changed files with 313 additions and 92 deletions
|
@ -129,7 +129,7 @@ pub const fn identity<T>(x: T) -> T { x }
|
||||||
/// # Examples
|
/// # Examples
|
||||||
///
|
///
|
||||||
/// By using trait bounds we can accept arguments of different types as long as they can be
|
/// By using trait bounds we can accept arguments of different types as long as they can be
|
||||||
/// converted a the specified type `T`.
|
/// converted to the specified type `T`.
|
||||||
///
|
///
|
||||||
/// For example: By creating a generic function that takes an `AsRef<str>` we express that we
|
/// For example: By creating a generic function that takes an `AsRef<str>` we express that we
|
||||||
/// want to accept all references that can be converted to `&str` as an argument.
|
/// want to accept all references that can be converted to `&str` as an argument.
|
||||||
|
|
|
@ -628,10 +628,6 @@ impl<'hir> Map<'hir> {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn get_generics_span(&self, id: DefId) -> Option<Span> {
|
|
||||||
self.get_generics(id).map(|generics| generics.span).filter(|sp| *sp != DUMMY_SP)
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Retrieves the `Node` corresponding to `id`, returning `None` if cannot be found.
|
/// Retrieves the `Node` corresponding to `id`, returning `None` if cannot be found.
|
||||||
pub fn find(&self, id: NodeId) -> Option<Node<'hir>> {
|
pub fn find(&self, id: NodeId) -> Option<Node<'hir>> {
|
||||||
let hir_id = self.node_to_hir_id(id);
|
let hir_id = self.node_to_hir_id(id);
|
||||||
|
|
|
@ -16,7 +16,7 @@ use crate::util::nodemap::{NodeMap, FxHashSet};
|
||||||
use crate::mir::mono::Linkage;
|
use crate::mir::mono::Linkage;
|
||||||
|
|
||||||
use errors::FatalError;
|
use errors::FatalError;
|
||||||
use syntax_pos::{Span, DUMMY_SP, symbol::InternedString};
|
use syntax_pos::{Span, DUMMY_SP, symbol::InternedString, MultiSpan};
|
||||||
use syntax::source_map::Spanned;
|
use syntax::source_map::Spanned;
|
||||||
use rustc_target::spec::abi::Abi;
|
use rustc_target::spec::abi::Abi;
|
||||||
use syntax::ast::{self, CrateSugar, Ident, Name, NodeId, AsmDialect};
|
use syntax::ast::{self, CrateSugar, Ident, Name, NodeId, AsmDialect};
|
||||||
|
@ -625,6 +625,14 @@ impl Generics {
|
||||||
}
|
}
|
||||||
None
|
None
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn spans(&self) -> MultiSpan {
|
||||||
|
if self.params.is_empty() {
|
||||||
|
self.span.into()
|
||||||
|
} else {
|
||||||
|
self.params.iter().map(|p| p.span).collect::<Vec<Span>>().into()
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Synthetic type parameters are converted to another form during lowering; this allows
|
/// Synthetic type parameters are converted to another form during lowering; this allows
|
||||||
|
|
|
@ -914,8 +914,11 @@ impl<'a, 'gcx, 'tcx> InferCtxt<'a, 'gcx, 'tcx> {
|
||||||
}
|
}
|
||||||
|
|
||||||
// already reported in the query
|
// already reported in the query
|
||||||
ConstEvalFailure(_) => {
|
ConstEvalFailure(err) => {
|
||||||
self.tcx.sess.delay_span_bug(span, "constant in type had an ignored error");
|
self.tcx.sess.delay_span_bug(
|
||||||
|
span,
|
||||||
|
&format!("constant in type had an ignored error: {:?}", err),
|
||||||
|
);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -549,8 +549,8 @@ impl<'a, 'tcx> LayoutCx<'tcx, TyCtxt<'a, 'tcx, 'tcx>> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let count = count.assert_usize(tcx).ok_or(LayoutError::Unknown(ty))?;
|
||||||
let element = self.layout_of(element)?;
|
let element = self.layout_of(element)?;
|
||||||
let count = count.unwrap_usize(tcx);
|
|
||||||
let size = element.size.checked_mul(count, dl)
|
let size = element.size.checked_mul(count, dl)
|
||||||
.ok_or(LayoutError::SizeOverflow(ty))?;
|
.ok_or(LayoutError::SizeOverflow(ty))?;
|
||||||
|
|
||||||
|
|
|
@ -342,9 +342,7 @@ fn fixed_vec_metadata(
|
||||||
let (size, align) = cx.size_and_align_of(array_or_slice_type);
|
let (size, align) = cx.size_and_align_of(array_or_slice_type);
|
||||||
|
|
||||||
let upper_bound = match array_or_slice_type.sty {
|
let upper_bound = match array_or_slice_type.sty {
|
||||||
ty::Array(_, len) => {
|
ty::Array(_, len) => len.unwrap_usize(cx.tcx) as c_longlong,
|
||||||
len.unwrap_usize(cx.tcx) as c_longlong
|
|
||||||
}
|
|
||||||
_ => -1
|
_ => -1
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -440,7 +440,7 @@ impl fmt::Write for SymbolPrinter<'_, '_> {
|
||||||
'-' | ':' => self.path.temp_buf.push('.'),
|
'-' | ':' => self.path.temp_buf.push('.'),
|
||||||
|
|
||||||
// Avoid crashing LLVM in certain (LTO-related) situations, see #60925.
|
// Avoid crashing LLVM in certain (LTO-related) situations, see #60925.
|
||||||
'm' if self.path.temp_buf.ends_with(".llv") => self.path.temp_buf.push_str("$6d$"),
|
'm' if self.path.temp_buf.ends_with(".llv") => self.path.temp_buf.push_str("$u6d$"),
|
||||||
|
|
||||||
// These are legal symbols
|
// These are legal symbols
|
||||||
'a'..='z' | 'A'..='Z' | '0'..='9' | '_' | '.' | '$' => self.path.temp_buf.push(c),
|
'a'..='z' | 'A'..='Z' | '0'..='9' | '_' | '.' | '$' => self.path.temp_buf.push(c),
|
||||||
|
|
|
@ -332,8 +332,8 @@ fn place_base_conflict<'a, 'gcx: 'tcx, 'tcx>(
|
||||||
},
|
},
|
||||||
(StaticKind::Promoted(promoted_1), StaticKind::Promoted(promoted_2)) => {
|
(StaticKind::Promoted(promoted_1), StaticKind::Promoted(promoted_2)) => {
|
||||||
if promoted_1 == promoted_2 {
|
if promoted_1 == promoted_2 {
|
||||||
if let ty::Array(_, size) = s1.ty.sty {
|
if let ty::Array(_, len) = s1.ty.sty {
|
||||||
if size.unwrap_usize(tcx) == 0 {
|
if let Some(0) = len.assert_usize(tcx) {
|
||||||
// Ignore conflicts with promoted [T; 0].
|
// Ignore conflicts with promoted [T; 0].
|
||||||
debug!("place_element_conflict: IGNORE-LEN-0-PROMOTED");
|
debug!("place_element_conflict: IGNORE-LEN-0-PROMOTED");
|
||||||
return Overlap::Disjoint;
|
return Overlap::Disjoint;
|
||||||
|
|
|
@ -316,8 +316,9 @@ impl Qualif for HasMutInterior {
|
||||||
} else if let ty::Array(_, len) = ty.sty {
|
} else if let ty::Array(_, len) = ty.sty {
|
||||||
// FIXME(eddyb) the `cx.mode == Mode::Fn` condition
|
// FIXME(eddyb) the `cx.mode == Mode::Fn` condition
|
||||||
// seems unnecessary, given that this is merely a ZST.
|
// seems unnecessary, given that this is merely a ZST.
|
||||||
if !(len.unwrap_usize(cx.tcx) == 0 && cx.mode == Mode::Fn) {
|
match len.assert_usize(cx.tcx) {
|
||||||
return true;
|
Some(0) if cx.mode == Mode::Fn => {},
|
||||||
|
_ => return true,
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
return true;
|
return true;
|
||||||
|
|
|
@ -400,7 +400,7 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
|
||||||
let expected_ty = self.structurally_resolved_type(pat.span, expected);
|
let expected_ty = self.structurally_resolved_type(pat.span, expected);
|
||||||
let (inner_ty, slice_ty) = match expected_ty.sty {
|
let (inner_ty, slice_ty) = match expected_ty.sty {
|
||||||
ty::Array(inner_ty, size) => {
|
ty::Array(inner_ty, size) => {
|
||||||
let size = size.unwrap_usize(tcx);
|
if let Some(size) = size.assert_usize(tcx) {
|
||||||
let min_len = before.len() as u64 + after.len() as u64;
|
let min_len = before.len() as u64 + after.len() as u64;
|
||||||
if slice.is_none() {
|
if slice.is_none() {
|
||||||
if min_len != size {
|
if min_len != size {
|
||||||
|
@ -423,6 +423,15 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
|
||||||
.emit();
|
.emit();
|
||||||
(inner_ty, tcx.types.err)
|
(inner_ty, tcx.types.err)
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
struct_span_err!(
|
||||||
|
tcx.sess,
|
||||||
|
pat.span,
|
||||||
|
E0730,
|
||||||
|
"cannot pattern-match on an array without a fixed length",
|
||||||
|
).emit();
|
||||||
|
(inner_ty, tcx.types.err)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
ty::Slice(inner_ty) => (inner_ty, expected_ty),
|
ty::Slice(inner_ty) => (inner_ty, expected_ty),
|
||||||
_ => {
|
_ => {
|
||||||
|
@ -1080,8 +1089,18 @@ https://doc.rust-lang.org/reference/types.html#trait-objects");
|
||||||
let msg = format!("expected tuple struct/variant, found {} `{}`",
|
let msg = format!("expected tuple struct/variant, found {} `{}`",
|
||||||
res.descr(),
|
res.descr(),
|
||||||
hir::print::to_string(tcx.hir(), |s| s.print_qpath(qpath, false)));
|
hir::print::to_string(tcx.hir(), |s| s.print_qpath(qpath, false)));
|
||||||
struct_span_err!(tcx.sess, pat.span, E0164, "{}", msg)
|
let mut err = struct_span_err!(tcx.sess, pat.span, E0164, "{}", msg);
|
||||||
.span_label(pat.span, "not a tuple variant or struct").emit();
|
match (res, &pat.node) {
|
||||||
|
(Res::Def(DefKind::Fn, _), _) | (Res::Def(DefKind::Method, _), _) => {
|
||||||
|
err.span_label(pat.span, "`fn` calls are not allowed in patterns");
|
||||||
|
err.help("for more information, visit \
|
||||||
|
https://doc.rust-lang.org/book/ch18-00-patterns.html");
|
||||||
|
}
|
||||||
|
_ => {
|
||||||
|
err.span_label(pat.span, "not a tuple variant or struct");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
err.emit();
|
||||||
on_error();
|
on_error();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -385,7 +385,7 @@ fn check_region_bounds_on_impl_method<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
|
||||||
// the moment, give a kind of vague error message.
|
// the moment, give a kind of vague error message.
|
||||||
if trait_params != impl_params {
|
if trait_params != impl_params {
|
||||||
let def_span = tcx.sess.source_map().def_span(span);
|
let def_span = tcx.sess.source_map().def_span(span);
|
||||||
let span = tcx.hir().get_generics_span(impl_m.def_id).unwrap_or(def_span);
|
let span = tcx.hir().get_generics(impl_m.def_id).map(|g| g.span).unwrap_or(def_span);
|
||||||
let mut err = struct_span_err!(
|
let mut err = struct_span_err!(
|
||||||
tcx.sess,
|
tcx.sess,
|
||||||
span,
|
span,
|
||||||
|
@ -396,7 +396,7 @@ fn check_region_bounds_on_impl_method<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
|
||||||
err.span_label(span, "lifetimes do not match method in trait");
|
err.span_label(span, "lifetimes do not match method in trait");
|
||||||
if let Some(sp) = tcx.hir().span_if_local(trait_m.def_id) {
|
if let Some(sp) = tcx.hir().span_if_local(trait_m.def_id) {
|
||||||
let def_sp = tcx.sess.source_map().def_span(sp);
|
let def_sp = tcx.sess.source_map().def_span(sp);
|
||||||
let sp = tcx.hir().get_generics_span(trait_m.def_id).unwrap_or(def_sp);
|
let sp = tcx.hir().get_generics(trait_m.def_id).map(|g| g.span).unwrap_or(def_sp);
|
||||||
err.span_label(sp, "lifetimes in impl do not match this method in trait");
|
err.span_label(sp, "lifetimes in impl do not match this method in trait");
|
||||||
}
|
}
|
||||||
err.emit();
|
err.emit();
|
||||||
|
@ -583,7 +583,7 @@ fn compare_self_type<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
|
||||||
fn compare_number_of_generics<'a, 'tcx>(
|
fn compare_number_of_generics<'a, 'tcx>(
|
||||||
tcx: TyCtxt<'a, 'tcx, 'tcx>,
|
tcx: TyCtxt<'a, 'tcx, 'tcx>,
|
||||||
impl_: &ty::AssocItem,
|
impl_: &ty::AssocItem,
|
||||||
impl_span: Span,
|
_impl_span: Span,
|
||||||
trait_: &ty::AssocItem,
|
trait_: &ty::AssocItem,
|
||||||
trait_span: Option<Span>,
|
trait_span: Option<Span>,
|
||||||
) -> Result<(), ErrorReported> {
|
) -> Result<(), ErrorReported> {
|
||||||
|
@ -600,17 +600,44 @@ fn compare_number_of_generics<'a, 'tcx>(
|
||||||
if impl_count != trait_count {
|
if impl_count != trait_count {
|
||||||
err_occurred = true;
|
err_occurred = true;
|
||||||
|
|
||||||
let impl_hir_id = tcx.hir().as_local_hir_id(impl_.def_id).unwrap();
|
let (
|
||||||
let impl_item = tcx.hir().expect_impl_item(impl_hir_id);
|
trait_spans,
|
||||||
let span = if impl_item.generics.params.is_empty()
|
impl_trait_spans,
|
||||||
|| impl_item.generics.span.is_dummy() { // argument position impl Trait (#55374)
|
) = if let Some(trait_hir_id) = tcx.hir().as_local_hir_id(trait_.def_id) {
|
||||||
impl_span
|
let trait_item = tcx.hir().expect_trait_item(trait_hir_id);
|
||||||
|
if trait_item.generics.params.is_empty() {
|
||||||
|
(Some(vec![trait_item.generics.span]), vec![])
|
||||||
} else {
|
} else {
|
||||||
impl_item.generics.span
|
let arg_spans: Vec<Span> = trait_item.generics.params.iter()
|
||||||
|
.map(|p| p.span)
|
||||||
|
.collect();
|
||||||
|
let impl_trait_spans: Vec<Span> = trait_item.generics.params.iter()
|
||||||
|
.filter_map(|p| match p.kind {
|
||||||
|
GenericParamKind::Type {
|
||||||
|
synthetic: Some(hir::SyntheticTyParamKind::ImplTrait), ..
|
||||||
|
} => Some(p.span),
|
||||||
|
_ => None,
|
||||||
|
}).collect();
|
||||||
|
(Some(arg_spans), impl_trait_spans)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
(trait_span.map(|s| vec![s]), vec![])
|
||||||
};
|
};
|
||||||
|
|
||||||
|
let impl_hir_id = tcx.hir().as_local_hir_id(impl_.def_id).unwrap();
|
||||||
|
let impl_item = tcx.hir().expect_impl_item(impl_hir_id);
|
||||||
|
let impl_item_impl_trait_spans: Vec<Span> = impl_item.generics.params.iter()
|
||||||
|
.filter_map(|p| match p.kind {
|
||||||
|
GenericParamKind::Type {
|
||||||
|
synthetic: Some(hir::SyntheticTyParamKind::ImplTrait), ..
|
||||||
|
} => Some(p.span),
|
||||||
|
_ => None,
|
||||||
|
}).collect();
|
||||||
|
let spans = impl_item.generics.spans();
|
||||||
|
let span = spans.primary_span();
|
||||||
|
|
||||||
let mut err = tcx.sess.struct_span_err_with_code(
|
let mut err = tcx.sess.struct_span_err_with_code(
|
||||||
span,
|
spans,
|
||||||
&format!(
|
&format!(
|
||||||
"method `{}` has {} {kind} parameter{} but its trait \
|
"method `{}` has {} {kind} parameter{} but its trait \
|
||||||
declaration has {} {kind} parameter{}",
|
declaration has {} {kind} parameter{}",
|
||||||
|
@ -626,22 +653,36 @@ fn compare_number_of_generics<'a, 'tcx>(
|
||||||
|
|
||||||
let mut suffix = None;
|
let mut suffix = None;
|
||||||
|
|
||||||
if let Some(span) = trait_span {
|
if let Some(spans) = trait_spans {
|
||||||
err.span_label(
|
let mut spans = spans.iter();
|
||||||
span,
|
if let Some(span) = spans.next() {
|
||||||
format!("expected {} {} parameter{}", trait_count, kind,
|
err.span_label(*span, format!(
|
||||||
if trait_count != 1 { "s" } else { "" })
|
"expected {} {} parameter{}",
|
||||||
);
|
trait_count,
|
||||||
|
kind,
|
||||||
|
if trait_count != 1 { "s" } else { "" },
|
||||||
|
));
|
||||||
|
}
|
||||||
|
for span in spans {
|
||||||
|
err.span_label(*span, "");
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
suffix = Some(format!(", expected {}", trait_count));
|
suffix = Some(format!(", expected {}", trait_count));
|
||||||
}
|
}
|
||||||
|
|
||||||
err.span_label(
|
if let Some(span) = span {
|
||||||
span,
|
err.span_label(span, format!(
|
||||||
format!("found {} {} parameter{}{}", impl_count, kind,
|
"found {} {} parameter{}{}",
|
||||||
|
impl_count,
|
||||||
|
kind,
|
||||||
if impl_count != 1 { "s" } else { "" },
|
if impl_count != 1 { "s" } else { "" },
|
||||||
suffix.unwrap_or_else(|| String::new())),
|
suffix.unwrap_or_else(|| String::new()),
|
||||||
);
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
for span in impl_trait_spans.iter().chain(impl_item_impl_trait_spans.iter()) {
|
||||||
|
err.span_label(*span, "`impl Trait` introduces an implicit type parameter");
|
||||||
|
}
|
||||||
|
|
||||||
err.emit();
|
err.emit();
|
||||||
}
|
}
|
||||||
|
|
|
@ -4648,6 +4648,38 @@ fn make_recursive_type() -> impl Sized {
|
||||||
```
|
```
|
||||||
"##,
|
"##,
|
||||||
|
|
||||||
|
E0730: r##"
|
||||||
|
An array without a fixed length was pattern-matched.
|
||||||
|
|
||||||
|
Example of erroneous code:
|
||||||
|
|
||||||
|
```compile_fail,E0730
|
||||||
|
#![feature(const_generics)]
|
||||||
|
|
||||||
|
fn is_123<const N: usize>(x: [u32; N]) -> bool {
|
||||||
|
match x {
|
||||||
|
[1, 2, 3] => true, // error: cannot pattern-match on an
|
||||||
|
// array without a fixed length
|
||||||
|
_ => false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Ensure that the pattern is consistent with the size of the matched
|
||||||
|
array. Additional elements can be matched with `..`:
|
||||||
|
|
||||||
|
```
|
||||||
|
#![feature(slice_patterns)]
|
||||||
|
|
||||||
|
let r = &[1, 2, 3, 4];
|
||||||
|
match r {
|
||||||
|
&[a, b, ..] => { // ok!
|
||||||
|
println!("a={}, b={}", a, b);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
"##,
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
register_diagnostics! {
|
register_diagnostics! {
|
||||||
|
|
|
@ -405,7 +405,7 @@ mod builtin {
|
||||||
///
|
///
|
||||||
/// ```compile_fail
|
/// ```compile_fail
|
||||||
/// #[cfg(not(any(feature = "foo", feature = "bar")))]
|
/// #[cfg(not(any(feature = "foo", feature = "bar")))]
|
||||||
/// compile_error!("Either feature \"foo\" or \"bar\" must be enabled for this crate.")
|
/// compile_error!("Either feature \"foo\" or \"bar\" must be enabled for this crate.");
|
||||||
/// ```
|
/// ```
|
||||||
///
|
///
|
||||||
/// [`panic!`]: ../std/macro.panic.html
|
/// [`panic!`]: ../std/macro.panic.html
|
||||||
|
|
|
@ -5050,9 +5050,13 @@ impl<'a> Parser<'a> {
|
||||||
/// where typaramseq = ( typaram ) | ( typaram , typaramseq )
|
/// where typaramseq = ( typaram ) | ( typaram , typaramseq )
|
||||||
fn parse_generics(&mut self) -> PResult<'a, ast::Generics> {
|
fn parse_generics(&mut self) -> PResult<'a, ast::Generics> {
|
||||||
let span_lo = self.span;
|
let span_lo = self.span;
|
||||||
if self.eat_lt() {
|
let (params, span) = if self.eat_lt() {
|
||||||
let params = self.parse_generic_params()?;
|
let params = self.parse_generic_params()?;
|
||||||
self.expect_gt()?;
|
self.expect_gt()?;
|
||||||
|
(params, span_lo.to(self.prev_span))
|
||||||
|
} else {
|
||||||
|
(vec![], self.prev_span.between(self.span))
|
||||||
|
};
|
||||||
Ok(ast::Generics {
|
Ok(ast::Generics {
|
||||||
params,
|
params,
|
||||||
where_clause: WhereClause {
|
where_clause: WhereClause {
|
||||||
|
@ -5060,11 +5064,8 @@ impl<'a> Parser<'a> {
|
||||||
predicates: Vec::new(),
|
predicates: Vec::new(),
|
||||||
span: DUMMY_SP,
|
span: DUMMY_SP,
|
||||||
},
|
},
|
||||||
span: span_lo.to(self.prev_span),
|
span,
|
||||||
})
|
})
|
||||||
} else {
|
|
||||||
Ok(ast::Generics::default())
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Parses generic args (within a path segment) with recovery for extra leading angle brackets.
|
/// Parses generic args (within a path segment) with recovery for extra leading angle brackets.
|
||||||
|
|
|
@ -36,13 +36,13 @@ LL | fn wrong_bound1<'b,'c,'d:'a+'c>(self, b: Inv<'b>, c: Inv<'c>, d: Inv<'d
|
||||||
| ^^
|
| ^^
|
||||||
|
|
||||||
error[E0195]: lifetime parameters or bounds on method `wrong_bound2` do not match the trait declaration
|
error[E0195]: lifetime parameters or bounds on method `wrong_bound2` do not match the trait declaration
|
||||||
--> $DIR/regions-bound-missing-bound-in-impl.rs:41:5
|
--> $DIR/regions-bound-missing-bound-in-impl.rs:41:20
|
||||||
|
|
|
|
||||||
LL | fn wrong_bound2<'b,'c,'d:'a+'b>(self, b: Inv<'b>, c: Inv<'c>, d: Inv<'d>);
|
LL | fn wrong_bound2<'b,'c,'d:'a+'b>(self, b: Inv<'b>, c: Inv<'c>, d: Inv<'d>);
|
||||||
| ---------------- lifetimes in impl do not match this method in trait
|
| ---------------- lifetimes in impl do not match this method in trait
|
||||||
...
|
...
|
||||||
LL | fn wrong_bound2(self, b: Inv, c: Inv, d: Inv) {
|
LL | fn wrong_bound2(self, b: Inv, c: Inv, d: Inv) {
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ lifetimes do not match method in trait
|
| ^ lifetimes do not match method in trait
|
||||||
|
|
||||||
error[E0276]: impl has stricter requirements than trait
|
error[E0276]: impl has stricter requirements than trait
|
||||||
--> $DIR/regions-bound-missing-bound-in-impl.rs:48:5
|
--> $DIR/regions-bound-missing-bound-in-impl.rs:48:5
|
||||||
|
|
15
src/test/ui/const-generics/issue-61422.rs
Normal file
15
src/test/ui/const-generics/issue-61422.rs
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
// run-pass
|
||||||
|
|
||||||
|
#![feature(const_generics)]
|
||||||
|
//~^ WARN the feature `const_generics` is incomplete and may cause the compiler to crash
|
||||||
|
|
||||||
|
use std::mem;
|
||||||
|
|
||||||
|
fn foo<const SIZE: usize>() {
|
||||||
|
let arr: [u8; SIZE] = unsafe {
|
||||||
|
let mut array: [u8; SIZE] = mem::uninitialized();
|
||||||
|
array
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {}
|
6
src/test/ui/const-generics/issue-61422.stderr
Normal file
6
src/test/ui/const-generics/issue-61422.stderr
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
warning: the feature `const_generics` is incomplete and may cause the compiler to crash
|
||||||
|
--> $DIR/issue-61422.rs:3:12
|
||||||
|
|
|
||||||
|
LL | #![feature(const_generics)]
|
||||||
|
| ^^^^^^^^^^^^^^
|
||||||
|
|
19
src/test/ui/const-generics/mut-ref-const-param-array.rs
Normal file
19
src/test/ui/const-generics/mut-ref-const-param-array.rs
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
// run-pass
|
||||||
|
|
||||||
|
#![feature(const_generics)]
|
||||||
|
//~^ WARN the feature `const_generics` is incomplete and may cause the compiler to crash
|
||||||
|
|
||||||
|
use std::ops::AddAssign;
|
||||||
|
|
||||||
|
fn inc<T: AddAssign + Clone, const N: usize>(v: &mut [T; N]) -> &mut [T; N] {
|
||||||
|
for x in v.iter_mut() {
|
||||||
|
*x += x.clone();
|
||||||
|
}
|
||||||
|
v
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let mut v = [1, 2, 3];
|
||||||
|
inc(&mut v);
|
||||||
|
assert_eq!(v, [2, 4, 6]);
|
||||||
|
}
|
|
@ -0,0 +1,6 @@
|
||||||
|
warning: the feature `const_generics` is incomplete and may cause the compiler to crash
|
||||||
|
--> $DIR/mut-ref-const-param-array.rs:3:12
|
||||||
|
|
|
||||||
|
LL | #![feature(const_generics)]
|
||||||
|
| ^^^^^^^^^^^^^^
|
||||||
|
|
|
@ -0,0 +1,11 @@
|
||||||
|
// run-pass
|
||||||
|
|
||||||
|
#![feature(const_generics)]
|
||||||
|
//~^ WARN the feature `const_generics` is incomplete and may cause the compiler to crash
|
||||||
|
|
||||||
|
use std::mem::MaybeUninit;
|
||||||
|
|
||||||
|
#[repr(transparent)]
|
||||||
|
pub struct MaybeUninitWrapper<const N: usize>(MaybeUninit<[u64; N]>);
|
||||||
|
|
||||||
|
fn main() {}
|
|
@ -0,0 +1,6 @@
|
||||||
|
warning: the feature `const_generics` is incomplete and may cause the compiler to crash
|
||||||
|
--> $DIR/transparent-maybeunit-array-wrapper.rs:3:12
|
||||||
|
|
|
||||||
|
LL | #![feature(const_generics)]
|
||||||
|
| ^^^^^^^^^^^^^^
|
||||||
|
|
|
@ -8,5 +8,15 @@ impl Foo for Bar {
|
||||||
fn foo(x: bool) -> Self { Bar } //~ ERROR E0049
|
fn foo(x: bool) -> Self { Bar } //~ ERROR E0049
|
||||||
}
|
}
|
||||||
|
|
||||||
|
trait Fuzz {
|
||||||
|
fn fuzz<A: Default, B>(x: A, y: B) -> Self;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct Baz;
|
||||||
|
|
||||||
|
impl Fuzz for Baz {
|
||||||
|
fn fuzz(x: bool, y: bool) -> Self { Baz } //~ ERROR E0049
|
||||||
|
}
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,12 +1,23 @@
|
||||||
error[E0049]: method `foo` has 0 type parameters but its trait declaration has 1 type parameter
|
error[E0049]: method `foo` has 0 type parameters but its trait declaration has 1 type parameter
|
||||||
--> $DIR/E0049.rs:8:5
|
--> $DIR/E0049.rs:8:11
|
||||||
|
|
|
|
||||||
LL | fn foo<T: Default>(x: T) -> Self;
|
LL | fn foo<T: Default>(x: T) -> Self;
|
||||||
| --------------------------------- expected 1 type parameter
|
| - expected 1 type parameter
|
||||||
...
|
...
|
||||||
LL | fn foo(x: bool) -> Self { Bar }
|
LL | fn foo(x: bool) -> Self { Bar }
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^ found 0 type parameters
|
| ^ found 0 type parameters
|
||||||
|
|
||||||
error: aborting due to previous error
|
error[E0049]: method `fuzz` has 0 type parameters but its trait declaration has 2 type parameters
|
||||||
|
--> $DIR/E0049.rs:18:12
|
||||||
|
|
|
||||||
|
LL | fn fuzz<A: Default, B>(x: A, y: B) -> Self;
|
||||||
|
| - -
|
||||||
|
| |
|
||||||
|
| expected 2 type parameters
|
||||||
|
...
|
||||||
|
LL | fn fuzz(x: bool, y: bool) -> Self { Baz }
|
||||||
|
| ^ found 0 type parameters
|
||||||
|
|
||||||
|
error: aborting due to 2 previous errors
|
||||||
|
|
||||||
For more information about this error, try `rustc --explain E0049`.
|
For more information about this error, try `rustc --explain E0049`.
|
||||||
|
|
11
src/test/ui/error-codes/E0730.rs
Normal file
11
src/test/ui/error-codes/E0730.rs
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
#![feature(const_generics)]
|
||||||
|
//~^ WARN the feature `const_generics` is incomplete and may cause the compiler to crash
|
||||||
|
|
||||||
|
fn is_123<const N: usize>(x: [u32; N]) -> bool {
|
||||||
|
match x {
|
||||||
|
[1, 2, 3] => true, //~ ERROR cannot pattern-match on an array without a fixed length
|
||||||
|
_ => false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {}
|
15
src/test/ui/error-codes/E0730.stderr
Normal file
15
src/test/ui/error-codes/E0730.stderr
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
warning: the feature `const_generics` is incomplete and may cause the compiler to crash
|
||||||
|
--> $DIR/E0730.rs:1:12
|
||||||
|
|
|
||||||
|
LL | #![feature(const_generics)]
|
||||||
|
| ^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
error[E0730]: cannot pattern-match on an array without a fixed length
|
||||||
|
--> $DIR/E0730.rs:6:9
|
||||||
|
|
|
||||||
|
LL | [1, 2, 3] => true,
|
||||||
|
| ^^^^^^^^^
|
||||||
|
|
||||||
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0730`.
|
|
@ -2,7 +2,9 @@ error[E0164]: expected tuple struct/variant, found method `<A>::new`
|
||||||
--> $DIR/fn-in-pat.rs:11:9
|
--> $DIR/fn-in-pat.rs:11:9
|
||||||
|
|
|
|
||||||
LL | A::new() => (),
|
LL | A::new() => (),
|
||||||
| ^^^^^^^^ not a tuple variant or struct
|
| ^^^^^^^^ `fn` calls are not allowed in patterns
|
||||||
|
|
|
||||||
|
= help: for more information, visit https://doc.rust-lang.org/book/ch18-00-patterns.html
|
||||||
|
|
||||||
error: aborting due to previous error
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
error[E0049]: method `foo` has 1 type parameter but its trait declaration has 0 type parameters
|
error[E0049]: method `foo` has 1 type parameter but its trait declaration has 0 type parameters
|
||||||
--> $DIR/issue-36708.rs:8:11
|
--> $DIR/issue-36708.rs:8:12
|
||||||
|
|
|
|
||||||
LL | fn foo<T>() {}
|
LL | fn foo<T>() {}
|
||||||
| ^^^ found 1 type parameter, expected 0
|
| ^ found 1 type parameter, expected 0
|
||||||
|
|
||||||
error: aborting due to previous error
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
|
|
@ -2,7 +2,9 @@ error[E0164]: expected tuple struct/variant, found method `<Path>::new`
|
||||||
--> $DIR/issue-55587.rs:4:9
|
--> $DIR/issue-55587.rs:4:9
|
||||||
|
|
|
|
||||||
LL | let Path::new();
|
LL | let Path::new();
|
||||||
| ^^^^^^^^^^^ not a tuple variant or struct
|
| ^^^^^^^^^^^ `fn` calls are not allowed in patterns
|
||||||
|
|
|
||||||
|
= help: for more information, visit https://doc.rust-lang.org/book/ch18-00-patterns.html
|
||||||
|
|
||||||
error: aborting due to previous error
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
|
|
@ -10,6 +10,7 @@ impl Foo for u32 {
|
||||||
fn foo(&self, t: impl Clone) {}
|
fn foo(&self, t: impl Clone) {}
|
||||||
//~^ ERROR method `foo` has 1 type parameter but its trait declaration has 0 type parameters
|
//~^ ERROR method `foo` has 1 type parameter but its trait declaration has 0 type parameters
|
||||||
//~| NOTE found 1 type parameter
|
//~| NOTE found 1 type parameter
|
||||||
|
//~| NOTE `impl Trait` introduces an implicit type parameter
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
|
|
@ -1,11 +1,14 @@
|
||||||
error[E0049]: method `foo` has 1 type parameter but its trait declaration has 0 type parameters
|
error[E0049]: method `foo` has 1 type parameter but its trait declaration has 0 type parameters
|
||||||
--> $DIR/type-arg-mismatch-due-to-impl-trait.rs:10:5
|
--> $DIR/type-arg-mismatch-due-to-impl-trait.rs:10:22
|
||||||
|
|
|
|
||||||
LL | fn foo(&self, t: Self::T);
|
LL | fn foo(&self, t: Self::T);
|
||||||
| -------------------------- expected 0 type parameters
|
| - expected 0 type parameters
|
||||||
...
|
...
|
||||||
LL | fn foo(&self, t: impl Clone) {}
|
LL | fn foo(&self, t: impl Clone) {}
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ found 1 type parameter
|
| ^^^^^^^^^^
|
||||||
|
| |
|
||||||
|
| found 1 type parameter
|
||||||
|
| `impl Trait` introduces an implicit type parameter
|
||||||
|
|
||||||
error: aborting due to previous error
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
|
|
@ -2,13 +2,17 @@ error[E0164]: expected tuple struct/variant, found method `<Path>::new`
|
||||||
--> $DIR/match-fn-call.rs:6:9
|
--> $DIR/match-fn-call.rs:6:9
|
||||||
|
|
|
|
||||||
LL | Path::new("foo") => println!("foo"),
|
LL | Path::new("foo") => println!("foo"),
|
||||||
| ^^^^^^^^^^^^^^^^ not a tuple variant or struct
|
| ^^^^^^^^^^^^^^^^ `fn` calls are not allowed in patterns
|
||||||
|
|
|
||||||
|
= help: for more information, visit https://doc.rust-lang.org/book/ch18-00-patterns.html
|
||||||
|
|
||||||
error[E0164]: expected tuple struct/variant, found method `<Path>::new`
|
error[E0164]: expected tuple struct/variant, found method `<Path>::new`
|
||||||
--> $DIR/match-fn-call.rs:8:9
|
--> $DIR/match-fn-call.rs:8:9
|
||||||
|
|
|
|
||||||
LL | Path::new("bar") => println!("bar"),
|
LL | Path::new("bar") => println!("bar"),
|
||||||
| ^^^^^^^^^^^^^^^^ not a tuple variant or struct
|
| ^^^^^^^^^^^^^^^^ `fn` calls are not allowed in patterns
|
||||||
|
|
|
||||||
|
= help: for more information, visit https://doc.rust-lang.org/book/ch18-00-patterns.html
|
||||||
|
|
||||||
error: aborting due to 2 previous errors
|
error: aborting due to 2 previous errors
|
||||||
|
|
||||||
|
|
|
@ -1,16 +1,16 @@
|
||||||
error: symbol-name(_ZN11issue_609253foo36Foo$LT$issue_60925..llv$6d$..Foo$GT$3foo17h059a991a004536adE)
|
error: symbol-name(_ZN11issue_609253foo37Foo$LT$issue_60925..llv$u6d$..Foo$GT$3foo17h059a991a004536adE)
|
||||||
--> $DIR/issue-60925.rs:21:9
|
--> $DIR/issue-60925.rs:21:9
|
||||||
|
|
|
|
||||||
LL | #[rustc_symbol_name]
|
LL | #[rustc_symbol_name]
|
||||||
| ^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
error: demangling(issue_60925::foo::Foo<issue_60925::llv$6d$..Foo$GT$::foo::h059a991a004536ad)
|
error: demangling(issue_60925::foo::Foo<issue_60925::llv$u6d$..Foo$GT$::foo::h059a991a004536ad)
|
||||||
--> $DIR/issue-60925.rs:21:9
|
--> $DIR/issue-60925.rs:21:9
|
||||||
|
|
|
|
||||||
LL | #[rustc_symbol_name]
|
LL | #[rustc_symbol_name]
|
||||||
| ^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
error: demangling-alt(issue_60925::foo::Foo<issue_60925::llv$6d$..Foo$GT$::foo)
|
error: demangling-alt(issue_60925::foo::Foo<issue_60925::llv$u6d$..Foo$GT$::foo)
|
||||||
--> $DIR/issue-60925.rs:21:9
|
--> $DIR/issue-60925.rs:21:9
|
||||||
|
|
|
|
||||||
LL | #[rustc_symbol_name]
|
LL | #[rustc_symbol_name]
|
||||||
|
|
|
@ -19,9 +19,9 @@ mod foo {
|
||||||
|
|
||||||
impl Foo<::llvm::Foo> {
|
impl Foo<::llvm::Foo> {
|
||||||
#[rustc_symbol_name]
|
#[rustc_symbol_name]
|
||||||
//[legacy]~^ ERROR symbol-name(_ZN11issue_609253foo36Foo$LT$issue_60925..llv$6d$..Foo$GT$3foo
|
//[legacy]~^ ERROR symbol-name(_ZN11issue_609253foo37Foo$LT$issue_60925..llv$u6d$..Foo$GT$3foo
|
||||||
//[legacy]~| ERROR demangling(issue_60925::foo::Foo<issue_60925::llv$6d$..Foo$GT$::foo
|
//[legacy]~| ERROR demangling(issue_60925::foo::Foo<issue_60925::llv$u6d$..Foo$GT$::foo
|
||||||
//[legacy]~| ERROR demangling-alt(issue_60925::foo::Foo<issue_60925::llv$6d$..Foo$GT$::foo)
|
//[legacy]~| ERROR demangling-alt(issue_60925::foo::Foo<issue_60925::llv$u6d$..Foo$GT$::foo)
|
||||||
//[v0]~^^^^ ERROR symbol-name(_RNvMNtCs4fqI2P2rA04_11issue_609253fooINtB2_3FooNtNtB4_4llvm3FooE3foo)
|
//[v0]~^^^^ ERROR symbol-name(_RNvMNtCs4fqI2P2rA04_11issue_609253fooINtB2_3FooNtNtB4_4llvm3FooE3foo)
|
||||||
//[v0]~| ERROR demangling(<issue_60925[317d481089b8c8fe]::foo::Foo<issue_60925[317d481089b8c8fe]::llvm::Foo>>::foo)
|
//[v0]~| ERROR demangling(<issue_60925[317d481089b8c8fe]::foo::Foo<issue_60925[317d481089b8c8fe]::llvm::Foo>>::foo)
|
||||||
//[v0]~| ERROR demangling-alt(<issue_60925::foo::Foo<issue_60925::llvm::Foo>>::foo)
|
//[v0]~| ERROR demangling-alt(<issue_60925::foo::Foo<issue_60925::llvm::Foo>>::foo)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue