diff options
| author | Ayaz Hafiz <ayaz.hafiz.1@gmail.com> | 2020-07-09 19:03:15 -0700 |
|---|---|---|
| committer | Ayaz Hafiz <ayaz.hafiz.1@gmail.com> | 2020-07-09 19:21:14 -0700 |
| commit | 230393993ffc255d3f20d98400c8a376bd51d1c0 (patch) | |
| tree | 59c94c805ef765a57a71aad3742c048c5f537ae7 /src/rustllvm/RustWrapper.cpp | |
| parent | 8ac1525e091d3db28e67adcbbd6db1e1deaa37fb (diff) | |
| download | rust-230393993ffc255d3f20d98400c8a376bd51d1c0.tar.gz rust-230393993ffc255d3f20d98400c8a376bd51d1c0.zip | |
Don't visit foreign function bodies when lowering ast to hir
Previously the existence of bodies inside a foreign function block would
cause a panic in the hir `NodeCollector` during its collection of crate
bodies to compute a crate hash:
https://github.com/rust-lang/rust/blob/e59b08e62ea691916d2f063cac5aab4634128022/src/librustc_middle/hir/map/collector.rs#L154-L158
The collector walks the hir tree and creates a map of hir nodes, then
attaching bodies in the crate to their owner in the map. For a code like
```rust
extern "C" {
fn f() {
fn g() {}
}
}
```
The crate bodies include the body of the function `g`. But foreign
functions cannot have bodies, and while the parser AST permits a foreign
function to have a body, the hir doesn't. This means that the body of
`f` is not present in the hir, and so neither is `g`. So when the
`NodeCollector` finishes the walking the hir, it has no record of `g`,
cannot find an owner for the body of `g` it sees in the crate bodies,
and blows up.
Why do the crate bodies include the body of `g`? The AST walker has a
need a for walking function bodies, and FFIs share the same AST node as
functions in other contexts.
There are at least two options to fix this:
- Don't unwrap the map entry for an hir node in the `NodeCollector`
- Modifier the ast->hir lowering visitor to ignore foreign function
blocks
I don't think the first is preferrable, since we want to know when we
can't find a body for an hir node that we thought had one (dropping this
information may lead to an invalid hash). So this commit implements the
second option.
Closes #74120
Diffstat (limited to 'src/rustllvm/RustWrapper.cpp')
0 files changed, 0 insertions, 0 deletions
