[Lldb-commits] [lldb] [LLDB] Fix crash in TypeSystemClang::GetIndexofChildMemberWithName. (PR #117808)
Michael Buch via lldb-commits
lldb-commits at lists.llvm.org
Thu Nov 28 04:43:16 PST 2024
Michael137 wrote:
This is quite an interesting case. Basically the issue arises only because we have an `anonymous` struct in `B` with a base class that has an "indirect field" called `x`:
```
IndirectFieldDecl 0x104145868 <<invalid sloc>> <invalid sloc> implicit x 'int'
|-Field 0x104145758 '' 'A::(anonymous struct)'
`-Field 0x104145700 'x' 'int'
```
It's important that the nested structure in `B` is `anonymous` (not `unnamed`) because that's what [causes us to recurse](https://github.com/llvm/llvm-project/blob/cf47898453c83c977f92155c03e9cf205bfb2b19/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp#L6755)). Clang creates a `FieldDecl` with an empty name for that anonymous structure.
The lookup into base class `A` for name `x` works fine from Clang's perspective. But then we try to `GetIndexForRecordChild` to find the index of `x` in `A`, but that fails [because `RecordDecl::field_begin` doesn't iterate over `IndirectFieldDecl`s](https://github.com/llvm/llvm-project/blob/cf47898453c83c977f92155c03e9cf205bfb2b19/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp#L6688).
So even if we fix the crash, we still wouldn't be able to access `x`. I think we can address that separately from the crash, but I think we should not be clearing the vector in `TypeSystemClang::GetIndexofChildMemberWithName` and instead propagate errors properly.
Separately (outside the scope of this PR) we should make `GetIndexForRecordChild` account for fields of anonymous structures. E.g., we might want to do another lookup for `x` into the anonymous structure.
https://github.com/llvm/llvm-project/pull/117808
More information about the lldb-commits
mailing list