Merge lower_item into check_item_type
This commit is contained in:
@@ -758,17 +758,34 @@ pub(crate) fn check_item_type(tcx: TyCtxt<'_>, def_id: LocalDefId) -> Result<(),
|
|||||||
}
|
}
|
||||||
|
|
||||||
match tcx.def_kind(def_id) {
|
match tcx.def_kind(def_id) {
|
||||||
|
def_kind @ (DefKind::Static { .. } | DefKind::Const) => {
|
||||||
|
tcx.ensure_ok().generics_of(def_id);
|
||||||
|
tcx.ensure_ok().type_of(def_id);
|
||||||
|
tcx.ensure_ok().predicates_of(def_id);
|
||||||
|
match def_kind {
|
||||||
DefKind::Static { .. } => {
|
DefKind::Static { .. } => {
|
||||||
check_static_inhabited(tcx, def_id);
|
check_static_inhabited(tcx, def_id);
|
||||||
check_static_linkage(tcx, def_id);
|
check_static_linkage(tcx, def_id);
|
||||||
wfcheck::check_static_item(tcx, def_id)?;
|
wfcheck::check_static_item(tcx, def_id)?;
|
||||||
}
|
}
|
||||||
DefKind::Const => {}
|
DefKind::Const => {}
|
||||||
|
_ => unreachable!(),
|
||||||
|
}
|
||||||
|
}
|
||||||
DefKind::Enum => {
|
DefKind::Enum => {
|
||||||
|
tcx.ensure_ok().generics_of(def_id);
|
||||||
|
tcx.ensure_ok().type_of(def_id);
|
||||||
|
tcx.ensure_ok().predicates_of(def_id);
|
||||||
|
crate::collect::lower_enum_variant_types(tcx, def_id.to_def_id());
|
||||||
check_enum(tcx, def_id);
|
check_enum(tcx, def_id);
|
||||||
check_variances_for_type_defn(tcx, def_id);
|
check_variances_for_type_defn(tcx, def_id);
|
||||||
}
|
}
|
||||||
DefKind::Fn => {
|
DefKind::Fn => {
|
||||||
|
tcx.ensure_ok().generics_of(def_id);
|
||||||
|
tcx.ensure_ok().type_of(def_id);
|
||||||
|
tcx.ensure_ok().predicates_of(def_id);
|
||||||
|
tcx.ensure_ok().fn_sig(def_id);
|
||||||
|
tcx.ensure_ok().codegen_fn_attrs(def_id);
|
||||||
if let Some(i) = tcx.intrinsic(def_id) {
|
if let Some(i) = tcx.intrinsic(def_id) {
|
||||||
intrinsic::check_intrinsic_type(
|
intrinsic::check_intrinsic_type(
|
||||||
tcx,
|
tcx,
|
||||||
@@ -779,6 +796,11 @@ pub(crate) fn check_item_type(tcx: TyCtxt<'_>, def_id: LocalDefId) -> Result<(),
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
DefKind::Impl { of_trait } => {
|
DefKind::Impl { of_trait } => {
|
||||||
|
tcx.ensure_ok().generics_of(def_id);
|
||||||
|
tcx.ensure_ok().type_of(def_id);
|
||||||
|
tcx.ensure_ok().impl_trait_header(def_id);
|
||||||
|
tcx.ensure_ok().predicates_of(def_id);
|
||||||
|
tcx.ensure_ok().associated_items(def_id);
|
||||||
if of_trait && let Some(impl_trait_header) = tcx.impl_trait_header(def_id) {
|
if of_trait && let Some(impl_trait_header) = tcx.impl_trait_header(def_id) {
|
||||||
tcx.ensure_ok()
|
tcx.ensure_ok()
|
||||||
.coherent_trait(impl_trait_header.trait_ref.instantiate_identity().def_id)?;
|
.coherent_trait(impl_trait_header.trait_ref.instantiate_identity().def_id)?;
|
||||||
@@ -787,6 +809,11 @@ pub(crate) fn check_item_type(tcx: TyCtxt<'_>, def_id: LocalDefId) -> Result<(),
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
DefKind::Trait => {
|
DefKind::Trait => {
|
||||||
|
tcx.ensure_ok().generics_of(def_id);
|
||||||
|
tcx.ensure_ok().trait_def(def_id);
|
||||||
|
tcx.ensure_ok().explicit_super_predicates_of(def_id);
|
||||||
|
tcx.ensure_ok().predicates_of(def_id);
|
||||||
|
tcx.ensure_ok().associated_items(def_id);
|
||||||
let assoc_items = tcx.associated_items(def_id);
|
let assoc_items = tcx.associated_items(def_id);
|
||||||
check_on_unimplemented(tcx, def_id);
|
check_on_unimplemented(tcx, def_id);
|
||||||
|
|
||||||
@@ -805,12 +832,32 @@ pub(crate) fn check_item_type(tcx: TyCtxt<'_>, def_id: LocalDefId) -> Result<(),
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
DefKind::Struct => {
|
DefKind::TraitAlias => {
|
||||||
check_struct(tcx, def_id);
|
tcx.ensure_ok().generics_of(def_id);
|
||||||
check_variances_for_type_defn(tcx, def_id);
|
tcx.ensure_ok().explicit_implied_predicates_of(def_id);
|
||||||
|
tcx.ensure_ok().explicit_super_predicates_of(def_id);
|
||||||
|
tcx.ensure_ok().predicates_of(def_id);
|
||||||
|
}
|
||||||
|
def_kind @ (DefKind::Struct | DefKind::Union) => {
|
||||||
|
tcx.ensure_ok().generics_of(def_id);
|
||||||
|
tcx.ensure_ok().type_of(def_id);
|
||||||
|
tcx.ensure_ok().predicates_of(def_id);
|
||||||
|
|
||||||
|
let adt = tcx.adt_def(def_id).non_enum_variant();
|
||||||
|
for f in adt.fields.iter() {
|
||||||
|
tcx.ensure_ok().generics_of(f.did);
|
||||||
|
tcx.ensure_ok().type_of(f.did);
|
||||||
|
tcx.ensure_ok().predicates_of(f.did);
|
||||||
|
}
|
||||||
|
|
||||||
|
if let Some((_, ctor_def_id)) = adt.ctor {
|
||||||
|
crate::collect::lower_variant_ctor(tcx, ctor_def_id.expect_local());
|
||||||
|
}
|
||||||
|
match def_kind {
|
||||||
|
DefKind::Struct => check_struct(tcx, def_id),
|
||||||
|
DefKind::Union => check_union(tcx, def_id),
|
||||||
|
_ => unreachable!(),
|
||||||
}
|
}
|
||||||
DefKind::Union => {
|
|
||||||
check_union(tcx, def_id);
|
|
||||||
check_variances_for_type_defn(tcx, def_id);
|
check_variances_for_type_defn(tcx, def_id);
|
||||||
}
|
}
|
||||||
DefKind::OpaqueTy => {
|
DefKind::OpaqueTy => {
|
||||||
@@ -838,6 +885,9 @@ pub(crate) fn check_item_type(tcx: TyCtxt<'_>, def_id: LocalDefId) -> Result<(),
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
DefKind::TyAlias => {
|
DefKind::TyAlias => {
|
||||||
|
tcx.ensure_ok().generics_of(def_id);
|
||||||
|
tcx.ensure_ok().type_of(def_id);
|
||||||
|
tcx.ensure_ok().predicates_of(def_id);
|
||||||
check_type_alias_type_params_are_used(tcx, def_id);
|
check_type_alias_type_params_are_used(tcx, def_id);
|
||||||
if tcx.type_alias_is_lazy(def_id) {
|
if tcx.type_alias_is_lazy(def_id) {
|
||||||
res = res.and(enter_wf_checking_ctxt(tcx, def_id, |wfcx| {
|
res = res.and(enter_wf_checking_ctxt(tcx, def_id, |wfcx| {
|
||||||
@@ -897,11 +947,23 @@ pub(crate) fn check_item_type(tcx: TyCtxt<'_>, def_id: LocalDefId) -> Result<(),
|
|||||||
}
|
}
|
||||||
|
|
||||||
let item = tcx.hir_foreign_item(item.id);
|
let item = tcx.hir_foreign_item(item.id);
|
||||||
match &item.kind {
|
tcx.ensure_ok().generics_of(item.owner_id);
|
||||||
hir::ForeignItemKind::Fn(sig, _, _) => {
|
tcx.ensure_ok().type_of(item.owner_id);
|
||||||
|
tcx.ensure_ok().predicates_of(item.owner_id);
|
||||||
|
if tcx.is_conditionally_const(def_id) {
|
||||||
|
tcx.ensure_ok().explicit_implied_const_bounds(def_id);
|
||||||
|
tcx.ensure_ok().const_conditions(def_id);
|
||||||
|
}
|
||||||
|
match item.kind {
|
||||||
|
hir::ForeignItemKind::Fn(sig, ..) => {
|
||||||
|
tcx.ensure_ok().codegen_fn_attrs(item.owner_id);
|
||||||
|
tcx.ensure_ok().fn_sig(item.owner_id);
|
||||||
require_c_abi_if_c_variadic(tcx, sig.decl, abi, item.span);
|
require_c_abi_if_c_variadic(tcx, sig.decl, abi, item.span);
|
||||||
}
|
}
|
||||||
_ => {}
|
hir::ForeignItemKind::Static(..) => {
|
||||||
|
tcx.ensure_ok().codegen_fn_attrs(item.owner_id);
|
||||||
|
}
|
||||||
|
_ => (),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -230,7 +230,6 @@ fn check_item<'tcx>(tcx: TyCtxt<'tcx>, item: &'tcx hir::Item<'tcx>) -> Result<()
|
|||||||
?item.owner_id,
|
?item.owner_id,
|
||||||
item.name = ? tcx.def_path_str(def_id)
|
item.name = ? tcx.def_path_str(def_id)
|
||||||
);
|
);
|
||||||
crate::collect::lower_item(tcx, item.item_id());
|
|
||||||
|
|
||||||
match item.kind {
|
match item.kind {
|
||||||
// Right now we check that every default trait implementation
|
// Right now we check that every default trait implementation
|
||||||
|
|||||||
@@ -615,105 +615,6 @@ fn get_new_lifetime_name<'tcx>(
|
|||||||
(1..).flat_map(a_to_z_repeat_n).find(|lt| !existing_lifetimes.contains(lt.as_str())).unwrap()
|
(1..).flat_map(a_to_z_repeat_n).find(|lt| !existing_lifetimes.contains(lt.as_str())).unwrap()
|
||||||
}
|
}
|
||||||
|
|
||||||
#[instrument(level = "debug", skip_all)]
|
|
||||||
pub(super) fn lower_item(tcx: TyCtxt<'_>, item_id: hir::ItemId) {
|
|
||||||
let it = tcx.hir_item(item_id);
|
|
||||||
debug!(item = ?it.kind.ident(), id = %it.hir_id());
|
|
||||||
let def_id = item_id.owner_id.def_id;
|
|
||||||
|
|
||||||
match &it.kind {
|
|
||||||
// These don't define types.
|
|
||||||
hir::ItemKind::ExternCrate(..)
|
|
||||||
| hir::ItemKind::Use(..)
|
|
||||||
| hir::ItemKind::Macro(..)
|
|
||||||
| hir::ItemKind::Mod(..)
|
|
||||||
| hir::ItemKind::GlobalAsm { .. } => {}
|
|
||||||
hir::ItemKind::ForeignMod { items, .. } => {
|
|
||||||
for item in *items {
|
|
||||||
let item = tcx.hir_foreign_item(item.id);
|
|
||||||
tcx.ensure_ok().generics_of(item.owner_id);
|
|
||||||
tcx.ensure_ok().type_of(item.owner_id);
|
|
||||||
tcx.ensure_ok().predicates_of(item.owner_id);
|
|
||||||
if tcx.is_conditionally_const(def_id) {
|
|
||||||
tcx.ensure_ok().explicit_implied_const_bounds(def_id);
|
|
||||||
tcx.ensure_ok().const_conditions(def_id);
|
|
||||||
}
|
|
||||||
match item.kind {
|
|
||||||
hir::ForeignItemKind::Fn(..) => {
|
|
||||||
tcx.ensure_ok().codegen_fn_attrs(item.owner_id);
|
|
||||||
tcx.ensure_ok().fn_sig(item.owner_id)
|
|
||||||
}
|
|
||||||
hir::ForeignItemKind::Static(..) => {
|
|
||||||
tcx.ensure_ok().codegen_fn_attrs(item.owner_id);
|
|
||||||
}
|
|
||||||
_ => (),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
hir::ItemKind::Enum(..) => {
|
|
||||||
tcx.ensure_ok().generics_of(def_id);
|
|
||||||
tcx.ensure_ok().type_of(def_id);
|
|
||||||
tcx.ensure_ok().predicates_of(def_id);
|
|
||||||
lower_enum_variant_types(tcx, def_id.to_def_id());
|
|
||||||
}
|
|
||||||
hir::ItemKind::Impl { .. } => {
|
|
||||||
tcx.ensure_ok().generics_of(def_id);
|
|
||||||
tcx.ensure_ok().type_of(def_id);
|
|
||||||
tcx.ensure_ok().impl_trait_header(def_id);
|
|
||||||
tcx.ensure_ok().predicates_of(def_id);
|
|
||||||
tcx.ensure_ok().associated_items(def_id);
|
|
||||||
}
|
|
||||||
hir::ItemKind::Trait(..) => {
|
|
||||||
tcx.ensure_ok().generics_of(def_id);
|
|
||||||
tcx.ensure_ok().trait_def(def_id);
|
|
||||||
tcx.at(it.span).explicit_super_predicates_of(def_id);
|
|
||||||
tcx.ensure_ok().predicates_of(def_id);
|
|
||||||
tcx.ensure_ok().associated_items(def_id);
|
|
||||||
}
|
|
||||||
hir::ItemKind::TraitAlias(..) => {
|
|
||||||
tcx.ensure_ok().generics_of(def_id);
|
|
||||||
tcx.at(it.span).explicit_implied_predicates_of(def_id);
|
|
||||||
tcx.at(it.span).explicit_super_predicates_of(def_id);
|
|
||||||
tcx.ensure_ok().predicates_of(def_id);
|
|
||||||
}
|
|
||||||
hir::ItemKind::Struct(_, _, struct_def) | hir::ItemKind::Union(_, _, struct_def) => {
|
|
||||||
tcx.ensure_ok().generics_of(def_id);
|
|
||||||
tcx.ensure_ok().type_of(def_id);
|
|
||||||
tcx.ensure_ok().predicates_of(def_id);
|
|
||||||
|
|
||||||
for f in struct_def.fields() {
|
|
||||||
tcx.ensure_ok().generics_of(f.def_id);
|
|
||||||
tcx.ensure_ok().type_of(f.def_id);
|
|
||||||
tcx.ensure_ok().predicates_of(f.def_id);
|
|
||||||
}
|
|
||||||
|
|
||||||
if let Some(ctor_def_id) = struct_def.ctor_def_id() {
|
|
||||||
lower_variant_ctor(tcx, ctor_def_id);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
hir::ItemKind::TyAlias(..) => {
|
|
||||||
tcx.ensure_ok().generics_of(def_id);
|
|
||||||
tcx.ensure_ok().type_of(def_id);
|
|
||||||
tcx.ensure_ok().predicates_of(def_id);
|
|
||||||
}
|
|
||||||
|
|
||||||
hir::ItemKind::Static(..) | hir::ItemKind::Const(..) => {
|
|
||||||
tcx.ensure_ok().generics_of(def_id);
|
|
||||||
tcx.ensure_ok().type_of(def_id);
|
|
||||||
tcx.ensure_ok().predicates_of(def_id);
|
|
||||||
}
|
|
||||||
|
|
||||||
hir::ItemKind::Fn { .. } => {
|
|
||||||
tcx.ensure_ok().generics_of(def_id);
|
|
||||||
tcx.ensure_ok().type_of(def_id);
|
|
||||||
tcx.ensure_ok().predicates_of(def_id);
|
|
||||||
tcx.ensure_ok().fn_sig(def_id);
|
|
||||||
tcx.ensure_ok().codegen_fn_attrs(def_id);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub(crate) fn lower_trait_item(tcx: TyCtxt<'_>, trait_item_id: hir::TraitItemId) {
|
pub(crate) fn lower_trait_item(tcx: TyCtxt<'_>, trait_item_id: hir::TraitItemId) {
|
||||||
let trait_item = tcx.hir_trait_item(trait_item_id);
|
let trait_item = tcx.hir_trait_item(trait_item_id);
|
||||||
let def_id = trait_item_id.owner_id;
|
let def_id = trait_item_id.owner_id;
|
||||||
@@ -761,13 +662,13 @@ pub(super) fn lower_impl_item(tcx: TyCtxt<'_>, impl_item_id: hir::ImplItemId) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn lower_variant_ctor(tcx: TyCtxt<'_>, def_id: LocalDefId) {
|
pub(super) fn lower_variant_ctor(tcx: TyCtxt<'_>, def_id: LocalDefId) {
|
||||||
tcx.ensure_ok().generics_of(def_id);
|
tcx.ensure_ok().generics_of(def_id);
|
||||||
tcx.ensure_ok().type_of(def_id);
|
tcx.ensure_ok().type_of(def_id);
|
||||||
tcx.ensure_ok().predicates_of(def_id);
|
tcx.ensure_ok().predicates_of(def_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn lower_enum_variant_types(tcx: TyCtxt<'_>, def_id: DefId) {
|
pub(super) fn lower_enum_variant_types(tcx: TyCtxt<'_>, def_id: DefId) {
|
||||||
let def = tcx.adt_def(def_id);
|
let def = tcx.adt_def(def_id);
|
||||||
let repr_type = def.repr().discr_type();
|
let repr_type = def.repr().discr_type();
|
||||||
let initial = repr_type.initial_discriminant(tcx);
|
let initial = repr_type.initial_discriminant(tcx);
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
pub trait T2 {}
|
pub trait T2 {}
|
||||||
#[cfg(cfail2)]
|
#[cfg(cfail2)]
|
||||||
pub trait T2: T1 {}
|
pub trait T2: T1 {}
|
||||||
//[cfail2]~^ ERROR cycle detected when computing the super predicates of `T2`
|
//[cfail2]~^ ERROR cycle detected when computing the implied predicates of `T2`
|
||||||
|
|
||||||
pub trait T1: T2 {}
|
pub trait T1: T2 {}
|
||||||
|
|
||||||
|
|||||||
@@ -8,10 +8,8 @@ LL | trait Chromosome: Chromosome {
|
|||||||
note: cycle used when checking that `Chromosome` is well-formed
|
note: cycle used when checking that `Chromosome` is well-formed
|
||||||
--> $DIR/cycle-trait-supertrait-direct.rs:3:1
|
--> $DIR/cycle-trait-supertrait-direct.rs:3:1
|
||||||
|
|
|
|
||||||
LL | / trait Chromosome: Chromosome {
|
LL | trait Chromosome: Chromosome {
|
||||||
LL | |
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
LL | | }
|
|
||||||
| |_^
|
|
||||||
= note: see https://rustc-dev-guide.rust-lang.org/overview.html#queries and https://rustc-dev-guide.rust-lang.org/query.html for more information
|
= note: see https://rustc-dev-guide.rust-lang.org/overview.html#queries and https://rustc-dev-guide.rust-lang.org/query.html for more information
|
||||||
|
|
||||||
error: aborting due to 1 previous error
|
error: aborting due to 1 previous error
|
||||||
|
|||||||
@@ -13,10 +13,8 @@ LL | trait T2 : T1 {
|
|||||||
note: cycle used when checking that `T1` is well-formed
|
note: cycle used when checking that `T1` is well-formed
|
||||||
--> $DIR/issue-12511.rs:1:1
|
--> $DIR/issue-12511.rs:1:1
|
||||||
|
|
|
|
||||||
LL | / trait T1 : T2 {
|
LL | trait T1 : T2 {
|
||||||
LL | |
|
| ^^^^^^^^^^^^^
|
||||||
LL | | }
|
|
||||||
| |_^
|
|
||||||
= note: see https://rustc-dev-guide.rust-lang.org/overview.html#queries and https://rustc-dev-guide.rust-lang.org/query.html for more information
|
= note: see https://rustc-dev-guide.rust-lang.org/overview.html#queries and https://rustc-dev-guide.rust-lang.org/query.html for more information
|
||||||
|
|
||||||
error: aborting due to 1 previous error
|
error: aborting due to 1 previous error
|
||||||
|
|||||||
@@ -73,6 +73,14 @@ LL |
|
|||||||
LL | V9,
|
LL | V9,
|
||||||
| -- `-2` assigned here
|
| -- `-2` assigned here
|
||||||
|
|
||||||
|
error[E0370]: enum discriminant overflowed
|
||||||
|
--> $DIR/E0081.rs:87:5
|
||||||
|
|
|
||||||
|
LL | X256,
|
||||||
|
| ^^^^ overflowed on value after 255
|
||||||
|
|
|
||||||
|
= note: explicitly set `X256 = 0` if that is desired outcome
|
||||||
|
|
||||||
error[E0081]: discriminant value `0` assigned more than once
|
error[E0081]: discriminant value `0` assigned more than once
|
||||||
--> $DIR/E0081.rs:57:1
|
--> $DIR/E0081.rs:57:1
|
||||||
|
|
|
|
||||||
@@ -88,14 +96,6 @@ LL | X000, X001, X002, X003, X004, X005, X006, X007, X008, X009,
|
|||||||
LL | X256,
|
LL | X256,
|
||||||
| ---- `0` assigned here
|
| ---- `0` assigned here
|
||||||
|
|
||||||
error[E0370]: enum discriminant overflowed
|
|
||||||
--> $DIR/E0081.rs:87:5
|
|
||||||
|
|
|
||||||
LL | X256,
|
|
||||||
| ^^^^ overflowed on value after 255
|
|
||||||
|
|
|
||||||
= note: explicitly set `X256 = 0` if that is desired outcome
|
|
||||||
|
|
||||||
error: aborting due to 7 previous errors
|
error: aborting due to 7 previous errors
|
||||||
|
|
||||||
Some errors have detailed explanations: E0081, E0370.
|
Some errors have detailed explanations: E0081, E0370.
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ note: cycle used when checking that `T1` is well-formed
|
|||||||
--> $DIR/infinite-trait-alias-recursion.rs:3:1
|
--> $DIR/infinite-trait-alias-recursion.rs:3:1
|
||||||
|
|
|
|
||||||
LL | trait T1 = T2;
|
LL | trait T1 = T2;
|
||||||
| ^^^^^^^^^^^^^^
|
| ^^^^^^^^
|
||||||
= note: see https://rustc-dev-guide.rust-lang.org/overview.html#queries and https://rustc-dev-guide.rust-lang.org/query.html for more information
|
= note: see https://rustc-dev-guide.rust-lang.org/overview.html#queries and https://rustc-dev-guide.rust-lang.org/query.html for more information
|
||||||
|
|
||||||
error: aborting due to 1 previous error
|
error: aborting due to 1 previous error
|
||||||
|
|||||||
@@ -1,12 +1,3 @@
|
|||||||
error[E0210]: type parameter `T` must be used as the type parameter for some local type (e.g., `MyStruct<T>`)
|
|
||||||
--> $DIR/generics-default-stability-where.rs:7:6
|
|
||||||
|
|
|
||||||
LL | impl<T> Trait3<usize> for T where T: Trait2<usize> {
|
|
||||||
| ^ type parameter `T` must be used as the type parameter for some local type
|
|
||||||
|
|
|
||||||
= note: implementing a foreign trait is only possible if at least one of the types for which it is implemented is local
|
|
||||||
= note: only traits defined in the current crate can be implemented for a type parameter
|
|
||||||
|
|
||||||
error[E0658]: use of unstable library feature `unstable_default`
|
error[E0658]: use of unstable library feature `unstable_default`
|
||||||
--> $DIR/generics-default-stability-where.rs:7:45
|
--> $DIR/generics-default-stability-where.rs:7:45
|
||||||
|
|
|
|
||||||
@@ -16,6 +7,15 @@ LL | impl<T> Trait3<usize> for T where T: Trait2<usize> {
|
|||||||
= help: add `#![feature(unstable_default)]` to the crate attributes to enable
|
= help: add `#![feature(unstable_default)]` to the crate attributes to enable
|
||||||
= note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date
|
= note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date
|
||||||
|
|
||||||
|
error[E0210]: type parameter `T` must be used as the type parameter for some local type (e.g., `MyStruct<T>`)
|
||||||
|
--> $DIR/generics-default-stability-where.rs:7:6
|
||||||
|
|
|
||||||
|
LL | impl<T> Trait3<usize> for T where T: Trait2<usize> {
|
||||||
|
| ^ type parameter `T` must be used as the type parameter for some local type
|
||||||
|
|
|
||||||
|
= note: implementing a foreign trait is only possible if at least one of the types for which it is implemented is local
|
||||||
|
= note: only traits defined in the current crate can be implemented for a type parameter
|
||||||
|
|
||||||
error: aborting due to 2 previous errors
|
error: aborting due to 2 previous errors
|
||||||
|
|
||||||
Some errors have detailed explanations: E0210, E0658.
|
Some errors have detailed explanations: E0210, E0658.
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ note: cycle used when checking that `A` is well-formed
|
|||||||
--> $DIR/cyclic-trait-resolution.rs:1:1
|
--> $DIR/cyclic-trait-resolution.rs:1:1
|
||||||
|
|
|
|
||||||
LL | trait A: B + A {}
|
LL | trait A: B + A {}
|
||||||
| ^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^
|
||||||
= note: see https://rustc-dev-guide.rust-lang.org/overview.html#queries and https://rustc-dev-guide.rust-lang.org/query.html for more information
|
= note: see https://rustc-dev-guide.rust-lang.org/overview.html#queries and https://rustc-dev-guide.rust-lang.org/query.html for more information
|
||||||
|
|
||||||
error[E0391]: cycle detected when computing the implied predicates of `A`
|
error[E0391]: cycle detected when computing the implied predicates of `A`
|
||||||
|
|||||||
Reference in New Issue
Block a user