Files
clang-p2996/lldb/test/API/lang/cpp/template-function/TestTemplateFunctions.py
Adrian Prantl d33fa70ddd [lldb] Inline expression evaluator error visualization (#106470)
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.
2024-09-27 18:09:52 -07:00

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)