111 lines · python
1import lldb2import lldbsuite.test.lldbplatformutil as lldbplatformutil3from lldbsuite.test.decorators import *4from lldbsuite.test.lldbtest import *5from lldbsuite.test import lldbutil6 7 8class TestCase(TestBase):9 @no_debug_info_test10 @skipIf(compiler="clang", compiler_version=["<", "20.0"])11 def test(self):12 self.build()13 target = self.dbg.CreateTarget(self.getBuildArtifact("a.out"))14 15 value = self.expect_expr("temp1", result_type="C<int, 2>")16 template_type = value.GetType()17 self.assertEqual(template_type.GetNumberOfTemplateArguments(), 2)18 19 # Check a type argument.20 self.assertEqual(21 template_type.GetTemplateArgumentKind(0), lldb.eTemplateArgumentKindType22 )23 self.assertEqual(template_type.GetTemplateArgumentType(0).GetName(), "int")24 25 # Check a integral argument.26 self.assertEqual(27 template_type.GetTemplateArgumentKind(1), lldb.eTemplateArgumentKindIntegral28 )29 self.assertEqual(30 template_type.GetTemplateArgumentType(1).GetName(), "unsigned int"31 )32 33 # Template parameter isn't a NTTP.34 self.assertFalse(template_type.GetTemplateArgumentValue(target, 0))35 36 # Template parameter index out-of-bounds.37 self.assertFalse(template_type.GetTemplateArgumentValue(target, 2))38 39 # Template parameter is a NTTP.40 param_val = template_type.GetTemplateArgumentValue(target, 1)41 self.assertEqual(param_val.GetTypeName(), "unsigned int")42 self.assertEqual(param_val.GetValueAsUnsigned(), 2)43 44 # Try to get an invalid template argument.45 self.assertEqual(46 template_type.GetTemplateArgumentKind(2), lldb.eTemplateArgumentKindNull47 )48 self.assertEqual(template_type.GetTemplateArgumentType(2).GetName(), "")49 50 value = self.expect_expr("temp2", result_type="Foo<short, -2>")51 52 # Can't get template parameter value with invalid target.53 self.assertFalse(value.GetType().GetTemplateArgumentValue(lldb.SBTarget(), 1))54 55 template_param_value = value.GetType().GetTemplateArgumentValue(target, 1)56 self.assertTrue(template_param_value)57 self.assertEqual(template_param_value.GetTypeName(), "short")58 self.assertEqual(template_param_value.GetValueAsSigned(), -2)59 60 value = self.expect_expr("temp3", result_type="Foo<char, 'v'>")61 template_param_value = value.GetType().GetTemplateArgumentValue(target, 1)62 self.assertTrue(template_param_value)63 self.assertEqual(template_param_value.GetTypeName(), "char")64 self.assertEqual(chr(template_param_value.GetValueAsSigned()), "v")65 66 value = self.expect_expr("temp4", result_type="Foo<float, 2.000000e+00>")67 template_param_value = value.GetType().GetTemplateArgumentValue(target, 1)68 self.assertEqual(template_param_value.GetTypeName(), "float")69 # FIXME: this should return a float70 self.assertEqual(template_param_value.GetValueAsSigned(), 2)71 72 value = self.expect_expr("temp5", result_type="Foo<double, -2.505000e+02>")73 template_param_value = value.GetType().GetTemplateArgumentValue(target, 1)74 self.assertEqual(template_param_value.GetTypeName(), "double")75 # FIXME: this should return a float76 self.assertEqual(template_param_value.GetValueAsSigned(), -250)77 78 # FIXME: type should be Foo<int *, &temp1.member>79 value = self.expect_expr("temp6", result_type="Foo<int *, int *>")80 self.assertFalse(value.GetType().GetTemplateArgumentValue(target, 1))81 82 # FIXME: support wider range of floating point types83 value = self.expect_expr("temp7", result_type="Foo<__fp16, __fp16>")84 self.assertFalse(value.GetType().GetTemplateArgumentValue(target, 1))85 86 # The target we use when evaluating these expressions for Arm leads to there87 # not being a __bf16 type in the AST so we fall back to __fp16 and evaluating88 # this fails.89 if lldbplatformutil.getArchitecture() != "arm":90 value = self.expect_expr("temp8", result_type="Foo<__bf16, __bf16>")91 self.assertFalse(value.GetType().GetTemplateArgumentValue(target, 1))92 93 value = self.expect_expr("temp9", result_type="Bar<double, 1.200000e+00>")94 template_param_value = value.GetType().GetTemplateArgumentValue(target, 1)95 self.assertEqual(template_param_value.GetTypeName(), "double")96 # FIXME: this should return a float97 self.assertEqual(template_param_value.GetValueAsSigned(), 1)98 99 value = self.expect_expr(100 "temp10", result_type="Bar<float, 1.000000e+00, 2.000000e+00>"101 )102 template_param_value = value.GetType().GetTemplateArgumentValue(target, 1)103 self.assertEqual(template_param_value.GetTypeName(), "float")104 # FIXME: this should return a float105 self.assertEqual(template_param_value.GetValueAsSigned(), 1)106 107 template_param_value = value.GetType().GetTemplateArgumentValue(target, 2)108 self.assertEqual(template_param_value.GetTypeName(), "float")109 # FIXME: this should return a float110 self.assertEqual(template_param_value.GetValueAsSigned(), 2)111