aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRaphael Isemann <teemperor@gmail.com>2019-10-17 18:16:50 +0000
committerRaphael Isemann <teemperor@gmail.com>2019-10-17 18:16:50 +0000
commitaaefd8122db54c84a037fa8c8b77ded4c824957b (patch)
treecd596ad70ba6d1ca6b0cc8a746f89a63fd704337
parentac7e41ed6fef583ad755b9ecfdeb654353259cc3 (diff)
downloadlldb-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
-rw-r--r--packages/Python/lldbsuite/test/commands/expression/call-overridden-method/TestCallOverriddenMethod.py4
-rw-r--r--packages/Python/lldbsuite/test/commands/expression/call-overridden-method/main.cpp1
-rw-r--r--packages/Python/lldbsuite/test/commands/expression/ignore-artificial-constructors/TestIgnoreArtificialConstructors.py4
-rw-r--r--packages/Python/lldbsuite/test/commands/expression/ignore-artificial-constructors/main.cpp10
-rw-r--r--source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp5
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);