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); } _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits