Skip to content

privacy exposure bug when mixing explicit type ascription and an impl on struct #10548

Closed
@pnkfelix

Description

@pnkfelix

Surely adding a type ascription shouldn't cause a privacy violation, right? And yet...

Example file (a.rs):

mod a {
    struct S;

    #[cfg(not(hide_impl))]
    impl S { }

    pub struct Expose;
    impl Expose { pub fn expose(&self) -> S { S } }
}

fn f_infer() {
    let _s;
    _s = a::Expose.expose();
}

#[cfg(demo_explicit)]
fn f_typed() {
    let _s : a::S;
    _s = a::Expose.expose();
}

fn main() {}

Some runs illustrating the bug. Note that the only difference introduced by hide_impl is whether or not the empty impl item for S is present, and therefore toggling it should not (IMO) be causing changes to the privacy semantics.

% rustc a.rs
% rustc --cfg demo_explicit a.rs
% rustc --cfg hide_impl a.rs
% rustc --cfg hide_impl --cfg demo_explicit a.rs
a.rs:18:13: 18:17 error: type `S` is private
a.rs:18     let _s : a::S;
                     ^~~~
error: aborting due to previous error
task 'rustc' failed at 'explicit failure', /Users/fklock/Dev/Mozilla/rust.git/src/libsyntax/diagnostic.rs:101
task '<main>' failed at 'explicit failure', /Users/fklock/Dev/Mozilla/rust.git/src/librustc/lib.rs:396

(Possibly related to #10545, but do note that the properties of these two scenarios do differ. In particular, the presence/absence of fields in the struct seems to be irrelevant for this bug.)

Metadata

Metadata

Assignees

No one assigned

    Labels

    A-visibilityArea: Visibility / privacy

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions