Implement use
associated items of traits
This commit is contained in:
parent
4e5fec2f1e
commit
5079acc060
21 changed files with 374 additions and 42 deletions
|
@ -1,19 +1,19 @@
|
||||||
Attempt was made to import an unimportable value. This can happen when trying
|
Attempt was made to import an unimportable type. This can happen when trying
|
||||||
to import a method from a trait.
|
to import a type from a trait.
|
||||||
|
|
||||||
Erroneous code example:
|
Erroneous code example:
|
||||||
|
|
||||||
```compile_fail,E0253
|
```compile_fail,E0253
|
||||||
mod foo {
|
mod foo {
|
||||||
pub trait MyTrait {
|
pub trait MyTrait {
|
||||||
fn do_something();
|
type SomeType;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
use foo::MyTrait::do_something;
|
use foo::MyTrait::SomeType;
|
||||||
// error: `do_something` is not directly importable
|
// error: `SomeType` is not directly importable
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
```
|
```
|
||||||
|
|
||||||
It's invalid to directly import methods belonging to a trait or concrete type.
|
It's invalid to directly import types belonging to a trait.
|
||||||
|
|
|
@ -519,6 +519,8 @@ declare_features! (
|
||||||
(unstable, impl_trait_in_bindings, "1.64.0", Some(63065)),
|
(unstable, impl_trait_in_bindings, "1.64.0", Some(63065)),
|
||||||
/// Allows `impl Trait` as output type in `Fn` traits in return position of functions.
|
/// Allows `impl Trait` as output type in `Fn` traits in return position of functions.
|
||||||
(unstable, impl_trait_in_fn_trait_return, "1.64.0", Some(99697)),
|
(unstable, impl_trait_in_fn_trait_return, "1.64.0", Some(99697)),
|
||||||
|
/// Allows `use` associated functions from traits.
|
||||||
|
(unstable, import_trait_associated_functions, "CURRENT_RUSTC_VERSION", Some(134691)),
|
||||||
/// Allows associated types in inherent impls.
|
/// Allows associated types in inherent impls.
|
||||||
(incomplete, inherent_associated_types, "1.52.0", Some(8995)),
|
(incomplete, inherent_associated_types, "1.52.0", Some(8995)),
|
||||||
/// Allow anonymous constants from an inline `const` block in pattern position
|
/// Allow anonymous constants from an inline `const` block in pattern position
|
||||||
|
|
|
@ -1183,7 +1183,11 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
|
||||||
let in_module_is_extern = !in_module.def_id().is_local();
|
let in_module_is_extern = !in_module.def_id().is_local();
|
||||||
in_module.for_each_child(self, |this, ident, ns, name_binding| {
|
in_module.for_each_child(self, |this, ident, ns, name_binding| {
|
||||||
// avoid non-importable candidates
|
// avoid non-importable candidates
|
||||||
if !name_binding.is_importable() {
|
if !name_binding.is_importable()
|
||||||
|
// FIXME(import_trait_associated_functions): remove this when `import_trait_associated_functions` is stable
|
||||||
|
|| name_binding.is_assoc_const_or_fn()
|
||||||
|
&& !this.tcx.features().import_trait_associated_functions()
|
||||||
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -17,9 +17,10 @@ use rustc_session::lint::builtin::{
|
||||||
AMBIGUOUS_GLOB_REEXPORTS, HIDDEN_GLOB_REEXPORTS, PUB_USE_OF_PRIVATE_EXTERN_CRATE,
|
AMBIGUOUS_GLOB_REEXPORTS, HIDDEN_GLOB_REEXPORTS, PUB_USE_OF_PRIVATE_EXTERN_CRATE,
|
||||||
REDUNDANT_IMPORTS, UNUSED_IMPORTS,
|
REDUNDANT_IMPORTS, UNUSED_IMPORTS,
|
||||||
};
|
};
|
||||||
|
use rustc_session::parse::feature_err;
|
||||||
use rustc_span::edit_distance::find_best_match_for_name;
|
use rustc_span::edit_distance::find_best_match_for_name;
|
||||||
use rustc_span::hygiene::LocalExpnId;
|
use rustc_span::hygiene::LocalExpnId;
|
||||||
use rustc_span::{Ident, Span, Symbol, kw};
|
use rustc_span::{Ident, Span, Symbol, kw, sym};
|
||||||
use smallvec::SmallVec;
|
use smallvec::SmallVec;
|
||||||
use tracing::debug;
|
use tracing::debug;
|
||||||
|
|
||||||
|
@ -829,6 +830,17 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
|
||||||
// Don't update the resolution, because it was never added.
|
// Don't update the resolution, because it was never added.
|
||||||
Err(Determined) if target.name == kw::Underscore => {}
|
Err(Determined) if target.name == kw::Underscore => {}
|
||||||
Ok(binding) if binding.is_importable() => {
|
Ok(binding) if binding.is_importable() => {
|
||||||
|
if binding.is_assoc_const_or_fn()
|
||||||
|
&& !this.tcx.features().import_trait_associated_functions()
|
||||||
|
{
|
||||||
|
feature_err(
|
||||||
|
this.tcx.sess,
|
||||||
|
sym::import_trait_associated_functions,
|
||||||
|
import.span,
|
||||||
|
"`use` associated items of traits is unstable",
|
||||||
|
)
|
||||||
|
.emit();
|
||||||
|
}
|
||||||
let imported_binding = this.import(binding, import);
|
let imported_binding = this.import(binding, import);
|
||||||
target_bindings[ns].set(Some(imported_binding));
|
target_bindings[ns].set(Some(imported_binding));
|
||||||
this.define(parent, target, ns, imported_binding);
|
this.define(parent, target, ns, imported_binding);
|
||||||
|
|
|
@ -920,10 +920,13 @@ impl<'ra> NameBindingData<'ra> {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn is_importable(&self) -> bool {
|
fn is_importable(&self) -> bool {
|
||||||
!matches!(
|
!matches!(self.res(), Res::Def(DefKind::AssocTy, _))
|
||||||
self.res(),
|
}
|
||||||
Res::Def(DefKind::AssocConst | DefKind::AssocFn | DefKind::AssocTy, _)
|
|
||||||
)
|
// FIXME(import_trait_associated_functions): associate `const` or `fn` are not importable unless
|
||||||
|
// the feature `import_trait_associated_functions` is enable
|
||||||
|
fn is_assoc_const_or_fn(&self) -> bool {
|
||||||
|
matches!(self.res(), Res::Def(DefKind::AssocConst | DefKind::AssocFn, _))
|
||||||
}
|
}
|
||||||
|
|
||||||
fn macro_kind(&self) -> Option<MacroKind> {
|
fn macro_kind(&self) -> Option<MacroKind> {
|
||||||
|
|
|
@ -1093,6 +1093,7 @@ symbols! {
|
||||||
import,
|
import,
|
||||||
import_name_type,
|
import_name_type,
|
||||||
import_shadowing,
|
import_shadowing,
|
||||||
|
import_trait_associated_functions,
|
||||||
imported_main,
|
imported_main,
|
||||||
in_band_lifetimes,
|
in_band_lifetimes,
|
||||||
include,
|
include,
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
mod foo {
|
mod foo {
|
||||||
pub trait MyTrait {
|
pub trait MyTrait {
|
||||||
fn do_something();
|
type SomeType;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
use foo::MyTrait::do_something;
|
use foo::MyTrait::SomeType;
|
||||||
//~^ ERROR E0253
|
//~^ ERROR E0253
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
error[E0253]: `do_something` is not directly importable
|
error[E0253]: `SomeType` is not directly importable
|
||||||
--> $DIR/E0253.rs:7:5
|
--> $DIR/E0253.rs:7:5
|
||||||
|
|
|
|
||||||
LL | use foo::MyTrait::do_something;
|
LL | use foo::MyTrait::SomeType;
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ cannot be imported directly
|
| ^^^^^^^^^^^^^^^^^^^^^^ cannot be imported directly
|
||||||
|
|
||||||
error: aborting due to 1 previous error
|
error: aborting due to 1 previous error
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,63 @@
|
||||||
|
//@ edition:2018
|
||||||
|
use std::collections::HashMap;
|
||||||
|
|
||||||
|
use A::{DEFAULT, new};
|
||||||
|
//~^ ERROR `use` associated items of traits is unstable [E0658]
|
||||||
|
//~| ERROR `use` associated items of traits is unstable [E0658]
|
||||||
|
use Default::default;
|
||||||
|
//~^ ERROR `use` associated items of traits is unstable [E0658]
|
||||||
|
|
||||||
|
struct S {
|
||||||
|
a: HashMap<i32, i32>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl S {
|
||||||
|
fn new() -> S {
|
||||||
|
S { a: default() }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
trait A: Sized {
|
||||||
|
const DEFAULT: Option<Self> = None;
|
||||||
|
fn new() -> Self;
|
||||||
|
fn do_something(&self);
|
||||||
|
}
|
||||||
|
|
||||||
|
mod b {
|
||||||
|
use super::A::{self, DEFAULT, new};
|
||||||
|
//~^ ERROR `use` associated items of traits is unstable [E0658]
|
||||||
|
//~| ERROR `use` associated items of traits is unstable [E0658]
|
||||||
|
|
||||||
|
struct B();
|
||||||
|
|
||||||
|
impl A for B {
|
||||||
|
const DEFAULT: Option<Self> = Some(B());
|
||||||
|
fn new() -> Self {
|
||||||
|
B()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn do_something(&self) {}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn f() {
|
||||||
|
let b: B = new();
|
||||||
|
b.do_something();
|
||||||
|
let c: B = DEFAULT.unwrap();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl A for S {
|
||||||
|
fn new() -> Self {
|
||||||
|
S::new()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn do_something(&self) {}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn f() {
|
||||||
|
let s: S = new();
|
||||||
|
s.do_something();
|
||||||
|
let t: Option<S> = DEFAULT;
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {}
|
|
@ -0,0 +1,53 @@
|
||||||
|
error[E0658]: `use` associated items of traits is unstable
|
||||||
|
--> $DIR/feature-gate-import-trait-associated-functions.rs:4:9
|
||||||
|
|
|
||||||
|
LL | use A::{DEFAULT, new};
|
||||||
|
| ^^^^^^^
|
||||||
|
|
|
||||||
|
= note: see issue #134691 <https://github.com/rust-lang/rust/issues/134691> for more information
|
||||||
|
= help: add `#![feature(import_trait_associated_functions)]` to the crate attributes to enable
|
||||||
|
= note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date
|
||||||
|
|
||||||
|
error[E0658]: `use` associated items of traits is unstable
|
||||||
|
--> $DIR/feature-gate-import-trait-associated-functions.rs:4:18
|
||||||
|
|
|
||||||
|
LL | use A::{DEFAULT, new};
|
||||||
|
| ^^^
|
||||||
|
|
|
||||||
|
= note: see issue #134691 <https://github.com/rust-lang/rust/issues/134691> for more information
|
||||||
|
= help: add `#![feature(import_trait_associated_functions)]` to the crate attributes to enable
|
||||||
|
= note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date
|
||||||
|
|
||||||
|
error[E0658]: `use` associated items of traits is unstable
|
||||||
|
--> $DIR/feature-gate-import-trait-associated-functions.rs:7:5
|
||||||
|
|
|
||||||
|
LL | use Default::default;
|
||||||
|
| ^^^^^^^^^^^^^^^^
|
||||||
|
|
|
||||||
|
= note: see issue #134691 <https://github.com/rust-lang/rust/issues/134691> for more information
|
||||||
|
= help: add `#![feature(import_trait_associated_functions)]` to the crate attributes to enable
|
||||||
|
= note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date
|
||||||
|
|
||||||
|
error[E0658]: `use` associated items of traits is unstable
|
||||||
|
--> $DIR/feature-gate-import-trait-associated-functions.rs:27:26
|
||||||
|
|
|
||||||
|
LL | use super::A::{self, DEFAULT, new};
|
||||||
|
| ^^^^^^^
|
||||||
|
|
|
||||||
|
= note: see issue #134691 <https://github.com/rust-lang/rust/issues/134691> for more information
|
||||||
|
= help: add `#![feature(import_trait_associated_functions)]` to the crate attributes to enable
|
||||||
|
= note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date
|
||||||
|
|
||||||
|
error[E0658]: `use` associated items of traits is unstable
|
||||||
|
--> $DIR/feature-gate-import-trait-associated-functions.rs:27:35
|
||||||
|
|
|
||||||
|
LL | use super::A::{self, DEFAULT, new};
|
||||||
|
| ^^^
|
||||||
|
|
|
||||||
|
= note: see issue #134691 <https://github.com/rust-lang/rust/issues/134691> for more information
|
||||||
|
= help: add `#![feature(import_trait_associated_functions)]` to the crate attributes to enable
|
||||||
|
= note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date
|
||||||
|
|
||||||
|
error: aborting due to 5 previous errors
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0658`.
|
|
@ -2,6 +2,6 @@ trait Foo {
|
||||||
fn foo();
|
fn foo();
|
||||||
}
|
}
|
||||||
|
|
||||||
use Foo::foo; //~ ERROR not directly importable
|
use Foo::foo; //~ ERROR `use` associated items of traits is unstable [E0658]
|
||||||
|
|
||||||
fn main() { foo(); }
|
fn main() { foo(); } //~ ERROR type annotations needed
|
||||||
|
|
|
@ -1,9 +1,22 @@
|
||||||
error[E0253]: `foo` is not directly importable
|
error[E0658]: `use` associated items of traits is unstable
|
||||||
--> $DIR/import-trait-method.rs:5:5
|
--> $DIR/import-trait-method.rs:5:5
|
||||||
|
|
|
|
||||||
LL | use Foo::foo;
|
LL | use Foo::foo;
|
||||||
| ^^^^^^^^ cannot be imported directly
|
| ^^^^^^^^
|
||||||
|
|
|
||||||
|
= note: see issue #134691 <https://github.com/rust-lang/rust/issues/134691> for more information
|
||||||
|
= help: add `#![feature(import_trait_associated_functions)]` to the crate attributes to enable
|
||||||
|
= note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date
|
||||||
|
|
||||||
error: aborting due to 1 previous error
|
error[E0283]: type annotations needed
|
||||||
|
--> $DIR/import-trait-method.rs:7:13
|
||||||
|
|
|
||||||
|
LL | fn main() { foo(); }
|
||||||
|
| ^^^^^ cannot infer type
|
||||||
|
|
|
||||||
|
= note: cannot satisfy `_: Foo`
|
||||||
|
|
||||||
For more information about this error, try `rustc --explain E0253`.
|
error: aborting due to 2 previous errors
|
||||||
|
|
||||||
|
Some errors have detailed explanations: E0283, E0658.
|
||||||
|
For more information about an error, try `rustc --explain E0283`.
|
||||||
|
|
|
@ -0,0 +1,39 @@
|
||||||
|
error[E0425]: cannot find function `cmp` in this scope
|
||||||
|
--> $DIR/fn-to-method.rs:12:13
|
||||||
|
|
|
||||||
|
LL | let x = cmp(&1, &2);
|
||||||
|
| ^^^ not found in this scope
|
||||||
|
|
|
||||||
|
help: consider importing one of these associated functions
|
||||||
|
|
|
||||||
|
LL + use std::cmp::Ord::cmp;
|
||||||
|
|
|
||||||
|
LL + use std::iter::Iterator::cmp;
|
||||||
|
|
|
||||||
|
|
||||||
|
error[E0425]: cannot find function `len` in this scope
|
||||||
|
--> $DIR/fn-to-method.rs:16:13
|
||||||
|
|
|
||||||
|
LL | let y = len([1, 2, 3]);
|
||||||
|
| ^^^ not found in this scope
|
||||||
|
|
|
||||||
|
help: consider importing this associated function
|
||||||
|
|
|
||||||
|
LL + use std::iter::ExactSizeIterator::len;
|
||||||
|
|
|
||||||
|
|
||||||
|
error[E0425]: cannot find function `bar` in this scope
|
||||||
|
--> $DIR/fn-to-method.rs:20:13
|
||||||
|
|
|
||||||
|
LL | let z = bar(Foo);
|
||||||
|
| ^^^ not found in this scope
|
||||||
|
|
|
||||||
|
help: use the `.` operator to call the method `bar` on `Foo`
|
||||||
|
|
|
||||||
|
LL - let z = bar(Foo);
|
||||||
|
LL + let z = Foo.bar();
|
||||||
|
|
|
||||||
|
|
||||||
|
error: aborting due to 3 previous errors
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0425`.
|
|
@ -1,5 +1,5 @@
|
||||||
error[E0425]: cannot find function `cmp` in this scope
|
error[E0425]: cannot find function `cmp` in this scope
|
||||||
--> $DIR/fn-to-method.rs:8:13
|
--> $DIR/fn-to-method.rs:12:13
|
||||||
|
|
|
|
||||||
LL | let x = cmp(&1, &2);
|
LL | let x = cmp(&1, &2);
|
||||||
| ^^^ not found in this scope
|
| ^^^ not found in this scope
|
||||||
|
@ -10,7 +10,7 @@ LL | let x = (&1).cmp(&2);
|
||||||
| ~ ~~~~~~~~~
|
| ~ ~~~~~~~~~
|
||||||
|
|
||||||
error[E0425]: cannot find function `len` in this scope
|
error[E0425]: cannot find function `len` in this scope
|
||||||
--> $DIR/fn-to-method.rs:12:13
|
--> $DIR/fn-to-method.rs:16:13
|
||||||
|
|
|
|
||||||
LL | let y = len([1, 2, 3]);
|
LL | let y = len([1, 2, 3]);
|
||||||
| ^^^ not found in this scope
|
| ^^^ not found in this scope
|
||||||
|
@ -22,7 +22,7 @@ LL + let y = [1, 2, 3].len();
|
||||||
|
|
|
|
||||||
|
|
||||||
error[E0425]: cannot find function `bar` in this scope
|
error[E0425]: cannot find function `bar` in this scope
|
||||||
--> $DIR/fn-to-method.rs:16:13
|
--> $DIR/fn-to-method.rs:20:13
|
||||||
|
|
|
|
||||||
LL | let z = bar(Foo);
|
LL | let z = bar(Foo);
|
||||||
| ^^^ not found in this scope
|
| ^^^ not found in this scope
|
|
@ -1,4 +1,8 @@
|
||||||
|
//@ revisions: normal import_trait_associated_functions
|
||||||
|
#![cfg_attr(import_trait_associated_functions, feature(import_trait_associated_functions))]
|
||||||
struct Foo;
|
struct Foo;
|
||||||
|
//[import_trait_associated_functions]~^ HELP consider importing one of these associated functions
|
||||||
|
//[import_trait_associated_functions]~| HELP consider importing this associated function
|
||||||
|
|
||||||
impl Foo {
|
impl Foo {
|
||||||
fn bar(self) {}
|
fn bar(self) {}
|
||||||
|
@ -7,11 +11,11 @@ impl Foo {
|
||||||
fn main() {
|
fn main() {
|
||||||
let x = cmp(&1, &2);
|
let x = cmp(&1, &2);
|
||||||
//~^ ERROR cannot find function `cmp` in this scope
|
//~^ ERROR cannot find function `cmp` in this scope
|
||||||
//~| HELP use the `.` operator to call the method `Ord::cmp` on `&{integer}`
|
//[normal]~| HELP use the `.` operator to call the method `Ord::cmp` on `&{integer}`
|
||||||
|
|
||||||
let y = len([1, 2, 3]);
|
let y = len([1, 2, 3]);
|
||||||
//~^ ERROR cannot find function `len` in this scope
|
//~^ ERROR cannot find function `len` in this scope
|
||||||
//~| HELP use the `.` operator to call the method `len` on `&[{integer}]`
|
//[normal]~| HELP use the `.` operator to call the method `len` on `&[{integer}]`
|
||||||
|
|
||||||
let z = bar(Foo);
|
let z = bar(Foo);
|
||||||
//~^ ERROR cannot find function `bar` in this scope
|
//~^ ERROR cannot find function `bar` in this scope
|
||||||
|
|
61
tests/ui/use/import_trait_associated_functions-2015.rs
Normal file
61
tests/ui/use/import_trait_associated_functions-2015.rs
Normal file
|
@ -0,0 +1,61 @@
|
||||||
|
//@ edition:2015
|
||||||
|
//@ check-pass
|
||||||
|
#![feature(import_trait_associated_functions)]
|
||||||
|
|
||||||
|
use std::collections::HashMap;
|
||||||
|
|
||||||
|
use A::{DEFAULT, new};
|
||||||
|
use std::default::Default::default;
|
||||||
|
|
||||||
|
struct S {
|
||||||
|
a: HashMap<i32, i32>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl S {
|
||||||
|
fn new() -> S {
|
||||||
|
S { a: default() }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
trait A: Sized {
|
||||||
|
const DEFAULT: Option<Self> = None;
|
||||||
|
fn new() -> Self;
|
||||||
|
fn do_something(&self);
|
||||||
|
}
|
||||||
|
|
||||||
|
mod b {
|
||||||
|
use super::A::{self, DEFAULT, new};
|
||||||
|
|
||||||
|
struct B();
|
||||||
|
|
||||||
|
impl A for B {
|
||||||
|
const DEFAULT: Option<Self> = Some(B());
|
||||||
|
fn new() -> Self {
|
||||||
|
B()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn do_something(&self) {}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn f() {
|
||||||
|
let b: B = new();
|
||||||
|
b.do_something();
|
||||||
|
let c: B = DEFAULT.unwrap();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl A for S {
|
||||||
|
fn new() -> Self {
|
||||||
|
S::new()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn do_something(&self) {}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn f() {
|
||||||
|
let s: S = new();
|
||||||
|
s.do_something();
|
||||||
|
let t: Option<S> = DEFAULT;
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {}
|
61
tests/ui/use/import_trait_associated_functions.rs
Normal file
61
tests/ui/use/import_trait_associated_functions.rs
Normal file
|
@ -0,0 +1,61 @@
|
||||||
|
//@ edition:2018
|
||||||
|
//@ check-pass
|
||||||
|
#![feature(import_trait_associated_functions)]
|
||||||
|
|
||||||
|
use std::collections::HashMap;
|
||||||
|
|
||||||
|
use A::{DEFAULT, new};
|
||||||
|
use Default::default;
|
||||||
|
|
||||||
|
struct S {
|
||||||
|
a: HashMap<i32, i32>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl S {
|
||||||
|
fn new() -> S {
|
||||||
|
S { a: default() }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
trait A: Sized {
|
||||||
|
const DEFAULT: Option<Self> = None;
|
||||||
|
fn new() -> Self;
|
||||||
|
fn do_something(&self);
|
||||||
|
}
|
||||||
|
|
||||||
|
mod b {
|
||||||
|
use super::A::{self, DEFAULT, new};
|
||||||
|
|
||||||
|
struct B();
|
||||||
|
|
||||||
|
impl A for B {
|
||||||
|
const DEFAULT: Option<Self> = Some(B());
|
||||||
|
fn new() -> Self {
|
||||||
|
B()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn do_something(&self) {}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn f() {
|
||||||
|
let b: B = new();
|
||||||
|
b.do_something();
|
||||||
|
let c: B = DEFAULT.unwrap();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl A for S {
|
||||||
|
fn new() -> Self {
|
||||||
|
S::new()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn do_something(&self) {}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn f() {
|
||||||
|
let s: S = new();
|
||||||
|
s.do_something();
|
||||||
|
let t: Option<S> = DEFAULT;
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {}
|
|
@ -3,13 +3,13 @@
|
||||||
extern crate use_from_trait_xc;
|
extern crate use_from_trait_xc;
|
||||||
|
|
||||||
use use_from_trait_xc::Trait::foo;
|
use use_from_trait_xc::Trait::foo;
|
||||||
//~^ ERROR `foo` is not directly importable
|
//~^ ERROR `use` associated items of traits is unstable [E0658]
|
||||||
|
|
||||||
use use_from_trait_xc::Trait::Assoc;
|
use use_from_trait_xc::Trait::Assoc;
|
||||||
//~^ ERROR `Assoc` is not directly importable
|
//~^ ERROR `Assoc` is not directly importable
|
||||||
|
|
||||||
use use_from_trait_xc::Trait::CONST;
|
use use_from_trait_xc::Trait::CONST;
|
||||||
//~^ ERROR `CONST` is not directly importable
|
//~^ ERROR `use` associated items of traits is unstable [E0658]
|
||||||
|
|
||||||
use use_from_trait_xc::Foo::new; //~ ERROR struct `Foo` is private
|
use use_from_trait_xc::Foo::new; //~ ERROR struct `Foo` is private
|
||||||
//~^ ERROR unresolved import `use_from_trait_xc::Foo`
|
//~^ ERROR unresolved import `use_from_trait_xc::Foo`
|
||||||
|
|
|
@ -1,8 +1,12 @@
|
||||||
error[E0253]: `foo` is not directly importable
|
error[E0658]: `use` associated items of traits is unstable
|
||||||
--> $DIR/use-from-trait-xc.rs:5:5
|
--> $DIR/use-from-trait-xc.rs:5:5
|
||||||
|
|
|
|
||||||
LL | use use_from_trait_xc::Trait::foo;
|
LL | use use_from_trait_xc::Trait::foo;
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ cannot be imported directly
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
|
||||||
|
= note: see issue #134691 <https://github.com/rust-lang/rust/issues/134691> for more information
|
||||||
|
= help: add `#![feature(import_trait_associated_functions)]` to the crate attributes to enable
|
||||||
|
= note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date
|
||||||
|
|
||||||
error[E0253]: `Assoc` is not directly importable
|
error[E0253]: `Assoc` is not directly importable
|
||||||
--> $DIR/use-from-trait-xc.rs:8:5
|
--> $DIR/use-from-trait-xc.rs:8:5
|
||||||
|
@ -10,11 +14,15 @@ error[E0253]: `Assoc` is not directly importable
|
||||||
LL | use use_from_trait_xc::Trait::Assoc;
|
LL | use use_from_trait_xc::Trait::Assoc;
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ cannot be imported directly
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ cannot be imported directly
|
||||||
|
|
||||||
error[E0253]: `CONST` is not directly importable
|
error[E0658]: `use` associated items of traits is unstable
|
||||||
--> $DIR/use-from-trait-xc.rs:11:5
|
--> $DIR/use-from-trait-xc.rs:11:5
|
||||||
|
|
|
|
||||||
LL | use use_from_trait_xc::Trait::CONST;
|
LL | use use_from_trait_xc::Trait::CONST;
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ cannot be imported directly
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
|
||||||
|
= note: see issue #134691 <https://github.com/rust-lang/rust/issues/134691> for more information
|
||||||
|
= help: add `#![feature(import_trait_associated_functions)]` to the crate attributes to enable
|
||||||
|
= note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date
|
||||||
|
|
||||||
error[E0432]: unresolved import `use_from_trait_xc::Foo`
|
error[E0432]: unresolved import `use_from_trait_xc::Foo`
|
||||||
--> $DIR/use-from-trait-xc.rs:14:24
|
--> $DIR/use-from-trait-xc.rs:14:24
|
||||||
|
@ -66,5 +74,5 @@ LL | struct Foo;
|
||||||
|
|
||||||
error: aborting due to 9 previous errors
|
error: aborting due to 9 previous errors
|
||||||
|
|
||||||
Some errors have detailed explanations: E0253, E0432, E0603.
|
Some errors have detailed explanations: E0253, E0432, E0603, E0658.
|
||||||
For more information about an error, try `rustc --explain E0253`.
|
For more information about an error, try `rustc --explain E0253`.
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
use Trait::foo; //~ ERROR `foo` is not directly importable
|
use Trait::foo; //~ ERROR `use` associated items of traits is unstable [E0658]
|
||||||
use Trait::Assoc; //~ ERROR `Assoc` is not directly importable
|
use Trait::Assoc; //~ ERROR `Assoc` is not directly importable
|
||||||
use Trait::C; //~ ERROR `C` is not directly importable
|
use Trait::C; //~ ERROR `use` associated items of traits is unstable [E0658]
|
||||||
|
|
||||||
use Foo::new; //~ ERROR unresolved import `Foo` [E0432]
|
use Foo::new; //~ ERROR unresolved import `Foo` [E0432]
|
||||||
|
|
||||||
|
|
|
@ -1,8 +1,12 @@
|
||||||
error[E0253]: `foo` is not directly importable
|
error[E0658]: `use` associated items of traits is unstable
|
||||||
--> $DIR/use-from-trait.rs:1:5
|
--> $DIR/use-from-trait.rs:1:5
|
||||||
|
|
|
|
||||||
LL | use Trait::foo;
|
LL | use Trait::foo;
|
||||||
| ^^^^^^^^^^ cannot be imported directly
|
| ^^^^^^^^^^
|
||||||
|
|
|
||||||
|
= note: see issue #134691 <https://github.com/rust-lang/rust/issues/134691> for more information
|
||||||
|
= help: add `#![feature(import_trait_associated_functions)]` to the crate attributes to enable
|
||||||
|
= note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date
|
||||||
|
|
||||||
error[E0253]: `Assoc` is not directly importable
|
error[E0253]: `Assoc` is not directly importable
|
||||||
--> $DIR/use-from-trait.rs:2:5
|
--> $DIR/use-from-trait.rs:2:5
|
||||||
|
@ -10,11 +14,15 @@ error[E0253]: `Assoc` is not directly importable
|
||||||
LL | use Trait::Assoc;
|
LL | use Trait::Assoc;
|
||||||
| ^^^^^^^^^^^^ cannot be imported directly
|
| ^^^^^^^^^^^^ cannot be imported directly
|
||||||
|
|
||||||
error[E0253]: `C` is not directly importable
|
error[E0658]: `use` associated items of traits is unstable
|
||||||
--> $DIR/use-from-trait.rs:3:5
|
--> $DIR/use-from-trait.rs:3:5
|
||||||
|
|
|
|
||||||
LL | use Trait::C;
|
LL | use Trait::C;
|
||||||
| ^^^^^^^^ cannot be imported directly
|
| ^^^^^^^^
|
||||||
|
|
|
||||||
|
= note: see issue #134691 <https://github.com/rust-lang/rust/issues/134691> for more information
|
||||||
|
= help: add `#![feature(import_trait_associated_functions)]` to the crate attributes to enable
|
||||||
|
= note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date
|
||||||
|
|
||||||
error[E0432]: unresolved import `Foo`
|
error[E0432]: unresolved import `Foo`
|
||||||
--> $DIR/use-from-trait.rs:5:5
|
--> $DIR/use-from-trait.rs:5:5
|
||||||
|
@ -30,5 +38,5 @@ LL | use Foo::C2;
|
||||||
|
|
||||||
error: aborting due to 5 previous errors
|
error: aborting due to 5 previous errors
|
||||||
|
|
||||||
Some errors have detailed explanations: E0253, E0432.
|
Some errors have detailed explanations: E0253, E0432, E0658.
|
||||||
For more information about an error, try `rustc --explain E0253`.
|
For more information about an error, try `rustc --explain E0253`.
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue