"""
Test that we can call functions and use types
annotated (and thus mangled) with ABI tags.
"""
import lldb
from lldbsuite.test.decorators import *
from lldbsuite.test.lldbtest import *
from lldbsuite.test import lldbutil
class AbiTagLookupTestCase(TestBase):
@skipIfWindows
@expectedFailureAll(debug_info=["dwarf", "gmodules", "dwo"])
def test_abi_tag_lookup(self):
self.build()
lldbutil.run_to_source_breakpoint(
self, "Break here", lldb.SBFileSpec("main.cpp", False)
)
# Qualified/unqualified lookup to templates in namespace
self.expect_expr("operator<(b1, b2)", result_type="bool", result_value="true")
self.expect_expr(
"A::operator<(b1, b2)", result_type="bool", result_value="true"
)
self.expect_expr("b1 < b2", result_type="bool", result_value="true")
# Qualified/unqualified lookup to templates with ABI tags in namespace
self.expect_expr("operator>(b1, b2)", result_type="bool", result_value="true")
self.expect_expr(
"A::operator>(b1, b2)", result_type="bool", result_value="true"
)
self.expect_expr("b1 > b2", result_type="bool", result_value="true")
# Call non-operator templates with ABI tags
self.expect_expr("A::withAbiTagInNS(1, 1)", result_type="int", result_value="1")
self.expect_expr(
"A::withAbiTagInNS(1.0, 1.0)", result_type="int", result_value="2"
)
self.expect_expr("withAbiTagInNS(b1, b2)", result_type="int", result_value="2")
self.expect_expr(
"A::withAbiTagInNS(b1, b2)", result_type="int", result_value="2"
)
self.expect_expr("withAbiTag(b1, b2)", result_type="int", result_value="3")
self.expect_expr("withAbiTag(0, 0)", result_type="int", result_value="-3")
# Structures with ABI tags
self.expect_expr("t.Value()", result_type="const int", result_value="4")
self.expect_expr("tt.Value()", result_type="const int", result_value="5")
self.expect_expr(
"Tagged{.mem = 6}",
result_type="Tagged",
result_children=[ValueCheck(name="mem", value="6")],
)
# Inline namespaces with ABI tags
self.expect_expr(
"v1::withImplicitTag(Simple{.mem = 6})", result_type="int", result_value="6"
)
self.expect_expr(
"withImplicitTag(Simple{.mem = 6})", result_type="int", result_value="6"
)
self.expect_expr(
"v1::withImplicitTag(Tagged{.mem = 6})", result_type="int", result_value="6"
)
self.expect_expr(
"withImplicitTag(Tagged{.mem = 6})", result_type="int", result_value="6"
)