1"""Test that lldb works correctly on compile units form different languages."""
2
3
4
5import re
6import lldb
7from lldbsuite.test.lldbtest import *
8
9
10class MixedLanguagesTestCase(TestBase):
11
12    def test_language_of_frame(self):
13        """Test that the language defaults to the language of the current frame."""
14        self.build()
15        exe = self.getBuildArtifact("a.out")
16        self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET)
17
18        # Execute the cleanup function during test case tear down
19        # to restore the frame format.
20        def cleanup():
21            self.runCmd(
22                "settings set frame-format %s" %
23                self.format_string, check=False)
24        self.addTearDownHook(cleanup)
25        self.runCmd("settings show frame-format")
26        m = re.match(
27            '^frame-format \(format-string\) = "(.*)\"$',
28            self.res.GetOutput())
29        self.assertTrue(m, "Bad settings string")
30        self.format_string = m.group(1)
31
32        # Change the default format to print the language.
33        format_string = "frame #${frame.index}: ${frame.pc}{ ${module.file.basename}\`${function.name}{${function.pc-offset}}}{, lang=${language}}\n"
34        self.runCmd("settings set frame-format %s" % format_string)
35        self.expect("settings show frame-format", SETTING_MSG("frame-format"),
36                    substrs=[format_string])
37
38        # Run to BP at main (in main.c) and test that the language is C.
39        self.runCmd("breakpoint set -n main")
40        self.runCmd("run")
41        self.expect("thread backtrace",
42                    substrs=["`main", "lang=c"])
43        # Make sure evaluation of C++11 fails.
44        self.expect("expr foo != nullptr", error=True,
45                    startstr="error")
46
47        # Run to BP at foo (in foo.cpp) and test that the language is C++.
48        self.runCmd("breakpoint set -n foo")
49        self.runCmd("continue")
50        self.expect("thread backtrace",
51                    substrs=["`::foo()", "lang=c++"])
52        # Make sure we can evaluate an expression requiring C++11
53        # (note: C++11 is enabled by default for C++).
54        self.expect("expr foo != nullptr",
55                    patterns=["true"])
56