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