mirror of
https://github.com/intel/llvm.git
synced 2026-01-22 23:49:22 +08:00
[lldb] Don't emit artificial constructor declarations as global functions
Summary: When we have a artificial constructor DIE, we currently create from that a global function with the name of that class. That ends up causing a bunch of funny errors such as "must use 'struct' tag to refer to type 'Foo' in this scope" when doing `Foo f`. Also causes that constructing a class via `Foo()` actually just calls that global function. The fix is that when we have an artificial method decl, we always treat it as handled even if we don't create a CXXMethodDecl for it (which we never do for artificial methods at the moment). Fixes rdar://55757491 and probably some other radars. Reviewers: aprantl, vsk, shafik Reviewed By: aprantl Subscribers: jingham, shafik, labath, JDevlieghere, lldb-commits Tags: #lldb Differential Revision: https://reviews.llvm.org/D68130 llvm-svn: 375151
This commit is contained in:
@@ -49,3 +49,7 @@ class ExprCommandCallOverriddenMethod(TestBase):
|
||||
|
||||
# Test calling the base class.
|
||||
self.expect("expr realbase.foo()", substrs=["1"])
|
||||
|
||||
# Test with locally constructed instances.
|
||||
self.expect("expr Base().foo()", substrs=["1"])
|
||||
self.expect("expr Derived().foo()", substrs=["2"])
|
||||
|
||||
@@ -11,6 +11,7 @@ public:
|
||||
|
||||
int main() {
|
||||
Base realbase;
|
||||
realbase.foo();
|
||||
Derived d;
|
||||
Base *b = &d;
|
||||
return 0; // Set breakpoint here
|
||||
|
||||
@@ -0,0 +1,4 @@
|
||||
from lldbsuite.test import lldbinline
|
||||
from lldbsuite.test import decorators
|
||||
|
||||
lldbinline.MakeInlineTest(__file__, globals(), None)
|
||||
@@ -0,0 +1,10 @@
|
||||
struct Foo {
|
||||
// Triggers that we emit an artificial constructor for Foo.
|
||||
virtual ~Foo() = default;
|
||||
};
|
||||
|
||||
int main() {
|
||||
Foo f;
|
||||
// Try to construct foo in our expression.
|
||||
return 0; //%self.expect("expr Foo()", substrs=["(Foo) $0 = {}"])
|
||||
}
|
||||
@@ -1007,8 +1007,11 @@ TypeSP DWARFASTParserClang::ParseTypeFromDWARF(const SymbolContext &sc,
|
||||
is_attr_used, attrs.is_artificial);
|
||||
|
||||
type_handled = cxx_method_decl != NULL;
|
||||
// Artificial methods are always handled even when don't
|
||||
// create a new declaration for them.
|
||||
type_handled |= attrs.is_artificial;
|
||||
|
||||
if (type_handled) {
|
||||
if (cxx_method_decl) {
|
||||
LinkDeclContextToDIE(
|
||||
ClangASTContext::GetAsDeclContext(cxx_method_decl),
|
||||
die);
|
||||
|
||||
Reference in New Issue
Block a user