Skip to content

codegen generates vtables for a variable's supertype when unsizing sometimes #107205

Closed
@Rattenkrieg

Description

@Rattenkrieg

I was putting &'s here and there to make my program compile as beginners supposed to do and finally ended with:

  = note: Undefined symbols for architecture arm64:
            "core::ptr::drop_in_place$LT$fn$LP$$RF$$u5b$i64$u5d$$RP$$u20$.$GT$$u20$i64$GT$::h8f1379e9ceec7fb5", referenced from:
                l___unnamed_1 in wyas-3cfa3c0d2101b65b.6xaszv4ay9i42ky.rcgu.o
          ld: symbol(s) not found for architecture arm64
          clang: error: linker command failed with exit code 1 (use -v to see invocation)

To assure myself that this is unrelated to native/rosetta mess I've ran this in docker and in rust playground with the same outcome.

  = note: /usr/bin/ld: /playground/target/release/deps/playground-7e94a1292993c003.playground.0627c30c-cgu.0.rcgu.o:(.data.rel.ro..L__unnamed_3+0x0): undefined reference to `core::ptr::drop_in_place<fn(&[i64]) -> i64>'
          /usr/bin/ld: /playground/target/release/deps/playground-7e94a1292993c003: hidden symbol `_ZN4core3ptr66drop_in_place$LT$fn$LP$$RF$$u5b$i64$u5d$$RP$$u20$.$GT$$u20$i64$GT$17h8581d5a4605118bdE' isn't defined
          /usr/bin/ld: final link failed: bad value

This particular code breaks the linker

struct Wrapper(fn(val: &[i64]) -> i64);

impl Debug for Wrapper {
    fn fmt<'a>(&'a self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        f.debug_tuple("Wrapper").field(&self.0 as &fn(&'a [i64]) -> i64).finish()
    }
}

fn main() {
    println!("{:?}", Wrapper(useful));
}

I've come up with that since deriving Debug or implementing it manually like that

impl Debug for Wrapper {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        f.debug_tuple("Wrapper").field(&self.0).finish()
    }
}

leads to following type/borrow check error:

implementation of Debug is not general enough

Expected behavior: program prints

Wrapper(address)

Actual behavior: see above

rustc --version --verbose:

rustc 1.66.1 (90743e729 2023-01-10)
binary: rustc
commit-hash: 90743e7298aca107ddaa0c202a4d3604e29bfeb6
commit-date: 2023-01-10
host: aarch64-apple-darwin
release: 1.66.1
LLVM version: 15.0.2

I've tried both beta 1.67.0-beta.9 and nightly 1.68.0-nighlty at rust playground and both are failing during linking.


Edit

I've bruteforced working program 😂 :

impl Debug for Wrapper {
    fn fmt<'a>(&'a self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        f.debug_tuple("Wrapper").field(&(self.0 as fn(&'a [i64]) -> i64)).finish()
    }
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    A-codegenArea: Code generationC-bugCategory: This is a bug.I-unsoundIssue: A soundness hole (worst kind of bug), see: https://en.wikipedia.org/wiki/SoundnessP-highHigh priorityT-compilerRelevant to the compiler team, which will review and decide on the PR/issue.regression-from-stable-to-stablePerformance or correctness regression from one stable version to another.

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions