199451b44SJordan Rupprecht""" 299451b44SJordan RupprechtTest that we can call C++ template fucntions. 399451b44SJordan Rupprecht""" 499451b44SJordan Rupprechtimport lldb 599451b44SJordan Rupprechtfrom lldbsuite.test.decorators import * 699451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import * 799451b44SJordan Rupprechtfrom lldbsuite.test import lldbutil 899451b44SJordan Rupprecht 999451b44SJordan Rupprecht 1099451b44SJordan Rupprechtclass TemplateFunctionsTestCase(TestBase): 1199451b44SJordan Rupprecht 1299451b44SJordan Rupprecht def do_test_template_function(self, add_cast): 1399451b44SJordan Rupprecht self.build() 14*9e2715aaSshafik lldbutil.run_to_source_breakpoint(self, '// break here', 15*9e2715aaSshafik lldb.SBFileSpec("main.cpp", False)) 16*9e2715aaSshafik 1799451b44SJordan Rupprecht if add_cast: 18*9e2715aaSshafik self.expect_expr("(int) foo(42)", result_type="int", result_value="42") 19*9e2715aaSshafik else: 20*9e2715aaSshafik self.expect("expr b1 <=> b2", error=True, substrs=["warning: <user expression 0>:1:4: '<=>' is a single token in C++20; add a space to avoid a change in behavior"]) 21*9e2715aaSshafik 22*9e2715aaSshafik self.expect_expr("foo(42)", result_type="int", result_value="42") 23*9e2715aaSshafik 24*9e2715aaSshafik # overload with template case 25*9e2715aaSshafik self.expect_expr("h(10)", result_type="int", result_value="10") 26*9e2715aaSshafik 27*9e2715aaSshafik # ADL lookup case 28*9e2715aaSshafik self.expect_expr("f(A::C{})", result_type="int", result_value="4") 29*9e2715aaSshafik 30*9e2715aaSshafik # ADL lookup but no overload 31*9e2715aaSshafik self.expect_expr("g(A::C{})", result_type="int", result_value="4") 32*9e2715aaSshafik 33*9e2715aaSshafik # variadic function cases 34*9e2715aaSshafik self.expect_expr("var(1)", result_type="int", result_value="10") 35*9e2715aaSshafik self.expect_expr("var(1, 2)", result_type="int", result_value="10") 36*9e2715aaSshafik 37*9e2715aaSshafik # Overloaded templated operator case 38*9e2715aaSshafik self.expect_expr("b1 > b2", result_type="bool", result_value="true") 39*9e2715aaSshafik self.expect_expr("b1 >> b2", result_type="bool", result_value="true") 40*9e2715aaSshafik self.expect_expr("b1 << b2", result_type="bool", result_value="true") 41*9e2715aaSshafik self.expect_expr("b1 == b2", result_type="bool", result_value="true") 42*9e2715aaSshafik 43*9e2715aaSshafik # Overloaded operator case 44*9e2715aaSshafik self.expect_expr("d1 > d2", result_type="bool", result_value="true") 45*9e2715aaSshafik self.expect_expr("d1 >> d2", result_type="bool", result_value="true") 46*9e2715aaSshafik self.expect_expr("d1 << d2", result_type="bool", result_value="true") 47*9e2715aaSshafik self.expect_expr("d1 == d2", result_type="bool", result_value="true") 4899451b44SJordan Rupprecht 4999451b44SJordan Rupprecht @skipIfWindows 5099451b44SJordan Rupprecht def test_template_function_with_cast(self): 5199451b44SJordan Rupprecht self.do_test_template_function(True) 5299451b44SJordan Rupprecht 5399451b44SJordan Rupprecht @skipIfWindows 5499451b44SJordan Rupprecht @expectedFailureAll(debug_info=["dwarf", "gmodules", "dwo"]) 5599451b44SJordan Rupprecht def test_template_function_without_cast(self): 5699451b44SJordan Rupprecht self.do_test_template_function(False) 57