Handle more cases in cfg_accessible
This commit is contained in:
parent
bef2b7cd1c
commit
163374644b
3 changed files with 55 additions and 49 deletions
|
@ -443,11 +443,20 @@ impl<'a> ResolverExpand for Resolver<'a> {
|
|||
PathResult::NonModule(partial_res) if partial_res.unresolved_segments() == 0 => {
|
||||
return Ok(true);
|
||||
}
|
||||
PathResult::NonModule(..) => {
|
||||
self.session
|
||||
.struct_span_err(span, "not sure whether the path is accessible or not")
|
||||
.note("the type may have associated items, but we are currently not checking them")
|
||||
.emit();
|
||||
|
||||
// If we get a partially resolved NonModule in one namespace, we should get the
|
||||
// same result in any other namespaces, so we can return early.
|
||||
return Ok(false);
|
||||
}
|
||||
PathResult::Indeterminate => indeterminate = true,
|
||||
// FIXME: `resolve_path` is not ready to report partially resolved paths
|
||||
// correctly, so we just report an error if the path was reported as unresolved.
|
||||
// This needs to be fixed for `cfg_accessible` to be useful.
|
||||
PathResult::NonModule(..) | PathResult::Failed { .. } => {}
|
||||
// We can only be sure that a path doesn't exist after having tested all the
|
||||
// posibilities, only at that time we can return false.
|
||||
PathResult::Failed { .. } => {}
|
||||
PathResult::Module(_) => panic!("unexpected path resolution"),
|
||||
}
|
||||
}
|
||||
|
@ -456,10 +465,6 @@ impl<'a> ResolverExpand for Resolver<'a> {
|
|||
return Err(Indeterminate);
|
||||
}
|
||||
|
||||
self.session
|
||||
.struct_span_err(span, "not sure whether the path is accessible or not")
|
||||
.span_note(span, "`cfg_accessible` is not fully implemented")
|
||||
.emit();
|
||||
Ok(false)
|
||||
}
|
||||
|
||||
|
|
|
@ -5,20 +5,35 @@ mod m {
|
|||
struct ExistingPrivate;
|
||||
}
|
||||
|
||||
trait Trait {
|
||||
type Assoc;
|
||||
}
|
||||
|
||||
enum Enum {
|
||||
Existing,
|
||||
}
|
||||
|
||||
#[cfg_accessible(Enum)]
|
||||
struct ExistingResolved;
|
||||
|
||||
#[cfg_accessible(Enum::Existing)]
|
||||
struct ExistingResolvedVariant;
|
||||
|
||||
#[cfg_accessible(m::ExistingPublic)]
|
||||
struct ExistingPublic;
|
||||
|
||||
// FIXME: Not implemented yet.
|
||||
#[cfg_accessible(m::ExistingPrivate)] //~ ERROR not sure whether the path is accessible or not
|
||||
#[cfg_accessible(m::ExistingPrivate)]
|
||||
struct ExistingPrivate;
|
||||
|
||||
// FIXME: Not implemented yet.
|
||||
#[cfg_accessible(m::NonExistent)] //~ ERROR not sure whether the path is accessible or not
|
||||
struct ExistingPrivate;
|
||||
#[cfg_accessible(m::NonExistent)]
|
||||
struct NonExistingPrivate;
|
||||
|
||||
#[cfg_accessible(n::AccessibleExpanded)] // OK, `cfg_accessible` can wait and retry.
|
||||
struct AccessibleExpanded;
|
||||
|
||||
#[cfg_accessible(Trait::Assoc)]
|
||||
struct AccessibleTraitAssoc;
|
||||
|
||||
macro_rules! generate_accessible_expanded {
|
||||
() => {
|
||||
mod n {
|
||||
|
@ -29,15 +44,12 @@ macro_rules! generate_accessible_expanded {
|
|||
|
||||
generate_accessible_expanded!();
|
||||
|
||||
struct S {
|
||||
field: u8,
|
||||
}
|
||||
|
||||
// FIXME: Not implemented yet.
|
||||
#[cfg_accessible(S::field)] //~ ERROR not sure whether the path is accessible or not
|
||||
struct Field;
|
||||
|
||||
fn main() {
|
||||
ExistingPublic;
|
||||
AccessibleExpanded;
|
||||
AccessibleTraitAssoc;
|
||||
|
||||
ExistingPrivate; //~ ERROR cannot find
|
||||
NonExistingPrivate; //~ ERROR cannot find
|
||||
NonExistingTraitAlias; //~ ERROR cannot find
|
||||
}
|
||||
|
|
|
@ -1,38 +1,27 @@
|
|||
error: not sure whether the path is accessible or not
|
||||
--> $DIR/cfg_accessible.rs:12:18
|
||||
error[E0425]: cannot find value `ExistingPrivate` in this scope
|
||||
--> $DIR/cfg_accessible.rs:52:5
|
||||
|
|
||||
LL | #[cfg_accessible(m::ExistingPrivate)]
|
||||
| ^^^^^^^^^^^^^^^^^^
|
||||
LL | ExistingPrivate;
|
||||
| ^^^^^^^^^^^^^^^ not found in this scope
|
||||
|
|
||||
note: `cfg_accessible` is not fully implemented
|
||||
--> $DIR/cfg_accessible.rs:12:18
|
||||
note: unit struct `m::ExistingPrivate` exists but is inaccessible
|
||||
--> $DIR/cfg_accessible.rs:5:5
|
||||
|
|
||||
LL | #[cfg_accessible(m::ExistingPrivate)]
|
||||
| ^^^^^^^^^^^^^^^^^^
|
||||
LL | struct ExistingPrivate;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^ not accessible
|
||||
|
||||
error: not sure whether the path is accessible or not
|
||||
--> $DIR/cfg_accessible.rs:16:18
|
||||
error[E0425]: cannot find value `NonExistingPrivate` in this scope
|
||||
--> $DIR/cfg_accessible.rs:53:5
|
||||
|
|
||||
LL | #[cfg_accessible(m::NonExistent)]
|
||||
| ^^^^^^^^^^^^^^
|
||||
|
|
||||
note: `cfg_accessible` is not fully implemented
|
||||
--> $DIR/cfg_accessible.rs:16:18
|
||||
|
|
||||
LL | #[cfg_accessible(m::NonExistent)]
|
||||
| ^^^^^^^^^^^^^^
|
||||
LL | NonExistingPrivate;
|
||||
| ^^^^^^^^^^^^^^^^^^ not found in this scope
|
||||
|
||||
error: not sure whether the path is accessible or not
|
||||
--> $DIR/cfg_accessible.rs:37:18
|
||||
error[E0425]: cannot find value `NonExistingTraitAlias` in this scope
|
||||
--> $DIR/cfg_accessible.rs:54:5
|
||||
|
|
||||
LL | #[cfg_accessible(S::field)]
|
||||
| ^^^^^^^^
|
||||
|
|
||||
note: `cfg_accessible` is not fully implemented
|
||||
--> $DIR/cfg_accessible.rs:37:18
|
||||
|
|
||||
LL | #[cfg_accessible(S::field)]
|
||||
| ^^^^^^^^
|
||||
LL | NonExistingTraitAlias;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^ not found in this scope
|
||||
|
||||
error: aborting due to 3 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0425`.
|
||||
|
|
Loading…
Add table
Reference in a new issue