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    mydir = TestBase.compute_mydir(__file__)
1399451b44SJordan Rupprecht
1499451b44SJordan Rupprecht    def do_test_template_function(self, add_cast):
1599451b44SJordan Rupprecht        self.build()
16*9e2715aaSshafik        lldbutil.run_to_source_breakpoint(self, '// break here',
17*9e2715aaSshafik                lldb.SBFileSpec("main.cpp", False))
18*9e2715aaSshafik
1999451b44SJordan Rupprecht        if add_cast:
20*9e2715aaSshafik          self.expect_expr("(int) foo(42)", result_type="int", result_value="42")
21*9e2715aaSshafik        else:
22*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"])
23*9e2715aaSshafik
24*9e2715aaSshafik          self.expect_expr("foo(42)", result_type="int", result_value="42")
25*9e2715aaSshafik
26*9e2715aaSshafik          # overload with template case
27*9e2715aaSshafik          self.expect_expr("h(10)", result_type="int", result_value="10")
28*9e2715aaSshafik
29*9e2715aaSshafik          # ADL lookup case
30*9e2715aaSshafik          self.expect_expr("f(A::C{})", result_type="int", result_value="4")
31*9e2715aaSshafik
32*9e2715aaSshafik          # ADL lookup but no overload
33*9e2715aaSshafik          self.expect_expr("g(A::C{})", result_type="int", result_value="4")
34*9e2715aaSshafik
35*9e2715aaSshafik          # variadic function cases
36*9e2715aaSshafik          self.expect_expr("var(1)", result_type="int", result_value="10")
37*9e2715aaSshafik          self.expect_expr("var(1, 2)", result_type="int", result_value="10")
38*9e2715aaSshafik
39*9e2715aaSshafik          # Overloaded templated operator case
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          self.expect_expr("b1 << b2", result_type="bool", result_value="true")
43*9e2715aaSshafik          self.expect_expr("b1 == b2", result_type="bool", result_value="true")
44*9e2715aaSshafik
45*9e2715aaSshafik          # Overloaded operator case
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")
48*9e2715aaSshafik          self.expect_expr("d1 << d2", result_type="bool", result_value="true")
49*9e2715aaSshafik          self.expect_expr("d1 == d2", result_type="bool", result_value="true")
5099451b44SJordan Rupprecht
5199451b44SJordan Rupprecht    @skipIfWindows
5299451b44SJordan Rupprecht    def test_template_function_with_cast(self):
5399451b44SJordan Rupprecht        self.do_test_template_function(True)
5499451b44SJordan Rupprecht
5599451b44SJordan Rupprecht    @skipIfWindows
5699451b44SJordan Rupprecht    @expectedFailureAll(debug_info=["dwarf", "gmodules", "dwo"])
5799451b44SJordan Rupprecht    def test_template_function_without_cast(self):
5899451b44SJordan Rupprecht        self.do_test_template_function(False)
59