import lldb import lldbsuite.test.lldbplatformutil as lldbplatformutil from lldbsuite.test.decorators import * from lldbsuite.test.lldbtest import * from lldbsuite.test import lldbutil class TestCase(TestBase): @no_debug_info_test @skipIf(compiler="clang", compiler_version=["<", "20.0"]) def test(self): self.build() target = self.dbg.CreateTarget(self.getBuildArtifact("a.out")) value = self.expect_expr("temp1", result_type="C") template_type = value.GetType() self.assertEqual(template_type.GetNumberOfTemplateArguments(), 2) # Check a type argument. self.assertEqual( template_type.GetTemplateArgumentKind(0), lldb.eTemplateArgumentKindType ) self.assertEqual(template_type.GetTemplateArgumentType(0).GetName(), "int") # Check a integral argument. self.assertEqual( template_type.GetTemplateArgumentKind(1), lldb.eTemplateArgumentKindIntegral ) self.assertEqual( template_type.GetTemplateArgumentType(1).GetName(), "unsigned int" ) # Template parameter isn't a NTTP. self.assertFalse(template_type.GetTemplateArgumentValue(target, 0)) # Template parameter index out-of-bounds. self.assertFalse(template_type.GetTemplateArgumentValue(target, 2)) # Template parameter is a NTTP. param_val = template_type.GetTemplateArgumentValue(target, 1) self.assertEqual(param_val.GetTypeName(), "unsigned int") self.assertEqual(param_val.GetValueAsUnsigned(), 2) # Try to get an invalid template argument. self.assertEqual( template_type.GetTemplateArgumentKind(2), lldb.eTemplateArgumentKindNull ) self.assertEqual(template_type.GetTemplateArgumentType(2).GetName(), "") value = self.expect_expr("temp2", result_type="Foo") # Can't get template parameter value with invalid target. self.assertFalse(value.GetType().GetTemplateArgumentValue(lldb.SBTarget(), 1)) template_param_value = value.GetType().GetTemplateArgumentValue(target, 1) self.assertTrue(template_param_value) self.assertEqual(template_param_value.GetTypeName(), "short") self.assertEqual(template_param_value.GetValueAsSigned(), -2) value = self.expect_expr("temp3", result_type="Foo") template_param_value = value.GetType().GetTemplateArgumentValue(target, 1) self.assertTrue(template_param_value) self.assertEqual(template_param_value.GetTypeName(), "char") self.assertEqual(chr(template_param_value.GetValueAsSigned()), "v") value = self.expect_expr("temp4", result_type="Foo") template_param_value = value.GetType().GetTemplateArgumentValue(target, 1) self.assertEqual(template_param_value.GetTypeName(), "float") # FIXME: this should return a float self.assertEqual(template_param_value.GetValueAsSigned(), 2) value = self.expect_expr("temp5", result_type="Foo") template_param_value = value.GetType().GetTemplateArgumentValue(target, 1) self.assertEqual(template_param_value.GetTypeName(), "double") # FIXME: this should return a float self.assertEqual(template_param_value.GetValueAsSigned(), -250) # FIXME: type should be Foo value = self.expect_expr("temp6", result_type="Foo") self.assertFalse(value.GetType().GetTemplateArgumentValue(target, 1)) # FIXME: support wider range of floating point types value = self.expect_expr("temp7", result_type="Foo<__fp16, __fp16>") self.assertFalse(value.GetType().GetTemplateArgumentValue(target, 1)) # The target we use when evaluating these expressions for Arm leads to there # not being a __bf16 type in the AST so we fall back to __fp16 and evaluating # this fails. if lldbplatformutil.getArchitecture() != "arm": value = self.expect_expr("temp8", result_type="Foo<__bf16, __bf16>") self.assertFalse(value.GetType().GetTemplateArgumentValue(target, 1)) value = self.expect_expr("temp9", result_type="Bar") template_param_value = value.GetType().GetTemplateArgumentValue(target, 1) self.assertEqual(template_param_value.GetTypeName(), "double") # FIXME: this should return a float self.assertEqual(template_param_value.GetValueAsSigned(), 1) value = self.expect_expr( "temp10", result_type="Bar" ) template_param_value = value.GetType().GetTemplateArgumentValue(target, 1) self.assertEqual(template_param_value.GetTypeName(), "float") # FIXME: this should return a float self.assertEqual(template_param_value.GetValueAsSigned(), 1) template_param_value = value.GetType().GetTemplateArgumentValue(target, 2) self.assertEqual(template_param_value.GetTypeName(), "float") # FIXME: this should return a float self.assertEqual(template_param_value.GetValueAsSigned(), 2)