[Lldb-commits] [lldb] r330450 - Fix a crash when resolving overloads of C++ virtual methods.

Adrian Prantl via lldb-commits lldb-commits at lists.llvm.org
Fri Apr 20 10:14:05 PDT 2018


Author: adrian
Date: Fri Apr 20 10:14:05 2018
New Revision: 330450

URL: http://llvm.org/viewvc/llvm-project?rev=330450&view=rev
Log:
Fix a crash when resolving overloads of C++ virtual methods.

The isOverload() method needs to account for situations where the two
methods being compared don't have the same number of arguments.

rdar://problem/39542960

Added:
    lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/virtual-overload/
    lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/virtual-overload/Makefile
    lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/virtual-overload/TestVirtualOverload.py
    lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/virtual-overload/main.cpp
Modified:
    lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp

Added: lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/virtual-overload/Makefile
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/virtual-overload/Makefile?rev=330450&view=auto
==============================================================================
--- lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/virtual-overload/Makefile (added)
+++ lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/virtual-overload/Makefile Fri Apr 20 10:14:05 2018
@@ -0,0 +1,5 @@
+LEVEL = ../../../make
+
+CXX_SOURCES := main.cpp
+
+include $(LEVEL)/Makefile.rules

Added: lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/virtual-overload/TestVirtualOverload.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/virtual-overload/TestVirtualOverload.py?rev=330450&view=auto
==============================================================================
--- lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/virtual-overload/TestVirtualOverload.py (added)
+++ lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/virtual-overload/TestVirtualOverload.py Fri Apr 20 10:14:05 2018
@@ -0,0 +1,3 @@
+from lldbsuite.test import lldbinline
+
+lldbinline.MakeInlineTest(__file__, globals())

Added: lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/virtual-overload/main.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/virtual-overload/main.cpp?rev=330450&view=auto
==============================================================================
--- lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/virtual-overload/main.cpp (added)
+++ lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/virtual-overload/main.cpp Fri Apr 20 10:14:05 2018
@@ -0,0 +1,17 @@
+// Test that lldb doesn't get confused by an overload of a virtual
+// function of the same name.
+struct Base {
+  virtual void f(int i) {}
+  virtual ~Base() {}
+};
+
+struct Derived : Base {
+  virtual void f(int i, int j) {}
+};
+
+int main(int argc, char **argv) {
+  Derived obj;
+  obj.f(1, 2); //% self.expect("fr var", "not crashing", substrs = ["obj"])
+  return 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=330450&r1=330449&r2=330450&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp (original)
+++ lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp Fri Apr 20 10:14:05 2018
@@ -2170,7 +2170,10 @@ static bool isOverload(clang::CXXMethodD
                                  m2p.getUnqualifiedType());
     };
 
-  return !std::equal(m1Type->param_type_begin(), m1Type->param_type_end(),
+  // FIXME: In C++14 and later, we can just pass m2Type->param_type_end()
+  //        as a fourth parameter to std::equal().
+  return (m1->getNumParams() != m2->getNumParams()) ||
+         !std::equal(m1Type->param_type_begin(), m1Type->param_type_end(),
                      m2Type->param_type_begin(), compareArgTypes);
 }
 




More information about the lldb-commits mailing list