rust/tests/ui/const-generics
bors af06dce64b Auto merge of #106281 - JulianKnodt:transmute_const_generics, r=b-naber
Add ability to transmute (somewhat) with generic consts in arrays

Previously if the expression contained generic consts and did not have a directly equivalent type, transmuting the type in this way was forbidden, despite the two sizes being identical. Instead, we should be able to lazily tell if the two consts are identical, and if so allow them to be transmuted.

This is done by normalizing the forms of expressions into sorted order of multiplied terms, which is not generic over all expressions, but should handle most cases.

This allows for some _basic_ transmutations between types that are equivalent in size without requiring additional stack space at runtime.

I only see one other location at which `SizeSkeleton` is being used, and it checks for equality so this shouldn't affect anywhere else that I can tell.

See [this Stackoverflow post](https://stackoverflow.com/questions/73085012/transmute-nested-const-generic-array-rust) for what was previously necessary to convert between types. This PR makes converting nested `T -> [T; 1]` transmutes possible, and `[uB*2; N] -> [uB; N * 2]` possible as well.

I'm not sure whether this is something that would be wanted, and if it is it definitely should not be insta-stable, so I'd add a feature gate.
2023-04-08 19:47:22 +00:00
..
array-impls
auxiliary
backcompat
defaults update tests/ui 2023-04-07 18:07:11 +10:00
early
generic_arg_infer
generic_const_exprs Bless tidy 2023-03-27 18:58:07 +00:00
infer
issues
late-bound-vars
min_const_generics
occurs-check
parser-error-recovery
std
type-dependent
apit-with-const-param.rs
arg-in-pat-1.rs
arg-in-pat-2.rs
arg-in-pat-3.rs
argument_order.rs
argument_order.stderr
array-wrapper-struct-ctor.rs
assoc_const_eq_diagnostic.rs
assoc_const_eq_diagnostic.stderr
associated-type-bound-fail.rs
associated-type-bound-fail.stderr
associated-type-bound.rs
bad-const-generic-exprs.rs
bad-const-generic-exprs.stderr
bad-generic-in-copy-impl.rs Suppress copy impl error when post-normalized type references errors 2023-03-08 00:12:33 +00:00
bad-generic-in-copy-impl.stderr Suppress copy impl error when post-normalized type references errors 2023-03-08 00:12:33 +00:00
bad-subst-const-kind.rs Constrain const vars to error if const types are mismatched 2023-03-19 03:45:47 +00:00
bad-subst-const-kind.stderr Constrain const vars to error if const types are mismatched 2023-03-19 03:45:47 +00:00
broken-mir-1.rs
broken-mir-2.rs
cannot-infer-type-for-const-param.rs
coerce_unsized_array.rs
concrete-const-as-fn-arg.rs
concrete-const-impl-method.rs
condition-in-trait-const-arg.rs
const_trait_fn-issue-88433.rs
const-arg-in-const-arg.full.stderr
const-arg-in-const-arg.min.stderr
const-arg-in-const-arg.rs
const-arg-in-fn.rs
const-arg-type-arg-misordered.rs
const-arg-type-arg-misordered.stderr
const-argument-cross-crate-mismatch.rs
const-argument-cross-crate-mismatch.stderr
const-argument-cross-crate.rs
const-argument-if-length.full.stderr
const-argument-if-length.min.stderr
const-argument-if-length.rs
const-argument-non-static-lifetime.min.stderr
const-argument-non-static-lifetime.rs
const-fn-with-const-param.rs
const-generic-default-wont-borrowck.rs
const-generic-default-wont-borrowck.stderr
const-generic-function.rs
const-generic-function.stderr
const-generic-type_name.rs
const-param-after-const-literal-arg.rs
const-param-before-other-params.rs
const-param-before-other-params.stderr
const-param-elided-lifetime.full.stderr
const-param-elided-lifetime.min.stderr
const-param-elided-lifetime.rs
const-param-in-async.rs
const-param-type-depends-on-const-param.full.stderr
const-param-type-depends-on-const-param.min.stderr
const-param-type-depends-on-const-param.rs
const-param-type-depends-on-type-param-ungated.rs
const-param-type-depends-on-type-param-ungated.stderr
const-param-type-depends-on-type-param.full.stderr
const-param-type-depends-on-type-param.min.stderr
const-param-type-depends-on-type-param.rs
const-parameter-uppercase-lint.rs
const-parameter-uppercase-lint.stderr
core-types.rs
cross_crate_complex.rs
deref-into-array-generic.rs
different_generic_args_array.rs
different_generic_args_array.stderr
different_generic_args.full.stderr
different_generic_args.min.stderr
different_generic_args.rs
dont-evaluate-array-len-on-err-1.rs
dont-evaluate-array-len-on-err-1.stderr
dyn-supertraits.rs
ensure_is_evaluatable.rs
ensure_is_evaluatable.stderr
enum-variants.rs
exhaustive-value.rs
exhaustive-value.stderr
expose-default-substs-param-env.rs
float-generic.adt_const_params.stderr
float-generic.rs
float-generic.simple.stderr
fn_with_two_const_inputs.rs
fn_with_two_const_inputs.stderr
fn_with_two_same_const_inputs.rs
fn-const-param-call.full.stderr
fn-const-param-call.min.stderr
fn-const-param-call.rs
fn-const-param-infer.full.stderr
fn-const-param-infer.min.stderr
fn-const-param-infer.rs
forbid-non-structural_match-types.rs
forbid-non-structural_match-types.stderr
foreign-item-const-parameter.rs
foreign-item-const-parameter.stderr
generic-param-mismatch.rs
generic-param-mismatch.stderr
ice-68875.rs
ice-68875.stderr
ice-const-generic-function-return-ty.rs
ice-const-generic-function-return-ty.stderr
impl-const-generic-struct.rs
incorrect-number-of-const-args.rs
incorrect-number-of-const-args.stderr
infer_arg_from_pat.rs
infer_arr_len_from_pat.rs
inhabited-assoc-ty-ice-1.rs
inhabited-assoc-ty-ice-2.rs
integer-literal-generic-arg-in-where-clause.rs
intrinsics-type_name-as-const-argument.min.stderr
intrinsics-type_name-as-const-argument.rs
invalid-const-arg-for-type-param.rs
invalid-const-arg-for-type-param.stderr
invalid-constant-in-args.rs
invalid-constant-in-args.stderr
invalid-enum.rs
invalid-enum.stderr
invariant.rs
invariant.stderr
issue-46511.rs
issue-46511.stderr
issue-66451.rs
issue-66451.stderr
issue-70408.rs
issue-80471.rs
issue-80471.stderr
issue-93647.rs Move const trait bounds checks to MIR constck 2023-03-28 08:39:55 +00:00
issue-93647.stderr Move const trait bounds checks to MIR constck 2023-03-28 08:39:55 +00:00
issue-97007.rs
issue-102124.rs
issue-105689.rs
issue-106419-struct-with-multiple-const-params.rs
legacy-const-generics-bad.rs
legacy-const-generics-bad.stderr
legacy-const-generics.rs
nested-type.full.stderr
nested-type.min.stderr
nested-type.rs
outer-lifetime-in-const-generic-default.rs
outer-lifetime-in-const-generic-default.stderr
overlapping_impls.rs
params-in-ct-in-ty-param-lazy-norm.full.stderr
params-in-ct-in-ty-param-lazy-norm.min.stderr
params-in-ct-in-ty-param-lazy-norm.rs
parent_generics_of_encoding_impl_trait.rs
parent_generics_of_encoding_impl_trait.stderr
parent_generics_of_encoding.rs
projection-as-arg-const.rs
projection-as-arg-const.stderr
promotion.rs
raw-ptr-const-param-deref.full.stderr
raw-ptr-const-param-deref.min.stderr
raw-ptr-const-param-deref.rs
raw-ptr-const-param.full.stderr
raw-ptr-const-param.min.stderr
raw-ptr-const-param.rs
slice-const-param-mismatch.full.stderr
slice-const-param-mismatch.min.stderr
slice-const-param-mismatch.rs
slice-const-param.rs
sneaky-array-repeat-expr.rs
sneaky-array-repeat-expr.stderr
struct-with-invalid-const-param.rs
struct-with-invalid-const-param.stderr
suggest_const_for_array.rs
suggest_const_for_array.stderr
trait-const-args.rs
transmute_no_gate.rs Add feature gate 2023-04-07 11:18:07 -07:00
transmute_no_gate.stderr Add feature gate 2023-04-07 11:18:07 -07:00
transmute-const-param-static-reference.min.stderr
transmute-const-param-static-reference.rs
transmute-fail.rs Add feature gate 2023-04-07 11:18:07 -07:00
transmute-fail.stderr Add feature gate 2023-04-07 11:18:07 -07:00
transmute.rs Add feature gate 2023-04-07 11:18:07 -07:00
transparent-maybeunit-array-wrapper.rs
try_unify_ignore_lifetimes.rs
two_matching_preds.rs
type_mismatch.rs Use param's real type in try_eval_lit_or_param 2023-03-09 20:49:11 +00:00
type_mismatch.stderr Note type mismatch on ConstArgHasType 2023-03-23 19:09:34 +00:00
type_not_in_scope.rs Use param's real type in try_eval_lit_or_param 2023-03-09 20:49:11 +00:00
type_not_in_scope.stderr Use param's real type in try_eval_lit_or_param 2023-03-09 20:49:11 +00:00
type_of_anon_const.rs
type-after-const-ok.rs
types-mismatch-const-args.full.stderr
types-mismatch-const-args.min.stderr
types-mismatch-const-args.rs
unify_with_nested_expr.rs
unify_with_nested_expr.stderr
uninferred-consts-during-codegen-1.rs
uninferred-consts-during-codegen-2.rs
unknown_adt.rs
unknown_adt.stderr
unused_braces.fixed
unused_braces.full.fixed
unused_braces.min.fixed
unused_braces.rs
unused_braces.stderr
unused-const-param.rs
unused-type-param-suggestion.rs
unused-type-param-suggestion.stderr
where-clauses.rs
wrong-normalization.rs
wrong-normalization.stderr