Rollup merge of #120476 - compiler-errors:lang-items-yeet, r=Nilstrieb
Remove some unnecessary check logic for lang items in HIR typeck Obvious bugs with `#[no_core]` do not deserve customized recovery logic, since they are bugs we do not expect users to ever encounter, and if users are experimenting with `#[no_core]`, they should really be familiar with the compiler implementation. These error recoveries are implemented now only where issues have been reported in the past, rather than systematically validating lang items. See https://github.com/rust-lang/compiler-team/issues/620 > In particular, one-off fixes for particular assumptions about lang items or intrinsics that introduce additional complexity into the compiler are not accepted. r? Nilstrieb
This commit is contained in:
commit
f3f1472678
@ -96,9 +96,6 @@ hir_typeck_lossy_provenance_ptr2int =
|
|||||||
hir_typeck_method_call_on_unknown_raw_pointee =
|
hir_typeck_method_call_on_unknown_raw_pointee =
|
||||||
cannot call a method on a raw pointer with an unknown pointee type
|
cannot call a method on a raw pointer with an unknown pointee type
|
||||||
|
|
||||||
hir_typeck_missing_fn_lang_items = failed to find an overloaded call trait for closure call
|
|
||||||
.help = make sure the `fn`/`fn_mut`/`fn_once` lang items are defined and have correctly defined `call`/`call_mut`/`call_once` methods
|
|
||||||
|
|
||||||
hir_typeck_missing_parentheses_in_range = can't call method `{$method_name}` on type `{$ty_str}`
|
hir_typeck_missing_parentheses_in_range = can't call method `{$method_name}` on type `{$ty_str}`
|
||||||
|
|
||||||
hir_typeck_no_associated_item = no {$item_kind} named `{$item_name}` found for {$ty_prefix} `{$ty_str}`{$trait_missing_method ->
|
hir_typeck_no_associated_item = no {$item_kind} named `{$item_name}` found for {$ty_prefix} `{$ty_str}`{$trait_missing_method ->
|
||||||
@ -108,8 +105,6 @@ hir_typeck_no_associated_item = no {$item_kind} named `{$item_name}` found for {
|
|||||||
|
|
||||||
hir_typeck_note_edition_guide = for more on editions, read https://doc.rust-lang.org/edition-guide
|
hir_typeck_note_edition_guide = for more on editions, read https://doc.rust-lang.org/edition-guide
|
||||||
|
|
||||||
hir_typeck_op_trait_generic_params = `{$method_name}` must not have any generic parameters
|
|
||||||
|
|
||||||
hir_typeck_option_result_asref = use `{$def_path}::as_ref` to convert `{$expected_ty}` to `{$expr_ty}`
|
hir_typeck_option_result_asref = use `{$def_path}::as_ref` to convert `{$expected_ty}` to `{$expr_ty}`
|
||||||
hir_typeck_option_result_cloned = use `{$def_path}::cloned` to clone the value inside the `{$def_path}`
|
hir_typeck_option_result_cloned = use `{$def_path}::cloned` to clone the value inside the `{$def_path}`
|
||||||
hir_typeck_option_result_copied = use `{$def_path}::copied` to copy the value inside the `{$def_path}`
|
hir_typeck_option_result_copied = use `{$def_path}::copied` to copy the value inside the `{$def_path}`
|
||||||
|
@ -254,28 +254,13 @@ fn try_overloaded_call_traits(
|
|||||||
adjusted_ty,
|
adjusted_ty,
|
||||||
opt_input_type.as_ref().map(slice::from_ref),
|
opt_input_type.as_ref().map(slice::from_ref),
|
||||||
) {
|
) {
|
||||||
// Check for `self` receiver on the method, otherwise we can't use this as a `Fn*` trait.
|
|
||||||
if !self.tcx.associated_item(ok.value.def_id).fn_has_self_parameter {
|
|
||||||
self.dcx().span_delayed_bug(
|
|
||||||
call_expr.span,
|
|
||||||
"input to overloaded call fn is not a self receiver",
|
|
||||||
);
|
|
||||||
return None;
|
|
||||||
}
|
|
||||||
|
|
||||||
let method = self.register_infer_ok_obligations(ok);
|
let method = self.register_infer_ok_obligations(ok);
|
||||||
let mut autoref = None;
|
let mut autoref = None;
|
||||||
if borrow {
|
if borrow {
|
||||||
// Check for &self vs &mut self in the method signature. Since this is either
|
// Check for &self vs &mut self in the method signature. Since this is either
|
||||||
// the Fn or FnMut trait, it should be one of those.
|
// the Fn or FnMut trait, it should be one of those.
|
||||||
let ty::Ref(region, _, mutbl) = method.sig.inputs()[0].kind() else {
|
let ty::Ref(region, _, mutbl) = method.sig.inputs()[0].kind() else {
|
||||||
// The `fn`/`fn_mut` lang item is ill-formed, which should have
|
bug!("Expected `FnMut`/`Fn` to take receiver by-ref/by-mut")
|
||||||
// caused an error elsewhere.
|
|
||||||
self.dcx().span_delayed_bug(
|
|
||||||
call_expr.span,
|
|
||||||
"input to call/call_mut is not a ref",
|
|
||||||
);
|
|
||||||
return None;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// For initial two-phase borrow
|
// For initial two-phase borrow
|
||||||
@ -949,9 +934,11 @@ pub fn resolve(self, fcx: &FnCtxt<'a, 'tcx>) {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
None => {
|
None => {
|
||||||
// This can happen if `#![no_core]` is used and the `fn/fn_mut/fn_once`
|
span_bug!(
|
||||||
// lang items are not defined (issue #86238).
|
self.call_expr.span,
|
||||||
fcx.dcx().emit_err(errors::MissingFnLangItems { span: self.call_expr.span });
|
"Expected to find a suitable `Fn`/`FnMut`/`FnOnce` implementation for `{}`",
|
||||||
|
self.adjusted_ty
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -152,26 +152,22 @@ pub(super) fn check_fn<'a, 'tcx>(
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn check_panic_info_fn(tcx: TyCtxt<'_>, fn_id: LocalDefId, fn_sig: ty::FnSig<'_>) {
|
fn check_panic_info_fn(tcx: TyCtxt<'_>, fn_id: LocalDefId, fn_sig: ty::FnSig<'_>) {
|
||||||
|
let span = tcx.def_span(fn_id);
|
||||||
|
|
||||||
let DefKind::Fn = tcx.def_kind(fn_id) else {
|
let DefKind::Fn = tcx.def_kind(fn_id) else {
|
||||||
let span = tcx.def_span(fn_id);
|
|
||||||
tcx.dcx().span_err(span, "should be a function");
|
tcx.dcx().span_err(span, "should be a function");
|
||||||
return;
|
return;
|
||||||
};
|
};
|
||||||
|
|
||||||
let generic_counts = tcx.generics_of(fn_id).own_counts();
|
let generic_counts = tcx.generics_of(fn_id).own_counts();
|
||||||
if generic_counts.types != 0 {
|
if generic_counts.types != 0 {
|
||||||
let span = tcx.def_span(fn_id);
|
|
||||||
tcx.dcx().span_err(span, "should have no type parameters");
|
tcx.dcx().span_err(span, "should have no type parameters");
|
||||||
}
|
}
|
||||||
if generic_counts.consts != 0 {
|
if generic_counts.consts != 0 {
|
||||||
let span = tcx.def_span(fn_id);
|
|
||||||
tcx.dcx().span_err(span, "should have no const parameters");
|
tcx.dcx().span_err(span, "should have no const parameters");
|
||||||
}
|
}
|
||||||
|
|
||||||
let Some(panic_info_did) = tcx.lang_items().panic_info() else {
|
let panic_info_did = tcx.require_lang_item(hir::LangItem::PanicInfo, Some(span));
|
||||||
tcx.dcx().err("language item required, but not found: `panic_info`");
|
|
||||||
return;
|
|
||||||
};
|
|
||||||
|
|
||||||
// build type `for<'a, 'b> fn(&'a PanicInfo<'b>) -> !`
|
// build type `for<'a, 'b> fn(&'a PanicInfo<'b>) -> !`
|
||||||
let panic_info_ty = tcx.type_of(panic_info_did).instantiate(
|
let panic_info_ty = tcx.type_of(panic_info_did).instantiate(
|
||||||
@ -203,11 +199,7 @@ fn check_panic_info_fn(tcx: TyCtxt<'_>, fn_id: LocalDefId, fn_sig: ty::FnSig<'_>
|
|||||||
|
|
||||||
let _ = check_function_signature(
|
let _ = check_function_signature(
|
||||||
tcx,
|
tcx,
|
||||||
ObligationCause::new(
|
ObligationCause::new(span, fn_id, ObligationCauseCode::LangFunctionType(sym::panic_impl)),
|
||||||
tcx.def_span(fn_id),
|
|
||||||
fn_id,
|
|
||||||
ObligationCauseCode::LangFunctionType(sym::panic_impl),
|
|
||||||
),
|
|
||||||
fn_id.into(),
|
fn_id.into(),
|
||||||
expected_sig,
|
expected_sig,
|
||||||
);
|
);
|
||||||
|
@ -83,14 +83,6 @@ pub struct MethodCallOnUnknownRawPointee {
|
|||||||
pub span: Span,
|
pub span: Span,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Diagnostic)]
|
|
||||||
#[diag(hir_typeck_missing_fn_lang_items)]
|
|
||||||
#[help]
|
|
||||||
pub struct MissingFnLangItems {
|
|
||||||
#[primary_span]
|
|
||||||
pub span: Span,
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Diagnostic)]
|
#[derive(Diagnostic)]
|
||||||
#[diag(hir_typeck_functional_record_update_on_non_struct, code = E0436)]
|
#[diag(hir_typeck_functional_record_update_on_non_struct, code = E0436)]
|
||||||
pub struct FunctionalRecordUpdateOnNonStruct {
|
pub struct FunctionalRecordUpdateOnNonStruct {
|
||||||
@ -193,14 +185,6 @@ pub struct AddMissingParenthesesInRange {
|
|||||||
pub right: Span,
|
pub right: Span,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Diagnostic)]
|
|
||||||
#[diag(hir_typeck_op_trait_generic_params)]
|
|
||||||
pub struct OpMethodGenericParams {
|
|
||||||
#[primary_span]
|
|
||||||
pub span: Span,
|
|
||||||
pub method_name: String,
|
|
||||||
}
|
|
||||||
|
|
||||||
pub struct TypeMismatchFruTypo {
|
pub struct TypeMismatchFruTypo {
|
||||||
/// Span of the LHS of the range
|
/// Span of the LHS of the range
|
||||||
pub expr_span: Span,
|
pub expr_span: Span,
|
||||||
|
@ -444,15 +444,6 @@ fn fatally_break_rust(tcx: TyCtxt<'_>, span: Span) -> ! {
|
|||||||
diag.emit()
|
diag.emit()
|
||||||
}
|
}
|
||||||
|
|
||||||
/// `expected` here is the expected number of explicit generic arguments on the trait.
|
|
||||||
fn has_expected_num_generic_args(tcx: TyCtxt<'_>, trait_did: DefId, expected: usize) -> bool {
|
|
||||||
let generics = tcx.generics_of(trait_did);
|
|
||||||
generics.count()
|
|
||||||
== expected
|
|
||||||
+ if generics.has_self { 1 } else { 0 }
|
|
||||||
+ if generics.host_effect_index.is_some() { 1 } else { 0 }
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn provide(providers: &mut Providers) {
|
pub fn provide(providers: &mut Providers) {
|
||||||
method::provide(providers);
|
method::provide(providers);
|
||||||
*providers = Providers {
|
*providers = Providers {
|
||||||
|
@ -10,7 +10,6 @@
|
|||||||
pub use self::suggest::SelfSource;
|
pub use self::suggest::SelfSource;
|
||||||
pub use self::MethodError::*;
|
pub use self::MethodError::*;
|
||||||
|
|
||||||
use crate::errors::OpMethodGenericParams;
|
|
||||||
use crate::FnCtxt;
|
use crate::FnCtxt;
|
||||||
use rustc_errors::{Applicability, Diagnostic, SubdiagnosticMessage};
|
use rustc_errors::{Applicability, Diagnostic, SubdiagnosticMessage};
|
||||||
use rustc_hir as hir;
|
use rustc_hir as hir;
|
||||||
@ -385,26 +384,12 @@ fn construct_obligation_for_trait(
|
|||||||
// type parameters or early-bound regions.
|
// type parameters or early-bound regions.
|
||||||
let tcx = self.tcx;
|
let tcx = self.tcx;
|
||||||
let Some(method_item) = self.associated_value(trait_def_id, m_name) else {
|
let Some(method_item) = self.associated_value(trait_def_id, m_name) else {
|
||||||
tcx.dcx().span_delayed_bug(
|
bug!("expected associated item for operator trait")
|
||||||
obligation.cause.span,
|
|
||||||
"operator trait does not have corresponding operator method",
|
|
||||||
);
|
|
||||||
return None;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
if method_item.kind != ty::AssocKind::Fn {
|
|
||||||
self.dcx().span_delayed_bug(tcx.def_span(method_item.def_id), "not a method");
|
|
||||||
return None;
|
|
||||||
}
|
|
||||||
|
|
||||||
let def_id = method_item.def_id;
|
let def_id = method_item.def_id;
|
||||||
let generics = tcx.generics_of(def_id);
|
if method_item.kind != ty::AssocKind::Fn {
|
||||||
|
span_bug!(tcx.def_span(def_id), "expected `{m_name}` to be an associated function");
|
||||||
if generics.params.len() != 0 {
|
|
||||||
tcx.dcx().emit_fatal(OpMethodGenericParams {
|
|
||||||
span: tcx.def_span(method_item.def_id),
|
|
||||||
method_name: m_name.to_string(),
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
debug!("lookup_in_trait_adjusted: method_item={:?}", method_item);
|
debug!("lookup_in_trait_adjusted: method_item={:?}", method_item);
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
//! Code related to processing overloaded binary and unary operators.
|
//! Code related to processing overloaded binary and unary operators.
|
||||||
|
|
||||||
use super::method::MethodCallee;
|
use super::method::MethodCallee;
|
||||||
use super::{has_expected_num_generic_args, FnCtxt};
|
use super::FnCtxt;
|
||||||
use crate::Expectation;
|
use crate::Expectation;
|
||||||
use rustc_ast as ast;
|
use rustc_ast as ast;
|
||||||
use rustc_data_structures::packed::Pu128;
|
use rustc_data_structures::packed::Pu128;
|
||||||
@ -887,25 +887,6 @@ fn lookup_op_method(
|
|||||||
lhs_ty, op, opname, trait_did
|
lhs_ty, op, opname, trait_did
|
||||||
);
|
);
|
||||||
|
|
||||||
// Catches cases like #83893, where a lang item is declared with the
|
|
||||||
// wrong number of generic arguments. Should have yielded an error
|
|
||||||
// elsewhere by now, but we have to catch it here so that we do not
|
|
||||||
// index `other_tys` out of bounds (if the lang item has too many
|
|
||||||
// generic arguments, `other_tys` is too short).
|
|
||||||
if !has_expected_num_generic_args(
|
|
||||||
self.tcx,
|
|
||||||
trait_did,
|
|
||||||
match op {
|
|
||||||
// Binary ops have a generic right-hand side, unary ops don't
|
|
||||||
Op::Binary(..) => 1,
|
|
||||||
Op::Unary(..) => 0,
|
|
||||||
},
|
|
||||||
) {
|
|
||||||
self.dcx()
|
|
||||||
.span_delayed_bug(span, "operator didn't have the right number of generic args");
|
|
||||||
return Err(vec![]);
|
|
||||||
}
|
|
||||||
|
|
||||||
let opname = Ident::with_dummy_span(opname);
|
let opname = Ident::with_dummy_span(opname);
|
||||||
let (opt_rhs_expr, opt_rhs_ty) = opt_rhs.unzip();
|
let (opt_rhs_expr, opt_rhs_ty) = opt_rhs.unzip();
|
||||||
let input_types = opt_rhs_ty.as_slice();
|
let input_types = opt_rhs_ty.as_slice();
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
use crate::method::MethodCallee;
|
use crate::method::MethodCallee;
|
||||||
use crate::{has_expected_num_generic_args, FnCtxt, PlaceOp};
|
use crate::{FnCtxt, PlaceOp};
|
||||||
use rustc_ast as ast;
|
use rustc_ast as ast;
|
||||||
use rustc_errors::Applicability;
|
use rustc_errors::Applicability;
|
||||||
use rustc_hir as hir;
|
use rustc_hir as hir;
|
||||||
@ -209,20 +209,6 @@ pub(super) fn try_overloaded_place_op(
|
|||||||
return None;
|
return None;
|
||||||
};
|
};
|
||||||
|
|
||||||
// If the lang item was declared incorrectly, stop here so that we don't
|
|
||||||
// run into an ICE (#83893). The error is reported where the lang item is
|
|
||||||
// declared.
|
|
||||||
if !has_expected_num_generic_args(
|
|
||||||
self.tcx,
|
|
||||||
imm_tr,
|
|
||||||
match op {
|
|
||||||
PlaceOp::Deref => 0,
|
|
||||||
PlaceOp::Index => 1,
|
|
||||||
},
|
|
||||||
) {
|
|
||||||
return None;
|
|
||||||
}
|
|
||||||
|
|
||||||
self.lookup_method_in_trait(
|
self.lookup_method_in_trait(
|
||||||
self.misc(span),
|
self.misc(span),
|
||||||
Ident::with_dummy_span(imm_op),
|
Ident::with_dummy_span(imm_op),
|
||||||
@ -249,20 +235,6 @@ fn try_mutable_overloaded_place_op(
|
|||||||
return None;
|
return None;
|
||||||
};
|
};
|
||||||
|
|
||||||
// If the lang item was declared incorrectly, stop here so that we don't
|
|
||||||
// run into an ICE (#83893). The error is reported where the lang item is
|
|
||||||
// declared.
|
|
||||||
if !has_expected_num_generic_args(
|
|
||||||
self.tcx,
|
|
||||||
mut_tr,
|
|
||||||
match op {
|
|
||||||
PlaceOp::Deref => 0,
|
|
||||||
PlaceOp::Index => 1,
|
|
||||||
},
|
|
||||||
) {
|
|
||||||
return None;
|
|
||||||
}
|
|
||||||
|
|
||||||
self.lookup_method_in_trait(
|
self.lookup_method_in_trait(
|
||||||
self.misc(span),
|
self.misc(span),
|
||||||
Ident::with_dummy_span(mut_op),
|
Ident::with_dummy_span(mut_op),
|
||||||
|
@ -1,18 +0,0 @@
|
|||||||
#![feature(no_core)]
|
|
||||||
#![feature(lang_items)]
|
|
||||||
#![no_core]
|
|
||||||
|
|
||||||
#[lang = "sized"]
|
|
||||||
trait Sized {}
|
|
||||||
|
|
||||||
#[lang = "add"]
|
|
||||||
trait Add<T> {
|
|
||||||
const add: u32 = 1u32;
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Add<u32> for u32 {}
|
|
||||||
|
|
||||||
fn main() {
|
|
||||||
1u32 + 1u32;
|
|
||||||
//~^ ERROR cannot add `u32` to `u32`
|
|
||||||
}
|
|
@ -1,11 +0,0 @@
|
|||||||
error[E0369]: cannot add `u32` to `u32`
|
|
||||||
--> $DIR/bad-add-impl.rs:16:10
|
|
||||||
|
|
|
||||||
LL | 1u32 + 1u32;
|
|
||||||
| ---- ^ ---- u32
|
|
||||||
| |
|
|
||||||
| u32
|
|
||||||
|
|
||||||
error: aborting due to 1 previous error
|
|
||||||
|
|
||||||
For more information about this error, try `rustc --explain E0369`.
|
|
@ -1,18 +0,0 @@
|
|||||||
error: failed to find an overloaded call trait for closure call
|
|
||||||
--> $DIR/fn-fn_mut-call-ill-formed.rs:39:5
|
|
||||||
|
|
|
||||||
LL | a();
|
|
||||||
| ^^^
|
|
||||||
|
|
|
||||||
= help: make sure the `fn`/`fn_mut`/`fn_once` lang items are defined and have correctly defined `call`/`call_mut`/`call_once` methods
|
|
||||||
|
|
||||||
error: failed to find an overloaded call trait for closure call
|
|
||||||
--> $DIR/fn-fn_mut-call-ill-formed.rs:43:5
|
|
||||||
|
|
|
||||||
LL | b();
|
|
||||||
| ^^^
|
|
||||||
|
|
|
||||||
= help: make sure the `fn`/`fn_mut`/`fn_once` lang items are defined and have correctly defined `call`/`call_mut`/`call_once` methods
|
|
||||||
|
|
||||||
error: aborting due to 2 previous errors
|
|
||||||
|
|
@ -1,18 +0,0 @@
|
|||||||
error: failed to find an overloaded call trait for closure call
|
|
||||||
--> $DIR/fn-fn_mut-call-ill-formed.rs:39:5
|
|
||||||
|
|
|
||||||
LL | a();
|
|
||||||
| ^^^
|
|
||||||
|
|
|
||||||
= help: make sure the `fn`/`fn_mut`/`fn_once` lang items are defined and have correctly defined `call`/`call_mut`/`call_once` methods
|
|
||||||
|
|
||||||
error: failed to find an overloaded call trait for closure call
|
|
||||||
--> $DIR/fn-fn_mut-call-ill-formed.rs:43:5
|
|
||||||
|
|
|
||||||
LL | b();
|
|
||||||
| ^^^
|
|
||||||
|
|
|
||||||
= help: make sure the `fn`/`fn_mut`/`fn_once` lang items are defined and have correctly defined `call`/`call_mut`/`call_once` methods
|
|
||||||
|
|
||||||
error: aborting due to 2 previous errors
|
|
||||||
|
|
@ -1,18 +0,0 @@
|
|||||||
error: failed to find an overloaded call trait for closure call
|
|
||||||
--> $DIR/fn-fn_mut-call-ill-formed.rs:42:5
|
|
||||||
|
|
|
||||||
LL | a();
|
|
||||||
| ^^^
|
|
||||||
|
|
|
||||||
= help: make sure the `fn`/`fn_mut`/`fn_once` lang items are defined and have correctly defined `call`/`call_mut`/`call_once` methods
|
|
||||||
|
|
||||||
error: failed to find an overloaded call trait for closure call
|
|
||||||
--> $DIR/fn-fn_mut-call-ill-formed.rs:47:5
|
|
||||||
|
|
|
||||||
LL | b();
|
|
||||||
| ^^^
|
|
||||||
|
|
|
||||||
= help: make sure the `fn`/`fn_mut`/`fn_once` lang items are defined and have correctly defined `call`/`call_mut`/`call_once` methods
|
|
||||||
|
|
||||||
error: aborting due to 2 previous errors
|
|
||||||
|
|
@ -1,18 +0,0 @@
|
|||||||
error: failed to find an overloaded call trait for closure call
|
|
||||||
--> $DIR/fn-fn_mut-call-ill-formed.rs:42:5
|
|
||||||
|
|
|
||||||
LL | a();
|
|
||||||
| ^^^
|
|
||||||
|
|
|
||||||
= help: make sure the `fn`/`fn_mut`/`fn_once` lang items are defined and have correctly defined `call`/`call_mut`/`call_once` methods
|
|
||||||
|
|
||||||
error: failed to find an overloaded call trait for closure call
|
|
||||||
--> $DIR/fn-fn_mut-call-ill-formed.rs:47:5
|
|
||||||
|
|
|
||||||
LL | b();
|
|
||||||
| ^^^
|
|
||||||
|
|
|
||||||
= help: make sure the `fn`/`fn_mut`/`fn_once` lang items are defined and have correctly defined `call`/`call_mut`/`call_once` methods
|
|
||||||
|
|
||||||
error: aborting due to 2 previous errors
|
|
||||||
|
|
@ -1,18 +0,0 @@
|
|||||||
error: failed to find an overloaded call trait for closure call
|
|
||||||
--> $DIR/fn-fn_mut-call-ill-formed.rs:42:5
|
|
||||||
|
|
|
||||||
LL | a();
|
|
||||||
| ^^^
|
|
||||||
|
|
|
||||||
= help: make sure the `fn`/`fn_mut`/`fn_once` lang items are defined and have correctly defined `call`/`call_mut`/`call_once` methods
|
|
||||||
|
|
||||||
error: failed to find an overloaded call trait for closure call
|
|
||||||
--> $DIR/fn-fn_mut-call-ill-formed.rs:47:5
|
|
||||||
|
|
|
||||||
LL | b();
|
|
||||||
| ^^^
|
|
||||||
|
|
|
||||||
= help: make sure the `fn`/`fn_mut`/`fn_once` lang items are defined and have correctly defined `call`/`call_mut`/`call_once` methods
|
|
||||||
|
|
||||||
error: aborting due to 2 previous errors
|
|
||||||
|
|
@ -1,18 +0,0 @@
|
|||||||
error: failed to find an overloaded call trait for closure call
|
|
||||||
--> $DIR/fn-fn_mut-call-ill-formed.rs:42:5
|
|
||||||
|
|
|
||||||
LL | a();
|
|
||||||
| ^^^
|
|
||||||
|
|
|
||||||
= help: make sure the `fn`/`fn_mut`/`fn_once` lang items are defined and have correctly defined `call`/`call_mut`/`call_once` methods
|
|
||||||
|
|
||||||
error: failed to find an overloaded call trait for closure call
|
|
||||||
--> $DIR/fn-fn_mut-call-ill-formed.rs:47:5
|
|
||||||
|
|
|
||||||
LL | b();
|
|
||||||
| ^^^
|
|
||||||
|
|
|
||||||
= help: make sure the `fn`/`fn_mut`/`fn_once` lang items are defined and have correctly defined `call`/`call_mut`/`call_once` methods
|
|
||||||
|
|
||||||
error: aborting due to 2 previous errors
|
|
||||||
|
|
@ -1,18 +0,0 @@
|
|||||||
error: failed to find an overloaded call trait for closure call
|
|
||||||
--> $DIR/fn-fn_mut-call-ill-formed.rs:42:5
|
|
||||||
|
|
|
||||||
LL | a();
|
|
||||||
| ^^^
|
|
||||||
|
|
|
||||||
= help: make sure the `fn`/`fn_mut`/`fn_once` lang items are defined and have correctly defined `call`/`call_mut`/`call_once` methods
|
|
||||||
|
|
||||||
error: failed to find an overloaded call trait for closure call
|
|
||||||
--> $DIR/fn-fn_mut-call-ill-formed.rs:47:5
|
|
||||||
|
|
|
||||||
LL | b();
|
|
||||||
| ^^^
|
|
||||||
|
|
|
||||||
= help: make sure the `fn`/`fn_mut`/`fn_once` lang items are defined and have correctly defined `call`/`call_mut`/`call_once` methods
|
|
||||||
|
|
||||||
error: aborting due to 2 previous errors
|
|
||||||
|
|
@ -1,18 +0,0 @@
|
|||||||
error: failed to find an overloaded call trait for closure call
|
|
||||||
--> $DIR/fn-fn_mut-call-ill-formed.rs:42:5
|
|
||||||
|
|
|
||||||
LL | a();
|
|
||||||
| ^^^
|
|
||||||
|
|
|
||||||
= help: make sure the `fn`/`fn_mut`/`fn_once` lang items are defined and have correctly defined `call`/`call_mut`/`call_once` methods
|
|
||||||
|
|
||||||
error: failed to find an overloaded call trait for closure call
|
|
||||||
--> $DIR/fn-fn_mut-call-ill-formed.rs:47:5
|
|
||||||
|
|
|
||||||
LL | b();
|
|
||||||
| ^^^
|
|
||||||
|
|
|
||||||
= help: make sure the `fn`/`fn_mut`/`fn_once` lang items are defined and have correctly defined `call`/`call_mut`/`call_once` methods
|
|
||||||
|
|
||||||
error: aborting due to 2 previous errors
|
|
||||||
|
|
@ -1,49 +0,0 @@
|
|||||||
// revisions: fn_once_bad_item fn_once_bad_sig fn_mut_bad_item fn_mut_bad_sig fn_bad_item fn_bad_sig
|
|
||||||
|
|
||||||
#![feature(lang_items)]
|
|
||||||
#![feature(no_core)]
|
|
||||||
#![no_core]
|
|
||||||
|
|
||||||
#[lang = "sized"]
|
|
||||||
trait Sized {}
|
|
||||||
|
|
||||||
#[cfg(any(fn_bad_item, fn_bad_sig))]
|
|
||||||
#[lang = "fn"]
|
|
||||||
trait MyFn<T> {
|
|
||||||
#[cfg(fn_bad_sig)]
|
|
||||||
fn call(i: i32) -> i32 { 0 }
|
|
||||||
|
|
||||||
#[cfg(fn_bad_item)]
|
|
||||||
const call: i32 = 42;
|
|
||||||
}
|
|
||||||
|
|
||||||
#[cfg(any(fn_mut_bad_item, fn_mut_bad_sig))]
|
|
||||||
#[lang = "fn_mut"]
|
|
||||||
trait MyFnMut<T> {
|
|
||||||
#[cfg(fn_mut_bad_sig)]
|
|
||||||
fn call_mut(i: i32) -> i32 { 0 }
|
|
||||||
|
|
||||||
#[cfg(fn_mut_bad_item)]
|
|
||||||
const call_mut: i32 = 42;
|
|
||||||
}
|
|
||||||
|
|
||||||
#[cfg(any(fn_once_bad_item, fn_once_bad_sig))]
|
|
||||||
#[lang = "fn_once"]
|
|
||||||
trait MyFnOnce<T> {
|
|
||||||
#[cfg(fn_once_bad_sig)]
|
|
||||||
fn call_once(i: i32) -> i32 { 0 }
|
|
||||||
|
|
||||||
#[cfg(fn_once_bad_item)]
|
|
||||||
const call_once: i32 = 42;
|
|
||||||
}
|
|
||||||
|
|
||||||
fn main() {
|
|
||||||
let a = || 42;
|
|
||||||
a();
|
|
||||||
//~^ ERROR failed to find an overloaded call trait for closure call
|
|
||||||
|
|
||||||
let mut i = 0;
|
|
||||||
let mut b = || { };
|
|
||||||
b();
|
|
||||||
//~^ ERROR failed to find an overloaded call trait for closure call
|
|
||||||
}
|
|
@ -1,17 +0,0 @@
|
|||||||
#![feature(no_core, lang_items)]
|
|
||||||
#![no_core]
|
|
||||||
|
|
||||||
#[lang="sized"]
|
|
||||||
trait Sized {}
|
|
||||||
|
|
||||||
#[lang="add"]
|
|
||||||
trait Add<T> {}
|
|
||||||
|
|
||||||
impl Add<i32> for i32 {}
|
|
||||||
|
|
||||||
fn main() {
|
|
||||||
let x = 5 + 6;
|
|
||||||
//~^ ERROR cannot add `i32` to `{integer}`
|
|
||||||
let y = 5i32 + 6i32;
|
|
||||||
//~^ ERROR cannot add `i32` to `i32`
|
|
||||||
}
|
|
@ -1,19 +0,0 @@
|
|||||||
error[E0369]: cannot add `i32` to `{integer}`
|
|
||||||
--> $DIR/issue-31076.rs:13:15
|
|
||||||
|
|
|
||||||
LL | let x = 5 + 6;
|
|
||||||
| - ^ - i32
|
|
||||||
| |
|
|
||||||
| {integer}
|
|
||||||
|
|
||||||
error[E0369]: cannot add `i32` to `i32`
|
|
||||||
--> $DIR/issue-31076.rs:15:18
|
|
||||||
|
|
|
||||||
LL | let y = 5i32 + 6i32;
|
|
||||||
| ---- ^ ---- i32
|
|
||||||
| |
|
|
||||||
| i32
|
|
||||||
|
|
||||||
error: aborting due to 2 previous errors
|
|
||||||
|
|
||||||
For more information about this error, try `rustc --explain E0369`.
|
|
@ -1,16 +0,0 @@
|
|||||||
// Regression test for the ICE described in issue #86238.
|
|
||||||
|
|
||||||
#![feature(lang_items)]
|
|
||||||
#![feature(no_core)]
|
|
||||||
|
|
||||||
#![no_core]
|
|
||||||
fn main() {
|
|
||||||
let one = || {};
|
|
||||||
one()
|
|
||||||
//~^ ERROR: failed to find an overloaded call trait for closure call
|
|
||||||
//~| HELP: make sure the `fn`/`fn_mut`/`fn_once` lang items are defined
|
|
||||||
}
|
|
||||||
#[lang = "sized"]
|
|
||||||
trait Sized {}
|
|
||||||
#[lang = "copy"]
|
|
||||||
trait Copy {}
|
|
@ -1,10 +0,0 @@
|
|||||||
error: failed to find an overloaded call trait for closure call
|
|
||||||
--> $DIR/issue-86238.rs:9:5
|
|
||||||
|
|
|
||||||
LL | one()
|
|
||||||
| ^^^^^
|
|
||||||
|
|
|
||||||
= help: make sure the `fn`/`fn_mut`/`fn_once` lang items are defined and have correctly defined `call`/`call_mut`/`call_once` methods
|
|
||||||
|
|
||||||
error: aborting due to 1 previous error
|
|
||||||
|
|
@ -1,5 +1,4 @@
|
|||||||
// compile-flags:-C panic=abort
|
// compile-flags:-C panic=abort
|
||||||
// error-pattern: language item required, but not found: `panic_info`
|
|
||||||
|
|
||||||
#![feature(lang_items)]
|
#![feature(lang_items)]
|
||||||
#![feature(no_core)]
|
#![feature(no_core)]
|
||||||
@ -8,6 +7,7 @@
|
|||||||
|
|
||||||
#[panic_handler]
|
#[panic_handler]
|
||||||
fn panic() -> ! {
|
fn panic() -> ! {
|
||||||
|
//~^ ERROR requires `panic_info` lang_item
|
||||||
loop {}
|
loop {}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,4 +1,8 @@
|
|||||||
error: language item required, but not found: `panic_info`
|
error: requires `panic_info` lang_item
|
||||||
|
--> $DIR/panic-handler-requires-panic-info.rs:9:1
|
||||||
|
|
|
||||||
|
LL | fn panic() -> ! {
|
||||||
|
| ^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
error: aborting due to 1 previous error
|
error: aborting due to 1 previous error
|
||||||
|
|
||||||
|
@ -1,23 +0,0 @@
|
|||||||
#![crate_type = "lib"]
|
|
||||||
#![feature(lang_items)]
|
|
||||||
#![feature(no_core)]
|
|
||||||
#![no_core]
|
|
||||||
|
|
||||||
#[lang="sized"]
|
|
||||||
pub trait Sized {
|
|
||||||
// Empty.
|
|
||||||
}
|
|
||||||
|
|
||||||
#[lang = "add"]
|
|
||||||
trait Add<RHS=Self> {
|
|
||||||
type Output;
|
|
||||||
|
|
||||||
fn add<Y>(self, _: RHS) -> Self::Output;
|
|
||||||
//~^ ERROR `add` must not have any generic parameters
|
|
||||||
}
|
|
||||||
|
|
||||||
#[allow(unreachable_code)]
|
|
||||||
fn ice(a: usize) {
|
|
||||||
let r = loop {};
|
|
||||||
r = r + a;
|
|
||||||
}
|
|
@ -1,8 +0,0 @@
|
|||||||
error: `add` must not have any generic parameters
|
|
||||||
--> $DIR/invalid_operator_trait.rs:15:5
|
|
||||||
|
|
|
||||||
LL | fn add<Y>(self, _: RHS) -> Self::Output;
|
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
||||||
|
|
||||||
error: aborting due to 1 previous error
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user