Skip to content

Fix passing/getting packed structs to/from foreign functions. #16584

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

Merged
merged 3 commits into from
Aug 20, 2014

Conversation

luqmana
Copy link
Member

@luqmana luqmana commented Aug 18, 2014

Fixes #16574.

@@ -177,10 +177,12 @@ fn classify_ty(ty: Type) -> Vec<RegClass> {

fn classify_struct(tys: &[Type],
cls: &mut [RegClass], i: uint,
off: uint) {
off: uint, packed: bool) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: line this up with the rest of the arguments

bors added a commit that referenced this pull request Aug 19, 2014
@bors bors closed this Aug 20, 2014
@bors bors merged commit 7382554 into rust-lang:master Aug 20, 2014
@luqmana luqmana deleted the psfo branch July 15, 2015 23:59
bors added a commit to rust-lang-ci/rust that referenced this pull request Mar 31, 2024
feat: Implement ATPIT

Resolves rust-lang#16584

Note: This implementation only works for ATPIT, not for TAIT.
The main hinderence that blocks the later is the defining sites of TAIT can be inner blocks like in;
```rust
type X = impl Default;

mod foo {
    fn bar() -> super::X {
        ()
    }
}
```
So, to figure out we are defining it or not, we should recursively probe for nested modules and bodies.

For ATPIT, we can just look into current body because `error[E0401]: can't use 'Self' from outer item` prevent such nested structures;

```rust
trait Foo {
    type Item;
    fn foo() -> Self::Item;
}

struct Bar;

impl Foo for Bar {
    type Item = impl Default;
    fn foo() -> Self::Item {
        fn bar() -> Self::Item {
                    ^^^^^^^^^^
                    |
                    use of `Self` from outer item
                    refer to the type directly here instead
            5
        }
        bar()
    }
}
```

But this implementation does not checks for unification of same ATPIT between different bodies, monomorphization, nor layout for similar reason. (But these can be done with lazyness if we can utilize something like "mutation of interned value" with `db`. I coundn't find such thing but I would appreciate it if such thing exists and you could let me know 😅)
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

Successfully merging this pull request may close these issues.

Packed structs are passed incorrectly to foreign functions on x86_64
5 participants