Implement RFC 2532 – Associated Type Defaults
This commit is contained in:
parent
187f3d73ab
commit
a323ff2c86
@ -1054,27 +1054,42 @@ fn assemble_candidates_from_impls<'cx, 'tcx>(
|
||||
// an error when we confirm the candidate
|
||||
// (which will ultimately lead to `normalize_to_error`
|
||||
// being invoked).
|
||||
node_item.item.defaultness.has_value()
|
||||
false
|
||||
} else {
|
||||
// If we're looking at a trait *impl*, the item is
|
||||
// specializable if the impl or the item are marked
|
||||
// `default`.
|
||||
node_item.item.defaultness.is_default()
|
||||
|| super::util::impl_is_default(selcx.tcx(), node_item.node.def_id())
|
||||
};
|
||||
|
||||
match is_default {
|
||||
// Non-specializable items are always projectable
|
||||
false => true,
|
||||
|
||||
// Only reveal a specializable default if we're past type-checking
|
||||
// and the obligations is monomorphic, otherwise passes such as
|
||||
// and the obligation is monomorphic, otherwise passes such as
|
||||
// transmute checking and polymorphic MIR optimizations could
|
||||
// get a result which isn't correct for all monomorphizations.
|
||||
if !is_default {
|
||||
true
|
||||
} else if obligation.param_env.reveal == Reveal::All {
|
||||
true if obligation.param_env.reveal == Reveal::All => {
|
||||
// NOTE(eddyb) inference variables can resolve to parameters, so
|
||||
// assume `poly_trait_ref` isn't monomorphic, if it contains any.
|
||||
let poly_trait_ref = selcx.infcx().resolve_vars_if_possible(&poly_trait_ref);
|
||||
let poly_trait_ref =
|
||||
selcx.infcx().resolve_vars_if_possible(&poly_trait_ref);
|
||||
!poly_trait_ref.needs_infer() && !poly_trait_ref.needs_subst()
|
||||
} else {
|
||||
}
|
||||
|
||||
true => {
|
||||
debug!(
|
||||
"assemble_candidates_from_impls: not eligible due to default: \
|
||||
assoc_ty={} predicate={}",
|
||||
selcx.tcx().def_path_str(node_item.item.def_id),
|
||||
obligation.predicate,
|
||||
);
|
||||
false
|
||||
}
|
||||
}
|
||||
}
|
||||
super::VtableParam(..) => {
|
||||
// This case tell us nothing about the value of an
|
||||
// associated type. Consider:
|
||||
|
@ -1964,7 +1964,6 @@ fn check_impl_items_against_trait<'tcx>(
|
||||
|
||||
// Locate trait definition and items
|
||||
let trait_def = tcx.trait_def(impl_trait_ref.def_id);
|
||||
let mut overridden_associated_type = None;
|
||||
|
||||
let impl_items = || impl_item_refs.iter().map(|iiref| tcx.hir().impl_item(iiref.id));
|
||||
|
||||
@ -2046,9 +2045,6 @@ fn check_impl_items_against_trait<'tcx>(
|
||||
hir::ImplItemKind::OpaqueTy(..) | hir::ImplItemKind::TyAlias(_) => {
|
||||
let opt_trait_span = tcx.hir().span_if_local(ty_trait_item.def_id);
|
||||
if ty_trait_item.kind == ty::AssocKind::Type {
|
||||
if ty_trait_item.defaultness.has_value() {
|
||||
overridden_associated_type = Some(impl_item);
|
||||
}
|
||||
compare_ty_impl(
|
||||
tcx,
|
||||
&ty_impl_item,
|
||||
@ -2082,8 +2078,6 @@ fn check_impl_items_against_trait<'tcx>(
|
||||
|
||||
// Check for missing items from trait
|
||||
let mut missing_items = Vec::new();
|
||||
let mut invalidated_items = Vec::new();
|
||||
let associated_type_overridden = overridden_associated_type.is_some();
|
||||
for trait_item in tcx.associated_items(impl_trait_ref.def_id).in_definition_order() {
|
||||
let is_implemented = trait_def
|
||||
.ancestors(tcx, impl_id)
|
||||
@ -2094,8 +2088,6 @@ fn check_impl_items_against_trait<'tcx>(
|
||||
if !is_implemented && !traits::impl_is_default(tcx, impl_id) {
|
||||
if !trait_item.defaultness.has_value() {
|
||||
missing_items.push(*trait_item);
|
||||
} else if associated_type_overridden {
|
||||
invalidated_items.push(trait_item.ident);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -2103,19 +2095,6 @@ fn check_impl_items_against_trait<'tcx>(
|
||||
if !missing_items.is_empty() {
|
||||
missing_items_err(tcx, impl_span, &missing_items, full_impl_span);
|
||||
}
|
||||
|
||||
if !invalidated_items.is_empty() {
|
||||
let invalidator = overridden_associated_type.unwrap();
|
||||
struct_span_err!(
|
||||
tcx.sess,
|
||||
invalidator.span,
|
||||
E0399,
|
||||
"the following trait items need to be reimplemented as `{}` was overridden: `{}`",
|
||||
invalidator.ident,
|
||||
invalidated_items.iter().map(|name| name.to_string()).collect::<Vec<_>>().join("`, `")
|
||||
)
|
||||
.emit();
|
||||
}
|
||||
}
|
||||
|
||||
fn missing_items_err(
|
||||
|
@ -1,3 +1,8 @@
|
||||
// check-pass
|
||||
|
||||
// Before RFC 2532, overriding one assoc. type default required overriding all
|
||||
// provided defaults.
|
||||
|
||||
#![feature(associated_type_defaults)]
|
||||
|
||||
pub trait Tr {
|
||||
@ -9,7 +14,6 @@ pub trait Tr {
|
||||
|
||||
impl Tr for () {
|
||||
type Assoc = ();
|
||||
//~^ ERROR need to be reimplemented as `Assoc` was overridden: `Assoc2`, `C`, `foo`
|
||||
}
|
||||
|
||||
fn main() {}
|
||||
|
@ -1,9 +0,0 @@
|
||||
error[E0399]: the following trait items need to be reimplemented as `Assoc` was overridden: `Assoc2`, `C`, `foo`
|
||||
--> $DIR/associated-types-overridden-default.rs:11:5
|
||||
|
|
||||
LL | type Assoc = ();
|
||||
| ^^^^^^^^^^^^^^^^
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
For more information about this error, try `rustc --explain E0399`.
|
35
src/test/ui/associated-types/defaults-cyclic-fail.rs
Normal file
35
src/test/ui/associated-types/defaults-cyclic-fail.rs
Normal file
@ -0,0 +1,35 @@
|
||||
#![feature(associated_type_defaults)]
|
||||
|
||||
// Having a cycle in assoc. type defaults is okay...
|
||||
trait Tr {
|
||||
type A = Self::B;
|
||||
type B = Self::A;
|
||||
}
|
||||
|
||||
// ...but is an error in any impl that doesn't override at least one of the defaults
|
||||
impl Tr for () {}
|
||||
//~^ ERROR overflow evaluating the requirement
|
||||
|
||||
// As soon as at least one is redefined, it works:
|
||||
impl Tr for u8 {
|
||||
type A = u8;
|
||||
}
|
||||
|
||||
impl Tr for u32 {
|
||||
type A = ();
|
||||
type B = u8;
|
||||
}
|
||||
|
||||
// ...but only if this actually breaks the cycle
|
||||
impl Tr for bool {
|
||||
//~^ ERROR overflow evaluating the requirement
|
||||
type A = Box<Self::B>;
|
||||
//~^ ERROR overflow evaluating the requirement
|
||||
}
|
||||
// (the error is shown twice for some reason)
|
||||
|
||||
fn main() {
|
||||
// Check that the overridden type propagates to the other
|
||||
let _a: <u8 as Tr>::A = 0u8;
|
||||
let _b: <u8 as Tr>::B = 0u8;
|
||||
}
|
21
src/test/ui/associated-types/defaults-cyclic-fail.stderr
Normal file
21
src/test/ui/associated-types/defaults-cyclic-fail.stderr
Normal file
@ -0,0 +1,21 @@
|
||||
error[E0275]: overflow evaluating the requirement `<() as Tr>::B`
|
||||
--> $DIR/defaults-cyclic-fail.rs:10:6
|
||||
|
|
||||
LL | impl Tr for () {}
|
||||
| ^^
|
||||
|
||||
error[E0275]: overflow evaluating the requirement `<bool as Tr>::B`
|
||||
--> $DIR/defaults-cyclic-fail.rs:24:6
|
||||
|
|
||||
LL | impl Tr for bool {
|
||||
| ^^
|
||||
|
||||
error[E0275]: overflow evaluating the requirement `<bool as Tr>::B`
|
||||
--> $DIR/defaults-cyclic-fail.rs:26:5
|
||||
|
|
||||
LL | type A = Box<Self::B>;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: aborting due to 3 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0275`.
|
22
src/test/ui/associated-types/defaults-cyclic-pass.rs
Normal file
22
src/test/ui/associated-types/defaults-cyclic-pass.rs
Normal file
@ -0,0 +1,22 @@
|
||||
// check-pass
|
||||
|
||||
#![feature(associated_type_defaults)]
|
||||
|
||||
trait Tr {
|
||||
type Item = u8;
|
||||
type Container = Vec<Self::Item>;
|
||||
}
|
||||
|
||||
impl Tr for () {}
|
||||
|
||||
impl Tr for u16 {
|
||||
type Item = u16;
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let _container: <() as Tr>::Container = Vec::<u8>::new();
|
||||
let _item: <() as Tr>::Item = 0u8;
|
||||
|
||||
let _container: <u16 as Tr>::Container = Vec::<u16>::new();
|
||||
let _item: <u16 as Tr>::Item = 0u16;
|
||||
}
|
@ -0,0 +1,50 @@
|
||||
#![feature(associated_type_defaults)]
|
||||
|
||||
// Associated type defaults may not be assumed inside the trait defining them.
|
||||
// ie. they only resolve to `<Self as Tr>::A`, not the actual type `()`
|
||||
trait Tr {
|
||||
type A = ();
|
||||
|
||||
fn f(p: Self::A) {
|
||||
let () = p;
|
||||
//~^ ERROR mismatched types
|
||||
//~| NOTE expected associated type, found `()`
|
||||
//~| NOTE expected associated type `<Self as Tr>::A`
|
||||
//~| NOTE consider constraining
|
||||
//~| NOTE for more information, visit
|
||||
}
|
||||
}
|
||||
|
||||
// An impl that doesn't override the type *can* assume the default.
|
||||
impl Tr for () {
|
||||
fn f(p: Self::A) {
|
||||
let () = p;
|
||||
}
|
||||
}
|
||||
|
||||
impl Tr for u8 {
|
||||
type A = ();
|
||||
|
||||
fn f(p: Self::A) {
|
||||
let () = p;
|
||||
}
|
||||
}
|
||||
|
||||
trait AssocConst {
|
||||
type Ty = u8;
|
||||
|
||||
// Assoc. consts also cannot assume that default types hold
|
||||
const C: Self::Ty = 0u8;
|
||||
//~^ ERROR mismatched types
|
||||
//~| NOTE expected associated type, found `u8`
|
||||
//~| NOTE expected associated type `<Self as AssocConst>::Ty`
|
||||
//~| NOTE consider constraining
|
||||
//~| NOTE for more information, visit
|
||||
}
|
||||
|
||||
// An impl can, however
|
||||
impl AssocConst for () {
|
||||
const C: Self::Ty = 0u8;
|
||||
}
|
||||
|
||||
fn main() {}
|
@ -0,0 +1,25 @@
|
||||
error[E0308]: mismatched types
|
||||
--> $DIR/defaults-in-other-trait-items.rs:9:13
|
||||
|
|
||||
LL | let () = p;
|
||||
| ^^ expected associated type, found `()`
|
||||
|
|
||||
= note: expected associated type `<Self as Tr>::A`
|
||||
found unit type `()`
|
||||
= note: consider constraining the associated type `<Self as Tr>::A` to `()` or calling a method that returns `<Self as Tr>::A`
|
||||
= note: for more information, visit https://doc.rust-lang.org/book/ch19-03-advanced-traits.html
|
||||
|
||||
error[E0308]: mismatched types
|
||||
--> $DIR/defaults-in-other-trait-items.rs:37:25
|
||||
|
|
||||
LL | const C: Self::Ty = 0u8;
|
||||
| ^^^ expected associated type, found `u8`
|
||||
|
|
||||
= note: expected associated type `<Self as AssocConst>::Ty`
|
||||
found type `u8`
|
||||
= note: consider constraining the associated type `<Self as AssocConst>::Ty` to `u8` or calling a method that returns `<Self as AssocConst>::Ty`
|
||||
= note: for more information, visit https://doc.rust-lang.org/book/ch19-03-advanced-traits.html
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0308`.
|
@ -23,8 +23,7 @@ mod priv_trait {
|
||||
<Pub as PrivTr>::CONST;
|
||||
//~^ ERROR associated constant `PrivTr::CONST` is private
|
||||
let _: <Pub as PrivTr>::AssocTy;
|
||||
//~^ ERROR trait `priv_trait::PrivTr` is private
|
||||
//~| ERROR trait `priv_trait::PrivTr` is private
|
||||
//~^ ERROR associated type `PrivTr::AssocTy` is private
|
||||
pub type InSignatureTy = <Pub as PrivTr>::AssocTy;
|
||||
//~^ ERROR trait `priv_trait::PrivTr` is private
|
||||
pub trait InSignatureTr: PrivTr {}
|
||||
@ -116,15 +115,11 @@ mod priv_parent_substs {
|
||||
<Priv as PubTr<_>>::CONST;
|
||||
//~^ ERROR type `priv_parent_substs::Priv` is private
|
||||
|
||||
let _: <Pub as PubTr>::AssocTy;
|
||||
//~^ ERROR type `priv_parent_substs::Priv` is private
|
||||
//~| ERROR type `priv_parent_substs::Priv` is private
|
||||
let _: <Pub as PubTr>::AssocTy; // FIXME no longer an error?!
|
||||
let _: <Pub as PubTr<_>>::AssocTy;
|
||||
//~^ ERROR type `priv_parent_substs::Priv` is private
|
||||
//~| ERROR type `priv_parent_substs::Priv` is private
|
||||
let _: <Priv as PubTr<_>>::AssocTy;
|
||||
//~^ ERROR type `priv_parent_substs::Priv` is private
|
||||
//~| ERROR type `priv_parent_substs::Priv` is private
|
||||
|
||||
pub type InSignatureTy1 = <Pub as PubTr>::AssocTy;
|
||||
//~^ ERROR type `priv_parent_substs::Priv` is private
|
||||
|
@ -42,18 +42,7 @@ LL | priv_trait::mac!();
|
||||
|
|
||||
= note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error: trait `priv_trait::PrivTr` is private
|
||||
--> $DIR/associated-item-privacy-trait.rs:25:13
|
||||
|
|
||||
LL | let _: <Pub as PrivTr>::AssocTy;
|
||||
| ^
|
||||
...
|
||||
LL | priv_trait::mac!();
|
||||
| ------------------- in this macro invocation
|
||||
|
|
||||
= note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error: trait `priv_trait::PrivTr` is private
|
||||
error: associated type `PrivTr::AssocTy` is private
|
||||
--> $DIR/associated-item-privacy-trait.rs:25:16
|
||||
|
|
||||
LL | let _: <Pub as PrivTr>::AssocTy;
|
||||
@ -65,7 +54,7 @@ LL | priv_trait::mac!();
|
||||
= note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error: trait `priv_trait::PrivTr` is private
|
||||
--> $DIR/associated-item-privacy-trait.rs:28:34
|
||||
--> $DIR/associated-item-privacy-trait.rs:27:34
|
||||
|
|
||||
LL | pub type InSignatureTy = <Pub as PrivTr>::AssocTy;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
@ -76,7 +65,7 @@ LL | priv_trait::mac!();
|
||||
= note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error: trait `priv_trait::PrivTr` is private
|
||||
--> $DIR/associated-item-privacy-trait.rs:30:34
|
||||
--> $DIR/associated-item-privacy-trait.rs:29:34
|
||||
|
|
||||
LL | pub trait InSignatureTr: PrivTr {}
|
||||
| ^^^^^^
|
||||
@ -87,7 +76,7 @@ LL | priv_trait::mac!();
|
||||
= note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error: trait `priv_trait::PrivTr` is private
|
||||
--> $DIR/associated-item-privacy-trait.rs:32:14
|
||||
--> $DIR/associated-item-privacy-trait.rs:31:14
|
||||
|
|
||||
LL | impl PrivTr for u8 {}
|
||||
| ^^^^^^
|
||||
@ -98,7 +87,7 @@ LL | priv_trait::mac!();
|
||||
= note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error: type `priv_signature::Priv` is private
|
||||
--> $DIR/associated-item-privacy-trait.rs:49:21
|
||||
--> $DIR/associated-item-privacy-trait.rs:48:21
|
||||
|
|
||||
LL | let value = <Pub as PubTr>::method;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^
|
||||
@ -109,7 +98,7 @@ LL | priv_signature::mac!();
|
||||
= note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error: type `priv_signature::Priv` is private
|
||||
--> $DIR/associated-item-privacy-trait.rs:51:9
|
||||
--> $DIR/associated-item-privacy-trait.rs:50:9
|
||||
|
|
||||
LL | value;
|
||||
| ^^^^^
|
||||
@ -120,7 +109,7 @@ LL | priv_signature::mac!();
|
||||
= note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error: type `priv_signature::Priv` is private
|
||||
--> $DIR/associated-item-privacy-trait.rs:53:13
|
||||
--> $DIR/associated-item-privacy-trait.rs:52:13
|
||||
|
|
||||
LL | Pub.method(loop {});
|
||||
| ^^^^^^
|
||||
@ -131,7 +120,7 @@ LL | priv_signature::mac!();
|
||||
= note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error: type `priv_substs::Priv` is private
|
||||
--> $DIR/associated-item-privacy-trait.rs:70:21
|
||||
--> $DIR/associated-item-privacy-trait.rs:69:21
|
||||
|
|
||||
LL | let value = <Pub as PubTr>::method::<Priv>;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
@ -142,7 +131,7 @@ LL | priv_substs::mac!();
|
||||
= note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error: type `priv_substs::Priv` is private
|
||||
--> $DIR/associated-item-privacy-trait.rs:72:9
|
||||
--> $DIR/associated-item-privacy-trait.rs:71:9
|
||||
|
|
||||
LL | value;
|
||||
| ^^^^^
|
||||
@ -153,7 +142,7 @@ LL | priv_substs::mac!();
|
||||
= note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error: type `priv_substs::Priv` is private
|
||||
--> $DIR/associated-item-privacy-trait.rs:74:9
|
||||
--> $DIR/associated-item-privacy-trait.rs:73:9
|
||||
|
|
||||
LL | Pub.method::<Priv>();
|
||||
| ^^^^^^^^^^^^^^^^^^^^
|
||||
@ -164,7 +153,7 @@ LL | priv_substs::mac!();
|
||||
= note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error: type `priv_parent_substs::Priv` is private
|
||||
--> $DIR/associated-item-privacy-trait.rs:94:21
|
||||
--> $DIR/associated-item-privacy-trait.rs:93:21
|
||||
|
|
||||
LL | let value = <Pub as PubTr>::method;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^
|
||||
@ -175,7 +164,7 @@ LL | priv_parent_substs::mac!();
|
||||
= note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error: type `priv_parent_substs::Priv` is private
|
||||
--> $DIR/associated-item-privacy-trait.rs:96:9
|
||||
--> $DIR/associated-item-privacy-trait.rs:95:9
|
||||
|
|
||||
LL | value;
|
||||
| ^^^^^
|
||||
@ -186,7 +175,7 @@ LL | priv_parent_substs::mac!();
|
||||
= note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error: type `priv_parent_substs::Priv` is private
|
||||
--> $DIR/associated-item-privacy-trait.rs:98:21
|
||||
--> $DIR/associated-item-privacy-trait.rs:97:21
|
||||
|
|
||||
LL | let value = <Pub as PubTr<_>>::method;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
@ -197,7 +186,7 @@ LL | priv_parent_substs::mac!();
|
||||
= note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error: type `priv_parent_substs::Priv` is private
|
||||
--> $DIR/associated-item-privacy-trait.rs:100:9
|
||||
--> $DIR/associated-item-privacy-trait.rs:99:9
|
||||
|
|
||||
LL | value;
|
||||
| ^^^^^
|
||||
@ -208,7 +197,7 @@ LL | priv_parent_substs::mac!();
|
||||
= note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error: type `priv_parent_substs::Priv` is private
|
||||
--> $DIR/associated-item-privacy-trait.rs:102:9
|
||||
--> $DIR/associated-item-privacy-trait.rs:101:9
|
||||
|
|
||||
LL | Pub.method();
|
||||
| ^^^^^^^^^^^^
|
||||
@ -219,7 +208,7 @@ LL | priv_parent_substs::mac!();
|
||||
= note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error: type `priv_parent_substs::Priv` is private
|
||||
--> $DIR/associated-item-privacy-trait.rs:105:21
|
||||
--> $DIR/associated-item-privacy-trait.rs:104:21
|
||||
|
|
||||
LL | let value = <Priv as PubTr<_>>::method;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
@ -230,7 +219,7 @@ LL | priv_parent_substs::mac!();
|
||||
= note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error: type `priv_parent_substs::Priv` is private
|
||||
--> $DIR/associated-item-privacy-trait.rs:107:9
|
||||
--> $DIR/associated-item-privacy-trait.rs:106:9
|
||||
|
|
||||
LL | value;
|
||||
| ^^^^^
|
||||
@ -241,7 +230,7 @@ LL | priv_parent_substs::mac!();
|
||||
= note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error: type `priv_parent_substs::Priv` is private
|
||||
--> $DIR/associated-item-privacy-trait.rs:109:9
|
||||
--> $DIR/associated-item-privacy-trait.rs:108:9
|
||||
|
|
||||
LL | Priv.method();
|
||||
| ^^^^^^^^^^^^^
|
||||
@ -252,7 +241,7 @@ LL | priv_parent_substs::mac!();
|
||||
= note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error: type `priv_parent_substs::Priv` is private
|
||||
--> $DIR/associated-item-privacy-trait.rs:112:9
|
||||
--> $DIR/associated-item-privacy-trait.rs:111:9
|
||||
|
|
||||
LL | <Pub as PubTr>::CONST;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^
|
||||
@ -263,7 +252,7 @@ LL | priv_parent_substs::mac!();
|
||||
= note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error: type `priv_parent_substs::Priv` is private
|
||||
--> $DIR/associated-item-privacy-trait.rs:114:9
|
||||
--> $DIR/associated-item-privacy-trait.rs:113:9
|
||||
|
|
||||
LL | <Pub as PubTr<_>>::CONST;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
@ -274,7 +263,7 @@ LL | priv_parent_substs::mac!();
|
||||
= note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error: type `priv_parent_substs::Priv` is private
|
||||
--> $DIR/associated-item-privacy-trait.rs:116:9
|
||||
--> $DIR/associated-item-privacy-trait.rs:115:9
|
||||
|
|
||||
LL | <Priv as PubTr<_>>::CONST;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
@ -285,29 +274,7 @@ LL | priv_parent_substs::mac!();
|
||||
= note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error: type `priv_parent_substs::Priv` is private
|
||||
--> $DIR/associated-item-privacy-trait.rs:119:13
|
||||
|
|
||||
LL | let _: <Pub as PubTr>::AssocTy;
|
||||
| ^
|
||||
...
|
||||
LL | priv_parent_substs::mac!();
|
||||
| --------------------------- in this macro invocation
|
||||
|
|
||||
= note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error: type `priv_parent_substs::Priv` is private
|
||||
--> $DIR/associated-item-privacy-trait.rs:119:16
|
||||
|
|
||||
LL | let _: <Pub as PubTr>::AssocTy;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^
|
||||
...
|
||||
LL | priv_parent_substs::mac!();
|
||||
| --------------------------- in this macro invocation
|
||||
|
|
||||
= note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error: type `priv_parent_substs::Priv` is private
|
||||
--> $DIR/associated-item-privacy-trait.rs:122:13
|
||||
--> $DIR/associated-item-privacy-trait.rs:119:30
|
||||
|
|
||||
LL | let _: <Pub as PubTr<_>>::AssocTy;
|
||||
| ^
|
||||
@ -318,21 +285,10 @@ LL | priv_parent_substs::mac!();
|
||||
= note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error: type `priv_parent_substs::Priv` is private
|
||||
--> $DIR/associated-item-privacy-trait.rs:122:16
|
||||
|
|
||||
LL | let _: <Pub as PubTr<_>>::AssocTy;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
...
|
||||
LL | priv_parent_substs::mac!();
|
||||
| --------------------------- in this macro invocation
|
||||
|
|
||||
= note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error: type `priv_parent_substs::Priv` is private
|
||||
--> $DIR/associated-item-privacy-trait.rs:125:13
|
||||
--> $DIR/associated-item-privacy-trait.rs:121:17
|
||||
|
|
||||
LL | let _: <Priv as PubTr<_>>::AssocTy;
|
||||
| ^
|
||||
| ^^^^
|
||||
...
|
||||
LL | priv_parent_substs::mac!();
|
||||
| --------------------------- in this macro invocation
|
||||
@ -340,18 +296,7 @@ LL | priv_parent_substs::mac!();
|
||||
= note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error: type `priv_parent_substs::Priv` is private
|
||||
--> $DIR/associated-item-privacy-trait.rs:125:16
|
||||
|
|
||||
LL | let _: <Priv as PubTr<_>>::AssocTy;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
...
|
||||
LL | priv_parent_substs::mac!();
|
||||
| --------------------------- in this macro invocation
|
||||
|
|
||||
= note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error: type `priv_parent_substs::Priv` is private
|
||||
--> $DIR/associated-item-privacy-trait.rs:129:35
|
||||
--> $DIR/associated-item-privacy-trait.rs:124:35
|
||||
|
|
||||
LL | pub type InSignatureTy1 = <Pub as PubTr>::AssocTy;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^
|
||||
@ -362,7 +307,7 @@ LL | priv_parent_substs::mac!();
|
||||
= note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error: type `priv_parent_substs::Priv` is private
|
||||
--> $DIR/associated-item-privacy-trait.rs:131:35
|
||||
--> $DIR/associated-item-privacy-trait.rs:126:35
|
||||
|
|
||||
LL | pub type InSignatureTy2 = <Priv as PubTr<Pub>>::AssocTy;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
@ -373,7 +318,7 @@ LL | priv_parent_substs::mac!();
|
||||
= note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error: type `priv_parent_substs::Priv` is private
|
||||
--> $DIR/associated-item-privacy-trait.rs:133:14
|
||||
--> $DIR/associated-item-privacy-trait.rs:128:14
|
||||
|
|
||||
LL | impl PubTr for u8 {}
|
||||
| ^^^^^
|
||||
@ -383,5 +328,5 @@ LL | priv_parent_substs::mac!();
|
||||
|
|
||||
= note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error: aborting due to 35 previous errors
|
||||
error: aborting due to 30 previous errors
|
||||
|
||||
|
@ -10,6 +10,11 @@ mod m {
|
||||
impl PrivTr for Priv {}
|
||||
pub trait PubTrAux1<T> {}
|
||||
pub trait PubTrAux2 { type A; }
|
||||
impl<T> PubTrAux1<T> for u8 {}
|
||||
impl PubTrAux2 for u8 {
|
||||
type A = Priv;
|
||||
//~^ ERROR private type `m::Priv` in public interface
|
||||
}
|
||||
|
||||
// "Private-in-public in associated types is hard error" in RFC 2145
|
||||
// applies only to the aliased types, not bounds.
|
||||
|
@ -1,5 +1,14 @@
|
||||
error[E0446]: private type `m::Priv` in public interface
|
||||
--> $DIR/private-in-public-assoc-ty.rs:15:9
|
||||
|
|
||||
LL | struct Priv;
|
||||
| - `m::Priv` declared as private
|
||||
...
|
||||
LL | type A = Priv;
|
||||
| ^^^^^^^^^^^^^^ can't leak private type
|
||||
|
||||
warning: private trait `m::PrivTr` in public interface (error E0445)
|
||||
--> $DIR/private-in-public-assoc-ty.rs:16:5
|
||||
--> $DIR/private-in-public-assoc-ty.rs:21:5
|
||||
|
|
||||
LL | / pub trait PubTr {
|
||||
LL | |
|
||||
@ -15,7 +24,7 @@ LL | | }
|
||||
= note: for more information, see issue #34537 <https://github.com/rust-lang/rust/issues/34537>
|
||||
|
||||
warning: private type `m::Priv` in public interface (error E0446)
|
||||
--> $DIR/private-in-public-assoc-ty.rs:16:5
|
||||
--> $DIR/private-in-public-assoc-ty.rs:21:5
|
||||
|
|
||||
LL | / pub trait PubTr {
|
||||
LL | |
|
||||
@ -30,7 +39,7 @@ LL | | }
|
||||
= note: for more information, see issue #34537 <https://github.com/rust-lang/rust/issues/34537>
|
||||
|
||||
warning: private type `m::Priv` in public interface (error E0446)
|
||||
--> $DIR/private-in-public-assoc-ty.rs:16:5
|
||||
--> $DIR/private-in-public-assoc-ty.rs:21:5
|
||||
|
|
||||
LL | / pub trait PubTr {
|
||||
LL | |
|
||||
@ -45,7 +54,7 @@ LL | | }
|
||||
= note: for more information, see issue #34537 <https://github.com/rust-lang/rust/issues/34537>
|
||||
|
||||
error[E0446]: private type `m::Priv` in public interface
|
||||
--> $DIR/private-in-public-assoc-ty.rs:27:9
|
||||
--> $DIR/private-in-public-assoc-ty.rs:32:9
|
||||
|
|
||||
LL | struct Priv;
|
||||
| - `m::Priv` declared as private
|
||||
@ -54,7 +63,7 @@ LL | type Alias4 = Priv;
|
||||
| ^^^^^^^^^^^^^^^^^^^ can't leak private type
|
||||
|
||||
error[E0446]: private type `m::Priv` in public interface
|
||||
--> $DIR/private-in-public-assoc-ty.rs:34:9
|
||||
--> $DIR/private-in-public-assoc-ty.rs:39:9
|
||||
|
|
||||
LL | struct Priv;
|
||||
| - `m::Priv` declared as private
|
||||
@ -63,7 +72,7 @@ LL | type Alias1 = Priv;
|
||||
| ^^^^^^^^^^^^^^^^^^^ can't leak private type
|
||||
|
||||
error[E0445]: private trait `m::PrivTr` in public interface
|
||||
--> $DIR/private-in-public-assoc-ty.rs:37:9
|
||||
--> $DIR/private-in-public-assoc-ty.rs:42:9
|
||||
|
|
||||
LL | trait PrivTr {}
|
||||
| - `m::PrivTr` declared as private
|
||||
@ -72,7 +81,7 @@ LL | type Exist = impl PrivTr;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^ can't leak private trait
|
||||
|
||||
error[E0445]: private trait `m::PrivTr` in public interface
|
||||
--> $DIR/private-in-public-assoc-ty.rs:37:9
|
||||
--> $DIR/private-in-public-assoc-ty.rs:42:9
|
||||
|
|
||||
LL | trait PrivTr {}
|
||||
| - `m::PrivTr` declared as private
|
||||
@ -80,7 +89,7 @@ LL | trait PrivTr {}
|
||||
LL | type Exist = impl PrivTr;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^ can't leak private trait
|
||||
|
||||
error: aborting due to 4 previous errors
|
||||
error: aborting due to 5 previous errors
|
||||
|
||||
Some errors have detailed explanations: E0445, E0446.
|
||||
For more information about an error, try `rustc --explain E0445`.
|
||||
|
@ -35,7 +35,7 @@ fn main() {
|
||||
<u8 as A>::N::NN; //~ ERROR cannot find associated type `N` in `A`
|
||||
let _: <u8 as Tr>::Y::NN; //~ ERROR ambiguous associated type
|
||||
let _: <u8 as E>::Y::NN; //~ ERROR expected associated type, found variant `E::Y`
|
||||
<u8 as Tr>::Y::NN; //~ ERROR no associated item named `NN` found
|
||||
<u8 as Tr>::Y::NN; //~ ERROR no associated item named `NN` found for type `u16`
|
||||
<u8 as E>::Y::NN; //~ ERROR expected associated type, found variant `E::Y`
|
||||
|
||||
let _: <u8 as Tr::N>::NN; //~ ERROR cannot find associated type `NN` in `Tr::N`
|
||||
@ -52,5 +52,5 @@ fn main() {
|
||||
let _: <u8 as Dr>::Z; //~ ERROR expected associated type, found method `Dr::Z`
|
||||
<u8 as Dr>::X; //~ ERROR expected method or associated constant, found associated type `Dr::X`
|
||||
let _: <u8 as Dr>::Z::N; //~ ERROR expected associated type, found method `Dr::Z`
|
||||
<u8 as Dr>::X::N; //~ ERROR no associated item named `N` found
|
||||
<u8 as Dr>::X::N; //~ ERROR no associated item named `N` found for type `u16`
|
||||
}
|
||||
|
@ -205,19 +205,19 @@ error[E0223]: ambiguous associated type
|
||||
--> $DIR/ufcs-partially-resolved.rs:36:12
|
||||
|
|
||||
LL | let _: <u8 as Tr>::Y::NN;
|
||||
| ^^^^^^^^^^^^^^^^^ help: use fully-qualified syntax: `<<u8 as Tr>::Y as Trait>::NN`
|
||||
| ^^^^^^^^^^^^^^^^^ help: use fully-qualified syntax: `<u16 as Trait>::NN`
|
||||
|
||||
error[E0599]: no associated item named `NN` found for associated type `<u8 as Tr>::Y` in the current scope
|
||||
error[E0599]: no associated item named `NN` found for type `u16` in the current scope
|
||||
--> $DIR/ufcs-partially-resolved.rs:38:20
|
||||
|
|
||||
LL | <u8 as Tr>::Y::NN;
|
||||
| ^^ associated item not found in `<u8 as Tr>::Y`
|
||||
| ^^ associated item not found in `u16`
|
||||
|
||||
error[E0599]: no associated item named `N` found for associated type `<u8 as Dr>::X` in the current scope
|
||||
error[E0599]: no associated item named `N` found for type `u16` in the current scope
|
||||
--> $DIR/ufcs-partially-resolved.rs:55:20
|
||||
|
|
||||
LL | <u8 as Dr>::X::N;
|
||||
| ^ associated item not found in `<u8 as Dr>::X`
|
||||
| ^ associated item not found in `u16`
|
||||
|
||||
error: aborting due to 32 previous errors
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user