Auto merge of #65632 - JohnTitor:rollup-adb16gb, r=JohnTitor
Rollup of 5 pull requests Successful merges: - #65460 (Clean up `contains()` `insert()` chains on HashSet) - #65463 (Avoid unnecessary arena allocations in `expand_pattern()`.) - #65579 (Changed `resolve_type_vars_with_obligations` to also resolve const inference variables) - #65605 (Remove unreachable unit tuple compare binop codegen) - #65626 (trivial typo fix) Failed merges: r? @ghost
This commit is contained in:
commit
7979016aff
21 changed files with 53 additions and 67 deletions
src
librustc
librustc_codegen_llvm/debuginfo
librustc_codegen_ssa/mir
librustc_metadata
librustc_mir
librustc_resolve
librustc_typeck/check
libsyntax
test/ui/const-generics
|
@ -1,7 +1,7 @@
|
|||
use super::{InferCtxt, FixupError, FixupResult, Span};
|
||||
use super::type_variable::{TypeVariableOrigin, TypeVariableOriginKind};
|
||||
use crate::mir::interpret::ConstValue;
|
||||
use crate::ty::{self, Ty, Const, TyCtxt, TypeFoldable, InferConst, TypeFlags};
|
||||
use crate::ty::{self, Ty, Const, TyCtxt, TypeFoldable, InferConst};
|
||||
use crate::ty::fold::{TypeFolder, TypeVisitor};
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
@ -29,7 +29,7 @@ impl<'a, 'tcx> TypeFolder<'tcx> for OpportunisticVarResolver<'a, 'tcx> {
|
|||
}
|
||||
|
||||
fn fold_ty(&mut self, t: Ty<'tcx>) -> Ty<'tcx> {
|
||||
if !t.has_infer_types() {
|
||||
if !t.has_infer_types() && !t.has_infer_consts() {
|
||||
t // micro-optimize -- if there is nothing in this type that this fold affects...
|
||||
} else {
|
||||
let t = self.infcx.shallow_resolve(t);
|
||||
|
@ -38,7 +38,7 @@ impl<'a, 'tcx> TypeFolder<'tcx> for OpportunisticVarResolver<'a, 'tcx> {
|
|||
}
|
||||
|
||||
fn fold_const(&mut self, ct: &'tcx Const<'tcx>) -> &'tcx Const<'tcx> {
|
||||
if !ct.has_type_flags(TypeFlags::HAS_CT_INFER) {
|
||||
if !ct.has_infer_consts() {
|
||||
ct // micro-optimize -- if there is nothing in this const that this fold affects...
|
||||
} else {
|
||||
let ct = self.infcx.shallow_resolve(ct);
|
||||
|
|
|
@ -905,11 +905,10 @@ pub fn check_unused_or_stable_features(tcx: TyCtxt<'_>) {
|
|||
// Warn if the user has enabled an already-stable lang feature.
|
||||
unnecessary_stable_feature_lint(tcx, span, feature, since);
|
||||
}
|
||||
if lang_features.contains(&feature) {
|
||||
if !lang_features.insert(feature) {
|
||||
// Warn if the user enables a lang feature multiple times.
|
||||
duplicate_feature_err(tcx.sess, span, feature);
|
||||
}
|
||||
lang_features.insert(feature);
|
||||
}
|
||||
|
||||
let declared_lib_features = &tcx.features().declared_lib_features;
|
||||
|
|
|
@ -88,6 +88,9 @@ pub trait TypeFoldable<'tcx>: fmt::Debug + Clone {
|
|||
fn has_infer_types(&self) -> bool {
|
||||
self.has_type_flags(TypeFlags::HAS_TY_INFER)
|
||||
}
|
||||
fn has_infer_consts(&self) -> bool {
|
||||
self.has_type_flags(TypeFlags::HAS_CT_INFER)
|
||||
}
|
||||
fn has_local_value(&self) -> bool {
|
||||
self.has_type_flags(TypeFlags::KEEP_IN_LOCAL_TCX)
|
||||
}
|
||||
|
|
|
@ -2069,11 +2069,9 @@ fn set_members_of_composite_type(cx: &CodegenCx<'ll, 'tcx>,
|
|||
{
|
||||
let mut composite_types_completed =
|
||||
debug_context(cx).composite_types_completed.borrow_mut();
|
||||
if composite_types_completed.contains(&composite_type_metadata) {
|
||||
if !composite_types_completed.insert(&composite_type_metadata) {
|
||||
bug!("debuginfo::set_members_of_composite_type() - \
|
||||
Already completed forward declaration re-encountered.");
|
||||
} else {
|
||||
composite_types_completed.insert(composite_type_metadata);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -556,7 +556,6 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
|
|||
) -> Bx::Value {
|
||||
let is_float = input_ty.is_floating_point();
|
||||
let is_signed = input_ty.is_signed();
|
||||
let is_unit = input_ty.is_unit();
|
||||
match op {
|
||||
mir::BinOp::Add => if is_float {
|
||||
bx.fadd(lhs, rhs)
|
||||
|
@ -594,13 +593,7 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
|
|||
mir::BinOp::Shl => common::build_unchecked_lshift(bx, lhs, rhs),
|
||||
mir::BinOp::Shr => common::build_unchecked_rshift(bx, input_ty, lhs, rhs),
|
||||
mir::BinOp::Ne | mir::BinOp::Lt | mir::BinOp::Gt |
|
||||
mir::BinOp::Eq | mir::BinOp::Le | mir::BinOp::Ge => if is_unit {
|
||||
bx.cx().const_bool(match op {
|
||||
mir::BinOp::Ne | mir::BinOp::Lt | mir::BinOp::Gt => false,
|
||||
mir::BinOp::Eq | mir::BinOp::Le | mir::BinOp::Ge => true,
|
||||
_ => unreachable!()
|
||||
})
|
||||
} else if is_float {
|
||||
mir::BinOp::Eq | mir::BinOp::Le | mir::BinOp::Ge => if is_float {
|
||||
bx.fcmp(
|
||||
base::bin_op_to_fcmp_predicate(op.to_hir_binop()),
|
||||
lhs, rhs
|
||||
|
|
|
@ -198,12 +198,10 @@ impl Collector<'tcx> {
|
|||
self.tcx.sess.err(&format!("renaming of the library `{}` was specified, \
|
||||
however this crate contains no `#[link(...)]` \
|
||||
attributes referencing this library.", name));
|
||||
} else if renames.contains(name) {
|
||||
} else if !renames.insert(name) {
|
||||
self.tcx.sess.err(&format!("multiple renamings were \
|
||||
specified for library `{}` .",
|
||||
name));
|
||||
} else {
|
||||
renames.insert(name);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -78,7 +78,7 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
|
|||
.last()
|
||||
.unwrap();
|
||||
|
||||
if self.uninitialized_error_reported.contains(&root_place) {
|
||||
if !self.uninitialized_error_reported.insert(root_place) {
|
||||
debug!(
|
||||
"report_use_of_moved_or_uninitialized place: error about {:?} suppressed",
|
||||
root_place
|
||||
|
@ -86,8 +86,6 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
|
|||
return;
|
||||
}
|
||||
|
||||
self.uninitialized_error_reported.insert(root_place);
|
||||
|
||||
let item_msg = match self.describe_place_with_options(used_place,
|
||||
IncludingDowncast(true)) {
|
||||
Some(name) => format!("`{}`", name),
|
||||
|
|
|
@ -189,8 +189,8 @@ use std::ops::RangeInclusive;
|
|||
use std::u128;
|
||||
use std::convert::TryInto;
|
||||
|
||||
pub fn expand_pattern<'a, 'tcx>(cx: &MatchCheckCtxt<'a, 'tcx>, pat: Pat<'tcx>) -> &'a Pat<'tcx> {
|
||||
cx.pattern_arena.alloc(LiteralExpander { tcx: cx.tcx }.fold_pattern(&pat))
|
||||
pub fn expand_pattern<'a, 'tcx>(cx: &MatchCheckCtxt<'a, 'tcx>, pat: Pat<'tcx>) -> Pat<'tcx> {
|
||||
LiteralExpander { tcx: cx.tcx }.fold_pattern(&pat)
|
||||
}
|
||||
|
||||
struct LiteralExpander<'tcx> {
|
||||
|
|
|
@ -154,7 +154,8 @@ impl<'tcx> MatchVisitor<'_, 'tcx> {
|
|||
self.tables
|
||||
);
|
||||
patcx.include_lint_checks();
|
||||
let pattern = expand_pattern(cx, patcx.lower_pattern(&pat));
|
||||
let pattern =
|
||||
cx.pattern_arena.alloc(expand_pattern(cx, patcx.lower_pattern(&pat))) as &_;
|
||||
if !patcx.errors.is_empty() {
|
||||
patcx.report_inlining_errors(pat.span);
|
||||
have_errors = true;
|
||||
|
@ -253,8 +254,9 @@ impl<'tcx> MatchVisitor<'_, 'tcx> {
|
|||
patcx.include_lint_checks();
|
||||
let pattern = patcx.lower_pattern(pat);
|
||||
let pattern_ty = pattern.ty;
|
||||
let pattern = expand_pattern(cx, pattern);
|
||||
let pats: Matrix<'_, '_> = vec![smallvec![
|
||||
expand_pattern(cx, pattern)
|
||||
&pattern
|
||||
]].into_iter().collect();
|
||||
|
||||
let witnesses = match check_not_useful(cx, pattern_ty, &pats, pat.hir_id) {
|
||||
|
|
|
@ -1214,7 +1214,7 @@ fn search_for_adt_without_structural_match<'tcx>(tcx: TyCtxt<'tcx>,
|
|||
|
||||
// tracks ADT's previously encountered during search, so that
|
||||
// we will not recur on them again.
|
||||
seen: FxHashSet<&'tcx AdtDef>,
|
||||
seen: FxHashSet<hir::def_id::DefId>,
|
||||
}
|
||||
|
||||
impl<'tcx> TypeVisitor<'tcx> for Search<'tcx> {
|
||||
|
@ -1254,14 +1254,12 @@ fn search_for_adt_without_structural_match<'tcx>(tcx: TyCtxt<'tcx>,
|
|||
return true // Halt visiting!
|
||||
}
|
||||
|
||||
if self.seen.contains(adt_def) {
|
||||
if !self.seen.insert(adt_def.did) {
|
||||
debug!("Search already seen adt_def: {:?}", adt_def);
|
||||
// let caller continue its search
|
||||
return false;
|
||||
}
|
||||
|
||||
self.seen.insert(adt_def);
|
||||
|
||||
// `#[structural_match]` does not care about the
|
||||
// instantiation of the generics in an ADT (it
|
||||
// instead looks directly at its fields outside
|
||||
|
|
|
@ -72,13 +72,11 @@ fn check_fn_for_unconditional_recursion(
|
|||
let caller_substs = &InternalSubsts::identity_for_item(tcx, def_id)[..trait_substs_count];
|
||||
|
||||
while let Some(bb) = reachable_without_self_call_queue.pop() {
|
||||
if visited.contains(bb) {
|
||||
if !visited.insert(bb) {
|
||||
//already done
|
||||
continue;
|
||||
}
|
||||
|
||||
visited.insert(bb);
|
||||
|
||||
let block = &basic_blocks[bb];
|
||||
|
||||
if let Some(ref terminator) = block.terminator {
|
||||
|
|
|
@ -673,13 +673,12 @@ impl<'a, 'b> ImportResolver<'a, 'b> {
|
|||
self.throw_unresolved_import_error(errors, None);
|
||||
errors = vec![];
|
||||
}
|
||||
if !seen_spans.contains(&err.span) {
|
||||
if seen_spans.insert(err.span) {
|
||||
let path = import_path_to_string(
|
||||
&import.module_path.iter().map(|seg| seg.ident).collect::<Vec<_>>(),
|
||||
&import.subclass,
|
||||
err.span,
|
||||
);
|
||||
seen_spans.insert(err.span);
|
||||
errors.push((path, err));
|
||||
prev_root_id = import.root_id;
|
||||
}
|
||||
|
|
|
@ -811,7 +811,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
|||
target: Ty<'tcx>,
|
||||
allow_two_phase: AllowTwoPhase,
|
||||
) -> RelateResult<'tcx, Ty<'tcx>> {
|
||||
let source = self.resolve_type_vars_with_obligations(expr_ty);
|
||||
let source = self.resolve_vars_with_obligations(expr_ty);
|
||||
debug!("coercion::try({:?}: {:?} -> {:?})", expr, source, target);
|
||||
|
||||
let cause = self.cause(expr.span, ObligationCauseCode::ExprAssignable);
|
||||
|
@ -829,7 +829,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
|||
|
||||
/// Same as `try_coerce()`, but without side-effects.
|
||||
pub fn can_coerce(&self, expr_ty: Ty<'tcx>, target: Ty<'tcx>) -> bool {
|
||||
let source = self.resolve_type_vars_with_obligations(expr_ty);
|
||||
let source = self.resolve_vars_with_obligations(expr_ty);
|
||||
debug!("coercion::can({:?} -> {:?})", source, target);
|
||||
|
||||
let cause = self.cause(syntax_pos::DUMMY_SP, ObligationCauseCode::ExprAssignable);
|
||||
|
@ -853,8 +853,8 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
|||
-> RelateResult<'tcx, Ty<'tcx>>
|
||||
where E: AsCoercionSite
|
||||
{
|
||||
let prev_ty = self.resolve_type_vars_with_obligations(prev_ty);
|
||||
let new_ty = self.resolve_type_vars_with_obligations(new_ty);
|
||||
let prev_ty = self.resolve_vars_with_obligations(prev_ty);
|
||||
let new_ty = self.resolve_vars_with_obligations(new_ty);
|
||||
debug!("coercion::try_find_coercion_lub({:?}, {:?})", prev_ty, new_ty);
|
||||
|
||||
// Special-case that coercion alone cannot handle:
|
||||
|
@ -1333,7 +1333,7 @@ impl<'tcx, 'exprs, E: AsCoercionSite> CoerceMany<'tcx, 'exprs, E> {
|
|||
err.span_label(return_sp, "expected because this return type...");
|
||||
err.span_label( *sp, format!(
|
||||
"...is found to be `{}` here",
|
||||
fcx.resolve_type_vars_with_obligations(expected),
|
||||
fcx.resolve_vars_with_obligations(expected),
|
||||
));
|
||||
}
|
||||
err
|
||||
|
|
|
@ -108,7 +108,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
|||
expected: Ty<'tcx>,
|
||||
allow_two_phase: AllowTwoPhase)
|
||||
-> (Ty<'tcx>, Option<DiagnosticBuilder<'tcx>>) {
|
||||
let expected = self.resolve_type_vars_with_obligations(expected);
|
||||
let expected = self.resolve_vars_with_obligations(expected);
|
||||
|
||||
let e = match self.try_coerce(expr, checked_ty, expected, allow_two_phase) {
|
||||
Ok(ty) => return (ty, None),
|
||||
|
@ -117,7 +117,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
|||
|
||||
let expr = expr.peel_drop_temps();
|
||||
let cause = self.misc(expr.span);
|
||||
let expr_ty = self.resolve_type_vars_with_obligations(checked_ty);
|
||||
let expr_ty = self.resolve_vars_with_obligations(checked_ty);
|
||||
let mut err = self.report_mismatched_types(&cause, expected, expr_ty, e);
|
||||
|
||||
if self.is_assign_to_bool(expr, expected) {
|
||||
|
|
|
@ -1010,7 +1010,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
|||
expr: &'tcx hir::Expr,
|
||||
) -> Ty<'tcx> {
|
||||
let flds = expected.only_has_type(self).and_then(|ty| {
|
||||
let ty = self.resolve_type_vars_with_obligations(ty);
|
||||
let ty = self.resolve_vars_with_obligations(ty);
|
||||
match ty.kind {
|
||||
ty::Tuple(ref flds) => Some(&flds[..]),
|
||||
_ => None
|
||||
|
|
|
@ -919,7 +919,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
|||
// This occurs for UFCS desugaring of `T::method`, where there is no
|
||||
// receiver expression for the method call, and thus no autoderef.
|
||||
if let SelfSource::QPath(_) = source {
|
||||
return is_local(self.resolve_type_vars_with_obligations(rcvr_ty));
|
||||
return is_local(self.resolve_vars_with_obligations(rcvr_ty));
|
||||
}
|
||||
|
||||
self.autoderef(span, rcvr_ty).any(|(ty, _)| is_local(ty))
|
||||
|
|
|
@ -2440,23 +2440,23 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
|||
self.cause(span, ObligationCauseCode::MiscObligation)
|
||||
}
|
||||
|
||||
/// Resolves type variables in `ty` if possible. Unlike the infcx
|
||||
/// Resolves type and const variables in `ty` if possible. Unlike the infcx
|
||||
/// version (resolve_vars_if_possible), this version will
|
||||
/// also select obligations if it seems useful, in an effort
|
||||
/// to get more type information.
|
||||
fn resolve_type_vars_with_obligations(&self, mut ty: Ty<'tcx>) -> Ty<'tcx> {
|
||||
debug!("resolve_type_vars_with_obligations(ty={:?})", ty);
|
||||
fn resolve_vars_with_obligations(&self, mut ty: Ty<'tcx>) -> Ty<'tcx> {
|
||||
debug!("resolve_vars_with_obligations(ty={:?})", ty);
|
||||
|
||||
// No Infer()? Nothing needs doing.
|
||||
if !ty.has_infer_types() {
|
||||
debug!("resolve_type_vars_with_obligations: ty={:?}", ty);
|
||||
if !ty.has_infer_types() && !ty.has_infer_consts() {
|
||||
debug!("resolve_vars_with_obligations: ty={:?}", ty);
|
||||
return ty;
|
||||
}
|
||||
|
||||
// If `ty` is a type variable, see whether we already know what it is.
|
||||
ty = self.resolve_vars_if_possible(&ty);
|
||||
if !ty.has_infer_types() {
|
||||
debug!("resolve_type_vars_with_obligations: ty={:?}", ty);
|
||||
if !ty.has_infer_types() && !ty.has_infer_consts() {
|
||||
debug!("resolve_vars_with_obligations: ty={:?}", ty);
|
||||
return ty;
|
||||
}
|
||||
|
||||
|
@ -2467,7 +2467,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
|||
self.select_obligations_where_possible(false, |_| {});
|
||||
ty = self.resolve_vars_if_possible(&ty);
|
||||
|
||||
debug!("resolve_type_vars_with_obligations: ty={:?}", ty);
|
||||
debug!("resolve_vars_with_obligations: ty={:?}", ty);
|
||||
ty
|
||||
}
|
||||
|
||||
|
@ -3668,7 +3668,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
|||
formal_ret: Ty<'tcx>,
|
||||
formal_args: &[Ty<'tcx>])
|
||||
-> Vec<Ty<'tcx>> {
|
||||
let formal_ret = self.resolve_type_vars_with_obligations(formal_ret);
|
||||
let formal_ret = self.resolve_vars_with_obligations(formal_ret);
|
||||
let ret_ty = match expected_ret.only_has_type(self) {
|
||||
Some(ret) => ret,
|
||||
None => return Vec::new()
|
||||
|
@ -4517,7 +4517,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
|||
err.span_suggestion(
|
||||
span,
|
||||
"try adding a return type",
|
||||
format!("-> {} ", self.resolve_type_vars_with_obligations(found)),
|
||||
format!("-> {} ", self.resolve_vars_with_obligations(found)),
|
||||
Applicability::MachineApplicable);
|
||||
true
|
||||
}
|
||||
|
@ -4993,7 +4993,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
|||
// If no resolution is possible, then an error is reported.
|
||||
// Numeric inference variables may be left unresolved.
|
||||
pub fn structurally_resolved_type(&self, sp: Span, ty: Ty<'tcx>) -> Ty<'tcx> {
|
||||
let ty = self.resolve_type_vars_with_obligations(ty);
|
||||
let ty = self.resolve_vars_with_obligations(ty);
|
||||
if !ty.is_ty_var() {
|
||||
ty
|
||||
} else {
|
||||
|
|
|
@ -179,7 +179,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
|||
self.check_expr_with_needs(lhs_expr, Needs::MutPlace)
|
||||
}
|
||||
};
|
||||
let lhs_ty = self.resolve_type_vars_with_obligations(lhs_ty);
|
||||
let lhs_ty = self.resolve_vars_with_obligations(lhs_ty);
|
||||
|
||||
// N.B., as we have not yet type-checked the RHS, we don't have the
|
||||
// type at hand. Make a variable to represent it. The whole reason
|
||||
|
@ -196,7 +196,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
|||
|
||||
// see `NB` above
|
||||
let rhs_ty = self.check_expr_coercable_to_type(rhs_expr, rhs_ty_var);
|
||||
let rhs_ty = self.resolve_type_vars_with_obligations(rhs_ty);
|
||||
let rhs_ty = self.resolve_vars_with_obligations(rhs_ty);
|
||||
|
||||
let return_ty = match result {
|
||||
Ok(method) => {
|
||||
|
|
|
@ -251,7 +251,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
|||
expected: Ty<'tcx>,
|
||||
mut def_bm: BindingMode,
|
||||
) -> (Ty<'tcx>, BindingMode) {
|
||||
let mut expected = self.resolve_type_vars_with_obligations(&expected);
|
||||
let mut expected = self.resolve_vars_with_obligations(&expected);
|
||||
|
||||
// Peel off as many `&` or `&mut` from the scrutinee type as possible. For example,
|
||||
// for `match &&&mut Some(5)` the loop runs three times, aborting when it reaches
|
||||
|
|
|
@ -67,7 +67,7 @@ pub struct Globals {
|
|||
impl Globals {
|
||||
fn new(edition: Edition) -> Globals {
|
||||
Globals {
|
||||
// We have no idea how many attributes their will be, so just
|
||||
// We have no idea how many attributes there will be, so just
|
||||
// initiate the vectors with 0 bits. We'll grow them as necessary.
|
||||
used_attrs: Lock::new(GrowableBitSet::new_empty()),
|
||||
known_attrs: Lock::new(GrowableBitSet::new_empty()),
|
||||
|
|
|
@ -1,20 +1,20 @@
|
|||
error[E0308]: mismatched types
|
||||
--> $DIR/const-argument-cross-crate-mismatch.rs:6:41
|
||||
--> $DIR/const-argument-cross-crate-mismatch.rs:6:67
|
||||
|
|
||||
LL | let _ = const_generic_lib::function(const_generic_lib::Struct([0u8, 1u8]));
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `3usize`, found `2usize`
|
||||
| ^^^^^^^^^^ expected an array with a fixed size of 3 elements, found one with 2 elements
|
||||
|
|
||||
= note: expected type `const_generic_lib::Struct<3usize>`
|
||||
found type `const_generic_lib::Struct<_: usize>`
|
||||
= note: expected type `[u8; 3]`
|
||||
found type `[u8; 2]`
|
||||
|
||||
error[E0308]: mismatched types
|
||||
--> $DIR/const-argument-cross-crate-mismatch.rs:8:39
|
||||
--> $DIR/const-argument-cross-crate-mismatch.rs:8:65
|
||||
|
|
||||
LL | let _: const_generic_lib::Alias = const_generic_lib::Struct([0u8, 1u8, 2u8]);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `2usize`, found `3usize`
|
||||
| ^^^^^^^^^^^^^^^ expected an array with a fixed size of 2 elements, found one with 3 elements
|
||||
|
|
||||
= note: expected type `const_generic_lib::Struct<2usize>`
|
||||
found type `const_generic_lib::Struct<_: usize>`
|
||||
= note: expected type `[u8; 2]`
|
||||
found type `[u8; 3]`
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue