xref: /llvm-project/lldb/test/API/lang/cpp/class-template-parameter-pack/TestTemplatePackArgs.py (revision 2238dcc39358353cac21df75c3c3286ab20b8f53)
1"""
2Test that the type of arguments to C++ template classes that have variadic
3parameters can be enumerated.
4"""
5import lldb
6from lldbsuite.test.decorators import *
7from lldbsuite.test.lldbtest import *
8from lldbsuite.test import lldbutil
9
10
11class TemplatePackArgsTestCase(TestBase):
12    def test_template_argument_pack(self):
13        self.build()
14        (_, _, thread, _) = lldbutil.run_to_source_breakpoint(
15            self, "breakpoint here", lldb.SBFileSpec("main.cpp"), exe_name="a.out"
16        )
17        frame = thread.GetSelectedFrame()
18
19        empty_pack = frame.FindVariable("emptyPack")
20        self.assertTrue(
21            empty_pack.IsValid(), "make sure we find the emptyPack variable"
22        )
23
24        only_pack = frame.FindVariable("onlyPack")
25        self.assertTrue(only_pack.IsValid(), "make sure we find the onlyPack variable")
26        self.assertEqual(only_pack.GetType().GetNumberOfTemplateArguments(), 4)
27        self.assertEqual(
28            only_pack.GetType().GetTemplateArgumentType(0).GetName(), "int"
29        )
30        self.assertEqual(
31            only_pack.GetType().GetTemplateArgumentType(1).GetName(), "char"
32        )
33        self.assertEqual(
34            only_pack.GetType().GetTemplateArgumentType(2).GetName(), "double"
35        )
36        # Access the C<double, 42> template parameter.
37        nested_template = only_pack.GetType().GetTemplateArgumentType(3)
38        self.assertEqual(nested_template.GetName(), "D<int, int, bool>")
39        self.assertEqual(nested_template.GetNumberOfTemplateArguments(), 3)
40        self.assertEqual(nested_template.GetTemplateArgumentType(0).GetName(), "int")
41        self.assertEqual(nested_template.GetTemplateArgumentType(1).GetName(), "int")
42        self.assertEqual(nested_template.GetTemplateArgumentType(2).GetName(), "bool")
43