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

Internal compiler error: Verification failed: Struct access must be to a pointer value, not a { string<10> } #4438

Closed
Braqzen opened this issue Apr 13, 2023 · 4 comments · Fixed by #4442
Assignees
Labels
bug Something isn't working compiler General compiler. Should eventually become more specific as the issue is triaged P: critical Should be looked at before anything else

Comments

@Braqzen
Copy link
Contributor

Braqzen commented Apr 13, 2023

The following code produces an ICE when ref is removed from the impl method.

contract;

struct Todo {
    text: str[10]
}

impl Todo {
    fn update_text(ref mut self, text: str[10]) {
        self.text = text;
    }
}

storage {
    todo: Todo = Todo {
        text: "1234567890",
    }
}

abi Todos {
    #[storage(read, write)]
    fn update_text(text: str[10]);
}

impl Todos for Contract {
    #[storage(read, write)]
    fn update_text(text: str[10]) {
        storage.todo.update_text(text);
    }
}

Note that there was a fuel-toolchain.toml file at the time of writing this issue and all it contained is

[toolchain]
channel = "beta-3"
@Braqzen Braqzen added bug Something isn't working compiler General compiler. Should eventually become more specific as the issue is triaged P: critical Should be looked at before anything else labels Apr 13, 2023
@tritao
Copy link
Contributor

tritao commented Apr 14, 2023

Smaller repro:

script;

struct S {
    data: u64
}

impl S {
    fn update(mut self, data: u64) {
        self.data = data
    }
}

fn main() {
  let mut s = S { data: 0 };
  s.update(10);
}

@mohammadfawaz Should we disallow the usage mut self and always require it to be ref in such cases?

@mohammadfawaz
Copy link
Contributor

@tritao does the problem also affect mut struct arguments that are not self?

@tritao
Copy link
Contributor

tritao commented Apr 14, 2023

@tritao does the problem also affect mut struct arguments that are not self?

So, the following fails:

script;

struct S {
  data: u64
}

impl S {
  fn update(self, mut data: u64) {
    data = 20
  }
}

fn main() {
  let s = S { data: 0 };
  s.update(10);
}

With current master (after IR refactor):

error: Internal compiler error: Store must be to a pointer, not a u64.
Please file an issue on the repository and include the code that triggered this error.

Before IR refactor:

19 |   s.update(10);
   |            ^^ Internal compiler error: Destination arg for load/store is not valid.
Please file an issue on the repository and include the code that triggered this error.
20 | }

So this doesn't look like a regression.

If I try to do the same with a regular function, instead of a method:

13 | fn test(mut data: u64) {
   |             ^^^^ This parameter was declared as mutable, which is not supported yet, did you mean to use ref mut?
14 |   data = 0
15 | }

So we maybe just need to apply the ref/mut parameter checking we do for impl functions too?

@mohammadfawaz
Copy link
Contributor

Ah excellent. Yeah we just have to disallow mut without ref for method parameters everywhere

@tritao tritao self-assigned this Apr 14, 2023
tritao added a commit to tritao/sway that referenced this issue Apr 14, 2023
tritao added a commit to tritao/sway that referenced this issue Apr 14, 2023
mohammadfawaz pushed a commit that referenced this issue Apr 15, 2023
…4442)

Closes #4438.

## Checklist

- [x] I have linked to any relevant issues.
- [x] I have commented my code, particularly in hard-to-understand
areas.
- [x] I have updated the documentation where relevant (API docs, the
reference, and the Sway book).
- [x] I have added tests that prove my fix is effective or that my
feature works.
- [x] I have added (or requested a maintainer to add) the necessary
`Breaking*` or `New Feature` labels where relevant.
- [x] I have done my best to ensure that my PR adheres to [the Fuel Labs
Code Review
Standards](https://github.com/FuelLabs/rfcs/blob/master/text/code-standards/external-contributors.md).
- [x] I have requested a review from the relevant team or maintainers.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working compiler General compiler. Should eventually become more specific as the issue is triaged P: critical Should be looked at before anything else
Projects
None yet
Development

Successfully merging a pull request may close this issue.

3 participants