Files
clang-p2996/lldb/test/API/lang/cpp/template-function/TestTemplateFunctions.py
shafik 9e2715aaac [lldb] Remove template parameters from FunctionTemplateDecl names
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
2020-03-17 11:00:23 -07:00

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)