Fix to get the AST we generate for function templates closer to what clang generates and expects. We fix which FuntionDecl we are passing to CreateFunctionTemplateSpecializationInfo and we strip template parameters from the name when creating the FunctionDecl and FunctionTemplateDecl. These two fixes together fix asserts and ambiguous lookup issues for several cases which are added to the already existing small function template test. This fixes issues with overloads, overloads and ADL, variadic function templates and templated operator overloads. Differential Revision: https://reviews.llvm.org/D75761
59 lines
2.3 KiB
Python
59 lines
2.3 KiB
Python
"""
|
|
Test that we can call C++ template fucntions.
|
|
"""
|
|
import lldb
|
|
from lldbsuite.test.decorators import *
|
|
from lldbsuite.test.lldbtest import *
|
|
from lldbsuite.test import lldbutil
|
|
|
|
|
|
class TemplateFunctionsTestCase(TestBase):
|
|
|
|
mydir = TestBase.compute_mydir(__file__)
|
|
|
|
def do_test_template_function(self, add_cast):
|
|
self.build()
|
|
lldbutil.run_to_source_breakpoint(self, '// break here',
|
|
lldb.SBFileSpec("main.cpp", False))
|
|
|
|
if add_cast:
|
|
self.expect_expr("(int) foo(42)", result_type="int", result_value="42")
|
|
else:
|
|
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"])
|
|
|
|
self.expect_expr("foo(42)", result_type="int", result_value="42")
|
|
|
|
# overload with template case
|
|
self.expect_expr("h(10)", result_type="int", result_value="10")
|
|
|
|
# ADL lookup case
|
|
self.expect_expr("f(A::C{})", result_type="int", result_value="4")
|
|
|
|
# ADL lookup but no overload
|
|
self.expect_expr("g(A::C{})", result_type="int", result_value="4")
|
|
|
|
# variadic function cases
|
|
self.expect_expr("var(1)", result_type="int", result_value="10")
|
|
self.expect_expr("var(1, 2)", result_type="int", result_value="10")
|
|
|
|
# Overloaded templated operator case
|
|
self.expect_expr("b1 > b2", result_type="bool", result_value="true")
|
|
self.expect_expr("b1 >> b2", result_type="bool", result_value="true")
|
|
self.expect_expr("b1 << b2", result_type="bool", result_value="true")
|
|
self.expect_expr("b1 == b2", result_type="bool", result_value="true")
|
|
|
|
# Overloaded operator case
|
|
self.expect_expr("d1 > d2", result_type="bool", result_value="true")
|
|
self.expect_expr("d1 >> d2", result_type="bool", result_value="true")
|
|
self.expect_expr("d1 << d2", result_type="bool", result_value="true")
|
|
self.expect_expr("d1 == d2", result_type="bool", result_value="true")
|
|
|
|
@skipIfWindows
|
|
def test_template_function_with_cast(self):
|
|
self.do_test_template_function(True)
|
|
|
|
@skipIfWindows
|
|
@expectedFailureAll(debug_info=["dwarf", "gmodules", "dwo"])
|
|
def test_template_function_without_cast(self):
|
|
self.do_test_template_function(False)
|