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.
52 lines
2.1 KiB
Python
52 lines
2.1 KiB
Python
"""Test that lldb works correctly on compile units form different languages."""
|
|
|
|
|
|
import re
|
|
import lldb
|
|
from lldbsuite.test.lldbtest import *
|
|
|
|
|
|
class MixedLanguagesTestCase(TestBase):
|
|
def test_language_of_frame(self):
|
|
"""Test that the language defaults to the language of the current frame."""
|
|
self.build()
|
|
exe = self.getBuildArtifact("a.out")
|
|
self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET)
|
|
|
|
# Execute the cleanup function during test case tear down
|
|
# to restore the frame format.
|
|
def cleanup():
|
|
self.runCmd(
|
|
"settings set frame-format %s" % self.format_string, check=False
|
|
)
|
|
|
|
self.addTearDownHook(cleanup)
|
|
self.runCmd("settings show frame-format")
|
|
m = re.match('^frame-format \(format-string\) = "(.*)"$', self.res.GetOutput())
|
|
self.assertTrue(m, "Bad settings string")
|
|
self.format_string = m.group(1)
|
|
|
|
# Change the default format to print the language.
|
|
format_string = "frame #${frame.index}: ${frame.pc}{ ${module.file.basename}\`${function.name}{${function.pc-offset}}}{, lang=${language}}\n"
|
|
self.runCmd("settings set frame-format %s" % format_string)
|
|
self.expect(
|
|
"settings show frame-format",
|
|
SETTING_MSG("frame-format"),
|
|
substrs=[format_string],
|
|
)
|
|
|
|
# Run to BP at main (in main.c) and test that the language is C.
|
|
self.runCmd("breakpoint set -n main")
|
|
self.runCmd("run")
|
|
self.expect("thread backtrace", substrs=["`main", "lang=c"])
|
|
# Make sure evaluation of C++11 fails.
|
|
self.expect("expr foo != nullptr", error=True, substrs=["error"])
|
|
|
|
# Run to BP at foo (in foo.cpp) and test that the language is C++.
|
|
self.runCmd("breakpoint set -n foo")
|
|
self.runCmd("continue")
|
|
self.expect("thread backtrace", substrs=["`::foo()", "lang=c++"])
|
|
# Make sure we can evaluate an expression requiring C++11
|
|
# (note: C++11 is enabled by default for C++).
|
|
self.expect("expr foo != nullptr", patterns=["true"])
|