Author: teemperor
Date: Thu Oct 17 11:16:50 2019
New Revision: 375151

URL: http://llvm.org/viewvc/llvm-project?rev=375151&view=rev
Log:
[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

Added:
    
lldb/trunk/packages/Python/lldbsuite/test/commands/expression/ignore-artificial-constructors/
    
lldb/trunk/packages/Python/lldbsuite/test/commands/expression/ignore-artificial-constructors/TestIgnoreArtificialConstructors.py
    
lldb/trunk/packages/Python/lldbsuite/test/commands/expression/ignore-artificial-constructors/main.cpp
Modified:
    
lldb/trunk/packages/Python/lldbsuite/test/commands/expression/call-overridden-method/TestCallOverriddenMethod.py
    
lldb/trunk/packages/Python/lldbsuite/test/commands/expression/call-overridden-method/main.cpp
    lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp

Modified: 
lldb/trunk/packages/Python/lldbsuite/test/commands/expression/call-overridden-method/TestCallOverriddenMethod.py
URL: 
http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/commands/expression/call-overridden-method/TestCallOverriddenMethod.py?rev=375151&r1=375150&r2=375151&view=diff
==============================================================================
--- 
lldb/trunk/packages/Python/lldbsuite/test/commands/expression/call-overridden-method/TestCallOverriddenMethod.py
 (original)
+++ 
lldb/trunk/packages/Python/lldbsuite/test/commands/expression/call-overridden-method/TestCallOverriddenMethod.py
 Thu Oct 17 11:16:50 2019
@@ -49,3 +49,7 @@ class ExprCommandCallOverriddenMethod(Te
 
         # 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"])

Modified: 
lldb/trunk/packages/Python/lldbsuite/test/commands/expression/call-overridden-method/main.cpp
URL: 
http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/commands/expression/call-overridden-method/main.cpp?rev=375151&r1=375150&r2=375151&view=diff
==============================================================================
--- 
lldb/trunk/packages/Python/lldbsuite/test/commands/expression/call-overridden-method/main.cpp
 (original)
+++ 
lldb/trunk/packages/Python/lldbsuite/test/commands/expression/call-overridden-method/main.cpp
 Thu Oct 17 11:16:50 2019
@@ -11,6 +11,7 @@ public:
 
 int main() {
   Base realbase;
+  realbase.foo();
   Derived d;
   Base *b = &d;
   return 0; // Set breakpoint here

Added: 
lldb/trunk/packages/Python/lldbsuite/test/commands/expression/ignore-artificial-constructors/TestIgnoreArtificialConstructors.py
URL: 
http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/commands/expression/ignore-artificial-constructors/TestIgnoreArtificialConstructors.py?rev=375151&view=auto
==============================================================================
--- 
lldb/trunk/packages/Python/lldbsuite/test/commands/expression/ignore-artificial-constructors/TestIgnoreArtificialConstructors.py
 (added)
+++ 
lldb/trunk/packages/Python/lldbsuite/test/commands/expression/ignore-artificial-constructors/TestIgnoreArtificialConstructors.py
 Thu Oct 17 11:16:50 2019
@@ -0,0 +1,4 @@
+from lldbsuite.test import lldbinline
+from lldbsuite.test import decorators
+
+lldbinline.MakeInlineTest(__file__, globals(), None)

Added: 
lldb/trunk/packages/Python/lldbsuite/test/commands/expression/ignore-artificial-constructors/main.cpp
URL: 
http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/commands/expression/ignore-artificial-constructors/main.cpp?rev=375151&view=auto
==============================================================================
--- 
lldb/trunk/packages/Python/lldbsuite/test/commands/expression/ignore-artificial-constructors/main.cpp
 (added)
+++ 
lldb/trunk/packages/Python/lldbsuite/test/commands/expression/ignore-artificial-constructors/main.cpp
 Thu Oct 17 11:16:50 2019
@@ -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 = {}"])
+}

Modified: lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp
URL: 
http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp?rev=375151&r1=375150&r2=375151&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp 
(original)
+++ lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp Thu Oct 
17 11:16:50 2019
@@ -1007,8 +1007,11 @@ TypeSP DWARFASTParserClang::ParseTypeFro
                               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);


_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to