199451b44SJordan Rupprecht"""
299451b44SJordan RupprechtTest the printing of anonymous and named namespace variables.
399451b44SJordan Rupprecht"""
499451b44SJordan Rupprecht
599451b44SJordan Rupprecht
699451b44SJordan Rupprecht
799451b44SJordan Rupprechtimport lldb
899451b44SJordan Rupprechtfrom lldbsuite.test.decorators import *
999451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import *
1099451b44SJordan Rupprechtfrom lldbsuite.test import lldbutil
1199451b44SJordan Rupprecht
1299451b44SJordan Rupprecht
1399451b44SJordan Rupprechtclass NamespaceBreakpointTestCase(TestBase):
1499451b44SJordan Rupprecht
1599451b44SJordan Rupprecht    @expectedFailureAll(bugnumber="llvm.org/pr28548", compiler="gcc")
1699451b44SJordan Rupprecht    @expectedFailureAll(oslist=["windows"])
1799451b44SJordan Rupprecht    def test_breakpoints_func_auto(self):
1899451b44SJordan Rupprecht        """Test that we can set breakpoints correctly by basename to find all functions whose basename is "func"."""
1999451b44SJordan Rupprecht        self.build()
2099451b44SJordan Rupprecht
2199451b44SJordan Rupprecht        names = [
2299451b44SJordan Rupprecht            "func()",
2399451b44SJordan Rupprecht            "func(int)",
2499451b44SJordan Rupprecht            "A::B::func()",
2599451b44SJordan Rupprecht            "A::func()",
2699451b44SJordan Rupprecht            "A::func(int)"]
2799451b44SJordan Rupprecht
2899451b44SJordan Rupprecht        # Create a target by the debugger.
2999451b44SJordan Rupprecht        exe = self.getBuildArtifact("a.out")
3099451b44SJordan Rupprecht        target = self.dbg.CreateTarget(exe)
3199451b44SJordan Rupprecht        self.assertTrue(target, VALID_TARGET)
3299451b44SJordan Rupprecht        module_list = lldb.SBFileSpecList()
3399451b44SJordan Rupprecht        module_list.Append(lldb.SBFileSpec(exe, False))
3499451b44SJordan Rupprecht        cu_list = lldb.SBFileSpecList()
3599451b44SJordan Rupprecht        # Set a breakpoint by name "func" which should pick up all functions
3699451b44SJordan Rupprecht        # whose basename is "func"
3799451b44SJordan Rupprecht        bp = target.BreakpointCreateByName(
3899451b44SJordan Rupprecht            "func", lldb.eFunctionNameTypeAuto, module_list, cu_list)
3999451b44SJordan Rupprecht        for bp_loc in bp:
4099451b44SJordan Rupprecht            name = bp_loc.GetAddress().GetFunction().GetName()
4199451b44SJordan Rupprecht            self.assertTrue(
4299451b44SJordan Rupprecht                name in names,
4399451b44SJordan Rupprecht                "make sure breakpoint locations are correct for 'func' with eFunctionNameTypeAuto")
4499451b44SJordan Rupprecht
4599451b44SJordan Rupprecht    @expectedFailureAll(bugnumber="llvm.org/pr28548", compiler="gcc")
4699451b44SJordan Rupprecht    def test_breakpoints_func_full(self):
4799451b44SJordan Rupprecht        """Test that we can set breakpoints correctly by fullname to find all functions whose fully qualified name is "func"
4899451b44SJordan Rupprecht           (no namespaces)."""
4999451b44SJordan Rupprecht        self.build()
5099451b44SJordan Rupprecht
5199451b44SJordan Rupprecht        names = ["func()", "func(int)"]
5299451b44SJordan Rupprecht
5399451b44SJordan Rupprecht        # Create a target by the debugger.
5499451b44SJordan Rupprecht        exe = self.getBuildArtifact("a.out")
5599451b44SJordan Rupprecht        target = self.dbg.CreateTarget(exe)
5699451b44SJordan Rupprecht        self.assertTrue(target, VALID_TARGET)
5799451b44SJordan Rupprecht        module_list = lldb.SBFileSpecList()
5899451b44SJordan Rupprecht        module_list.Append(lldb.SBFileSpec(exe, False))
5999451b44SJordan Rupprecht        cu_list = lldb.SBFileSpecList()
6099451b44SJordan Rupprecht
6199451b44SJordan Rupprecht        # Set a breakpoint by name "func" whose fullly qualified named matches "func" which
6299451b44SJordan Rupprecht        # should pick up only functions whose basename is "func" and has no
6399451b44SJordan Rupprecht        # containing context
6499451b44SJordan Rupprecht        bp = target.BreakpointCreateByName(
6599451b44SJordan Rupprecht            "func", lldb.eFunctionNameTypeFull, module_list, cu_list)
6699451b44SJordan Rupprecht        for bp_loc in bp:
6799451b44SJordan Rupprecht            name = bp_loc.GetAddress().GetFunction().GetName()
6899451b44SJordan Rupprecht            self.assertTrue(
6999451b44SJordan Rupprecht                name in names,
7099451b44SJordan Rupprecht                "make sure breakpoint locations are correct for 'func' with eFunctionNameTypeFull")
7199451b44SJordan Rupprecht
7299451b44SJordan Rupprecht    def test_breakpoints_a_func_full(self):
7399451b44SJordan Rupprecht        """Test that we can set breakpoints correctly by fullname to find all functions whose fully qualified name is "A::func"."""
7499451b44SJordan Rupprecht        self.build()
7599451b44SJordan Rupprecht
7699451b44SJordan Rupprecht        names = ["A::func()", "A::func(int)"]
7799451b44SJordan Rupprecht
7899451b44SJordan Rupprecht        # Create a target by the debugger.
7999451b44SJordan Rupprecht        exe = self.getBuildArtifact("a.out")
8099451b44SJordan Rupprecht        target = self.dbg.CreateTarget(exe)
8199451b44SJordan Rupprecht        self.assertTrue(target, VALID_TARGET)
8299451b44SJordan Rupprecht        module_list = lldb.SBFileSpecList()
8399451b44SJordan Rupprecht        module_list.Append(lldb.SBFileSpec(exe, False))
8499451b44SJordan Rupprecht        cu_list = lldb.SBFileSpecList()
8599451b44SJordan Rupprecht
8699451b44SJordan Rupprecht        # Set a breakpoint by name "A::func" whose fullly qualified named matches "A::func" which
8799451b44SJordan Rupprecht        # should pick up only functions whose basename is "func" and is
8899451b44SJordan Rupprecht        # contained in the "A" namespace
8999451b44SJordan Rupprecht        bp = target.BreakpointCreateByName(
9099451b44SJordan Rupprecht            "A::func", lldb.eFunctionNameTypeFull, module_list, cu_list)
9199451b44SJordan Rupprecht        for bp_loc in bp:
9299451b44SJordan Rupprecht            name = bp_loc.GetAddress().GetFunction().GetName()
9399451b44SJordan Rupprecht            self.assertTrue(
9499451b44SJordan Rupprecht                name in names,
9599451b44SJordan Rupprecht                "make sure breakpoint locations are correct for 'A::func' with eFunctionNameTypeFull")
9699451b44SJordan Rupprecht
9799451b44SJordan Rupprecht
9899451b44SJordan Rupprechtclass NamespaceTestCase(TestBase):
9999451b44SJordan Rupprecht
10099451b44SJordan Rupprecht    def setUp(self):
10199451b44SJordan Rupprecht        # Call super's setUp().
10299451b44SJordan Rupprecht        TestBase.setUp(self)
10399451b44SJordan Rupprecht        # Find the line numbers for declarations of namespace variables i and
10499451b44SJordan Rupprecht        # j.
10599451b44SJordan Rupprecht        self.line_var_i = line_number(
10699451b44SJordan Rupprecht            'main.cpp', '// Find the line number for anonymous namespace variable i.')
10799451b44SJordan Rupprecht        self.line_var_j = line_number(
10899451b44SJordan Rupprecht            'main.cpp', '// Find the line number for named namespace variable j.')
10999451b44SJordan Rupprecht        # And the line number to break at.
11099451b44SJordan Rupprecht        self.line_break = line_number('main.cpp',
11199451b44SJordan Rupprecht                                      '// Set break point at this line.')
11299451b44SJordan Rupprecht        # Break inside do {} while and evaluate value
11399451b44SJordan Rupprecht        self.line_break_ns1 = line_number('main.cpp', '// Evaluate ns1::value')
11499451b44SJordan Rupprecht        self.line_break_ns2 = line_number('main.cpp', '// Evaluate ns2::value')
11599451b44SJordan Rupprecht
11699451b44SJordan Rupprecht    def runToBkpt(self, command):
11799451b44SJordan Rupprecht        self.runCmd(command, RUN_SUCCEEDED)
11899451b44SJordan Rupprecht        # The stop reason of the thread should be breakpoint.
11999451b44SJordan Rupprecht        self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT,
12099451b44SJordan Rupprecht                    substrs=['stopped',
12199451b44SJordan Rupprecht                             'stop reason = breakpoint'])
12299451b44SJordan Rupprecht
12399451b44SJordan Rupprecht    # rdar://problem/8668674
12499451b44SJordan Rupprecht    @expectedFailureAll(oslist=["windows"], bugnumber="llvm.org/pr24764")
12599451b44SJordan Rupprecht    def test_with_run_command(self):
12699451b44SJordan Rupprecht        """Test that anonymous and named namespace variables display correctly."""
12799451b44SJordan Rupprecht        self.build()
12899451b44SJordan Rupprecht        self.runCmd("file " + self.getBuildArtifact("a.out"), CURRENT_EXECUTABLE_SET)
12999451b44SJordan Rupprecht
13099451b44SJordan Rupprecht        lldbutil.run_break_set_by_file_and_line(
13199451b44SJordan Rupprecht            self,
13299451b44SJordan Rupprecht            "main.cpp",
13399451b44SJordan Rupprecht            self.line_break_ns1,
13499451b44SJordan Rupprecht            num_expected_locations=1,
13599451b44SJordan Rupprecht            loc_exact=True)
13699451b44SJordan Rupprecht        lldbutil.run_break_set_by_file_and_line(
13799451b44SJordan Rupprecht            self,
13899451b44SJordan Rupprecht            "main.cpp",
13999451b44SJordan Rupprecht            self.line_break_ns2,
14099451b44SJordan Rupprecht            num_expected_locations=1,
14199451b44SJordan Rupprecht            loc_exact=True)
14299451b44SJordan Rupprecht        lldbutil.run_break_set_by_file_and_line(
14399451b44SJordan Rupprecht            self,
14499451b44SJordan Rupprecht            "main.cpp",
14599451b44SJordan Rupprecht            self.line_break,
14699451b44SJordan Rupprecht            num_expected_locations=1,
14799451b44SJordan Rupprecht            loc_exact=True)
14899451b44SJordan Rupprecht
14999451b44SJordan Rupprecht        self.runToBkpt("run")
15099451b44SJordan Rupprecht        # Evaluate ns1::value
151*42b9a683SRaphael Isemann        self.expect_expr("value", result_value="100")
15299451b44SJordan Rupprecht
15399451b44SJordan Rupprecht        self.runToBkpt("continue")
15499451b44SJordan Rupprecht        # Evaluate ns2::value
155*42b9a683SRaphael Isemann        self.expect_expr("value", result_value="200")
15699451b44SJordan Rupprecht
15799451b44SJordan Rupprecht        self.runToBkpt("continue")
15899451b44SJordan Rupprecht        # On Mac OS X, gcc 4.2 emits the wrong debug info with respect to
15999451b44SJordan Rupprecht        # types.
16099451b44SJordan Rupprecht        slist = ['(int) a = 12', 'anon_uint', 'a_uint', 'b_uint', 'y_uint']
16199451b44SJordan Rupprecht        if self.platformIsDarwin() and self.getCompiler() in [
16299451b44SJordan Rupprecht                'clang', 'llvm-gcc']:
16399451b44SJordan Rupprecht            slist = ['(int) a = 12',
16499451b44SJordan Rupprecht                     '::my_uint_t', 'anon_uint = 0',
16599451b44SJordan Rupprecht                     '(A::uint_t) a_uint = 1',
16699451b44SJordan Rupprecht                     '(A::B::uint_t) b_uint = 2',
16799451b44SJordan Rupprecht                     '(Y::uint_t) y_uint = 3']
16899451b44SJordan Rupprecht
16999451b44SJordan Rupprecht        # 'frame variable' displays the local variables with type information.
17099451b44SJordan Rupprecht        self.expect('frame variable', VARIABLES_DISPLAYED_CORRECTLY,
17199451b44SJordan Rupprecht                    substrs=slist)
17299451b44SJordan Rupprecht
17399451b44SJordan Rupprecht        # 'frame variable' with basename 'i' should work.
17499451b44SJordan Rupprecht        self.expect(
17599451b44SJordan Rupprecht            "frame variable --show-declaration --show-globals i",
17699451b44SJordan Rupprecht            startstr="main.cpp:%d: (int) (anonymous namespace)::i = 3" %
17799451b44SJordan Rupprecht            self.line_var_i)
17899451b44SJordan Rupprecht        # main.cpp:12: (int) (anonymous namespace)::i = 3
17999451b44SJordan Rupprecht
18099451b44SJordan Rupprecht        # 'frame variable' with basename 'j' should work, too.
18199451b44SJordan Rupprecht        self.expect(
18299451b44SJordan Rupprecht            "frame variable --show-declaration --show-globals j",
18399451b44SJordan Rupprecht            startstr="main.cpp:%d: (int) A::B::j = 4" %
18499451b44SJordan Rupprecht            self.line_var_j)
18599451b44SJordan Rupprecht        # main.cpp:19: (int) A::B::j = 4
18699451b44SJordan Rupprecht
18799451b44SJordan Rupprecht        # 'frame variable' should support address-of operator.
18899451b44SJordan Rupprecht        self.runCmd("frame variable &i")
18999451b44SJordan Rupprecht
19099451b44SJordan Rupprecht        # 'frame variable' with fully qualified name 'A::B::j' should work.
19199451b44SJordan Rupprecht        self.expect("frame variable A::B::j", VARIABLES_DISPLAYED_CORRECTLY,
19299451b44SJordan Rupprecht                    startstr='(int) A::B::j = 4',
19399451b44SJordan Rupprecht                    patterns=[' = 4'])
19499451b44SJordan Rupprecht
19599451b44SJordan Rupprecht        # So should the anonymous namespace case.
19699451b44SJordan Rupprecht        self.expect(
19799451b44SJordan Rupprecht            "frame variable '(anonymous namespace)::i'",
19899451b44SJordan Rupprecht            VARIABLES_DISPLAYED_CORRECTLY,
19999451b44SJordan Rupprecht            startstr='(int) (anonymous namespace)::i = 3',
20099451b44SJordan Rupprecht            patterns=[' = 3'])
20199451b44SJordan Rupprecht
20299451b44SJordan Rupprecht        # rdar://problem/8660275
20399451b44SJordan Rupprecht        # test/namespace: 'expression -- i+j' not working
20499451b44SJordan Rupprecht        # This has been fixed.
205*42b9a683SRaphael Isemann        self.expect_expr("i + j", result_type="int", result_value="7")
20699451b44SJordan Rupprecht        # (int) $2 = 7
20799451b44SJordan Rupprecht
208*42b9a683SRaphael Isemann        self.expect_expr("i", result_value="3")
209*42b9a683SRaphael Isemann        self.expect_expr("j", result_value="4")
21099451b44SJordan Rupprecht
21199451b44SJordan Rupprecht        # rdar://problem/8668674
21299451b44SJordan Rupprecht        # expression command with fully qualified namespace for a variable does
21399451b44SJordan Rupprecht        # not work
214*42b9a683SRaphael Isemann        self.expect_expr("::i", result_value="3")
215*42b9a683SRaphael Isemann        self.expect_expr("A::B::j", result_value="4")
21699451b44SJordan Rupprecht
21799451b44SJordan Rupprecht        # expression command with function in anonymous namespace
218*42b9a683SRaphael Isemann        self.expect_expr("myanonfunc(3)", result_value="6")
21999451b44SJordan Rupprecht
22099451b44SJordan Rupprecht        # global namespace qualification with function in anonymous namespace
221*42b9a683SRaphael Isemann        self.expect_expr("myanonfunc(4)", result_value="8")
22299451b44SJordan Rupprecht
22399451b44SJordan Rupprecht        self.expect("p myanonfunc",
22499451b44SJordan Rupprecht                    patterns=['\(anonymous namespace\)::myanonfunc\(int\)'])
22599451b44SJordan Rupprecht
22699451b44SJordan Rupprecht        self.expect("p variadic_sum", patterns=[
22799451b44SJordan Rupprecht                    '\(anonymous namespace\)::variadic_sum\(int, ...\)'])
228