mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-22 06:44:35 +00:00
Auto merge of #126726 - matthiaskrgr:rollup-ppe8ve3, r=matthiaskrgr
Rollup of 5 pull requests Successful merges: - #126620 (Actually taint InferCtxt when a fulfillment error is emitted) - #126649 (Fix `feature = "nightly"` in the new trait solver) - #126652 (Clarify that anonymous consts still do introduce a new scope) - #126703 (reword the hint::blackbox non-guarantees) - #126708 (Minimize `can_begin_literal_maybe_minus` usage) r? `@ghost` `@rustbot` modify labels: rollup
This commit is contained in:
commit
1208eddaff
@ -4905,6 +4905,7 @@ version = "0.0.0"
|
||||
dependencies = [
|
||||
"bitflags 2.5.0",
|
||||
"derivative",
|
||||
"indexmap",
|
||||
"rustc_ast_ir",
|
||||
"rustc_data_structures",
|
||||
"rustc_index",
|
||||
|
@ -558,9 +558,10 @@ impl Token {
|
||||
/// Returns `true` if the token can appear at the start of a const param.
|
||||
pub fn can_begin_const_arg(&self) -> bool {
|
||||
match self.kind {
|
||||
OpenDelim(Delimiter::Brace) => true,
|
||||
OpenDelim(Delimiter::Brace) | Literal(..) | BinOp(Minus) => true,
|
||||
Ident(name, IdentIsRaw::No) if name.is_bool_lit() => true,
|
||||
Interpolated(ref nt) => matches!(&**nt, NtExpr(..) | NtBlock(..) | NtLiteral(..)),
|
||||
_ => self.can_begin_literal_maybe_minus(),
|
||||
_ => false,
|
||||
}
|
||||
}
|
||||
|
||||
@ -620,6 +621,21 @@ impl Token {
|
||||
}
|
||||
}
|
||||
|
||||
pub fn can_begin_string_literal(&self) -> bool {
|
||||
match self.uninterpolate().kind {
|
||||
Literal(..) => true,
|
||||
Interpolated(ref nt) => match &**nt {
|
||||
NtLiteral(_) => true,
|
||||
NtExpr(e) => match &e.kind {
|
||||
ast::ExprKind::Lit(_) => true,
|
||||
_ => false,
|
||||
},
|
||||
_ => false,
|
||||
},
|
||||
_ => false,
|
||||
}
|
||||
}
|
||||
|
||||
/// A convenience function for matching on identifiers during parsing.
|
||||
/// Turns interpolated identifier (`$i: ident`) or lifetime (`$l: lifetime`) token
|
||||
/// into the regular identifier or lifetime token it refers to,
|
||||
|
@ -119,16 +119,7 @@ where
|
||||
|
||||
let errors = wfcx.select_all_or_error();
|
||||
if !errors.is_empty() {
|
||||
let err = infcx.err_ctxt().report_fulfillment_errors(errors);
|
||||
if tcx.dcx().has_errors().is_some() {
|
||||
return Err(err);
|
||||
} else {
|
||||
// HACK(oli-obk): tests/ui/specialization/min_specialization/specialize_on_type_error.rs
|
||||
// causes an delayed bug during normalization, without reporting an error, so we need
|
||||
// to act as if no error happened, in order to let our callers continue and report an
|
||||
// error later in check_impl_items_against_trait.
|
||||
return Ok(());
|
||||
}
|
||||
return Err(infcx.err_ctxt().report_fulfillment_errors(errors));
|
||||
}
|
||||
|
||||
debug!(?assumed_wf_types);
|
||||
|
@ -793,7 +793,7 @@ impl<'cx, 'tcx> Resolver<'cx, 'tcx> {
|
||||
}
|
||||
|
||||
fn report_error(&self, p: impl Into<ty::GenericArg<'tcx>>) -> ErrorGuaranteed {
|
||||
if let Some(guar) = self.fcx.dcx().has_errors() {
|
||||
if let Some(guar) = self.fcx.tainted_by_errors() {
|
||||
guar
|
||||
} else {
|
||||
self.fcx
|
||||
|
@ -550,7 +550,7 @@ lint_non_local_definitions_impl = non-local `impl` definition, `impl` blocks sho
|
||||
.with_trait = an `impl` is never scoped, even when it is nested inside an item, as it may impact type checking outside of that item, which can be the case if neither the trait or the self type are at the same nesting level as the `impl`
|
||||
.bounds = `impl` may be usable in bounds, etc. from outside the expression, which might e.g. make something constructible that previously wasn't, because it's still on a publicly-visible type
|
||||
.doctest = make this doc-test a standalone test with its own `fn main() {"{"} ... {"}"}`
|
||||
.exception = items in an anonymous const item (`const _: () = {"{"} ... {"}"}`) are treated as in the same scope as the anonymous const's declaration
|
||||
.exception = items in an anonymous const item (`const _: () = {"{"} ... {"}"}`) are treated as in the same scope as the anonymous const's declaration for the purpose of this lint
|
||||
.const_anon = use a const-anon item to suppress this lint
|
||||
.macro_to_change = the {$macro_kind} `{$macro_to_change}` defines the non-local `impl`, and may need to be changed
|
||||
|
||||
|
@ -7,7 +7,7 @@ edition = "2021"
|
||||
# tidy-alphabetical-start
|
||||
bitflags = "2.4.1"
|
||||
derivative = "2.2.0"
|
||||
rustc_ast_ir = { path = "../rustc_ast_ir" }
|
||||
rustc_ast_ir = { path = "../rustc_ast_ir", default-features = false }
|
||||
rustc_data_structures = { path = "../rustc_data_structures", optional = true }
|
||||
rustc_index = { path = "../rustc_index", default-features = false }
|
||||
rustc_macros = { path = "../rustc_macros", optional = true }
|
||||
|
@ -4,8 +4,6 @@
|
||||
//! but were uplifted in the process of making the new trait solver generic.
|
||||
//! So if you got to this crate from the old solver, it's totally normal.
|
||||
|
||||
#![feature(let_chains)]
|
||||
|
||||
pub mod canonicalizer;
|
||||
pub mod infcx;
|
||||
pub mod resolve;
|
||||
|
@ -2,7 +2,7 @@
|
||||
//! traits, `Copy`/`Clone`.
|
||||
|
||||
use rustc_ast_ir::{Movability, Mutability};
|
||||
use rustc_data_structures::fx::FxHashMap;
|
||||
use rustc_type_ir::data_structures::HashMap;
|
||||
use rustc_type_ir::fold::{TypeFoldable, TypeFolder, TypeSuperFoldable};
|
||||
use rustc_type_ir::inherent::*;
|
||||
use rustc_type_ir::lang_items::TraitSolverLangItem;
|
||||
@ -304,9 +304,10 @@ pub(in crate::solve) fn extract_tupled_inputs_and_output_from_callable<I: Intern
|
||||
let kind_ty = args.kind_ty();
|
||||
let sig = args.coroutine_closure_sig().skip_binder();
|
||||
|
||||
let coroutine_ty = if let Some(closure_kind) = kind_ty.to_opt_closure_kind()
|
||||
&& !args.tupled_upvars_ty().is_ty_var()
|
||||
{
|
||||
// FIXME: let_chains
|
||||
let kind = kind_ty.to_opt_closure_kind();
|
||||
let coroutine_ty = if kind.is_some() && !args.tupled_upvars_ty().is_ty_var() {
|
||||
let closure_kind = kind.unwrap();
|
||||
if !closure_kind.extends(goal_kind) {
|
||||
return Err(NoSolution);
|
||||
}
|
||||
@ -411,10 +412,11 @@ pub(in crate::solve) fn extract_tupled_inputs_and_output_from_async_callable<I:
|
||||
let kind_ty = args.kind_ty();
|
||||
let sig = args.coroutine_closure_sig().skip_binder();
|
||||
let mut nested = vec![];
|
||||
let coroutine_ty = if let Some(closure_kind) = kind_ty.to_opt_closure_kind()
|
||||
&& !args.tupled_upvars_ty().is_ty_var()
|
||||
{
|
||||
if !closure_kind.extends(goal_kind) {
|
||||
|
||||
// FIXME: let_chains
|
||||
let kind = kind_ty.to_opt_closure_kind();
|
||||
let coroutine_ty = if kind.is_some() && !args.tupled_upvars_ty().is_ty_var() {
|
||||
if !kind.unwrap().extends(goal_kind) {
|
||||
return Err(NoSolution);
|
||||
}
|
||||
|
||||
@ -683,7 +685,7 @@ where
|
||||
);
|
||||
}
|
||||
|
||||
let mut replace_projection_with = FxHashMap::default();
|
||||
let mut replace_projection_with = HashMap::default();
|
||||
for bound in object_bounds {
|
||||
if let ty::ExistentialPredicate::Projection(proj) = bound.skip_binder() {
|
||||
let proj = proj.with_self_ty(tcx, trait_ref.self_ty());
|
||||
@ -713,7 +715,7 @@ where
|
||||
struct ReplaceProjectionWith<'a, Infcx: SolverDelegate<Interner = I>, I: Interner> {
|
||||
ecx: &'a EvalCtxt<'a, Infcx>,
|
||||
param_env: I::ParamEnv,
|
||||
mapping: FxHashMap<I::DefId, ty::Binder<I, ty::ProjectionPredicate<I>>>,
|
||||
mapping: HashMap<I::DefId, ty::Binder<I, ty::ProjectionPredicate<I>>>,
|
||||
nested: Vec<Goal<I, I::Predicate>>,
|
||||
}
|
||||
|
||||
@ -725,24 +727,28 @@ impl<Infcx: SolverDelegate<Interner = I>, I: Interner> TypeFolder<I>
|
||||
}
|
||||
|
||||
fn fold_ty(&mut self, ty: I::Ty) -> I::Ty {
|
||||
if let ty::Alias(ty::Projection, alias_ty) = ty.kind()
|
||||
&& let Some(replacement) = self.mapping.get(&alias_ty.def_id)
|
||||
{
|
||||
// We may have a case where our object type's projection bound is higher-ranked,
|
||||
// but the where clauses we instantiated are not. We can solve this by instantiating
|
||||
// the binder at the usage site.
|
||||
let proj = self.ecx.instantiate_binder_with_infer(*replacement);
|
||||
// FIXME: Technically this equate could be fallible...
|
||||
self.nested.extend(
|
||||
self.ecx
|
||||
.eq_and_get_goals(
|
||||
self.param_env,
|
||||
alias_ty,
|
||||
proj.projection_term.expect_ty(self.ecx.interner()),
|
||||
)
|
||||
.expect("expected to be able to unify goal projection with dyn's projection"),
|
||||
);
|
||||
proj.term.expect_ty()
|
||||
if let ty::Alias(ty::Projection, alias_ty) = ty.kind() {
|
||||
if let Some(replacement) = self.mapping.get(&alias_ty.def_id) {
|
||||
// We may have a case where our object type's projection bound is higher-ranked,
|
||||
// but the where clauses we instantiated are not. We can solve this by instantiating
|
||||
// the binder at the usage site.
|
||||
let proj = self.ecx.instantiate_binder_with_infer(*replacement);
|
||||
// FIXME: Technically this equate could be fallible...
|
||||
self.nested.extend(
|
||||
self.ecx
|
||||
.eq_and_get_goals(
|
||||
self.param_env,
|
||||
alias_ty,
|
||||
proj.projection_term.expect_ty(self.ecx.interner()),
|
||||
)
|
||||
.expect(
|
||||
"expected to be able to unify goal projection with dyn's projection",
|
||||
),
|
||||
);
|
||||
proj.term.expect_ty()
|
||||
} else {
|
||||
ty.super_fold_with(self)
|
||||
}
|
||||
} else {
|
||||
ty.super_fold_with(self)
|
||||
}
|
||||
|
@ -1,7 +1,8 @@
|
||||
use std::ops::ControlFlow;
|
||||
|
||||
use rustc_data_structures::stack::ensure_sufficient_stack;
|
||||
#[cfg(feature = "nightly")]
|
||||
use rustc_macros::{HashStable_NoContext, TyDecodable, TyEncodable};
|
||||
use rustc_type_ir::data_structures::ensure_sufficient_stack;
|
||||
use rustc_type_ir::fold::{TypeFoldable, TypeFolder, TypeSuperFoldable};
|
||||
use rustc_type_ir::inherent::*;
|
||||
use rustc_type_ir::relate::Relate;
|
||||
@ -88,7 +89,7 @@ where
|
||||
#[derive(derivative::Derivative)]
|
||||
#[derivative(Clone(bound = ""), Debug(bound = ""), Default(bound = ""))]
|
||||
#[derive(TypeVisitable_Generic, TypeFoldable_Generic, Lift_Generic)]
|
||||
#[derive(TyDecodable, TyEncodable, HashStable_NoContext)]
|
||||
#[cfg_attr(feature = "nightly", derive(TyDecodable, TyEncodable, HashStable_NoContext))]
|
||||
// FIXME: This can be made crate-private once `EvalCtxt` also lives in this crate.
|
||||
pub struct NestedGoals<I: Interner> {
|
||||
/// These normalizes-to goals are treated specially during the evaluation
|
||||
@ -116,7 +117,8 @@ impl<I: Interner> NestedGoals<I> {
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(PartialEq, Eq, Debug, Hash, HashStable_NoContext, Clone, Copy)]
|
||||
#[derive(PartialEq, Eq, Debug, Hash, Clone, Copy)]
|
||||
#[cfg_attr(feature = "nightly", derive(HashStable_NoContext))]
|
||||
pub enum GenerateProofTree {
|
||||
Yes,
|
||||
No,
|
||||
@ -689,14 +691,15 @@ where
|
||||
fn visit_ty(&mut self, t: I::Ty) -> Self::Result {
|
||||
match t.kind() {
|
||||
ty::Infer(ty::TyVar(vid)) => {
|
||||
if let ty::TermKind::Ty(term) = self.term.kind()
|
||||
&& let ty::Infer(ty::TyVar(term_vid)) = term.kind()
|
||||
&& self.infcx.root_ty_var(vid) == self.infcx.root_ty_var(term_vid)
|
||||
{
|
||||
ControlFlow::Break(())
|
||||
} else {
|
||||
self.check_nameable(self.infcx.universe_of_ty(vid).unwrap())
|
||||
if let ty::TermKind::Ty(term) = self.term.kind() {
|
||||
if let ty::Infer(ty::TyVar(term_vid)) = term.kind() {
|
||||
if self.infcx.root_ty_var(vid) == self.infcx.root_ty_var(term_vid) {
|
||||
return ControlFlow::Break(());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
self.check_nameable(self.infcx.universe_of_ty(vid).unwrap())
|
||||
}
|
||||
ty::Placeholder(p) => self.check_nameable(p.universe()),
|
||||
_ => {
|
||||
@ -712,14 +715,18 @@ where
|
||||
fn visit_const(&mut self, c: I::Const) -> Self::Result {
|
||||
match c.kind() {
|
||||
ty::ConstKind::Infer(ty::InferConst::Var(vid)) => {
|
||||
if let ty::TermKind::Const(term) = self.term.kind()
|
||||
&& let ty::ConstKind::Infer(ty::InferConst::Var(term_vid)) = term.kind()
|
||||
&& self.infcx.root_const_var(vid) == self.infcx.root_const_var(term_vid)
|
||||
{
|
||||
ControlFlow::Break(())
|
||||
} else {
|
||||
self.check_nameable(self.infcx.universe_of_ct(vid).unwrap())
|
||||
if let ty::TermKind::Const(term) = self.term.kind() {
|
||||
if let ty::ConstKind::Infer(ty::InferConst::Var(term_vid)) = term.kind()
|
||||
{
|
||||
if self.infcx.root_const_var(vid)
|
||||
== self.infcx.root_const_var(term_vid)
|
||||
{
|
||||
return ControlFlow::Break(());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
self.check_nameable(self.infcx.universe_of_ct(vid).unwrap())
|
||||
}
|
||||
ty::ConstKind::Placeholder(p) => self.check_nameable(p.universe()),
|
||||
_ => {
|
||||
|
@ -1,7 +1,7 @@
|
||||
use std::mem;
|
||||
|
||||
use rustc_data_structures::fx::{FxHashMap, FxHashSet};
|
||||
use rustc_index::{Idx, IndexVec};
|
||||
use rustc_type_ir::data_structures::{HashMap, HashSet};
|
||||
use rustc_type_ir::inherent::*;
|
||||
use rustc_type_ir::Interner;
|
||||
use tracing::debug;
|
||||
@ -17,6 +17,7 @@ pub struct SolverLimit(usize);
|
||||
|
||||
rustc_index::newtype_index! {
|
||||
#[orderable]
|
||||
#[gate_rustc_only]
|
||||
pub struct StackDepth {}
|
||||
}
|
||||
|
||||
@ -70,7 +71,7 @@ struct StackEntry<I: Interner> {
|
||||
/// C :- D
|
||||
/// D :- C
|
||||
/// ```
|
||||
cycle_participants: FxHashSet<CanonicalInput<I>>,
|
||||
cycle_participants: HashSet<CanonicalInput<I>>,
|
||||
/// Starts out as `None` and gets set when rerunning this
|
||||
/// goal in case we encounter a cycle.
|
||||
provisional_result: Option<QueryResult<I>>,
|
||||
@ -126,7 +127,7 @@ pub(super) struct SearchGraph<I: Interner> {
|
||||
///
|
||||
/// An element is *deeper* in the stack if its index is *lower*.
|
||||
stack: IndexVec<StackDepth, StackEntry<I>>,
|
||||
provisional_cache: FxHashMap<CanonicalInput<I>, ProvisionalCacheEntry<I>>,
|
||||
provisional_cache: HashMap<CanonicalInput<I>, ProvisionalCacheEntry<I>>,
|
||||
}
|
||||
|
||||
impl<I: Interner> SearchGraph<I> {
|
||||
@ -227,13 +228,17 @@ impl<I: Interner> SearchGraph<I> {
|
||||
}
|
||||
|
||||
fn clear_dependent_provisional_results(
|
||||
provisional_cache: &mut FxHashMap<CanonicalInput<I>, ProvisionalCacheEntry<I>>,
|
||||
provisional_cache: &mut HashMap<CanonicalInput<I>, ProvisionalCacheEntry<I>>,
|
||||
head: StackDepth,
|
||||
) {
|
||||
#[allow(rustc::potential_query_instability)]
|
||||
provisional_cache.retain(|_, entry| {
|
||||
entry.with_coinductive_stack.take_if(|p| p.head == head);
|
||||
entry.with_inductive_stack.take_if(|p| p.head == head);
|
||||
if entry.with_coinductive_stack.as_ref().is_some_and(|p| p.head == head) {
|
||||
entry.with_coinductive_stack.take();
|
||||
}
|
||||
if entry.with_inductive_stack.as_ref().is_some_and(|p| p.head == head) {
|
||||
entry.with_inductive_stack.take();
|
||||
}
|
||||
!entry.is_empty()
|
||||
});
|
||||
}
|
||||
|
@ -1,7 +1,7 @@
|
||||
//! Dealing with trait goals, i.e. `T: Trait<'a, U>`.
|
||||
|
||||
use rustc_ast_ir::Movability;
|
||||
use rustc_data_structures::fx::FxIndexSet;
|
||||
use rustc_type_ir::data_structures::IndexSet;
|
||||
use rustc_type_ir::inherent::*;
|
||||
use rustc_type_ir::lang_items::TraitSolverLangItem;
|
||||
use rustc_type_ir::visit::TypeVisitableExt as _;
|
||||
@ -821,7 +821,7 @@ where
|
||||
// We may upcast to auto traits that are either explicitly listed in
|
||||
// the object type's bounds, or implied by the principal trait ref's
|
||||
// supertraits.
|
||||
let a_auto_traits: FxIndexSet<I::DefId> = a_data
|
||||
let a_auto_traits: IndexSet<I::DefId> = a_data
|
||||
.auto_traits()
|
||||
.into_iter()
|
||||
.chain(a_data.principal_def_id().into_iter().flat_map(|principal_def_id| {
|
||||
|
@ -1259,7 +1259,7 @@ impl<'a> Parser<'a> {
|
||||
self.token.is_keyword(kw::Unsafe)
|
||||
&& self.is_keyword_ahead(1, &[kw::Extern])
|
||||
&& self.look_ahead(
|
||||
2 + self.look_ahead(2, |t| t.can_begin_literal_maybe_minus() as usize),
|
||||
2 + self.look_ahead(2, |t| t.can_begin_string_literal() as usize),
|
||||
|t| t.kind == token::OpenDelim(Delimiter::Brace),
|
||||
)
|
||||
}
|
||||
@ -2448,7 +2448,7 @@ impl<'a> Parser<'a> {
|
||||
})
|
||||
// `extern ABI fn`
|
||||
|| self.check_keyword_case(kw::Extern, case)
|
||||
&& self.look_ahead(1, |t| t.can_begin_literal_maybe_minus())
|
||||
&& self.look_ahead(1, |t| t.can_begin_string_literal())
|
||||
&& (self.look_ahead(2, |t| t.is_keyword_case(kw::Fn, case)) ||
|
||||
// this branch is only for better diagnostic in later, `pub` is not allowed here
|
||||
(self.may_recover()
|
||||
|
@ -939,7 +939,8 @@ impl<'a> Parser<'a> {
|
||||
|| self.look_ahead(dist, |t| {
|
||||
t.is_path_start() // e.g. `MY_CONST`;
|
||||
|| t.kind == token::Dot // e.g. `.5` for recovery;
|
||||
|| t.can_begin_literal_maybe_minus() // e.g. `42`.
|
||||
|| matches!(t.kind, token::Literal(..) | token::BinOp(token::Minus))
|
||||
|| t.is_bool_lit()
|
||||
|| t.is_whole_expr()
|
||||
|| t.is_lifetime() // recover `'a` instead of `'a'`
|
||||
|| (self.may_recover() // recover leading `(`
|
||||
|
@ -2776,97 +2776,115 @@ impl<'tcx> TypeErrCtxt<'_, 'tcx> {
|
||||
let mut this = "this bound";
|
||||
let mut note = None;
|
||||
let mut help = None;
|
||||
if let ty::PredicateKind::Clause(clause) = predicate.kind().skip_binder()
|
||||
&& let ty::ClauseKind::Trait(trait_pred) = clause
|
||||
{
|
||||
let def_id = trait_pred.def_id();
|
||||
let visible_item = if let Some(local) = def_id.as_local() {
|
||||
// Check for local traits being reachable.
|
||||
let vis = &tcx.resolutions(()).effective_visibilities;
|
||||
// Account for non-`pub` traits in the root of the local crate.
|
||||
let is_locally_reachable = tcx.parent(def_id).is_crate_root();
|
||||
vis.is_reachable(local) || is_locally_reachable
|
||||
} else {
|
||||
// Check for foreign traits being reachable.
|
||||
tcx.visible_parent_map(()).get(&def_id).is_some()
|
||||
};
|
||||
if tcx.is_lang_item(def_id, LangItem::Sized) {
|
||||
// Check if this is an implicit bound, even in foreign crates.
|
||||
if tcx
|
||||
.generics_of(item_def_id)
|
||||
.own_params
|
||||
.iter()
|
||||
.any(|param| tcx.def_span(param.def_id) == span)
|
||||
{
|
||||
a = "an implicit `Sized`";
|
||||
this = "the implicit `Sized` requirement on this type parameter";
|
||||
}
|
||||
if let Some(hir::Node::TraitItem(hir::TraitItem {
|
||||
generics,
|
||||
kind: hir::TraitItemKind::Type(bounds, None),
|
||||
..
|
||||
})) = tcx.hir().get_if_local(item_def_id)
|
||||
// Do not suggest relaxing if there is an explicit `Sized` obligation.
|
||||
&& !bounds.iter()
|
||||
.filter_map(|bound| bound.trait_ref())
|
||||
.any(|tr| tr.trait_def_id() == tcx.lang_items().sized_trait())
|
||||
{
|
||||
let (span, separator) = if let [.., last] = bounds {
|
||||
(last.span().shrink_to_hi(), " +")
|
||||
if let ty::PredicateKind::Clause(clause) = predicate.kind().skip_binder() {
|
||||
match clause {
|
||||
ty::ClauseKind::Trait(trait_pred) => {
|
||||
let def_id = trait_pred.def_id();
|
||||
let visible_item = if let Some(local) = def_id.as_local() {
|
||||
// Check for local traits being reachable.
|
||||
let vis = &tcx.resolutions(()).effective_visibilities;
|
||||
// Account for non-`pub` traits in the root of the local crate.
|
||||
let is_locally_reachable = tcx.parent(def_id).is_crate_root();
|
||||
vis.is_reachable(local) || is_locally_reachable
|
||||
} else {
|
||||
(generics.span.shrink_to_hi(), ":")
|
||||
// Check for foreign traits being reachable.
|
||||
tcx.visible_parent_map(()).get(&def_id).is_some()
|
||||
};
|
||||
err.span_suggestion_verbose(
|
||||
span,
|
||||
"consider relaxing the implicit `Sized` restriction",
|
||||
format!("{separator} ?Sized"),
|
||||
Applicability::MachineApplicable,
|
||||
);
|
||||
if tcx.is_lang_item(def_id, LangItem::Sized) {
|
||||
// Check if this is an implicit bound, even in foreign crates.
|
||||
if tcx
|
||||
.generics_of(item_def_id)
|
||||
.own_params
|
||||
.iter()
|
||||
.any(|param| tcx.def_span(param.def_id) == span)
|
||||
{
|
||||
a = "an implicit `Sized`";
|
||||
this =
|
||||
"the implicit `Sized` requirement on this type parameter";
|
||||
}
|
||||
if let Some(hir::Node::TraitItem(hir::TraitItem {
|
||||
generics,
|
||||
kind: hir::TraitItemKind::Type(bounds, None),
|
||||
..
|
||||
})) = tcx.hir().get_if_local(item_def_id)
|
||||
// Do not suggest relaxing if there is an explicit `Sized` obligation.
|
||||
&& !bounds.iter()
|
||||
.filter_map(|bound| bound.trait_ref())
|
||||
.any(|tr| tr.trait_def_id() == tcx.lang_items().sized_trait())
|
||||
{
|
||||
let (span, separator) = if let [.., last] = bounds {
|
||||
(last.span().shrink_to_hi(), " +")
|
||||
} else {
|
||||
(generics.span.shrink_to_hi(), ":")
|
||||
};
|
||||
err.span_suggestion_verbose(
|
||||
span,
|
||||
"consider relaxing the implicit `Sized` restriction",
|
||||
format!("{separator} ?Sized"),
|
||||
Applicability::MachineApplicable,
|
||||
);
|
||||
}
|
||||
}
|
||||
if let DefKind::Trait = tcx.def_kind(item_def_id)
|
||||
&& !visible_item
|
||||
{
|
||||
note = Some(format!(
|
||||
"`{short_item_name}` is a \"sealed trait\", because to implement it \
|
||||
you also need to implement `{}`, which is not accessible; this is \
|
||||
usually done to force you to use one of the provided types that \
|
||||
already implement it",
|
||||
with_no_trimmed_paths!(tcx.def_path_str(def_id)),
|
||||
));
|
||||
let impls_of = tcx.trait_impls_of(def_id);
|
||||
let impls = impls_of
|
||||
.non_blanket_impls()
|
||||
.values()
|
||||
.flatten()
|
||||
.chain(impls_of.blanket_impls().iter())
|
||||
.collect::<Vec<_>>();
|
||||
if !impls.is_empty() {
|
||||
let len = impls.len();
|
||||
let mut types = impls
|
||||
.iter()
|
||||
.map(|t| {
|
||||
with_no_trimmed_paths!(format!(
|
||||
" {}",
|
||||
tcx.type_of(*t).instantiate_identity(),
|
||||
))
|
||||
})
|
||||
.collect::<Vec<_>>();
|
||||
let post = if types.len() > 9 {
|
||||
types.truncate(8);
|
||||
format!("\nand {} others", len - 8)
|
||||
} else {
|
||||
String::new()
|
||||
};
|
||||
help = Some(format!(
|
||||
"the following type{} implement{} the trait:\n{}{post}",
|
||||
pluralize!(len),
|
||||
if len == 1 { "s" } else { "" },
|
||||
types.join("\n"),
|
||||
));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if let DefKind::Trait = tcx.def_kind(item_def_id)
|
||||
&& !visible_item
|
||||
{
|
||||
note = Some(format!(
|
||||
"`{short_item_name}` is a \"sealed trait\", because to implement it \
|
||||
you also need to implement `{}`, which is not accessible; this is \
|
||||
usually done to force you to use one of the provided types that \
|
||||
already implement it",
|
||||
with_no_trimmed_paths!(tcx.def_path_str(def_id)),
|
||||
));
|
||||
let impls_of = tcx.trait_impls_of(def_id);
|
||||
let impls = impls_of
|
||||
.non_blanket_impls()
|
||||
.values()
|
||||
.flatten()
|
||||
.chain(impls_of.blanket_impls().iter())
|
||||
.collect::<Vec<_>>();
|
||||
if !impls.is_empty() {
|
||||
let len = impls.len();
|
||||
let mut types = impls
|
||||
.iter()
|
||||
.map(|t| {
|
||||
with_no_trimmed_paths!(format!(
|
||||
" {}",
|
||||
tcx.type_of(*t).instantiate_identity(),
|
||||
))
|
||||
})
|
||||
.collect::<Vec<_>>();
|
||||
let post = if types.len() > 9 {
|
||||
types.truncate(8);
|
||||
format!("\nand {} others", len - 8)
|
||||
ty::ClauseKind::ConstArgHasType(..) => {
|
||||
let descr =
|
||||
format!("required by a const generic parameter in `{item_name}`");
|
||||
if span.is_visible(sm) {
|
||||
let msg = format!(
|
||||
"required by this const generic parameter in `{short_item_name}`"
|
||||
);
|
||||
multispan.push_span_label(span, msg);
|
||||
err.span_note(multispan, descr);
|
||||
} else {
|
||||
String::new()
|
||||
};
|
||||
help = Some(format!(
|
||||
"the following type{} implement{} the trait:\n{}{post}",
|
||||
pluralize!(len),
|
||||
if len == 1 { "s" } else { "" },
|
||||
types.join("\n"),
|
||||
));
|
||||
err.span_note(tcx.def_span(item_def_id), descr);
|
||||
}
|
||||
return;
|
||||
}
|
||||
_ => (),
|
||||
}
|
||||
};
|
||||
}
|
||||
let descr = format!("required by {a} bound in `{item_name}`");
|
||||
if span.is_visible(sm) {
|
||||
let msg = format!("required by {this} in `{short_item_name}`");
|
||||
|
@ -179,6 +179,7 @@ impl<'tcx> TypeErrCtxt<'_, 'tcx> {
|
||||
for (error, suppressed) in iter::zip(&errors, &is_suppressed) {
|
||||
if !suppressed && error.obligation.cause.span.from_expansion() == from_expansion {
|
||||
let guar = self.report_fulfillment_error(error);
|
||||
self.infcx.set_tainted_by_errors(guar);
|
||||
reported = Some(guar);
|
||||
// We want to ignore desugarings here: spans are equivalent even
|
||||
// if one is the result of a desugaring and the other is not.
|
||||
@ -2686,22 +2687,14 @@ impl<'tcx> TypeErrCtxt<'_, 'tcx> {
|
||||
}
|
||||
}
|
||||
|
||||
// Given some `ConstArgHasType(?x, usize)`, we should not emit an error such as
|
||||
// "type annotations needed: cannot satisfy the constant `_` has type `usize`"
|
||||
// Instead we should emit a normal error suggesting the user to turbofish the
|
||||
// const parameter that is currently being inferred. Unfortunately we cannot
|
||||
// nicely emit such an error so we delay an ICE incase nobody else reports it
|
||||
// for us.
|
||||
ty::PredicateKind::Clause(ty::ClauseKind::ConstArgHasType(ct, ty)) => {
|
||||
return self.tcx.sess.dcx().span_delayed_bug(
|
||||
ty::PredicateKind::Clause(ty::ClauseKind::ConstArgHasType(ct, ..)) => self
|
||||
.emit_inference_failure_err(
|
||||
obligation.cause.body_id,
|
||||
span,
|
||||
format!(
|
||||
"`ambiguous ConstArgHasType({:?}, {:?}) unaccompanied by inference error`",
|
||||
ct, ty
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
ct.into(),
|
||||
ErrorCode::E0284,
|
||||
true,
|
||||
),
|
||||
ty::PredicateKind::NormalizesTo(ty::NormalizesTo { alias, term })
|
||||
if term.is_infer() =>
|
||||
{
|
||||
|
@ -7,7 +7,8 @@ edition = "2021"
|
||||
# tidy-alphabetical-start
|
||||
bitflags = "2.4.1"
|
||||
derivative = "2.2.0"
|
||||
rustc_ast_ir = { path = "../rustc_ast_ir" }
|
||||
indexmap = "2.0.0"
|
||||
rustc_ast_ir = { path = "../rustc_ast_ir", default-features = false }
|
||||
rustc_data_structures = { path = "../rustc_data_structures", optional = true }
|
||||
rustc_index = { path = "../rustc_index", default-features = false }
|
||||
rustc_macros = { path = "../rustc_macros", optional = true }
|
||||
|
@ -5,14 +5,16 @@ use std::ops::{ControlFlow, Deref};
|
||||
|
||||
#[cfg(feature = "nightly")]
|
||||
use rustc_macros::{HashStable_NoContext, TyDecodable, TyEncodable};
|
||||
#[cfg(feature = "nightly")]
|
||||
use rustc_serialize::Decodable;
|
||||
use tracing::debug;
|
||||
|
||||
use crate::data_structures::SsoHashSet;
|
||||
use crate::fold::{FallibleTypeFolder, TypeFoldable, TypeFolder, TypeSuperFoldable};
|
||||
use crate::inherent::*;
|
||||
use crate::lift::Lift;
|
||||
use crate::visit::{Flags, TypeSuperVisitable, TypeVisitable, TypeVisitableExt, TypeVisitor};
|
||||
use crate::{self as ty, Interner, SsoHashSet};
|
||||
use crate::{self as ty, Interner};
|
||||
|
||||
/// Binder is a binder for higher-ranked lifetimes or types. It is part of the
|
||||
/// compiler's representation for things like `for<'a> Fn(&'a isize)`
|
||||
@ -55,6 +57,7 @@ where
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(feature = "nightly")]
|
||||
macro_rules! impl_binder_encode_decode {
|
||||
($($t:ty),+ $(,)?) => {
|
||||
$(
|
||||
@ -82,6 +85,7 @@ macro_rules! impl_binder_encode_decode {
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(feature = "nightly")]
|
||||
impl_binder_encode_decode! {
|
||||
ty::FnSig<I>,
|
||||
ty::TraitPredicate<I>,
|
||||
|
29
compiler/rustc_type_ir/src/data_structures.rs
Normal file
29
compiler/rustc_type_ir/src/data_structures.rs
Normal file
@ -0,0 +1,29 @@
|
||||
#[cfg(feature = "nightly")]
|
||||
mod impl_ {
|
||||
pub use rustc_data_structures::fx::FxHashMap as HashMap;
|
||||
pub use rustc_data_structures::fx::FxHashSet as HashSet;
|
||||
pub use rustc_data_structures::fx::FxIndexMap as IndexMap;
|
||||
pub use rustc_data_structures::fx::FxIndexSet as IndexSet;
|
||||
pub use rustc_data_structures::sso::SsoHashMap;
|
||||
pub use rustc_data_structures::sso::SsoHashSet;
|
||||
pub use rustc_data_structures::stack::ensure_sufficient_stack;
|
||||
pub use rustc_data_structures::sync::Lrc;
|
||||
}
|
||||
|
||||
#[cfg(not(feature = "nightly"))]
|
||||
mod impl_ {
|
||||
pub use indexmap::IndexMap;
|
||||
pub use indexmap::IndexSet;
|
||||
pub use std::collections::HashMap;
|
||||
pub use std::collections::HashMap as SsoHashMap;
|
||||
pub use std::collections::HashSet;
|
||||
pub use std::collections::HashSet as SsoHashSet;
|
||||
pub use std::sync::Arc as Lrc;
|
||||
|
||||
#[inline]
|
||||
pub fn ensure_sufficient_stack<R>(f: impl FnOnce() -> R) -> R {
|
||||
f()
|
||||
}
|
||||
}
|
||||
|
||||
pub use impl_::*;
|
@ -30,7 +30,7 @@ impl<T> ExpectedFound<T> {
|
||||
Debug(bound = "")
|
||||
)]
|
||||
#[derive(TypeVisitable_Generic)]
|
||||
#[rustc_pass_by_value]
|
||||
#[cfg_attr(feature = "nightly", rustc_pass_by_value)]
|
||||
pub enum TypeError<I: Interner> {
|
||||
Mismatch,
|
||||
ConstnessMismatch(ExpectedFound<ty::BoundConstness>),
|
||||
|
@ -49,9 +49,10 @@ use rustc_index::{Idx, IndexVec};
|
||||
use std::mem;
|
||||
use tracing::debug;
|
||||
|
||||
use crate::data_structures::Lrc;
|
||||
use crate::inherent::*;
|
||||
use crate::visit::{TypeVisitable, TypeVisitableExt as _};
|
||||
use crate::{self as ty, Interner, Lrc};
|
||||
use crate::{self as ty, Interner};
|
||||
|
||||
#[cfg(feature = "nightly")]
|
||||
type Never = !;
|
||||
|
@ -1,3 +1,4 @@
|
||||
#[cfg(feature = "nightly")]
|
||||
use rustc_macros::{HashStable_NoContext, TyDecodable, TyEncodable};
|
||||
|
||||
use crate::Interner;
|
||||
|
@ -8,8 +8,8 @@ use std::hash::Hash;
|
||||
use std::ops::Deref;
|
||||
|
||||
use rustc_ast_ir::Mutability;
|
||||
use rustc_data_structures::fx::FxHashSet;
|
||||
|
||||
use crate::data_structures::HashSet;
|
||||
use crate::fold::{TypeFoldable, TypeSuperFoldable};
|
||||
use crate::relate::Relate;
|
||||
use crate::solve::{CacheData, CanonicalInput, QueryResult, Reveal};
|
||||
@ -530,7 +530,7 @@ pub trait EvaluationCache<I: Interner> {
|
||||
proof_tree: Option<I::CanonicalGoalEvaluationStepRef>,
|
||||
additional_depth: usize,
|
||||
encountered_overflow: bool,
|
||||
cycle_participants: FxHashSet<CanonicalInput<I>>,
|
||||
cycle_participants: HashSet<CanonicalInput<I>>,
|
||||
dep_node: I::DepNodeIndex,
|
||||
result: QueryResult<I>,
|
||||
);
|
||||
|
@ -7,27 +7,19 @@
|
||||
#![cfg_attr(feature = "nightly", allow(internal_features))]
|
||||
// tidy-alphabetical-end
|
||||
|
||||
#[cfg(feature = "nightly")]
|
||||
extern crate self as rustc_type_ir;
|
||||
|
||||
#[cfg(feature = "nightly")]
|
||||
use rustc_data_structures::sso::SsoHashSet;
|
||||
#[cfg(feature = "nightly")]
|
||||
use rustc_data_structures::sync::Lrc;
|
||||
#[cfg(feature = "nightly")]
|
||||
use rustc_macros::{Decodable, Encodable, HashStable_NoContext};
|
||||
#[cfg(not(feature = "nightly"))]
|
||||
use std::collections::HashSet as SsoHashSet;
|
||||
use std::fmt;
|
||||
use std::hash::Hash;
|
||||
#[cfg(not(feature = "nightly"))]
|
||||
use std::sync::Arc as Lrc;
|
||||
|
||||
// These modules are `pub` since they are not glob-imported.
|
||||
#[macro_use]
|
||||
pub mod visit;
|
||||
#[cfg(feature = "nightly")]
|
||||
pub mod codec;
|
||||
pub mod data_structures;
|
||||
pub mod error;
|
||||
pub mod fold;
|
||||
pub mod inherent;
|
||||
|
@ -1,3 +1,4 @@
|
||||
#[cfg(feature = "nightly")]
|
||||
use rustc_macros::{HashStable_NoContext, TyDecodable, TyEncodable};
|
||||
use rustc_type_ir_macros::{TypeFoldable_Generic, TypeVisitable_Generic};
|
||||
|
||||
|
@ -1,12 +1,13 @@
|
||||
use std::iter;
|
||||
|
||||
use rustc_ast_ir::Mutability;
|
||||
use rustc_type_ir::error::{ExpectedFound, TypeError};
|
||||
use rustc_type_ir::fold::TypeFoldable;
|
||||
use rustc_type_ir::inherent::*;
|
||||
use rustc_type_ir::{self as ty, Interner};
|
||||
use tracing::{debug, instrument};
|
||||
|
||||
use crate::error::{ExpectedFound, TypeError};
|
||||
use crate::fold::TypeFoldable;
|
||||
use crate::inherent::*;
|
||||
use crate::{self as ty, Interner};
|
||||
|
||||
pub type RelateResult<I, T> = Result<T, TypeError<I>>;
|
||||
|
||||
/// Extra information about why we ended up with a particular variance.
|
||||
|
@ -47,8 +47,9 @@ use rustc_index::{Idx, IndexVec};
|
||||
use std::fmt;
|
||||
use std::ops::ControlFlow;
|
||||
|
||||
use crate::data_structures::Lrc;
|
||||
use crate::inherent::*;
|
||||
use crate::{self as ty, Interner, Lrc, TypeFlags};
|
||||
use crate::{self as ty, Interner, TypeFlags};
|
||||
|
||||
/// This trait is implemented for every type that can be visited,
|
||||
/// providing the skeleton of the traversal.
|
||||
|
@ -263,7 +263,7 @@ pub fn spin_loop() {
|
||||
/// extent to which it can block optimisations may vary depending upon the platform and code-gen
|
||||
/// backend used. Programs cannot rely on `black_box` for *correctness*, beyond it behaving as the
|
||||
/// identity function. As such, it **must not be relied upon to control critical program behavior.**
|
||||
/// This _immediately_ precludes any direct use of this function for cryptographic or security
|
||||
/// This also means that this function does not offer any guarantees for cryptographic or security
|
||||
/// purposes.
|
||||
///
|
||||
/// [`std::convert::identity`]: crate::convert::identity
|
||||
|
@ -1,38 +0,0 @@
|
||||
//@ known-bug: #122044
|
||||
use std::hint::black_box;
|
||||
|
||||
trait Func {
|
||||
type Ret: Id;
|
||||
}
|
||||
|
||||
trait Id {
|
||||
type Assoc;
|
||||
}
|
||||
impl Id for u32 {}
|
||||
impl Id for u32 {}
|
||||
|
||||
impl<F: FnOnce() -> R, R: Id> Func for F {
|
||||
type Ret = R;
|
||||
}
|
||||
|
||||
fn bar() -> impl Copy + Id {
|
||||
0u32
|
||||
}
|
||||
|
||||
struct Foo<T: Func> {
|
||||
_func: T,
|
||||
value: Option<<<T as Func>::Ret as Id>::Assoc>,
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let mut fn_def = black_box(Foo {
|
||||
_func: bar,
|
||||
value: None,
|
||||
});
|
||||
let fn_ptr = black_box(Foo {
|
||||
_func: bar as fn() -> _,
|
||||
value: None,
|
||||
});
|
||||
|
||||
fn_def.value = fn_ptr.value;
|
||||
}
|
@ -1,13 +0,0 @@
|
||||
//@ known-bug: rust-lang/rust#123255
|
||||
//@ edition:2021
|
||||
#![crate_type = "lib"]
|
||||
|
||||
pub fn a() {}
|
||||
|
||||
mod handlers {
|
||||
pub struct C(&());
|
||||
pub fn c() -> impl Fn() -> C {
|
||||
let a1 = ();
|
||||
|| C((crate::a(), a1).into())
|
||||
}
|
||||
}
|
@ -6,4 +6,6 @@ fn combinator<T, const S: usize>() -> [T; S] {}
|
||||
fn main() {
|
||||
combinator().into_iter();
|
||||
//[cfail1]~^ ERROR type annotations needed
|
||||
//[cfail1]~| ERROR type annotations needed
|
||||
//[cfail1]~| ERROR type annotations needed
|
||||
}
|
||||
|
@ -12,4 +12,5 @@ fn main() {
|
||||
let foo = Foo::<1>::foo();
|
||||
let foo = Foo::foo();
|
||||
//~^ ERROR type annotations needed for `Foo<_>`
|
||||
//~| ERROR type annotations needed
|
||||
}
|
||||
|
@ -1,14 +1,37 @@
|
||||
error[E0282]: type annotations needed for `Foo<_>`
|
||||
error[E0284]: type annotations needed for `Foo<_>`
|
||||
--> $DIR/doesnt_infer.rs:13:9
|
||||
|
|
||||
LL | let foo = Foo::foo();
|
||||
| ^^^
|
||||
| ^^^ ---------- type must be known at this point
|
||||
|
|
||||
note: required by a const generic parameter in `Foo::<N>::foo`
|
||||
--> $DIR/doesnt_infer.rs:5:6
|
||||
|
|
||||
LL | impl<const N: u32> Foo<N> {
|
||||
| ^^^^^^^^^^^^ required by this const generic parameter in `Foo::<N>::foo`
|
||||
LL | fn foo() -> Self {
|
||||
| --- required by a bound in this associated function
|
||||
help: consider giving `foo` an explicit type, where the value of const parameter `N` is specified
|
||||
|
|
||||
LL | let foo: Foo<N> = Foo::foo();
|
||||
| ++++++++
|
||||
|
||||
error: aborting due to 1 previous error
|
||||
error[E0284]: type annotations needed for `Foo<_>`
|
||||
--> $DIR/doesnt_infer.rs:13:9
|
||||
|
|
||||
LL | let foo = Foo::foo();
|
||||
| ^^^ --- type must be known at this point
|
||||
|
|
||||
note: required by a const generic parameter in `Foo`
|
||||
--> $DIR/doesnt_infer.rs:3:12
|
||||
|
|
||||
LL | struct Foo<const N: u32 = 2>;
|
||||
| ^^^^^^^^^^^^^^^^ required by this const generic parameter in `Foo`
|
||||
help: consider giving `foo` an explicit type, where the value of const parameter `N` is specified
|
||||
|
|
||||
LL | let foo: Foo<N> = Foo::foo();
|
||||
| ++++++++
|
||||
|
||||
For more information about this error, try `rustc --explain E0282`.
|
||||
error: aborting due to 2 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0284`.
|
||||
|
@ -31,12 +31,17 @@ LL | 1_u64
|
||||
|
|
||||
= help: the trait `Traitor<1, 2>` is implemented for `u64`
|
||||
|
||||
error[E0282]: type annotations needed
|
||||
error[E0284]: type annotations needed
|
||||
--> $DIR/rp_impl_trait_fail.rs:28:5
|
||||
|
|
||||
LL | uwu();
|
||||
| ^^^ cannot infer the value of the const parameter `N` declared on the function `uwu`
|
||||
|
|
||||
note: required by a const generic parameter in `uwu`
|
||||
--> $DIR/rp_impl_trait_fail.rs:16:8
|
||||
|
|
||||
LL | fn uwu<const N: u8>() -> impl Traitor<N> {
|
||||
| ^^^^^^^^^^^ required by this const generic parameter in `uwu`
|
||||
help: consider specifying the generic argument
|
||||
|
|
||||
LL | uwu::<N>();
|
||||
@ -44,5 +49,5 @@ LL | uwu::<N>();
|
||||
|
||||
error: aborting due to 4 previous errors
|
||||
|
||||
Some errors have detailed explanations: E0277, E0282.
|
||||
Some errors have detailed explanations: E0277, E0284.
|
||||
For more information about an error, try `rustc --explain E0277`.
|
||||
|
@ -5,4 +5,5 @@ use std::simd::Mask;
|
||||
fn main() {
|
||||
let y = Mask::<_, _>::splat(false);
|
||||
//~^ ERROR: type annotations needed
|
||||
//~| ERROR type annotations needed
|
||||
}
|
||||
|
@ -1,23 +1,29 @@
|
||||
error[E0283]: type annotations needed for `Mask<_, _>`
|
||||
error[E0284]: type annotations needed for `Mask<_, _>`
|
||||
--> $DIR/issue-91614.rs:6:9
|
||||
|
|
||||
LL | let y = Mask::<_, _>::splat(false);
|
||||
| ^ -------------------------- type must be known at this point
|
||||
|
|
||||
= note: cannot satisfy `_: MaskElement`
|
||||
= help: the following types implement trait `MaskElement`:
|
||||
i16
|
||||
i32
|
||||
i64
|
||||
i8
|
||||
isize
|
||||
note: required by a bound in `Mask::<T, N>::splat`
|
||||
note: required by a const generic parameter in `Mask::<T, N>::splat`
|
||||
--> $SRC_DIR/core/src/../../portable-simd/crates/core_simd/src/masks.rs:LL:COL
|
||||
help: consider giving `y` an explicit type, where the type for type parameter `T` is specified
|
||||
help: consider giving `y` an explicit type, where the value of const parameter `N` is specified
|
||||
|
|
||||
LL | let y: Mask<T, N> = Mask::<_, _>::splat(false);
|
||||
| ++++++++++++
|
||||
|
||||
error: aborting due to 1 previous error
|
||||
error[E0284]: type annotations needed for `Mask<_, _>`
|
||||
--> $DIR/issue-91614.rs:6:9
|
||||
|
|
||||
LL | let y = Mask::<_, _>::splat(false);
|
||||
| ^ ------------ type must be known at this point
|
||||
|
|
||||
note: required by a const generic parameter in `Mask`
|
||||
--> $SRC_DIR/core/src/../../portable-simd/crates/core_simd/src/masks.rs:LL:COL
|
||||
help: consider giving `y` an explicit type, where the value of const parameter `N` is specified
|
||||
|
|
||||
LL | let y: Mask<T, N> = Mask::<_, _>::splat(false);
|
||||
| ++++++++++++
|
||||
|
||||
For more information about this error, try `rustc --explain E0283`.
|
||||
error: aborting due to 2 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0284`.
|
||||
|
@ -18,18 +18,41 @@ help: try adding a `where` bound
|
||||
LL | pub const fn new() -> Self where [(); Self::SIZE]: {
|
||||
| +++++++++++++++++++++++
|
||||
|
||||
error[E0282]: type annotations needed for `ArrayHolder<_>`
|
||||
error[E0284]: type annotations needed for `ArrayHolder<_>`
|
||||
--> $DIR/issue-62504.rs:26:9
|
||||
|
|
||||
LL | let mut array = ArrayHolder::new();
|
||||
| ^^^^^^^^^
|
||||
| ^^^^^^^^^ ------------------ type must be known at this point
|
||||
|
|
||||
note: required by a const generic parameter in `ArrayHolder::<X>::new`
|
||||
--> $DIR/issue-62504.rs:16:6
|
||||
|
|
||||
LL | impl<const X: usize> ArrayHolder<X> {
|
||||
| ^^^^^^^^^^^^^^ required by this const generic parameter in `ArrayHolder::<X>::new`
|
||||
LL | pub const fn new() -> Self {
|
||||
| --- required by a bound in this associated function
|
||||
help: consider giving `array` an explicit type, where the value of const parameter `X` is specified
|
||||
|
|
||||
LL | let mut array: ArrayHolder<X> = ArrayHolder::new();
|
||||
| ++++++++++++++++
|
||||
|
||||
error: aborting due to 3 previous errors
|
||||
error[E0284]: type annotations needed for `ArrayHolder<_>`
|
||||
--> $DIR/issue-62504.rs:26:9
|
||||
|
|
||||
LL | let mut array = ArrayHolder::new();
|
||||
| ^^^^^^^^^ ----------- type must be known at this point
|
||||
|
|
||||
note: required by a const generic parameter in `ArrayHolder`
|
||||
--> $DIR/issue-62504.rs:14:20
|
||||
|
|
||||
LL | struct ArrayHolder<const X: usize>([u32; X]);
|
||||
| ^^^^^^^^^^^^^^ required by this const generic parameter in `ArrayHolder`
|
||||
help: consider giving `array` an explicit type, where the value of const parameter `X` is specified
|
||||
|
|
||||
LL | let mut array: ArrayHolder<X> = ArrayHolder::new();
|
||||
| ++++++++++++++++
|
||||
|
||||
Some errors have detailed explanations: E0282, E0308.
|
||||
For more information about an error, try `rustc --explain E0282`.
|
||||
error: aborting due to 4 previous errors
|
||||
|
||||
Some errors have detailed explanations: E0284, E0308.
|
||||
For more information about an error, try `rustc --explain E0284`.
|
||||
|
@ -22,18 +22,41 @@ note: tuple struct defined here
|
||||
LL | struct ArrayHolder<const X: usize>([u32; X]);
|
||||
| ^^^^^^^^^^^
|
||||
|
||||
error[E0282]: type annotations needed for `ArrayHolder<_>`
|
||||
error[E0284]: type annotations needed for `ArrayHolder<_>`
|
||||
--> $DIR/issue-62504.rs:26:9
|
||||
|
|
||||
LL | let mut array = ArrayHolder::new();
|
||||
| ^^^^^^^^^
|
||||
| ^^^^^^^^^ ------------------ type must be known at this point
|
||||
|
|
||||
note: required by a const generic parameter in `ArrayHolder::<X>::new`
|
||||
--> $DIR/issue-62504.rs:16:6
|
||||
|
|
||||
LL | impl<const X: usize> ArrayHolder<X> {
|
||||
| ^^^^^^^^^^^^^^ required by this const generic parameter in `ArrayHolder::<X>::new`
|
||||
LL | pub const fn new() -> Self {
|
||||
| --- required by a bound in this associated function
|
||||
help: consider giving `array` an explicit type, where the value of const parameter `X` is specified
|
||||
|
|
||||
LL | let mut array: ArrayHolder<X> = ArrayHolder::new();
|
||||
| ++++++++++++++++
|
||||
|
||||
error: aborting due to 3 previous errors
|
||||
error[E0284]: type annotations needed for `ArrayHolder<_>`
|
||||
--> $DIR/issue-62504.rs:26:9
|
||||
|
|
||||
LL | let mut array = ArrayHolder::new();
|
||||
| ^^^^^^^^^ ----------- type must be known at this point
|
||||
|
|
||||
note: required by a const generic parameter in `ArrayHolder`
|
||||
--> $DIR/issue-62504.rs:14:20
|
||||
|
|
||||
LL | struct ArrayHolder<const X: usize>([u32; X]);
|
||||
| ^^^^^^^^^^^^^^ required by this const generic parameter in `ArrayHolder`
|
||||
help: consider giving `array` an explicit type, where the value of const parameter `X` is specified
|
||||
|
|
||||
LL | let mut array: ArrayHolder<X> = ArrayHolder::new();
|
||||
| ++++++++++++++++
|
||||
|
||||
Some errors have detailed explanations: E0282, E0308.
|
||||
For more information about an error, try `rustc --explain E0282`.
|
||||
error: aborting due to 4 previous errors
|
||||
|
||||
Some errors have detailed explanations: E0284, E0308.
|
||||
For more information about an error, try `rustc --explain E0284`.
|
||||
|
@ -25,4 +25,5 @@ impl<const X: usize> ArrayHolder<X> {
|
||||
fn main() {
|
||||
let mut array = ArrayHolder::new();
|
||||
//~^ ERROR: type annotations needed
|
||||
//~| ERROR type annotations needed
|
||||
}
|
||||
|
@ -18,4 +18,5 @@ fn use_dyn<const N: usize>(v: &dyn Foo<N>) where [u8; N + 1]: Sized {
|
||||
fn main() {
|
||||
use_dyn(&());
|
||||
//~^ ERROR type annotations needed
|
||||
//~| ERROR type annotations needed
|
||||
}
|
||||
|
@ -4,16 +4,37 @@ error[E0284]: type annotations needed
|
||||
LL | use_dyn(&());
|
||||
| ^^^^^^^ cannot infer the value of the const parameter `N` declared on the function `use_dyn`
|
||||
|
|
||||
note: required by a bound in `use_dyn`
|
||||
--> $DIR/object-safety-ok-infer-err.rs:14:55
|
||||
note: required by a const generic parameter in `use_dyn`
|
||||
--> $DIR/object-safety-ok-infer-err.rs:14:12
|
||||
|
|
||||
LL | fn use_dyn<const N: usize>(v: &dyn Foo<N>) where [u8; N + 1]: Sized {
|
||||
| ^^^^^ required by this bound in `use_dyn`
|
||||
| ^^^^^^^^^^^^^^ required by this const generic parameter in `use_dyn`
|
||||
help: consider specifying the generic argument
|
||||
|
|
||||
LL | use_dyn::<N>(&());
|
||||
| +++++
|
||||
|
||||
error: aborting due to 1 previous error
|
||||
error[E0284]: type annotations needed
|
||||
--> $DIR/object-safety-ok-infer-err.rs:19:5
|
||||
|
|
||||
LL | use_dyn(&());
|
||||
| ^^^^^^^ --- type must be known at this point
|
||||
| |
|
||||
| cannot infer the value of the const parameter `N` declared on the function `use_dyn`
|
||||
|
|
||||
note: required for `()` to implement `Foo<_>`
|
||||
--> $DIR/object-safety-ok-infer-err.rs:8:22
|
||||
|
|
||||
LL | impl<const N: usize> Foo<N> for () {
|
||||
| -------------- ^^^^^^ ^^
|
||||
| |
|
||||
| unsatisfied trait bound introduced here
|
||||
= note: required for the cast from `&()` to `&dyn Foo<_>`
|
||||
help: consider specifying the generic argument
|
||||
|
|
||||
LL | use_dyn::<N>(&());
|
||||
| +++++
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0284`.
|
||||
|
@ -1,9 +1,14 @@
|
||||
error[E0282]: type annotations needed
|
||||
error[E0284]: type annotations needed
|
||||
--> $DIR/cannot-infer-const-args.rs:6:5
|
||||
|
|
||||
LL | foo();
|
||||
| ^^^ cannot infer the value of the const parameter `X` declared on the function `foo`
|
||||
|
|
||||
note: required by a const generic parameter in `foo`
|
||||
--> $DIR/cannot-infer-const-args.rs:1:8
|
||||
|
|
||||
LL | fn foo<const X: usize>() -> usize {
|
||||
| ^^^^^^^^^^^^^^ required by this const generic parameter in `foo`
|
||||
help: consider specifying the generic argument
|
||||
|
|
||||
LL | foo::<X>();
|
||||
@ -11,4 +16,4 @@ LL | foo::<X>();
|
||||
|
||||
error: aborting due to 1 previous error
|
||||
|
||||
For more information about this error, try `rustc --explain E0282`.
|
||||
For more information about this error, try `rustc --explain E0284`.
|
||||
|
@ -1,14 +1,15 @@
|
||||
use std::convert::TryInto;
|
||||
|
||||
fn take_array_from_mut<T, const N: usize>(data: &mut [T], start: usize) -> &mut [T; N] {
|
||||
(&mut data[start .. start + N]).try_into().unwrap()
|
||||
(&mut data[start..start + N]).try_into().unwrap()
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let mut arr = [0, 1, 2, 3, 4, 5, 6, 7, 8];
|
||||
|
||||
for i in 1 .. 4 {
|
||||
for i in 1..4 {
|
||||
println!("{:?}", take_array_from_mut(&mut arr, i));
|
||||
//~^ ERROR type annotations needed
|
||||
//~| ERROR type annotations needed
|
||||
}
|
||||
}
|
||||
|
@ -1,14 +1,37 @@
|
||||
error[E0282]: type annotations needed
|
||||
error[E0284]: type annotations needed
|
||||
--> $DIR/issue-77092.rs:11:26
|
||||
|
|
||||
LL | println!("{:?}", take_array_from_mut(&mut arr, i));
|
||||
| ^^^^^^^^^^^^^^^^^^^ cannot infer the value of the const parameter `N` declared on the function `take_array_from_mut`
|
||||
|
|
||||
note: required by a const generic parameter in `take_array_from_mut`
|
||||
--> $DIR/issue-77092.rs:3:27
|
||||
|
|
||||
LL | fn take_array_from_mut<T, const N: usize>(data: &mut [T], start: usize) -> &mut [T; N] {
|
||||
| ^^^^^^^^^^^^^^ required by this const generic parameter in `take_array_from_mut`
|
||||
help: consider specifying the generic arguments
|
||||
|
|
||||
LL | println!("{:?}", take_array_from_mut::<i32, N>(&mut arr, i));
|
||||
| ++++++++++
|
||||
|
||||
error: aborting due to 1 previous error
|
||||
error[E0284]: type annotations needed
|
||||
--> $DIR/issue-77092.rs:11:26
|
||||
|
|
||||
LL | println!("{:?}", take_array_from_mut(&mut arr, i));
|
||||
| ---- ^^^^^^^^^^^^^^^^^^^ cannot infer the value of the const parameter `N` declared on the function `take_array_from_mut`
|
||||
| |
|
||||
| type must be known at this point
|
||||
|
|
||||
= note: required for `[i32; _]` to implement `Debug`
|
||||
= note: 1 redundant requirement hidden
|
||||
= note: required for `&mut [i32; _]` to implement `Debug`
|
||||
note: required by a bound in `core::fmt::rt::Argument::<'a>::new_debug`
|
||||
--> $SRC_DIR/core/src/fmt/rt.rs:LL:COL
|
||||
help: consider specifying the generic arguments
|
||||
|
|
||||
LL | println!("{:?}", take_array_from_mut::<i32, N>(&mut arr, i));
|
||||
| ++++++++++
|
||||
|
||||
For more information about this error, try `rustc --explain E0282`.
|
||||
error: aborting due to 2 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0284`.
|
||||
|
@ -1,9 +1,14 @@
|
||||
error[E0282]: type annotations needed
|
||||
error[E0284]: type annotations needed
|
||||
--> $DIR/method-chain.rs:15:33
|
||||
|
|
||||
LL | Foo.bar().bar().bar().bar().baz();
|
||||
| ^^^ cannot infer the value of the const parameter `N` declared on the method `baz`
|
||||
|
|
||||
note: required by a const generic parameter in `Foo::baz`
|
||||
--> $DIR/method-chain.rs:8:12
|
||||
|
|
||||
LL | fn baz<const N: usize>(self) -> Foo {
|
||||
| ^^^^^^^^^^^^^^ required by this const generic parameter in `Foo::baz`
|
||||
help: consider specifying the generic argument
|
||||
|
|
||||
LL | Foo.bar().bar().bar().bar().baz::<N>();
|
||||
@ -11,4 +16,4 @@ LL | Foo.bar().bar().bar().bar().baz::<N>();
|
||||
|
||||
error: aborting due to 1 previous error
|
||||
|
||||
For more information about this error, try `rustc --explain E0282`.
|
||||
For more information about this error, try `rustc --explain E0284`.
|
||||
|
@ -1,9 +1,14 @@
|
||||
error[E0282]: type annotations needed
|
||||
error[E0284]: type annotations needed
|
||||
--> $DIR/one-param-uninferred.rs:9:23
|
||||
|
|
||||
LL | let _: [u8; 17] = foo();
|
||||
| ^^^ cannot infer the value of the const parameter `M` declared on the function `foo`
|
||||
|
|
||||
note: required by a const generic parameter in `foo`
|
||||
--> $DIR/one-param-uninferred.rs:2:24
|
||||
|
|
||||
LL | fn foo<const N: usize, const M: usize>() -> [u8; N] {
|
||||
| ^^^^^^^^^^^^^^ required by this const generic parameter in `foo`
|
||||
help: consider specifying the generic arguments
|
||||
|
|
||||
LL | let _: [u8; 17] = foo::<17, M>();
|
||||
@ -11,4 +16,4 @@ LL | let _: [u8; 17] = foo::<17, M>();
|
||||
|
||||
error: aborting due to 1 previous error
|
||||
|
||||
For more information about this error, try `rustc --explain E0282`.
|
||||
For more information about this error, try `rustc --explain E0284`.
|
||||
|
@ -8,4 +8,5 @@ impl Foo {
|
||||
fn main() {
|
||||
Foo.foo();
|
||||
//~^ ERROR type annotations needed
|
||||
//~| ERROR type annotations needed
|
||||
}
|
||||
|
@ -1,14 +1,35 @@
|
||||
error[E0282]: type annotations needed
|
||||
error[E0284]: type annotations needed
|
||||
--> $DIR/uninferred-consts.rs:9:9
|
||||
|
|
||||
LL | Foo.foo();
|
||||
| ^^^ cannot infer the value of the const parameter `A` declared on the method `foo`
|
||||
|
|
||||
note: required by a const generic parameter in `Foo::foo`
|
||||
--> $DIR/uninferred-consts.rs:6:12
|
||||
|
|
||||
LL | fn foo<const A: usize, const B: usize>(self) {}
|
||||
| ^^^^^^^^^^^^^^ required by this const generic parameter in `Foo::foo`
|
||||
help: consider specifying the generic arguments
|
||||
|
|
||||
LL | Foo.foo::<A, B>();
|
||||
| ++++++++
|
||||
|
||||
error: aborting due to 1 previous error
|
||||
error[E0284]: type annotations needed
|
||||
--> $DIR/uninferred-consts.rs:9:9
|
||||
|
|
||||
LL | Foo.foo();
|
||||
| ^^^ cannot infer the value of the const parameter `B` declared on the method `foo`
|
||||
|
|
||||
note: required by a const generic parameter in `Foo::foo`
|
||||
--> $DIR/uninferred-consts.rs:6:28
|
||||
|
|
||||
LL | fn foo<const A: usize, const B: usize>(self) {}
|
||||
| ^^^^^^^^^^^^^^ required by this const generic parameter in `Foo::foo`
|
||||
help: consider specifying the generic arguments
|
||||
|
|
||||
LL | Foo.foo::<A, B>();
|
||||
| ++++++++
|
||||
|
||||
For more information about this error, try `rustc --explain E0282`.
|
||||
error: aborting due to 2 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0284`.
|
||||
|
@ -1,4 +1,5 @@
|
||||
//@ known-bug: rust-lang/rust#125799
|
||||
//! Used to ICE rust-lang/rust#125799 due to `isize` != `()`
|
||||
//! not being detected early due to the conflicting impls.
|
||||
//@ only-x86_64
|
||||
|
||||
trait Trait<T> {
|
||||
@ -10,6 +11,7 @@ impl<T> Trait<T> for Vec<T> {
|
||||
}
|
||||
|
||||
impl Trait<u8> for Vec<u8> {}
|
||||
//~^ ERROR: conflicting implementations
|
||||
|
||||
const BAR: <Vec<u8> as Trait<u8>>::Assoc = 3;
|
||||
|
12
tests/ui/const-generics/mistyped_const_in_pat.stderr
Normal file
12
tests/ui/const-generics/mistyped_const_in_pat.stderr
Normal file
@ -0,0 +1,12 @@
|
||||
error[E0119]: conflicting implementations of trait `Trait<u8>` for type `Vec<u8>`
|
||||
--> $DIR/mistyped_const_in_pat.rs:13:1
|
||||
|
|
||||
LL | impl<T> Trait<T> for Vec<T> {
|
||||
| --------------------------- first implementation here
|
||||
...
|
||||
LL | impl Trait<u8> for Vec<u8> {}
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation for `Vec<u8>`
|
||||
|
||||
error: aborting due to 1 previous error
|
||||
|
||||
For more information about this error, try `rustc --explain E0119`.
|
@ -4,11 +4,11 @@ error[E0284]: type annotations needed
|
||||
LL | generics_of_parent_impl_trait::foo([()]);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ cannot infer the value of const parameter `N` declared on the function `foo`
|
||||
|
|
||||
note: required by a bound in `foo`
|
||||
--> $DIR/auxiliary/generics_of_parent_impl_trait.rs:5:48
|
||||
note: required by a const generic parameter in `foo`
|
||||
--> $DIR/auxiliary/generics_of_parent_impl_trait.rs:5:12
|
||||
|
|
||||
LL | pub fn foo<const N: usize>(foo: impl Into<[(); N + 1]>) {
|
||||
| ^^^^^ required by this bound in `foo`
|
||||
| ^^^^^^^^^^^^^^ required by this const generic parameter in `foo`
|
||||
|
||||
error: aborting due to 1 previous error
|
||||
|
||||
|
@ -4,11 +4,11 @@ error: the constant `N` is not of type `u8`
|
||||
LL | bar::<N>()
|
||||
| ^ expected `u8`, found `usize`
|
||||
|
|
||||
note: required by a bound in `bar`
|
||||
note: required by a const generic parameter in `bar`
|
||||
--> $DIR/type_mismatch.rs:6:8
|
||||
|
|
||||
LL | fn bar<const N: u8>() -> [u8; N] {}
|
||||
| ^^^^^^^^^^^ required by this bound in `bar`
|
||||
| ^^^^^^^^^^^ required by this const generic parameter in `bar`
|
||||
|
||||
error[E0308]: mismatched types
|
||||
--> $DIR/type_mismatch.rs:6:26
|
||||
|
@ -4,14 +4,11 @@ error[E0284]: type annotations needed
|
||||
LL | bar();
|
||||
| ^^^ cannot infer the value of the const parameter `N` declared on the function `bar`
|
||||
|
|
||||
note: required by a bound in `bar`
|
||||
--> $DIR/unify_with_nested_expr.rs:14:10
|
||||
note: required by a const generic parameter in `bar`
|
||||
--> $DIR/unify_with_nested_expr.rs:12:8
|
||||
|
|
||||
LL | fn bar<const N: usize>()
|
||||
| --- required by a bound in this function
|
||||
LL | where
|
||||
LL | [(); N + 1]:,
|
||||
| ^^^^^ required by this bound in `bar`
|
||||
| ^^^^^^^^^^^^^^ required by this const generic parameter in `bar`
|
||||
help: consider specifying the generic argument
|
||||
|
|
||||
LL | bar::<N>();
|
||||
|
16
tests/ui/impl-trait/upvar_captures.rs
Normal file
16
tests/ui/impl-trait/upvar_captures.rs
Normal file
@ -0,0 +1,16 @@
|
||||
//! This test used to ICE: rust-lang/rust#123255
|
||||
//! Because the errors on `C` were ignored when trying
|
||||
//! to compute the MIR of the closure, which thus ended
|
||||
//! up with broken upvars.
|
||||
//@ edition:2021
|
||||
#![crate_type = "lib"]
|
||||
|
||||
pub fn a() {}
|
||||
|
||||
mod handlers {
|
||||
pub struct C(&()); //~ ERROR missing lifetime specifier
|
||||
pub fn c() -> impl Fn() -> C {
|
||||
let a1 = ();
|
||||
|| C((crate::a(), a1).into())
|
||||
}
|
||||
}
|
14
tests/ui/impl-trait/upvar_captures.stderr
Normal file
14
tests/ui/impl-trait/upvar_captures.stderr
Normal file
@ -0,0 +1,14 @@
|
||||
error[E0106]: missing lifetime specifier
|
||||
--> $DIR/upvar_captures.rs:11:18
|
||||
|
|
||||
LL | pub struct C(&());
|
||||
| ^ expected named lifetime parameter
|
||||
|
|
||||
help: consider introducing a named lifetime parameter
|
||||
|
|
||||
LL | pub struct C<'a>(&'a ());
|
||||
| ++++ ++
|
||||
|
||||
error: aborting due to 1 previous error
|
||||
|
||||
For more information about this error, try `rustc --explain E0106`.
|
@ -1,9 +1,14 @@
|
||||
error[E0282]: type annotations needed for `[usize; _]`
|
||||
error[E0284]: type annotations needed for `[usize; _]`
|
||||
--> $DIR/issue-83606.rs:8:9
|
||||
|
|
||||
LL | let _ = foo("foo");
|
||||
| ^
|
||||
| ^ ---------- type must be known at this point
|
||||
|
|
||||
note: required by a const generic parameter in `foo`
|
||||
--> $DIR/issue-83606.rs:3:8
|
||||
|
|
||||
LL | fn foo<const N: usize>(_: impl std::fmt::Display) -> [usize; N] {
|
||||
| ^^^^^^^^^^^^^^ required by this const generic parameter in `foo`
|
||||
help: consider giving this pattern a type, where the value of const parameter `N` is specified
|
||||
|
|
||||
LL | let _: [usize; N] = foo("foo");
|
||||
@ -11,4 +16,4 @@ LL | let _: [usize; N] = foo("foo");
|
||||
|
||||
error: aborting due to 1 previous error
|
||||
|
||||
For more information about this error, try `rustc --explain E0282`.
|
||||
For more information about this error, try `rustc --explain E0284`.
|
||||
|
@ -3,6 +3,8 @@ use std::convert::TryFrom;
|
||||
pub fn test_usage(p: ()) {
|
||||
SmallCString::try_from(p).map(|cstr| cstr);
|
||||
//~^ ERROR: type annotations needed
|
||||
//~| ERROR: type annotations needed
|
||||
//~| ERROR: type annotations needed
|
||||
}
|
||||
|
||||
pub struct SmallCString<const N: usize> {}
|
||||
|
@ -1,14 +1,61 @@
|
||||
error[E0282]: type annotations needed for `SmallCString<_>`
|
||||
error[E0284]: type annotations needed for `SmallCString<_>`
|
||||
--> $DIR/issue-98299.rs:4:36
|
||||
|
|
||||
LL | SmallCString::try_from(p).map(|cstr| cstr);
|
||||
| ^^^^
|
||||
| ------------ ^^^^
|
||||
| |
|
||||
| type must be known at this point
|
||||
|
|
||||
note: required by a const generic parameter in `SmallCString`
|
||||
--> $DIR/issue-98299.rs:10:25
|
||||
|
|
||||
LL | pub struct SmallCString<const N: usize> {}
|
||||
| ^^^^^^^^^^^^^^ required by this const generic parameter in `SmallCString`
|
||||
help: consider giving this closure parameter an explicit type, where the value of const parameter `N` is specified
|
||||
|
|
||||
LL | SmallCString::try_from(p).map(|cstr: SmallCString<N>| cstr);
|
||||
| +++++++++++++++++
|
||||
|
||||
error: aborting due to 1 previous error
|
||||
error[E0284]: type annotations needed for `SmallCString<_>`
|
||||
--> $DIR/issue-98299.rs:4:36
|
||||
|
|
||||
LL | SmallCString::try_from(p).map(|cstr| cstr);
|
||||
| ------------ ^^^^
|
||||
| |
|
||||
| type must be known at this point
|
||||
|
|
||||
note: required for `SmallCString<_>` to implement `TryFrom<()>`
|
||||
--> $DIR/issue-98299.rs:12:22
|
||||
|
|
||||
LL | impl<const N: usize> TryFrom<()> for SmallCString<N> {
|
||||
| -------------- ^^^^^^^^^^^ ^^^^^^^^^^^^^^^
|
||||
| |
|
||||
| unsatisfied trait bound introduced here
|
||||
help: consider giving this closure parameter an explicit type, where the value of const parameter `N` is specified
|
||||
|
|
||||
LL | SmallCString::try_from(p).map(|cstr: SmallCString<N>| cstr);
|
||||
| +++++++++++++++++
|
||||
|
||||
For more information about this error, try `rustc --explain E0282`.
|
||||
error[E0284]: type annotations needed for `SmallCString<_>`
|
||||
--> $DIR/issue-98299.rs:4:36
|
||||
|
|
||||
LL | SmallCString::try_from(p).map(|cstr| cstr);
|
||||
| ------------------------- ^^^^
|
||||
| |
|
||||
| type must be known at this point
|
||||
|
|
||||
note: required for `SmallCString<_>` to implement `TryFrom<()>`
|
||||
--> $DIR/issue-98299.rs:12:22
|
||||
|
|
||||
LL | impl<const N: usize> TryFrom<()> for SmallCString<N> {
|
||||
| -------------- ^^^^^^^^^^^ ^^^^^^^^^^^^^^^
|
||||
| |
|
||||
| unsatisfied trait bound introduced here
|
||||
help: consider giving this closure parameter an explicit type, where the value of const parameter `N` is specified
|
||||
|
|
||||
LL | SmallCString::try_from(p).map(|cstr: SmallCString<N>| cstr);
|
||||
| +++++++++++++++++
|
||||
|
||||
error: aborting due to 3 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0284`.
|
||||
|
@ -12,7 +12,7 @@ LL | non_local_macro::non_local_impl!(LocalStruct);
|
||||
= note: the macro `non_local_macro::non_local_impl` may come from an old version of the `non_local_macro` crate, try updating your dependency with `cargo update -p non_local_macro`
|
||||
= note: `impl` may be usable in bounds, etc. from outside the expression, which might e.g. make something constructible that previously wasn't, because it's still on a publicly-visible type
|
||||
= note: an `impl` is never scoped, even when it is nested inside an item, as it may impact type checking outside of that item, which can be the case if neither the trait or the self type are at the same nesting level as the `impl`
|
||||
= note: items in an anonymous const item (`const _: () = { ... }`) are treated as in the same scope as the anonymous const's declaration
|
||||
= note: items in an anonymous const item (`const _: () = { ... }`) are treated as in the same scope as the anonymous const's declaration for the purpose of this lint
|
||||
= note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>
|
||||
= note: `#[warn(non_local_definitions)]` on by default
|
||||
= note: this warning originates in the macro `non_local_macro::non_local_impl` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
@ -15,7 +15,7 @@ LL | impl Uto for &Test {}
|
||||
|
|
||||
= note: `impl` may be usable in bounds, etc. from outside the expression, which might e.g. make something constructible that previously wasn't, because it's still on a publicly-visible type
|
||||
= note: an `impl` is never scoped, even when it is nested inside an item, as it may impact type checking outside of that item, which can be the case if neither the trait or the self type are at the same nesting level as the `impl`
|
||||
= note: items in an anonymous const item (`const _: () = { ... }`) are treated as in the same scope as the anonymous const's declaration
|
||||
= note: items in an anonymous const item (`const _: () = { ... }`) are treated as in the same scope as the anonymous const's declaration for the purpose of this lint
|
||||
= note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>
|
||||
= note: `#[warn(non_local_definitions)]` on by default
|
||||
|
||||
@ -32,7 +32,7 @@ LL | impl Uto2 for Test {}
|
||||
|
|
||||
= note: `impl` may be usable in bounds, etc. from outside the expression, which might e.g. make something constructible that previously wasn't, because it's still on a publicly-visible type
|
||||
= note: an `impl` is never scoped, even when it is nested inside an item, as it may impact type checking outside of that item, which can be the case if neither the trait or the self type are at the same nesting level as the `impl`
|
||||
= note: items in an anonymous const item (`const _: () = { ... }`) are treated as in the same scope as the anonymous const's declaration
|
||||
= note: items in an anonymous const item (`const _: () = { ... }`) are treated as in the same scope as the anonymous const's declaration for the purpose of this lint
|
||||
= note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>
|
||||
|
||||
warning: non-local `impl` definition, `impl` blocks should be written at the same level as their item
|
||||
@ -48,7 +48,7 @@ LL | impl Uto3 for Test {}
|
||||
|
|
||||
= note: `impl` may be usable in bounds, etc. from outside the expression, which might e.g. make something constructible that previously wasn't, because it's still on a publicly-visible type
|
||||
= note: an `impl` is never scoped, even when it is nested inside an item, as it may impact type checking outside of that item, which can be the case if neither the trait or the self type are at the same nesting level as the `impl`
|
||||
= note: items in an anonymous const item (`const _: () = { ... }`) are treated as in the same scope as the anonymous const's declaration
|
||||
= note: items in an anonymous const item (`const _: () = { ... }`) are treated as in the same scope as the anonymous const's declaration for the purpose of this lint
|
||||
= note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>
|
||||
|
||||
warning: non-local `impl` definition, `impl` blocks should be written at the same level as their item
|
||||
@ -94,7 +94,7 @@ LL | impl Test {
|
||||
| `Test` is not local
|
||||
|
|
||||
= note: methods and associated constants are still usable outside the current expression, only `impl Local` and `impl dyn Local` can ever be private, and only if the type is nested in the same item as the `impl`
|
||||
= note: items in an anonymous const item (`const _: () = { ... }`) are treated as in the same scope as the anonymous const's declaration
|
||||
= note: items in an anonymous const item (`const _: () = { ... }`) are treated as in the same scope as the anonymous const's declaration for the purpose of this lint
|
||||
= note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>
|
||||
|
||||
warning: non-local `impl` definition, `impl` blocks should be written at the same level as their item
|
||||
|
@ -37,6 +37,19 @@ error[E0207]: the const parameter `host` is not constrained by the impl trait, s
|
||||
= note: expressions using a const parameter must map each value to a distinct output value
|
||||
= note: proving the result of expressions other than the parameter are unique is not supported
|
||||
|
||||
error[E0284]: type annotations needed
|
||||
--> $DIR/derive-const-use.rs:18:35
|
||||
|
|
||||
LL | const _: () = assert!(S((), A) == S::default());
|
||||
| ^^^^^^^^^^^^ cannot infer the value of the constant `_`
|
||||
|
|
||||
note: required for `S` to implement `Default`
|
||||
--> $DIR/derive-const-use.rs:15:16
|
||||
|
|
||||
LL | #[derive_const(Default, PartialEq)]
|
||||
| ^^^^^^^ unsatisfied trait bound introduced in this `derive` macro
|
||||
= note: this error originates in the derive macro `Default` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error[E0308]: mismatched types
|
||||
--> $DIR/derive-const-use.rs:16:14
|
||||
|
|
||||
@ -49,7 +62,24 @@ LL | pub struct S((), A);
|
||||
found constant `true`
|
||||
= note: this error originates in the derive macro `PartialEq` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error: aborting due to 6 previous errors
|
||||
error[E0284]: type annotations needed
|
||||
--> $DIR/derive-const-use.rs:16:18
|
||||
|
|
||||
LL | #[derive_const(Default, PartialEq)]
|
||||
| ------- in this derive macro expansion
|
||||
LL | pub struct S((), A);
|
||||
| ^ cannot infer the value of the constant `_`
|
||||
|
|
||||
note: required for `A` to implement `Default`
|
||||
--> $DIR/derive-const-use.rs:7:12
|
||||
|
|
||||
LL | impl const Default for A {
|
||||
| ----- ^^^^^^^ ^
|
||||
| |
|
||||
| unsatisfied trait bound introduced here
|
||||
= note: this error originates in the derive macro `Default` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
Some errors have detailed explanations: E0207, E0308, E0635.
|
||||
error: aborting due to 8 previous errors
|
||||
|
||||
Some errors have detailed explanations: E0207, E0284, E0308, E0635.
|
||||
For more information about an error, try `rustc --explain E0207`.
|
||||
|
@ -34,6 +34,94 @@ LL | impl const FromResidual for T {
|
||||
= note: expressions using a const parameter must map each value to a distinct output value
|
||||
= note: proving the result of expressions other than the parameter are unique is not supported
|
||||
|
||||
error: aborting due to 4 previous errors
|
||||
error[E0284]: type annotations needed
|
||||
--> $DIR/trait-default-body-stability.rs:33:6
|
||||
|
|
||||
LL | impl const FromResidual for T {
|
||||
| ^^^^^ cannot infer the value of the constant `_`
|
||||
|
|
||||
note: required for `T` to implement `Try`
|
||||
--> $DIR/trait-default-body-stability.rs:18:12
|
||||
|
|
||||
LL | impl const Try for T {
|
||||
| ----- ^^^ ^
|
||||
| |
|
||||
| unsatisfied trait bound introduced here
|
||||
|
||||
For more information about this error, try `rustc --explain E0207`.
|
||||
error[E0284]: type annotations needed
|
||||
--> $DIR/trait-default-body-stability.rs:44:9
|
||||
|
|
||||
LL | T?
|
||||
| ^^ cannot infer the value of the constant `_`
|
||||
|
|
||||
note: required for `T` to implement `Try`
|
||||
--> $DIR/trait-default-body-stability.rs:18:12
|
||||
|
|
||||
LL | impl const Try for T {
|
||||
| ----- ^^^ ^
|
||||
| |
|
||||
| unsatisfied trait bound introduced here
|
||||
|
||||
error[E0284]: type annotations needed
|
||||
--> $DIR/trait-default-body-stability.rs:44:9
|
||||
|
|
||||
LL | T?
|
||||
| ^^ cannot infer the value of the constant `_`
|
||||
|
|
||||
note: required for `T` to implement `FromResidual<T>`
|
||||
--> $DIR/trait-default-body-stability.rs:33:12
|
||||
|
|
||||
LL | impl const FromResidual for T {
|
||||
| ----- ^^^^^^^^^^^^ ^
|
||||
| |
|
||||
| unsatisfied trait bound introduced here
|
||||
|
||||
error[E0284]: type annotations needed
|
||||
--> $DIR/trait-default-body-stability.rs:44:9
|
||||
|
|
||||
LL | T?
|
||||
| ^^ cannot infer the value of the constant `_`
|
||||
|
|
||||
note: required for `T` to implement `Try`
|
||||
--> $DIR/trait-default-body-stability.rs:18:12
|
||||
|
|
||||
LL | impl const Try for T {
|
||||
| ----- ^^^ ^
|
||||
| |
|
||||
| unsatisfied trait bound introduced here
|
||||
= note: duplicate diagnostic emitted due to `-Z deduplicate-diagnostics=no`
|
||||
|
||||
error[E0284]: type annotations needed
|
||||
--> $DIR/trait-default-body-stability.rs:44:9
|
||||
|
|
||||
LL | T?
|
||||
| ^^ cannot infer the value of the constant `_`
|
||||
|
|
||||
note: required for `T` to implement `FromResidual<T>`
|
||||
--> $DIR/trait-default-body-stability.rs:33:12
|
||||
|
|
||||
LL | impl const FromResidual for T {
|
||||
| ----- ^^^^^^^^^^^^ ^
|
||||
| |
|
||||
| unsatisfied trait bound introduced here
|
||||
= note: duplicate diagnostic emitted due to `-Z deduplicate-diagnostics=no`
|
||||
|
||||
error[E0284]: type annotations needed
|
||||
--> $DIR/trait-default-body-stability.rs:44:9
|
||||
|
|
||||
LL | T?
|
||||
| ^^ cannot infer the value of the constant `_`
|
||||
|
|
||||
note: required for `T` to implement `Try`
|
||||
--> $DIR/trait-default-body-stability.rs:18:12
|
||||
|
|
||||
LL | impl const Try for T {
|
||||
| ----- ^^^ ^
|
||||
| |
|
||||
| unsatisfied trait bound introduced here
|
||||
= note: duplicate diagnostic emitted due to `-Z deduplicate-diagnostics=no`
|
||||
|
||||
error: aborting due to 10 previous errors
|
||||
|
||||
Some errors have detailed explanations: E0207, E0284.
|
||||
For more information about an error, try `rustc --explain E0207`.
|
||||
|
@ -4,4 +4,5 @@ fn main() {
|
||||
//~| ERROR cannot find type `T` in this scope
|
||||
//~| ERROR const and type arguments are not allowed on builtin type `str`
|
||||
//~| ERROR expected unit struct, unit variant or constant, found associated function `str<
|
||||
//~| ERROR type annotations needed
|
||||
}
|
||||
|
@ -32,7 +32,18 @@ error[E0533]: expected unit struct, unit variant or constant, found associated f
|
||||
LL | let str::<{fn str() { let str::T>>::as_bytes; }}, T>::as_bytes;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ not a unit struct, unit variant or constant
|
||||
|
||||
error: aborting due to 4 previous errors
|
||||
error[E0282]: type annotations needed
|
||||
--> $DIR/ensure-overriding-bindings-in-pattern-with-ty-err-doesnt-ice.rs:2:31
|
||||
|
|
||||
LL | let str::<{fn str() { let str::T>>::as_bytes; }}, T>::as_bytes;
|
||||
| ^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
help: consider giving this pattern a type
|
||||
|
|
||||
LL | let str::<{fn str() { let str::T>>::as_bytes: /* Type */; }}, T>::as_bytes;
|
||||
| ++++++++++++
|
||||
|
||||
Some errors have detailed explanations: E0109, E0412, E0533.
|
||||
error: aborting due to 5 previous errors
|
||||
|
||||
Some errors have detailed explanations: E0109, E0282, E0412, E0533.
|
||||
For more information about an error, try `rustc --explain E0109`.
|
||||
|
@ -14,11 +14,11 @@ LL | impl<const C: usize> Wrapper<C> {}
|
||||
|
|
||||
= help: consider constraining the associated type `<i32 as Trait>::Type` to `usize`
|
||||
= note: for more information, visit https://doc.rust-lang.org/book/ch19-03-advanced-traits.html
|
||||
note: required by a bound in `Wrapper`
|
||||
note: required by a const generic parameter in `Wrapper`
|
||||
--> $DIR/default-proj-ty-as-type-of-const-issue-125757.rs:12:16
|
||||
|
|
||||
LL | struct Wrapper<const C: <i32 as Trait>::Type> {}
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `Wrapper`
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this const generic parameter in `Wrapper`
|
||||
|
||||
error[E0308]: mismatched types
|
||||
--> $DIR/default-proj-ty-as-type-of-const-issue-125757.rs:15:30
|
||||
|
@ -10,7 +10,7 @@ error: the constant `ASSUME_ALIGNMENT` is not of type `Assume`
|
||||
LL | Dst: BikeshedIntrinsicFrom<Src, ASSUME_ALIGNMENT>,
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `Assume`, found `bool`
|
||||
|
|
||||
note: required by a bound in `BikeshedIntrinsicFrom`
|
||||
note: required by a const generic parameter in `BikeshedIntrinsicFrom`
|
||||
--> $SRC_DIR/core/src/mem/transmutability.rs:LL:COL
|
||||
|
||||
error[E0308]: mismatched types
|
||||
|
@ -1,4 +1,6 @@
|
||||
//@ known-bug: rust-lang/rust#123276
|
||||
//! This test used to ICE: rust-lang/rust#123276 because we did
|
||||
//! not taint when failing to find the `Foo` type and then tried
|
||||
//! to normalize it.
|
||||
//@ edition:2021
|
||||
|
||||
async fn create_task() {
|
||||
@ -19,7 +21,9 @@ struct AndThen;
|
||||
|
||||
impl Filter for AndThen
|
||||
where
|
||||
Foo: Filter,
|
||||
Foo: Filter, //~ ERROR: cannot find type `Foo`
|
||||
{
|
||||
type Future = ();
|
||||
}
|
||||
|
||||
fn main() {}
|
@ -0,0 +1,9 @@
|
||||
error[E0412]: cannot find type `Foo` in this scope
|
||||
--> $DIR/normalization-of-unknown-type.rs:24:5
|
||||
|
|
||||
LL | Foo: Filter,
|
||||
| ^^^ not found in this scope
|
||||
|
||||
error: aborting due to 1 previous error
|
||||
|
||||
For more information about this error, try `rustc --explain E0412`.
|
Loading…
Reference in New Issue
Block a user