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 NamespaceLookupTestCase(TestBase):
1499451b44SJordan Rupprecht
1599451b44SJordan Rupprecht    def setUp(self):
1699451b44SJordan Rupprecht        # Call super's setUp().
1799451b44SJordan Rupprecht        TestBase.setUp(self)
1899451b44SJordan Rupprecht        # Break inside different scopes and evaluate value
1999451b44SJordan Rupprecht        self.line_break_global_scope = line_number(
2099451b44SJordan Rupprecht            'ns.cpp', '// BP_global_scope')
2199451b44SJordan Rupprecht        self.line_break_file_scope = line_number('ns2.cpp', '// BP_file_scope')
2299451b44SJordan Rupprecht        self.line_break_ns_scope = line_number('ns2.cpp', '// BP_ns_scope')
2399451b44SJordan Rupprecht        self.line_break_nested_ns_scope = line_number(
2499451b44SJordan Rupprecht            'ns2.cpp', '// BP_nested_ns_scope')
2599451b44SJordan Rupprecht        self.line_break_nested_ns_scope_after_using = line_number(
2699451b44SJordan Rupprecht            'ns2.cpp', '// BP_nested_ns_scope_after_using')
2799451b44SJordan Rupprecht        self.line_break_before_using_directive = line_number(
2899451b44SJordan Rupprecht            'ns3.cpp', '// BP_before_using_directive')
2999451b44SJordan Rupprecht        self.line_break_after_using_directive = line_number(
3099451b44SJordan Rupprecht            'ns3.cpp', '// BP_after_using_directive')
3199451b44SJordan Rupprecht
3299451b44SJordan Rupprecht    def runToBkpt(self, command):
3399451b44SJordan Rupprecht        self.runCmd(command, RUN_SUCCEEDED)
3499451b44SJordan Rupprecht        # The stop reason of the thread should be breakpoint.
3599451b44SJordan Rupprecht        self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT,
3699451b44SJordan Rupprecht                    substrs=['stopped',
3799451b44SJordan Rupprecht                             'stop reason = breakpoint'])
3899451b44SJordan Rupprecht
3999451b44SJordan Rupprecht    @skipIfWindows # This is flakey on Windows: llvm.org/pr38373
4099451b44SJordan Rupprecht    def test_scope_lookup_with_run_command(self):
4199451b44SJordan Rupprecht        """Test scope lookup of functions in lldb."""
4299451b44SJordan Rupprecht        self.build()
4399451b44SJordan Rupprecht        self.runCmd("file " + self.getBuildArtifact("a.out"), CURRENT_EXECUTABLE_SET)
4499451b44SJordan Rupprecht
4599451b44SJordan Rupprecht        lldbutil.run_break_set_by_file_and_line(
4699451b44SJordan Rupprecht            self,
4799451b44SJordan Rupprecht            "ns.cpp",
4899451b44SJordan Rupprecht            self.line_break_global_scope,
4999451b44SJordan Rupprecht            num_expected_locations=1,
5099451b44SJordan Rupprecht            loc_exact=False)
5199451b44SJordan Rupprecht        lldbutil.run_break_set_by_file_and_line(
5299451b44SJordan Rupprecht            self,
5399451b44SJordan Rupprecht            "ns2.cpp",
5499451b44SJordan Rupprecht            self.line_break_ns_scope,
5599451b44SJordan Rupprecht            num_expected_locations=1,
5699451b44SJordan Rupprecht            loc_exact=False)
5799451b44SJordan Rupprecht        lldbutil.run_break_set_by_file_and_line(
5899451b44SJordan Rupprecht            self,
5999451b44SJordan Rupprecht            "ns2.cpp",
6099451b44SJordan Rupprecht            self.line_break_nested_ns_scope,
6199451b44SJordan Rupprecht            num_expected_locations=1,
6299451b44SJordan Rupprecht            loc_exact=False)
6399451b44SJordan Rupprecht        lldbutil.run_break_set_by_file_and_line(
6499451b44SJordan Rupprecht            self,
6599451b44SJordan Rupprecht            "ns2.cpp",
6699451b44SJordan Rupprecht            self.line_break_nested_ns_scope_after_using,
6799451b44SJordan Rupprecht            num_expected_locations=1,
6899451b44SJordan Rupprecht            loc_exact=False)
6999451b44SJordan Rupprecht        lldbutil.run_break_set_by_file_and_line(
7099451b44SJordan Rupprecht            self,
7199451b44SJordan Rupprecht            "ns3.cpp",
7299451b44SJordan Rupprecht            self.line_break_before_using_directive,
7399451b44SJordan Rupprecht            num_expected_locations=1,
7499451b44SJordan Rupprecht            loc_exact=False)
7599451b44SJordan Rupprecht        lldbutil.run_break_set_by_file_and_line(
7699451b44SJordan Rupprecht            self,
7799451b44SJordan Rupprecht            "ns3.cpp",
7899451b44SJordan Rupprecht            self.line_break_after_using_directive,
7999451b44SJordan Rupprecht            num_expected_locations=1,
8099451b44SJordan Rupprecht            loc_exact=False)
8199451b44SJordan Rupprecht
8299451b44SJordan Rupprecht        # Run to BP_global_scope at global scope
8399451b44SJordan Rupprecht        self.runToBkpt("run")
8499451b44SJordan Rupprecht        # Evaluate func() - should call ::func()
8599451b44SJordan Rupprecht        self.expect("expr -- func()", startstr="(int) $0 = 1")
8699451b44SJordan Rupprecht        # Evaluate A::B::func() - should call A::B::func()
8799451b44SJordan Rupprecht        self.expect("expr -- A::B::func()", startstr="(int) $1 = 4")
8899451b44SJordan Rupprecht        # Evaluate func(10) - should call ::func(int)
8999451b44SJordan Rupprecht        self.expect("expr -- func(10)", startstr="(int) $2 = 11")
9099451b44SJordan Rupprecht        # Evaluate ::func() - should call A::func()
9199451b44SJordan Rupprecht        self.expect("expr -- ::func()", startstr="(int) $3 = 1")
9299451b44SJordan Rupprecht        # Evaluate A::foo() - should call A::foo()
9399451b44SJordan Rupprecht        self.expect("expr -- A::foo()", startstr="(int) $4 = 42")
9499451b44SJordan Rupprecht
9599451b44SJordan Rupprecht        # Continue to BP_ns_scope at ns scope
9699451b44SJordan Rupprecht        self.runToBkpt("continue")
9799451b44SJordan Rupprecht        # Evaluate func(10) - should call A::func(int)
9899451b44SJordan Rupprecht        self.expect("expr -- func(10)", startstr="(int) $5 = 13")
9999451b44SJordan Rupprecht        # Evaluate B::func() - should call B::func()
10099451b44SJordan Rupprecht        self.expect("expr -- B::func()", startstr="(int) $6 = 4")
10199451b44SJordan Rupprecht        # Evaluate func() - should call A::func()
10299451b44SJordan Rupprecht        self.expect("expr -- func()", startstr="(int) $7 = 3")
10399451b44SJordan Rupprecht
10499451b44SJordan Rupprecht        # Continue to BP_nested_ns_scope at nested ns scope
10599451b44SJordan Rupprecht        self.runToBkpt("continue")
10699451b44SJordan Rupprecht        # Evaluate func() - should call A::B::func()
10799451b44SJordan Rupprecht        self.expect("expr -- func()", startstr="(int) $8 = 4")
10899451b44SJordan Rupprecht        # Evaluate A::func() - should call A::func()
10999451b44SJordan Rupprecht        self.expect("expr -- A::func()", startstr="(int) $9 = 3")
11099451b44SJordan Rupprecht
11199451b44SJordan Rupprecht        # Evaluate func(10) - should call A::func(10)
11299451b44SJordan Rupprecht        # NOTE: Under the rules of C++, this test would normally get an error
11399451b44SJordan Rupprecht        # because A::B::func() hides A::func(), but lldb intentionally
11499451b44SJordan Rupprecht        # disobeys these rules so that the intended overload can be found
11599451b44SJordan Rupprecht        # by only removing duplicates if they have the same type.
11699451b44SJordan Rupprecht        self.expect("expr -- func(10)", startstr="(int) $10 = 13")
11799451b44SJordan Rupprecht
11899451b44SJordan Rupprecht        # Continue to BP_nested_ns_scope_after_using at nested ns scope after
11999451b44SJordan Rupprecht        # using declaration
12099451b44SJordan Rupprecht        self.runToBkpt("continue")
12199451b44SJordan Rupprecht        # Evaluate A::func(10) - should call A::func(int)
12299451b44SJordan Rupprecht        self.expect("expr -- A::func(10)", startstr="(int) $11 = 13")
12399451b44SJordan Rupprecht
12499451b44SJordan Rupprecht        # Continue to BP_before_using_directive at global scope before using
12599451b44SJordan Rupprecht        # declaration
12699451b44SJordan Rupprecht        self.runToBkpt("continue")
12799451b44SJordan Rupprecht        # Evaluate ::func() - should call ::func()
12899451b44SJordan Rupprecht        self.expect("expr -- ::func()", startstr="(int) $12 = 1")
12999451b44SJordan Rupprecht        # Evaluate B::func() - should call B::func()
13099451b44SJordan Rupprecht        self.expect("expr -- B::func()", startstr="(int) $13 = 4")
13199451b44SJordan Rupprecht
13299451b44SJordan Rupprecht        # Continue to BP_after_using_directive at global scope after using
13399451b44SJordan Rupprecht        # declaration
13499451b44SJordan Rupprecht        self.runToBkpt("continue")
13599451b44SJordan Rupprecht        # Evaluate ::func() - should call ::func()
13699451b44SJordan Rupprecht        self.expect("expr -- ::func()", startstr="(int) $14 = 1")
13799451b44SJordan Rupprecht        # Evaluate B::func() - should call B::func()
13899451b44SJordan Rupprecht        self.expect("expr -- B::func()", startstr="(int) $15 = 4")
13999451b44SJordan Rupprecht
140*e9b09940SJonas Devlieghere    @expectedFailure("lldb scope lookup of functions bugs")
14199451b44SJordan Rupprecht    def test_function_scope_lookup_with_run_command(self):
14299451b44SJordan Rupprecht        """Test scope lookup of functions in lldb."""
14399451b44SJordan Rupprecht        self.build()
14499451b44SJordan Rupprecht        self.runCmd("file " + self.getBuildArtifact("a.out"), CURRENT_EXECUTABLE_SET)
14599451b44SJordan Rupprecht
14699451b44SJordan Rupprecht        lldbutil.run_break_set_by_file_and_line(
14799451b44SJordan Rupprecht            self,
14899451b44SJordan Rupprecht            "ns.cpp",
14999451b44SJordan Rupprecht            self.line_break_global_scope,
15099451b44SJordan Rupprecht            num_expected_locations=1,
15199451b44SJordan Rupprecht            loc_exact=False)
15299451b44SJordan Rupprecht        lldbutil.run_break_set_by_file_and_line(
15399451b44SJordan Rupprecht            self,
15499451b44SJordan Rupprecht            "ns2.cpp",
15599451b44SJordan Rupprecht            self.line_break_ns_scope,
15699451b44SJordan Rupprecht            num_expected_locations=1,
15799451b44SJordan Rupprecht            loc_exact=False)
15899451b44SJordan Rupprecht
15999451b44SJordan Rupprecht        # Run to BP_global_scope at global scope
16099451b44SJordan Rupprecht        self.runToBkpt("run")
16199451b44SJordan Rupprecht        # Evaluate foo() - should call ::foo()
16299451b44SJordan Rupprecht        # FIXME: lldb finds Y::foo because lookup for variables is done
16399451b44SJordan Rupprecht        # before functions.
16499451b44SJordan Rupprecht        self.expect("expr -- foo()", startstr="(int) $0 = 42")
16599451b44SJordan Rupprecht        # Evaluate ::foo() - should call ::foo()
16699451b44SJordan Rupprecht        # FIXME: lldb finds Y::foo because lookup for variables is done
16799451b44SJordan Rupprecht        # before functions and :: is ignored.
16899451b44SJordan Rupprecht        self.expect("expr -- ::foo()", startstr="(int) $1 = 42")
16999451b44SJordan Rupprecht
17099451b44SJordan Rupprecht        # Continue to BP_ns_scope at ns scope
17199451b44SJordan Rupprecht        self.runToBkpt("continue")
17299451b44SJordan Rupprecht        # Evaluate foo() - should call A::foo()
17399451b44SJordan Rupprecht        # FIXME: lldb finds Y::foo because lookup for variables is done
17499451b44SJordan Rupprecht        # before functions.
17599451b44SJordan Rupprecht        self.expect("expr -- foo()", startstr="(int) $2 = 42")
17699451b44SJordan Rupprecht
177*e9b09940SJonas Devlieghere    @expectedFailure("lldb file scope lookup bugs")
17899451b44SJordan Rupprecht    @skipIfWindows # This is flakey on Windows: llvm.org/pr38373
17999451b44SJordan Rupprecht    def test_file_scope_lookup_with_run_command(self):
18099451b44SJordan Rupprecht        """Test file scope lookup in lldb."""
18199451b44SJordan Rupprecht        self.build()
18299451b44SJordan Rupprecht        self.runCmd("file " + self.getBuildArtifact("a.out"), CURRENT_EXECUTABLE_SET)
18399451b44SJordan Rupprecht
18499451b44SJordan Rupprecht        lldbutil.run_break_set_by_file_and_line(
18599451b44SJordan Rupprecht            self,
18699451b44SJordan Rupprecht            "ns2.cpp",
18799451b44SJordan Rupprecht            self.line_break_file_scope,
18899451b44SJordan Rupprecht            num_expected_locations=1,
18999451b44SJordan Rupprecht            loc_exact=False)
19099451b44SJordan Rupprecht
19199451b44SJordan Rupprecht        # Run to BP_file_scope at file scope
19299451b44SJordan Rupprecht        self.runToBkpt("run")
19399451b44SJordan Rupprecht        # Evaluate func() - should call static ns2.cpp:func()
19499451b44SJordan Rupprecht        # FIXME: This test fails because lldb doesn't know about file scopes so
19599451b44SJordan Rupprecht        # finds the global ::func().
19699451b44SJordan Rupprecht        self.expect("expr -- func()", startstr="(int) $0 = 2")
19799451b44SJordan Rupprecht
19899451b44SJordan Rupprecht    @skipIfWindows # This is flakey on Windows: llvm.org/pr38373
19999451b44SJordan Rupprecht    def test_scope_lookup_before_using_with_run_command(self):
20099451b44SJordan Rupprecht        """Test scope lookup before using in lldb."""
20199451b44SJordan Rupprecht        self.build()
20299451b44SJordan Rupprecht        self.runCmd("file " + self.getBuildArtifact("a.out"), CURRENT_EXECUTABLE_SET)
20399451b44SJordan Rupprecht
20499451b44SJordan Rupprecht        lldbutil.run_break_set_by_file_and_line(
20599451b44SJordan Rupprecht            self,
20699451b44SJordan Rupprecht            "ns3.cpp",
20799451b44SJordan Rupprecht            self.line_break_before_using_directive,
20899451b44SJordan Rupprecht            num_expected_locations=1,
20999451b44SJordan Rupprecht            loc_exact=False)
21099451b44SJordan Rupprecht
21199451b44SJordan Rupprecht        # Run to BP_before_using_directive at global scope before using
21299451b44SJordan Rupprecht        # declaration
21399451b44SJordan Rupprecht        self.runToBkpt("run")
21499451b44SJordan Rupprecht        # Evaluate func() - should call ::func()
21599451b44SJordan Rupprecht        self.expect("expr -- func()", startstr="(int) $0 = 1")
21699451b44SJordan Rupprecht
21799451b44SJordan Rupprecht    # NOTE: this test may fail on older systems that don't emit import
21899451b44SJordan Rupprecht    # entries in DWARF - may need to add checks for compiler versions here.
21999451b44SJordan Rupprecht    @skipIf(
22099451b44SJordan Rupprecht        compiler="gcc",
22199451b44SJordan Rupprecht        oslist=["linux"],
22299451b44SJordan Rupprecht        debug_info=["dwo"])  # Skip to avoid crash
22399451b44SJordan Rupprecht    def test_scope_after_using_directive_lookup_with_run_command(self):
22499451b44SJordan Rupprecht        """Test scope lookup after using directive in lldb."""
22599451b44SJordan Rupprecht        self.build()
22699451b44SJordan Rupprecht        self.runCmd("file " + self.getBuildArtifact("a.out"), CURRENT_EXECUTABLE_SET)
22799451b44SJordan Rupprecht
22899451b44SJordan Rupprecht        lldbutil.run_break_set_by_file_and_line(
22999451b44SJordan Rupprecht            self,
23099451b44SJordan Rupprecht            "ns3.cpp",
23199451b44SJordan Rupprecht            self.line_break_after_using_directive,
23299451b44SJordan Rupprecht            num_expected_locations=1,
23399451b44SJordan Rupprecht            loc_exact=False)
23499451b44SJordan Rupprecht
23599451b44SJordan Rupprecht        # Run to BP_after_using_directive at global scope after using
23699451b44SJordan Rupprecht        # declaration
23799451b44SJordan Rupprecht        self.runToBkpt("run")
23899451b44SJordan Rupprecht        # Evaluate func2() - should call A::func2()
23999451b44SJordan Rupprecht        self.expect("expr -- func2()", startstr="(int) $0 = 3")
24099451b44SJordan Rupprecht
241*e9b09940SJonas Devlieghere    @expectedFailure(
24299451b44SJordan Rupprecht        "lldb scope lookup after using declaration bugs")
24399451b44SJordan Rupprecht    # NOTE: this test may fail on older systems that don't emit import
24499451b44SJordan Rupprecht    # emtries in DWARF - may need to add checks for compiler versions here.
24599451b44SJordan Rupprecht    def test_scope_after_using_declaration_lookup_with_run_command(self):
24699451b44SJordan Rupprecht        """Test scope lookup after using declaration in lldb."""
24799451b44SJordan Rupprecht        self.build()
24899451b44SJordan Rupprecht        self.runCmd("file " + self.getBuildArtifact("a.out"), CURRENT_EXECUTABLE_SET)
24999451b44SJordan Rupprecht
25099451b44SJordan Rupprecht        lldbutil.run_break_set_by_file_and_line(
25199451b44SJordan Rupprecht            self,
25299451b44SJordan Rupprecht            "ns2.cpp",
25399451b44SJordan Rupprecht            self.line_break_nested_ns_scope_after_using,
25499451b44SJordan Rupprecht            num_expected_locations=1,
25599451b44SJordan Rupprecht            loc_exact=False)
25699451b44SJordan Rupprecht
25799451b44SJordan Rupprecht        # Run to BP_nested_ns_scope_after_using at nested ns scope after using
25899451b44SJordan Rupprecht        # declaration
25999451b44SJordan Rupprecht        self.runToBkpt("run")
26099451b44SJordan Rupprecht        # Evaluate func() - should call A::func()
26199451b44SJordan Rupprecht        self.expect("expr -- func()", startstr="(int) $0 = 3")
26299451b44SJordan Rupprecht
263*e9b09940SJonas Devlieghere    @expectedFailure("lldb scope lookup ambiguity after using bugs")
26499451b44SJordan Rupprecht    def test_scope_ambiguity_after_using_lookup_with_run_command(self):
26599451b44SJordan Rupprecht        """Test scope lookup ambiguity after using in lldb."""
26699451b44SJordan Rupprecht        self.build()
26799451b44SJordan Rupprecht        self.runCmd("file " + self.getBuildArtifact("a.out"), CURRENT_EXECUTABLE_SET)
26899451b44SJordan Rupprecht
26999451b44SJordan Rupprecht        lldbutil.run_break_set_by_file_and_line(
27099451b44SJordan Rupprecht            self,
27199451b44SJordan Rupprecht            "ns3.cpp",
27299451b44SJordan Rupprecht            self.line_break_after_using_directive,
27399451b44SJordan Rupprecht            num_expected_locations=1,
27499451b44SJordan Rupprecht            loc_exact=False)
27599451b44SJordan Rupprecht
27699451b44SJordan Rupprecht        # Run to BP_after_using_directive at global scope after using
27799451b44SJordan Rupprecht        # declaration
27899451b44SJordan Rupprecht        self.runToBkpt("run")
27999451b44SJordan Rupprecht        # Evaluate func() - should get error: ambiguous
28099451b44SJordan Rupprecht        # FIXME: This test fails because lldb removes duplicates if they have
28199451b44SJordan Rupprecht        # the same type.
28299451b44SJordan Rupprecht        self.expect("expr -- func()", startstr="error")
28399451b44SJordan Rupprecht
28499451b44SJordan Rupprecht    def test_scope_lookup_shadowed_by_using_with_run_command(self):
28599451b44SJordan Rupprecht        """Test scope lookup shadowed by using in lldb."""
28699451b44SJordan Rupprecht        self.build()
28799451b44SJordan Rupprecht        self.runCmd("file " + self.getBuildArtifact("a.out"), CURRENT_EXECUTABLE_SET)
28899451b44SJordan Rupprecht
28999451b44SJordan Rupprecht        lldbutil.run_break_set_by_file_and_line(
29099451b44SJordan Rupprecht            self,
29199451b44SJordan Rupprecht            "ns2.cpp",
29299451b44SJordan Rupprecht            self.line_break_nested_ns_scope,
29399451b44SJordan Rupprecht            num_expected_locations=1,
29499451b44SJordan Rupprecht            loc_exact=False)
29599451b44SJordan Rupprecht
29699451b44SJordan Rupprecht        # Run to BP_nested_ns_scope at nested ns scope
29799451b44SJordan Rupprecht        self.runToBkpt("run")
29899451b44SJordan Rupprecht        # Evaluate func(10) - should call A::func(10)
29999451b44SJordan Rupprecht        # NOTE: Under the rules of C++, this test would normally get an error
30099451b44SJordan Rupprecht        # because A::B::func() shadows A::func(), but lldb intentionally
30199451b44SJordan Rupprecht        # disobeys these rules so that the intended overload can be found
30299451b44SJordan Rupprecht        # by only removing duplicates if they have the same type.
30399451b44SJordan Rupprecht        self.expect("expr -- func(10)", startstr="(int) $0 = 13")
304