Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Public function is allowed to return private struct, results in cc linking error #24102

Closed
daboross opened this issue Apr 6, 2015 · 2 comments

Comments

@daboross
Copy link
Contributor

daboross commented Apr 6, 2015

This error can be shown with two rust files compiled directly via rustc (or cargo, but just using rustc is simpler for showing the error).

cratea.rs:

#![crate_name = "cratea"]
#![crate_type = "lib"]

pub mod pub_dispatch {
    use dispatch;

    pub fn create_dispatch() -> dispatch::Dispatch {
        return dispatch::Dispatch;
    }
}

mod dispatch {
    pub struct Dispatch;

    impl Dispatch {
        pub fn dispatch(self) {
        }
    }
}

crateb.rs:

#![crate_name = "crateb"]
extern crate cratea;

fn main() {
    let dispatch = cratea::pub_dispatch::create_dispatch();

    dispatch.dispatch();
}

Output from compiling:

$ rustc cratea.rs
cratea.rs:16:9: 17:10 warning: method is never used: `dispatch`, #[warn(dead_code)] on by default
cratea.rs:16         pub fn dispatch(self) {
cratea.rs:17         }
$ rustc -L crate=./ crateb.rs
error: linking with `cc` failed: exit code: 1
note: "cc" "-Wl,--as-needed" "-m64" "-L" "/usr/local/lib/rustlib/x86_64-unknown-linux-gnu/lib" "-o" "crateb" "crateb.o" "-Wl,--whole-archive" "-lmorestack" "-Wl,--no-whole-archive" "-Wl,--gc-sections" "-pie" "-nodefaultlibs" "/tmp/tmp.8n2IVQ5qlk/libcratea.rlib" "/usr/local/lib/rustlib/x86_64-unknown-linux-gnu/lib/libstd-4e7c5e5c.rlib" "/usr/local/lib/rustlib/x86_64-unknown-linux-gnu/lib/libcollections-4e7c5e5c.rlib" "/usr/local/lib/rustlib/x86_64-unknown-linux-gnu/lib/libunicode-4e7c5e5c.rlib" "/usr/local/lib/rustlib/x86_64-unknown-linux-gnu/lib/librand-4e7c5e5c.rlib" "/usr/local/lib/rustlib/x86_64-unknown-linux-gnu/lib/liballoc-4e7c5e5c.rlib" "/usr/local/lib/rustlib/x86_64-unknown-linux-gnu/lib/liblibc-4e7c5e5c.rlib" "/usr/local/lib/rustlib/x86_64-unknown-linux-gnu/lib/libcore-4e7c5e5c.rlib" "-L" "./" "-L" "/usr/local/lib/rustlib/x86_64-unknown-linux-gnu/lib" "-L" "/tmp/tmp.8n2IVQ5qlk/.rust/lib/x86_64-unknown-linux-gnu" "-L" "/tmp/tmp.8n2IVQ5qlk/lib/x86_64-unknown-linux-gnu" "-Wl,--whole-archive" "-Wl,-Bstatic" "-Wl,--no-whole-archive" "-Wl,-Bdynamic" "-ldl" "-lpthread" "-lrt" "-lgcc_s" "-lpthread" "-lc" "-lm" "-lcompiler-rt"
note: crateb.o: In function `main::h69a169139aab5413faa':
crateb.0.rs:(.text._ZN4main20h69a169139aab5413faaE+0x2c): undefined reference to `dispatch::Dispatch::dispatch::ha28d1bdf4c2d8d39uaa'
collect2: error: ld returned 1 exit status

error: aborting due to previous error

Happens in rustc 1.0.0-beta (9854143cb 2015-04-02) (built 2015-04-02) and rustc 1.0.0-nightly (083b8a404 2015-04-05) (built 2015-04-05).

I would expect this to fail when compiling cratea, but instead cratea compiles fine, but then any crate using it will fail compiling.

@alexcrichton
Copy link
Member

I believe this is a duplicate of #16734, but thanks for the issue!

@daboross
Copy link
Contributor Author

daboross commented Apr 7, 2015

Ah, thank you for linking that!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants