forked from OSchip/llvm-project
[lldb][NFC] Add test for iterator invalidation during code completion.
This commit is contained in:
parent
da9c93f330
commit
65bab53afb
|
@ -0,0 +1,2 @@
|
|||
CXX_SOURCES := main.cpp
|
||||
include Makefile.rules
|
|
@ -0,0 +1,21 @@
|
|||
from lldbsuite.test.decorators import *
|
||||
from lldbsuite.test.lldbtest import *
|
||||
from lldbsuite.test import lldbutil
|
||||
|
||||
|
||||
class TestCase(TestBase):
|
||||
|
||||
mydir = TestBase.compute_mydir(__file__)
|
||||
|
||||
@skipIf # rdar://problem/53931074
|
||||
def test(self):
|
||||
self.build()
|
||||
exe = self.getBuildArtifact("a.out")
|
||||
target = self.dbg.CreateTarget(exe)
|
||||
callee_break = target.BreakpointCreateByName(
|
||||
"SomeClass::SomeClass(ParamClass)", None)
|
||||
self.assertTrue(callee_break.GetNumLocations() > 0)
|
||||
self.runCmd("run", RUN_SUCCEEDED)
|
||||
|
||||
to_complete = "e ParamClass"
|
||||
self.dbg.GetCommandInterpreter().HandleCompletion(to_complete, len(to_complete), 0, -1, lldb.SBStringList())
|
|
@ -0,0 +1,22 @@
|
|||
class LoadedByParamClass {};
|
||||
struct ParamClass {
|
||||
LoadedByParamClass some_func();
|
||||
};
|
||||
struct SomeClass {
|
||||
// LLDB stops in the constructor and then requests
|
||||
// possible expression completions. This will iterate over the
|
||||
// declarations in the translation unit.
|
||||
// The unnamed ParamClass parameter causes that LLDB will add
|
||||
// an incomplete ParamClass decl to the translation unit which
|
||||
// the code completion will find. Upon inspecting the ParamClass
|
||||
// decl to see if it can be used to provide any useful completions,
|
||||
// Clang will complete it and load all its members.
|
||||
// This causes that its member function some_func is loaded which in turn
|
||||
// loads the LoadedByParamClass decl. When LoadedByParamClass
|
||||
// is created it will be added to the translation unit which
|
||||
// will invalidate all iterators that currently iterate over
|
||||
// the translation unit. The iterator we use for code completion
|
||||
// is now invalidated and LLDB crashes.
|
||||
SomeClass(ParamClass) {}
|
||||
};
|
||||
int main() { ParamClass e; SomeClass y(e); }
|
Loading…
Reference in New Issue