This patch is a reworking of Pete Lawrence's (@PortalPete) proposal for better expression evaluator error messages: https://github.com/llvm/llvm-project/pull/80938 Before: ``` $ lldb -o "expr a+b" (lldb) expr a+b error: <user expression 0>:1:1: use of undeclared identifier 'a' a+b ^ error: <user expression 0>:1:3: use of undeclared identifier 'b' a+b ^ ``` After: ``` (lldb) expr a+b ^ ^ │ ╰─ error: use of undeclared identifier 'b' ╰─ error: use of undeclared identifier 'a' ``` This eliminates the confusing `<user expression 0>:1:3` source location and avoids echoing the expression to the console again, which results in a cleaner presentation that makes it easier to grasp what's going on. You can't see it here, bug the word "error" is now also in color, if so desired. Depends on https://github.com/llvm/llvm-project/pull/106442.
64 lines
2.4 KiB
Python
64 lines
2.4 KiB
Python
"""
|
|
Test that we can call C++ template fucntions.
|
|
"""
|
|
import lldb
|
|
from lldbsuite.test.decorators import *
|
|
from lldbsuite.test.lldbtest import *
|
|
from lldbsuite.test import lldbutil
|
|
|
|
|
|
class TemplateFunctionsTestCase(TestBase):
|
|
def do_test_template_function(self, add_cast):
|
|
self.build()
|
|
lldbutil.run_to_source_breakpoint(
|
|
self, "// break here", lldb.SBFileSpec("main.cpp", False)
|
|
)
|
|
|
|
if add_cast:
|
|
self.expect_expr("(int) foo(42)", result_type="int", result_value="42")
|
|
else:
|
|
self.expect(
|
|
"expr b1 <=> b2",
|
|
error=True,
|
|
substrs=[
|
|
"warning:",
|
|
"'<=>' is a single token in C++20; add a space to avoid a change in behavior",
|
|
],
|
|
)
|
|
|
|
self.expect_expr("foo(42)", result_type="int", result_value="42")
|
|
|
|
# overload with template case
|
|
self.expect_expr("h(10)", result_type="int", result_value="10")
|
|
|
|
# ADL lookup case
|
|
self.expect_expr("f(A::C{})", result_type="int", result_value="4")
|
|
|
|
# ADL lookup but no overload
|
|
self.expect_expr("g(A::C{})", result_type="int", result_value="4")
|
|
|
|
# variadic function cases
|
|
self.expect_expr("var(1)", result_type="int", result_value="10")
|
|
self.expect_expr("var(1, 2)", result_type="int", result_value="10")
|
|
|
|
# Overloaded templated operator case
|
|
self.expect_expr("b1 > b2", result_type="bool", result_value="true")
|
|
self.expect_expr("b1 >> b2", result_type="bool", result_value="true")
|
|
self.expect_expr("b1 << b2", result_type="bool", result_value="true")
|
|
self.expect_expr("b1 == b2", result_type="bool", result_value="true")
|
|
|
|
# Overloaded operator case
|
|
self.expect_expr("d1 > d2", result_type="bool", result_value="true")
|
|
self.expect_expr("d1 >> d2", result_type="bool", result_value="true")
|
|
self.expect_expr("d1 << d2", result_type="bool", result_value="true")
|
|
self.expect_expr("d1 == d2", result_type="bool", result_value="true")
|
|
|
|
@skipIfWindows
|
|
def test_template_function_with_cast(self):
|
|
self.do_test_template_function(True)
|
|
|
|
@skipIfWindows
|
|
@expectedFailureAll(debug_info=["dwarf", "gmodules", "dwo"])
|
|
def test_template_function_without_cast(self):
|
|
self.do_test_template_function(False)
|