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