| 1 | class LoadedByParamClass {}; |
| 2 | struct ParamClass { |
| 3 | LoadedByParamClass some_func(); |
| 4 | }; |
| 5 | struct SomeClass { |
| 6 | // LLDB stops in the constructor and then requests |
| 7 | // possible expression completions. This will iterate over the |
| 8 | // declarations in the translation unit. |
| 9 | // The unnamed ParamClass parameter causes that LLDB will add |
| 10 | // an incomplete ParamClass decl to the translation unit which |
| 11 | // the code completion will find. Upon inspecting the ParamClass |
| 12 | // decl to see if it can be used to provide any useful completions, |
| 13 | // Clang will complete it and load all its members. |
| 14 | // This causes that its member function some_func is loaded which in turn |
| 15 | // loads the LoadedByParamClass decl. When LoadedByParamClass |
| 16 | // is created it will be added to the translation unit which |
| 17 | // will invalidate all iterators that currently iterate over |
| 18 | // the translation unit. The iterator we use for code completion |
| 19 | // is now invalidated and LLDB crashes. |
| 20 | SomeClass(ParamClass) {} |
| 21 | }; |
| 22 | int main() { ParamClass e; SomeClass y(e); } |
| 23 | |