-
Notifications
You must be signed in to change notification settings - Fork 13.3k
Rust appears to create (duplicate?) vtables at runtime that could have been emitted at compile-time. #8591
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
Comments
Triage: now that I guess the second example doesn't use |
New code:
ouputs: |
Modernized:
outputs:
|
(That is, vtables are only emitted only once where identical, I suspect we've modified the linkage such that LLVM merges them? Or maybe the compiler just got smarter) |
I'm not sure if we want to have a test for this sort of optimization to be honest, but I'll leave that up to someone else. |
When we start doing codegen tests like this, we'll need to decide what all we cover, so I think I'll make that decision for now, to give this a close 😉 |
(and thanks for the backup! ❤️ ) |
…raffate add `empty_structs_with_brackets` <!-- Thank you for making Clippy better! We're collecting our changelog from pull request descriptions. If your PR only includes internal changes, you can just write `changelog: none`. Otherwise, please write a short comment explaining your change. Also, it's helpful for us that the lint name is put into brackets `[]` and backticks `` ` ` ``, e.g. ``[`lint_name`]``. If your PR fixes an issue, you can add "fixes #issue_number" into this PR description. This way the issue will be automatically closed when your PR is merged. If you added a new lint, here's a checklist for things that will be checked during review or continuous integration. - \[ ] Followed [lint naming conventions][lint_naming] - \[ ] Added passing UI tests (including committed `.stderr` file) - \[ ] `cargo test` passes locally - \[ ] Executed `cargo dev update_lints` - \[ ] Added lint documentation - \[ ] Run `cargo dev fmt` [lint_naming]: https://rust-lang.github.io/rfcs/0344-conventions-galore.html#lints Note that you can skip the above if you are just opening a WIP PR in order to get feedback. Delete this line and everything above before opening your PR. -- *Please write a short comment explaining your change (or "none" for internal only changes)* --> Closes rust-lang#8591 I'm already sorry for the massive diff 😅 changelog: New lint [`empty_structs_with_brackets`]
The code below outputs
((6340760, 140201758297392), (6340840, 140201758297424), (6340856, 140201758297472), (6340872, 140201758297504))
(exact numbers may vary). The important part is that the vtables seem to get newly created for ~1 and ~2 (and also @1 and @2) even though they could easily use the same vtables.The code was fed to rusti, original below (thanks to dbaupp):
Swapping vtables appears to work just fine, even between ~Trait and &Trait (but not between ~Trait and @trait):
Outputs (2,3) in rusti.
It seems to me we should generate the vtables at compile time.
The text was updated successfully, but these errors were encountered: