Auto merge of #116376 - matthiaskrgr:rollup-b3d14gq, r=matthiaskrgr

Rollup of 5 pull requests

Successful merges:

 - #115863 (Add check_unused_messages in tidy)
 - #116210 (Ensure that `~const` trait bounds on associated functions are in const traits or impls)
 - #116358 (Rename both of the `Match` relations)
 - #116371 (Remove unused features from `rustc_llvm`.)
 - #116374 (Print normalized ty)

r? `@ghost`
`@rustbot` modify labels: rollup
This commit is contained in:
bors 2023-10-03 11:49:06 +00:00
commit e3c631b3de
20 changed files with 193 additions and 127 deletions

View File

@ -52,7 +52,8 @@ struct AstValidator<'a> {
/// Are we inside a trait impl? /// Are we inside a trait impl?
in_trait_impl: bool, in_trait_impl: bool,
in_const_trait_impl: bool, /// Are we inside a const trait defn or impl?
in_const_trait_or_impl: bool,
has_proc_macro_decls: bool, has_proc_macro_decls: bool,
@ -78,11 +79,19 @@ impl<'a> AstValidator<'a> {
f: impl FnOnce(&mut Self), f: impl FnOnce(&mut Self),
) { ) {
let old = mem::replace(&mut self.in_trait_impl, is_in); let old = mem::replace(&mut self.in_trait_impl, is_in);
let old_const = let old_const = mem::replace(
mem::replace(&mut self.in_const_trait_impl, matches!(constness, Some(Const::Yes(_)))); &mut self.in_const_trait_or_impl,
matches!(constness, Some(Const::Yes(_))),
);
f(self); f(self);
self.in_trait_impl = old; self.in_trait_impl = old;
self.in_const_trait_impl = old_const; self.in_const_trait_or_impl = old_const;
}
fn with_in_trait(&mut self, is_const: bool, f: impl FnOnce(&mut Self)) {
let old = mem::replace(&mut self.in_const_trait_or_impl, is_const);
f(self);
self.in_const_trait_or_impl = old;
} }
fn with_banned_impl_trait(&mut self, f: impl FnOnce(&mut Self)) { fn with_banned_impl_trait(&mut self, f: impl FnOnce(&mut Self)) {
@ -933,23 +942,26 @@ impl<'a> Visitor<'a> for AstValidator<'a> {
} }
} }
ItemKind::Trait(box Trait { is_auto, generics, bounds, items, .. }) => { ItemKind::Trait(box Trait { is_auto, generics, bounds, items, .. }) => {
if *is_auto == IsAuto::Yes { let is_const_trait = attr::contains_name(&item.attrs, sym::const_trait);
// Auto traits cannot have generics, super traits nor contain items. self.with_in_trait(is_const_trait, |this| {
self.deny_generic_params(generics, item.ident.span); if *is_auto == IsAuto::Yes {
self.deny_super_traits(bounds, item.ident.span); // Auto traits cannot have generics, super traits nor contain items.
self.deny_where_clause(&generics.where_clause, item.ident.span); this.deny_generic_params(generics, item.ident.span);
self.deny_items(items, item.ident.span); this.deny_super_traits(bounds, item.ident.span);
} this.deny_where_clause(&generics.where_clause, item.ident.span);
this.deny_items(items, item.ident.span);
}
// Equivalent of `visit::walk_item` for `ItemKind::Trait` that inserts a bound // Equivalent of `visit::walk_item` for `ItemKind::Trait` that inserts a bound
// context for the supertraits. // context for the supertraits.
self.visit_vis(&item.vis); this.visit_vis(&item.vis);
self.visit_ident(item.ident); this.visit_ident(item.ident);
self.visit_generics(generics); this.visit_generics(generics);
self.with_tilde_const_allowed(|this| { this.with_tilde_const_allowed(|this| {
walk_list!(this, visit_param_bound, bounds, BoundKind::SuperTraits) walk_list!(this, visit_param_bound, bounds, BoundKind::SuperTraits)
});
walk_list!(this, visit_assoc_item, items, AssocCtxt::Trait);
}); });
walk_list!(self, visit_assoc_item, items, AssocCtxt::Trait);
walk_list!(self, visit_attribute, &item.attrs); walk_list!(self, visit_attribute, &item.attrs);
return; // Avoid visiting again return; // Avoid visiting again
} }
@ -1278,7 +1290,7 @@ impl<'a> Visitor<'a> for AstValidator<'a> {
let tilde_const_allowed = let tilde_const_allowed =
matches!(fk.header(), Some(FnHeader { constness: ast::Const::Yes(_), .. })) matches!(fk.header(), Some(FnHeader { constness: ast::Const::Yes(_), .. }))
|| matches!(fk.ctxt(), Some(FnCtxt::Assoc(_))); || matches!(fk.ctxt(), Some(FnCtxt::Assoc(_)) if self.in_const_trait_or_impl);
let disallowed = (!tilde_const_allowed).then(|| DisallowTildeConstContext::Fn(fk)); let disallowed = (!tilde_const_allowed).then(|| DisallowTildeConstContext::Fn(fk));
@ -1363,7 +1375,7 @@ impl<'a> Visitor<'a> for AstValidator<'a> {
walk_list!(self, visit_ty, ty); walk_list!(self, visit_ty, ty);
} }
AssocItemKind::Fn(box Fn { sig, generics, body, .. }) AssocItemKind::Fn(box Fn { sig, generics, body, .. })
if self.in_const_trait_impl if self.in_const_trait_or_impl
|| ctxt == AssocCtxt::Trait || ctxt == AssocCtxt::Trait
|| matches!(sig.header.constness, Const::Yes(_)) => || matches!(sig.header.constness, Const::Yes(_)) =>
{ {
@ -1510,7 +1522,7 @@ pub fn check_crate(
features, features,
extern_mod: None, extern_mod: None,
in_trait_impl: false, in_trait_impl: false,
in_const_trait_impl: false, in_const_trait_or_impl: false,
has_proc_macro_decls: false, has_proc_macro_decls: false,
outer_impl_trait: None, outer_impl_trait: None,
disallow_tilde_const: None, disallow_tilde_const: None,

View File

@ -670,19 +670,24 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
trace!("eval_place_to_op: got {:?}", op); trace!("eval_place_to_op: got {:?}", op);
// Sanity-check the type we ended up with. // Sanity-check the type we ended up with.
debug_assert!( if cfg!(debug_assertions) {
mir_assign_valid_types( let normalized_place_ty = self.subst_from_current_frame_and_normalize_erasing_regions(
mir_place.ty(&self.frame().body.local_decls, *self.tcx).ty,
)?;
if !mir_assign_valid_types(
*self.tcx, *self.tcx,
self.param_env, self.param_env,
self.layout_of(self.subst_from_current_frame_and_normalize_erasing_regions( self.layout_of(normalized_place_ty)?,
mir_place.ty(&self.frame().body.local_decls, *self.tcx).ty
)?)?,
op.layout, op.layout,
), ) {
"eval_place of a MIR place with type {:?} produced an interpreter operand with type {}", span_bug!(
mir_place.ty(&self.frame().body.local_decls, *self.tcx).ty, self.cur_span(),
op.layout.ty, "eval_place of a MIR place with type {} produced an interpreter operand with type {}",
); normalized_place_ty,
op.layout.ty,
)
}
}
Ok(op) Ok(op)
} }

View File

@ -573,19 +573,24 @@ where
trace!("{:?}", self.dump_place(&place)); trace!("{:?}", self.dump_place(&place));
// Sanity-check the type we ended up with. // Sanity-check the type we ended up with.
debug_assert!( if cfg!(debug_assertions) {
mir_assign_valid_types( let normalized_place_ty = self.subst_from_current_frame_and_normalize_erasing_regions(
mir_place.ty(&self.frame().body.local_decls, *self.tcx).ty,
)?;
if !mir_assign_valid_types(
*self.tcx, *self.tcx,
self.param_env, self.param_env,
self.layout_of(self.subst_from_current_frame_and_normalize_erasing_regions( self.layout_of(normalized_place_ty)?,
mir_place.ty(&self.frame().body.local_decls, *self.tcx).ty
)?)?,
place.layout, place.layout,
), ) {
"eval_place of a MIR place with type {:?} produced an interpreter place with type {}", span_bug!(
mir_place.ty(&self.frame().body.local_decls, *self.tcx).ty, self.cur_span(),
place.layout.ty, "eval_place of a MIR place with type {} produced an interpreter place with type {}",
); normalized_place_ty,
place.layout.ty,
)
}
}
Ok(place) Ok(place)
} }

View File

@ -96,8 +96,6 @@ hir_analysis_enum_discriminant_overflowed = enum discriminant overflowed
.label = overflowed on value after {$discr} .label = overflowed on value after {$discr}
.note = explicitly set `{$item_name} = {$wrapped_discr}` if that is desired outcome .note = explicitly set `{$item_name} = {$wrapped_discr}` if that is desired outcome
hir_analysis_expected_used_symbol = expected `used`, `used(compiler)` or `used(linker)`
hir_analysis_field_already_declared = hir_analysis_field_already_declared =
field `{$field_name}` is already declared field `{$field_name}` is already declared
.label = field already declared .label = field already declared

View File

@ -66,7 +66,6 @@ infer_await_both_futures = consider `await`ing on both `Future`s
infer_await_future = consider `await`ing on the `Future` infer_await_future = consider `await`ing on the `Future`
infer_await_note = calling an async function returns a future infer_await_note = calling an async function returns a future
infer_borrowed_too_long = a value of type `{$ty}` is borrowed for too long
infer_but_calling_introduces = {$has_param_name -> infer_but_calling_introduces = {$has_param_name ->
[true] `{$param_name}` [true] `{$param_name}`
*[false] `fn` parameter *[false] `fn` parameter
@ -181,8 +180,6 @@ infer_more_targeted = {$has_param_name ->
} but calling `{$ident}` introduces an implicit `'static` lifetime requirement } but calling `{$ident}` introduces an implicit `'static` lifetime requirement
infer_msl_introduces_static = introduces a `'static` lifetime requirement infer_msl_introduces_static = introduces a `'static` lifetime requirement
infer_msl_trait_note = this has an implicit `'static` lifetime requirement
infer_msl_trait_sugg = consider relaxing the implicit `'static` requirement
infer_msl_unmet_req = because this has an unmet lifetime requirement infer_msl_unmet_req = because this has an unmet lifetime requirement
infer_need_type_info_in_generator = infer_need_type_info_in_generator =
type inside {$generator_kind -> type inside {$generator_kind ->
@ -233,7 +230,6 @@ infer_prlf_known_limitation = this is a known limitation that will be removed in
infer_prlf_must_outlive_with_sup = ...must outlive the lifetime `{$sup_symbol}` defined here infer_prlf_must_outlive_with_sup = ...must outlive the lifetime `{$sup_symbol}` defined here
infer_prlf_must_outlive_without_sup = ...must outlive the lifetime defined here infer_prlf_must_outlive_without_sup = ...must outlive the lifetime defined here
infer_reborrow = ...so that reference does not outlive borrowed content infer_reborrow = ...so that reference does not outlive borrowed content
infer_reborrow_upvar = ...so that closure can access `{$name}`
infer_ref_longer_than_data = in type `{$ty}`, reference has a longer lifetime than the data it references infer_ref_longer_than_data = in type `{$ty}`, reference has a longer lifetime than the data it references
infer_reference_outlives_referent = ...so that the reference type `{$name}` does not outlive the data it points at infer_reference_outlives_referent = ...so that the reference type `{$name}` does not outlive the data it points at

View File

@ -44,7 +44,7 @@ pub fn extract_verify_if_eq<'tcx>(
test_ty: Ty<'tcx>, test_ty: Ty<'tcx>,
) -> Option<ty::Region<'tcx>> { ) -> Option<ty::Region<'tcx>> {
assert!(!verify_if_eq_b.has_escaping_bound_vars()); assert!(!verify_if_eq_b.has_escaping_bound_vars());
let mut m = Match::new(tcx, param_env); let mut m = MatchAgainstHigherRankedOutlives::new(tcx, param_env);
let verify_if_eq = verify_if_eq_b.skip_binder(); let verify_if_eq = verify_if_eq_b.skip_binder();
m.relate(verify_if_eq.ty, test_ty).ok()?; m.relate(verify_if_eq.ty, test_ty).ok()?;
@ -87,24 +87,32 @@ pub(super) fn can_match_erased_ty<'tcx>(
// pointless micro-optimization // pointless micro-optimization
true true
} else { } else {
Match::new(tcx, param_env).relate(outlives_ty, erased_ty).is_ok() MatchAgainstHigherRankedOutlives::new(tcx, param_env).relate(outlives_ty, erased_ty).is_ok()
} }
} }
struct Match<'tcx> { struct MatchAgainstHigherRankedOutlives<'tcx> {
tcx: TyCtxt<'tcx>, tcx: TyCtxt<'tcx>,
param_env: ty::ParamEnv<'tcx>, param_env: ty::ParamEnv<'tcx>,
pattern_depth: ty::DebruijnIndex, pattern_depth: ty::DebruijnIndex,
map: FxHashMap<ty::BoundRegion, ty::Region<'tcx>>, map: FxHashMap<ty::BoundRegion, ty::Region<'tcx>>,
} }
impl<'tcx> Match<'tcx> { impl<'tcx> MatchAgainstHigherRankedOutlives<'tcx> {
fn new(tcx: TyCtxt<'tcx>, param_env: ty::ParamEnv<'tcx>) -> Match<'tcx> { fn new(
Match { tcx, param_env, pattern_depth: ty::INNERMOST, map: FxHashMap::default() } tcx: TyCtxt<'tcx>,
param_env: ty::ParamEnv<'tcx>,
) -> MatchAgainstHigherRankedOutlives<'tcx> {
MatchAgainstHigherRankedOutlives {
tcx,
param_env,
pattern_depth: ty::INNERMOST,
map: FxHashMap::default(),
}
} }
} }
impl<'tcx> Match<'tcx> { impl<'tcx> MatchAgainstHigherRankedOutlives<'tcx> {
/// Creates the "Error" variant that signals "no match". /// Creates the "Error" variant that signals "no match".
fn no_match<T>(&self) -> RelateResult<'tcx, T> { fn no_match<T>(&self) -> RelateResult<'tcx, T> {
Err(TypeError::Mismatch) Err(TypeError::Mismatch)
@ -134,7 +142,7 @@ impl<'tcx> Match<'tcx> {
} }
} }
impl<'tcx> TypeRelation<'tcx> for Match<'tcx> { impl<'tcx> TypeRelation<'tcx> for MatchAgainstHigherRankedOutlives<'tcx> {
fn tag(&self) -> &'static str { fn tag(&self) -> &'static str {
"Match" "Match"
} }

View File

@ -3,10 +3,6 @@ name = "rustc_llvm"
version = "0.0.0" version = "0.0.0"
edition = "2021" edition = "2021"
[features]
static-libstdcpp = []
emscripten = []
[dependencies] [dependencies]
libc = "0.2.73" libc = "0.2.73"

View File

@ -18,20 +18,20 @@ use crate::ty::{self, InferConst, Ty, TyCtxt};
/// Like subtyping, matching is really a binary relation, so the only /// Like subtyping, matching is really a binary relation, so the only
/// important thing about the result is Ok/Err. Also, matching never /// important thing about the result is Ok/Err. Also, matching never
/// affects any type variables or unification state. /// affects any type variables or unification state.
pub struct Match<'tcx> { pub struct MatchAgainstFreshVars<'tcx> {
tcx: TyCtxt<'tcx>, tcx: TyCtxt<'tcx>,
param_env: ty::ParamEnv<'tcx>, param_env: ty::ParamEnv<'tcx>,
} }
impl<'tcx> Match<'tcx> { impl<'tcx> MatchAgainstFreshVars<'tcx> {
pub fn new(tcx: TyCtxt<'tcx>, param_env: ty::ParamEnv<'tcx>) -> Match<'tcx> { pub fn new(tcx: TyCtxt<'tcx>, param_env: ty::ParamEnv<'tcx>) -> MatchAgainstFreshVars<'tcx> {
Match { tcx, param_env } MatchAgainstFreshVars { tcx, param_env }
} }
} }
impl<'tcx> TypeRelation<'tcx> for Match<'tcx> { impl<'tcx> TypeRelation<'tcx> for MatchAgainstFreshVars<'tcx> {
fn tag(&self) -> &'static str { fn tag(&self) -> &'static str {
"Match" "MatchAgainstFreshVars"
} }
fn tcx(&self) -> TyCtxt<'tcx> { fn tcx(&self) -> TyCtxt<'tcx> {
self.tcx self.tcx

View File

@ -7,8 +7,6 @@ monomorphize_couldnt_dump_mono_stats =
monomorphize_encountered_error_while_instantiating = monomorphize_encountered_error_while_instantiating =
the above error was encountered while instantiating `{$formatted_item}` the above error was encountered while instantiating `{$formatted_item}`
monomorphize_fatal_error = {$error_message}
monomorphize_large_assignments = monomorphize_large_assignments =
moving {$size} bytes moving {$size} bytes
.label = value moved from here .label = value moved from here

View File

@ -59,7 +59,6 @@ parse_bare_cr = {$double_quotes ->
parse_bare_cr_in_raw_string = bare CR not allowed in raw string parse_bare_cr_in_raw_string = bare CR not allowed in raw string
parse_binary_float_literal_not_supported = binary float literal is not supported
parse_bounds_not_allowed_on_trait_aliases = bounds are not allowed on trait aliases parse_bounds_not_allowed_on_trait_aliases = bounds are not allowed on trait aliases
parse_box_not_pat = expected pattern, found {$descr} parse_box_not_pat = expected pattern, found {$descr}
@ -284,7 +283,6 @@ parse_generics_in_path = unexpected generic arguments in path
parse_help_set_edition_cargo = set `edition = "{$edition}"` in `Cargo.toml` parse_help_set_edition_cargo = set `edition = "{$edition}"` in `Cargo.toml`
parse_help_set_edition_standalone = pass `--edition {$edition}` to `rustc` parse_help_set_edition_standalone = pass `--edition {$edition}` to `rustc`
parse_hexadecimal_float_literal_not_supported = hexadecimal float literal is not supported
parse_if_expression_missing_condition = missing condition for `if` expression parse_if_expression_missing_condition = missing condition for `if` expression
.condition_label = expected condition here .condition_label = expected condition here
.block_label = if this block is the condition of the `if` expression, then it must be followed by another block .block_label = if this block is the condition of the `if` expression, then it must be followed by another block
@ -356,8 +354,6 @@ parse_inner_doc_comment_not_permitted = expected outer doc comment
.label_does_not_annotate_this = the inner doc comment doesn't annotate this {$item} .label_does_not_annotate_this = the inner doc comment doesn't annotate this {$item}
.sugg_change_inner_to_outer = to annotate the {$item}, change the doc comment from inner to outer style .sugg_change_inner_to_outer = to annotate the {$item}, change the doc comment from inner to outer style
parse_int_literal_too_large = integer literal is too large
parse_invalid_block_macro_segment = cannot use a `block` macro fragment here parse_invalid_block_macro_segment = cannot use a `block` macro fragment here
.label = the `block` fragment is within this context .label = the `block` fragment is within this context
.suggestion = wrap this in another block .suggestion = wrap this in another block
@ -382,18 +378,8 @@ parse_invalid_dyn_keyword = invalid `dyn` keyword
.suggestion = remove this keyword .suggestion = remove this keyword
parse_invalid_expression_in_let_else = a `{$operator}` expression cannot be directly assigned in `let...else` parse_invalid_expression_in_let_else = a `{$operator}` expression cannot be directly assigned in `let...else`
parse_invalid_float_literal_suffix = invalid suffix `{$suffix}` for float literal
.label = invalid suffix `{$suffix}`
.help = valid suffixes are `f32` and `f64`
parse_invalid_float_literal_width = invalid width `{$width}` for float literal
.help = valid widths are 32 and 64
parse_invalid_identifier_with_leading_number = identifiers cannot start with a number parse_invalid_identifier_with_leading_number = identifiers cannot start with a number
parse_invalid_int_literal_width = invalid width `{$width}` for integer literal
.help = valid widths are 8, 16, 32, 64 and 128
parse_invalid_interpolated_expression = invalid interpolated expression parse_invalid_interpolated_expression = invalid interpolated expression
parse_invalid_literal_suffix = suffixes on {$kind} literals are invalid parse_invalid_literal_suffix = suffixes on {$kind} literals are invalid
@ -412,14 +398,6 @@ parse_invalid_logical_operator = `{$incorrect}` is not a logical operator
parse_invalid_meta_item = expected unsuffixed literal or identifier, found `{$token}` parse_invalid_meta_item = expected unsuffixed literal or identifier, found `{$token}`
parse_invalid_num_literal_base_prefix = invalid base prefix for number literal
.note = base prefixes (`0xff`, `0b1010`, `0o755`) are lowercase
.suggestion = try making the prefix lowercase
parse_invalid_num_literal_suffix = invalid suffix `{$suffix}` for number literal
.label = invalid suffix `{$suffix}`
.help = the suffix must be one of the numeric types (`u32`, `isize`, `f32`, etc.)
parse_invalid_unicode_escape = invalid unicode character escape parse_invalid_unicode_escape = invalid unicode character escape
.label = invalid escape .label = invalid escape
.help = unicode escape must {$surrogate -> .help = unicode escape must {$surrogate ->
@ -603,13 +581,6 @@ parse_no_brace_unicode_escape = incorrect unicode escape sequence
parse_no_digits_literal = no valid digits found for number parse_no_digits_literal = no valid digits found for number
parse_non_item_in_item_list = non-item in item list
.suggestion_use_const_not_let = consider using `const` instead of `let` for associated const
.label_list_start = item list starts here
.label_non_item = non-item starts here
.label_list_end = item list ends here
.suggestion_remove_semicolon = consider removing this semicolon
parse_non_string_abi_literal = non-string ABI literal parse_non_string_abi_literal = non-string ABI literal
.suggestion = specify the ABI with a string literal .suggestion = specify the ABI with a string literal
@ -626,7 +597,6 @@ parse_note_mut_pattern_usage = `mut` may be followed by `variable` and `variable
parse_note_pattern_alternatives_use_single_vert = alternatives in or-patterns are separated with `|`, not `||` parse_note_pattern_alternatives_use_single_vert = alternatives in or-patterns are separated with `|`, not `||`
parse_octal_float_literal_not_supported = octal float literal is not supported
parse_or_pattern_not_allowed_in_fn_parameters = top-level or-patterns are not allowed in function parameters parse_or_pattern_not_allowed_in_fn_parameters = top-level or-patterns are not allowed in function parameters
parse_or_pattern_not_allowed_in_let_binding = top-level or-patterns are not allowed in `let` bindings parse_or_pattern_not_allowed_in_let_binding = top-level or-patterns are not allowed in `let` bindings
parse_out_of_range_hex_escape = out of range hex escape parse_out_of_range_hex_escape = out of range hex escape

View File

@ -15,8 +15,6 @@ query_system_cycle_stack_single = ...which immediately requires {$stack_bottom}
query_system_cycle_usage = cycle used when {$usage} query_system_cycle_usage = cycle used when {$usage}
query_system_cycle_which_requires = ...which requires {$desc}...
query_system_increment_compilation = internal compiler error: encountered incremental compilation error with {$dep_node} query_system_increment_compilation = internal compiler error: encountered incremental compilation error with {$dep_node}
.help = This is a known issue with the compiler. Run {$run_cmd} to allow your project to compile .help = This is a known issue with the compiler. Run {$run_cmd} to allow your project to compile

View File

@ -130,9 +130,6 @@ resolve_generic_params_from_outer_item_ty_param = type parameter from outer item
resolve_glob_import_doesnt_reexport = resolve_glob_import_doesnt_reexport =
glob import doesn't reexport anything because no candidate is public enough glob import doesn't reexport anything because no candidate is public enough
resolve_help_try_using_local_generic_param =
try using a local generic parameter instead
resolve_ident_bound_more_than_once_in_parameter_list = resolve_ident_bound_more_than_once_in_parameter_list =
identifier `{$identifier}` is bound more than once in this parameter list identifier `{$identifier}` is bound more than once in this parameter list
.label = used as parameter more than once .label = used as parameter more than once
@ -249,9 +246,6 @@ resolve_self_in_generic_param_default =
generic parameters cannot use `Self` in their defaults generic parameters cannot use `Self` in their defaults
.label = `Self` in generic parameter default .label = `Self` in generic parameter default
resolve_self_type_implicitly_declared_by_impl =
`Self` type implicitly declared here, by this `impl`
resolve_tool_module_imported = resolve_tool_module_imported =
cannot use a tool module through an import cannot use a tool module through an import
.note = the tool module imported here .note = the tool module imported here
@ -267,12 +261,6 @@ resolve_trait_impl_mismatch =
.label = does not match trait .label = does not match trait
.label_trait_item = item in trait .label_trait_item = item in trait
resolve_try_adding_local_generic_param_on_method =
try adding a local generic parameter in this method instead
resolve_try_using_local_generic_parameter =
try using a local generic parameter instead
resolve_try_using_similarly_named_label = resolve_try_using_similarly_named_label =
try using similarly named label try using similarly named label

View File

@ -25,8 +25,6 @@ session_feature_diagnostic_for_issue =
session_feature_diagnostic_help = session_feature_diagnostic_help =
add `#![feature({$feature})]` to the crate attributes to enable add `#![feature({$feature})]` to the crate attributes to enable
session_feature_gate_error = {$explain}
session_file_is_not_writeable = output file {$file} is not writeable -- check its permissions session_file_is_not_writeable = output file {$file} is not writeable -- check its permissions
session_file_write_fail = failed to write `{$path}` due to error `{$err}` session_file_write_fail = failed to write `{$path}` due to error `{$err}`

View File

@ -39,6 +39,7 @@ use rustc_middle::dep_graph::dep_kinds;
use rustc_middle::dep_graph::DepNodeIndex; use rustc_middle::dep_graph::DepNodeIndex;
use rustc_middle::mir::interpret::ErrorHandled; use rustc_middle::mir::interpret::ErrorHandled;
use rustc_middle::traits::DefiningAnchor; use rustc_middle::traits::DefiningAnchor;
use rustc_middle::ty::_match::MatchAgainstFreshVars;
use rustc_middle::ty::abstract_const::NotConstEvaluatable; use rustc_middle::ty::abstract_const::NotConstEvaluatable;
use rustc_middle::ty::fold::BottomUpFolder; use rustc_middle::ty::fold::BottomUpFolder;
use rustc_middle::ty::relate::TypeRelation; use rustc_middle::ty::relate::TypeRelation;
@ -2642,7 +2643,7 @@ impl<'tcx> SelectionContext<'_, 'tcx> {
current: ty::PolyTraitPredicate<'tcx>, current: ty::PolyTraitPredicate<'tcx>,
param_env: ty::ParamEnv<'tcx>, param_env: ty::ParamEnv<'tcx>,
) -> bool { ) -> bool {
let mut matcher = ty::_match::Match::new(self.tcx(), param_env); let mut matcher = MatchAgainstFreshVars::new(self.tcx(), param_env);
matcher.relate(previous, current).is_ok() matcher.relate(previous, current).is_ok()
} }

View File

@ -0,0 +1,28 @@
#![feature(const_trait_impl, effects)]
#[const_trait]
trait MyTrait {
fn do_something(&self);
}
trait OtherTrait {
fn do_something_else() where Self: ~const MyTrait;
//~^ ERROR `~const` is not allowed here
}
struct MyStruct<T>(T);
impl const MyTrait for u32 {
fn do_something(&self) {}
}
impl<T> MyStruct<T> {
pub fn foo(&self) where T: ~const MyTrait {
//~^ ERROR `~const` is not allowed here
self.0.do_something();
}
}
fn main() {
MyStruct(0u32).foo();
}

View File

@ -0,0 +1,26 @@
error: `~const` is not allowed here
--> $DIR/const-bound-on-not-const-associated-fn.rs:9:40
|
LL | fn do_something_else() where Self: ~const MyTrait;
| ^^^^^^^^^^^^^^
|
note: this function is not `const`, so it cannot have `~const` trait bounds
--> $DIR/const-bound-on-not-const-associated-fn.rs:9:8
|
LL | fn do_something_else() where Self: ~const MyTrait;
| ^^^^^^^^^^^^^^^^^
error: `~const` is not allowed here
--> $DIR/const-bound-on-not-const-associated-fn.rs:20:32
|
LL | pub fn foo(&self) where T: ~const MyTrait {
| ^^^^^^^^^^^^^^
|
note: this function is not `const`, so it cannot have `~const` trait bounds
--> $DIR/const-bound-on-not-const-associated-fn.rs:20:12
|
LL | pub fn foo(&self) where T: ~const MyTrait {
| ^^^
error: aborting due to 2 previous errors

View File

@ -7,7 +7,8 @@ struct Foo<const N: usize>;
impl<const N: usize> Foo<N> { impl<const N: usize> Foo<N> {
fn add<A: ~const Add42>(self) -> Foo<{ A::add(N) }> { fn add<A: ~const Add42>(self) -> Foo<{ A::add(N) }> {
//~^ ERROR mismatched types //~^ ERROR `~const` is not allowed here
//~| ERROR mismatched types
Foo Foo
} }
} }
@ -30,7 +31,7 @@ fn bar<A: ~const Add42, const N: usize>(_: Foo<N>) -> Foo<{ A::add(N) }> {
} }
fn main() { fn main() {
let foo = Foo::<0>; let foo = Foo::<0>;
let foo = bar::<(), _>(foo); let foo = bar::<(), _>(foo);
let _foo = bar::<(), _>(foo); let _foo = bar::<(), _>(foo);
} }

View File

@ -1,17 +1,29 @@
error: `~const` is not allowed here error: `~const` is not allowed here
--> $DIR/tilde-const-and-const-params.rs:26:11 --> $DIR/tilde-const-and-const-params.rs:9:15
|
LL | fn add<A: ~const Add42>(self) -> Foo<{ A::add(N) }> {
| ^^^^^^^^^^^^
|
note: this function is not `const`, so it cannot have `~const` trait bounds
--> $DIR/tilde-const-and-const-params.rs:9:8
|
LL | fn add<A: ~const Add42>(self) -> Foo<{ A::add(N) }> {
| ^^^
error: `~const` is not allowed here
--> $DIR/tilde-const-and-const-params.rs:27:11
| |
LL | fn bar<A: ~const Add42, const N: usize>(_: Foo<N>) -> Foo<{ A::add(N) }> { LL | fn bar<A: ~const Add42, const N: usize>(_: Foo<N>) -> Foo<{ A::add(N) }> {
| ^^^^^^^^^^^^ | ^^^^^^^^^^^^
| |
note: this function is not `const`, so it cannot have `~const` trait bounds note: this function is not `const`, so it cannot have `~const` trait bounds
--> $DIR/tilde-const-and-const-params.rs:26:4 --> $DIR/tilde-const-and-const-params.rs:27:4
| |
LL | fn bar<A: ~const Add42, const N: usize>(_: Foo<N>) -> Foo<{ A::add(N) }> { LL | fn bar<A: ~const Add42, const N: usize>(_: Foo<N>) -> Foo<{ A::add(N) }> {
| ^^^ | ^^^
error[E0308]: mismatched types error[E0308]: mismatched types
--> $DIR/tilde-const-and-const-params.rs:26:61 --> $DIR/tilde-const-and-const-params.rs:27:61
| |
LL | fn bar<A: ~const Add42, const N: usize>(_: Foo<N>) -> Foo<{ A::add(N) }> { LL | fn bar<A: ~const Add42, const N: usize>(_: Foo<N>) -> Foo<{ A::add(N) }> {
| ^^^^^^^^^ expected `false`, found `true` | ^^^^^^^^^ expected `false`, found `true`
@ -28,6 +40,6 @@ LL | fn add<A: ~const Add42>(self) -> Foo<{ A::add(N) }> {
= note: expected constant `false` = note: expected constant `false`
found constant `true` found constant `true`
error: aborting due to 3 previous errors error: aborting due to 4 previous errors
For more information about this error, try `rustc --explain E0308`. For more information about this error, try `rustc --explain E0308`.

View File

@ -6,7 +6,9 @@ trait Bar {}
trait Foo { trait Foo {
fn a(); fn a();
fn b() where Self: ~const Bar; fn b() where Self: ~const Bar;
//~^ ERROR `~const` is not allowed here
fn c<T: ~const Bar>(); fn c<T: ~const Bar>();
//~^ ERROR `~const` is not allowed here
} }
fn test1<T: Foo>() { fn test1<T: Foo>() {

View File

@ -1,5 +1,29 @@
error: `~const` is not allowed here
--> $DIR/trait-where-clause.rs:8:24
|
LL | fn b() where Self: ~const Bar;
| ^^^^^^^^^^
|
note: this function is not `const`, so it cannot have `~const` trait bounds
--> $DIR/trait-where-clause.rs:8:8
|
LL | fn b() where Self: ~const Bar;
| ^
error: `~const` is not allowed here
--> $DIR/trait-where-clause.rs:10:13
|
LL | fn c<T: ~const Bar>();
| ^^^^^^^^^^
|
note: this function is not `const`, so it cannot have `~const` trait bounds
--> $DIR/trait-where-clause.rs:10:8
|
LL | fn c<T: ~const Bar>();
| ^
error[E0277]: the trait bound `T: Bar` is not satisfied error[E0277]: the trait bound `T: Bar` is not satisfied
--> $DIR/trait-where-clause.rs:14:5 --> $DIR/trait-where-clause.rs:16:5
| |
LL | T::b(); LL | T::b();
| ^ the trait `Bar` is not implemented for `T` | ^ the trait `Bar` is not implemented for `T`
@ -15,13 +39,13 @@ LL | fn test1<T: Foo + Bar>() {
| +++++ | +++++
error[E0277]: the trait bound `T: Bar` is not satisfied error[E0277]: the trait bound `T: Bar` is not satisfied
--> $DIR/trait-where-clause.rs:16:12 --> $DIR/trait-where-clause.rs:18:12
| |
LL | T::c::<T>(); LL | T::c::<T>();
| ^ the trait `Bar` is not implemented for `T` | ^ the trait `Bar` is not implemented for `T`
| |
note: required by a bound in `Foo::c` note: required by a bound in `Foo::c`
--> $DIR/trait-where-clause.rs:9:13 --> $DIR/trait-where-clause.rs:10:13
| |
LL | fn c<T: ~const Bar>(); LL | fn c<T: ~const Bar>();
| ^^^^^^^^^^ required by this bound in `Foo::c` | ^^^^^^^^^^ required by this bound in `Foo::c`
@ -30,6 +54,6 @@ help: consider further restricting this bound
LL | fn test1<T: Foo + Bar>() { LL | fn test1<T: Foo + Bar>() {
| +++++ | +++++
error: aborting due to 2 previous errors error: aborting due to 4 previous errors
For more information about this error, try `rustc --explain E0277`. For more information about this error, try `rustc --explain E0277`.