1*2d5c43adSJonas Devlieghere"""
2*2d5c43adSJonas DevlieghereTest that the type of arguments to C++ template classes that have variadic
3*2d5c43adSJonas Devlieghereparameters can be enumerated.
4*2d5c43adSJonas Devlieghere"""
5*2d5c43adSJonas Devlieghereimport lldb
6*2d5c43adSJonas Devliegherefrom lldbsuite.test.decorators import *
7*2d5c43adSJonas Devliegherefrom lldbsuite.test.lldbtest import *
8*2d5c43adSJonas Devliegherefrom lldbsuite.test import lldbutil
9*2d5c43adSJonas Devlieghere
10*2d5c43adSJonas Devlieghere
11*2d5c43adSJonas Devlieghereclass TemplatePackArgsTestCase(TestBase):
12*2d5c43adSJonas Devlieghere
13*2d5c43adSJonas Devlieghere    mydir = TestBase.compute_mydir(__file__)
14*2d5c43adSJonas Devlieghere
15*2d5c43adSJonas Devlieghere    def test_template_argument_pack(self):
16*2d5c43adSJonas Devlieghere        self.build()
17*2d5c43adSJonas Devlieghere        (_, _, thread, _) = lldbutil.run_to_source_breakpoint(self,
18*2d5c43adSJonas Devlieghere          'breakpoint here', lldb.SBFileSpec('main.cpp'), exe_name = 'a.out')
19*2d5c43adSJonas Devlieghere        frame = thread.GetSelectedFrame()
20*2d5c43adSJonas Devlieghere
21*2d5c43adSJonas Devlieghere        empty_pack = frame.FindVariable('emptyPack')
22*2d5c43adSJonas Devlieghere        self.assertTrue(empty_pack.IsValid(),
23*2d5c43adSJonas Devlieghere                        'make sure we find the emptyPack variable')
24*2d5c43adSJonas Devlieghere
25*2d5c43adSJonas Devlieghere        only_pack = frame.FindVariable('onlyPack')
26*2d5c43adSJonas Devlieghere        self.assertTrue(only_pack.IsValid(),
27*2d5c43adSJonas Devlieghere                        'make sure we find the onlyPack variable')
28*2d5c43adSJonas Devlieghere        self.assertEqual(only_pack.GetType().GetNumberOfTemplateArguments(), 4)
29*2d5c43adSJonas Devlieghere        self.assertEqual(only_pack.GetType().GetTemplateArgumentType(0).GetName(), 'int')
30*2d5c43adSJonas Devlieghere        self.assertEqual(only_pack.GetType().GetTemplateArgumentType(1).GetName(), 'char')
31*2d5c43adSJonas Devlieghere        self.assertEqual(only_pack.GetType().GetTemplateArgumentType(2).GetName(), 'double')
32*2d5c43adSJonas Devlieghere        # Access the C<double, 42> template parameter.
33*2d5c43adSJonas Devlieghere        nested_template = only_pack.GetType().GetTemplateArgumentType(3)
34*2d5c43adSJonas Devlieghere        self.assertEqual(nested_template.GetName(), 'D<int, int, bool>')
35*2d5c43adSJonas Devlieghere        self.assertEqual(nested_template.GetNumberOfTemplateArguments(), 3)
36*2d5c43adSJonas Devlieghere        self.assertEqual(nested_template.GetTemplateArgumentType(0).GetName(), 'int')
37*2d5c43adSJonas Devlieghere        self.assertEqual(nested_template.GetTemplateArgumentType(1).GetName(), 'int')
38*2d5c43adSJonas Devlieghere        self.assertEqual(nested_template.GetTemplateArgumentType(2).GetName(), 'bool')
39