diff options
author | Raphael Isemann <teemperor@gmail.com> | 2019-10-17 18:16:50 +0000 |
---|---|---|
committer | Raphael Isemann <teemperor@gmail.com> | 2019-10-17 18:16:50 +0000 |
commit | aaefd8122db54c84a037fa8c8b77ded4c824957b (patch) | |
tree | cd596ad70ba6d1ca6b0cc8a746f89a63fd704337 | |
parent | ac7e41ed6fef583ad755b9ecfdeb654353259cc3 (diff) | |
download | lldb-aaefd8122db54c84a037fa8c8b77ded4c824957b.tar.gz |
[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
git-svn-id: https://llvm.org/svn/llvm-project/lldb/trunk@375151 91177308-0d34-0410-b5e6-96231b3b80d8
5 files changed, 23 insertions, 1 deletions
diff --git a/packages/Python/lldbsuite/test/commands/expression/call-overridden-method/TestCallOverriddenMethod.py b/packages/Python/lldbsuite/test/commands/expression/call-overridden-method/TestCallOverriddenMethod.py index c22fffb4f..93b918542 100644 --- a/packages/Python/lldbsuite/test/commands/expression/call-overridden-method/TestCallOverriddenMethod.py +++ b/packages/Python/lldbsuite/test/commands/expression/call-overridden-method/TestCallOverriddenMethod.py @@ -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"]) diff --git a/packages/Python/lldbsuite/test/commands/expression/call-overridden-method/main.cpp b/packages/Python/lldbsuite/test/commands/expression/call-overridden-method/main.cpp index 712c374ee..87997fa35 100644 --- a/packages/Python/lldbsuite/test/commands/expression/call-overridden-method/main.cpp +++ b/packages/Python/lldbsuite/test/commands/expression/call-overridden-method/main.cpp @@ -11,6 +11,7 @@ public: int main() { Base realbase; + realbase.foo(); Derived d; Base *b = &d; return 0; // Set breakpoint here diff --git a/packages/Python/lldbsuite/test/commands/expression/ignore-artificial-constructors/TestIgnoreArtificialConstructors.py b/packages/Python/lldbsuite/test/commands/expression/ignore-artificial-constructors/TestIgnoreArtificialConstructors.py new file mode 100644 index 000000000..03424658f --- /dev/null +++ b/packages/Python/lldbsuite/test/commands/expression/ignore-artificial-constructors/TestIgnoreArtificialConstructors.py @@ -0,0 +1,4 @@ +from lldbsuite.test import lldbinline +from lldbsuite.test import decorators + +lldbinline.MakeInlineTest(__file__, globals(), None) diff --git a/packages/Python/lldbsuite/test/commands/expression/ignore-artificial-constructors/main.cpp b/packages/Python/lldbsuite/test/commands/expression/ignore-artificial-constructors/main.cpp new file mode 100644 index 000000000..41457ebe1 --- /dev/null +++ b/packages/Python/lldbsuite/test/commands/expression/ignore-artificial-constructors/main.cpp @@ -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 = {}"]) +} diff --git a/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp b/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp index 607a16c59..ed87441b1 100644 --- a/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp +++ b/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp @@ -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); |