From b56e3a1723e3e390f4b73bb466a3f6cd91458ca2 Mon Sep 17 00:00:00 2001 From: Frederic Riss Date: Tue, 8 Oct 2019 19:52:01 +0000 Subject: [PATCH] Add test coverage to printing of enums and fix display of unsigned values TestCPP11EnumTypes.py should have covered all our bases when it comes to typed enums, but it missed the regression introduced in r374066. The reason it didn't catch it is somewhat funny: the test was copied over from another test that recompiled a source file with a different base type every time, but neither the test source nor the python code was adapted for testing enums. As a result, this test was just running 8 times the exact same checks on the exact same binary. This commit fixes the coverage and addresses the issue revealed by the new tests. llvm-svn: 374108 --- .../test/lang/cpp/enum_types/TestCPP11EnumTypes.py | 66 +++++++++++++--------- .../lldbsuite/test/lang/cpp/enum_types/main.cpp | 20 ++++++- lldb/source/Symbol/ClangASTContext.cpp | 15 +++-- 3 files changed, 66 insertions(+), 35 deletions(-) diff --git a/lldb/packages/Python/lldbsuite/test/lang/cpp/enum_types/TestCPP11EnumTypes.py b/lldb/packages/Python/lldbsuite/test/lang/cpp/enum_types/TestCPP11EnumTypes.py index 8157b1c..a250dfd 100644 --- a/lldb/packages/Python/lldbsuite/test/lang/cpp/enum_types/TestCPP11EnumTypes.py +++ b/lldb/packages/Python/lldbsuite/test/lang/cpp/enum_types/TestCPP11EnumTypes.py @@ -19,8 +19,8 @@ class CPP11EnumTypesTestCase(TestBase): """Test C++11 enumeration class types as int8_t types.""" self.build( dictionary={ - 'CFLAGS_EXTRAS': '"-DTEST_BLOCK_CAPTURED_VARS=int8_t"'}) - self.image_lookup_for_enum_type() + 'CFLAGS_EXTRAS': '"-DSIGNED_ENUM_CLASS_TYPE=int8_t"'}) + self.image_lookup_for_enum_type(True) @expectedFailureAll(oslist=['freebsd'], bugnumber='llvm.org/pr36527') @skipIf(dwarf_version=['<', '4']) @@ -28,8 +28,8 @@ class CPP11EnumTypesTestCase(TestBase): """Test C++11 enumeration class types as int16_t types.""" self.build( dictionary={ - 'CFLAGS_EXTRAS': '"-DTEST_BLOCK_CAPTURED_VARS=int16_t"'}) - self.image_lookup_for_enum_type() + 'CFLAGS_EXTRAS': '"-DSIGNED_ENUM_CLASS_TYPE=int16_t"'}) + self.image_lookup_for_enum_type(True) @expectedFailureAll(oslist=['freebsd'], bugnumber='llvm.org/pr36527') @skipIf(dwarf_version=['<', '4']) @@ -37,8 +37,8 @@ class CPP11EnumTypesTestCase(TestBase): """Test C++11 enumeration class types as int32_t types.""" self.build( dictionary={ - 'CFLAGS_EXTRAS': '"-DTEST_BLOCK_CAPTURED_VARS=int32_t"'}) - self.image_lookup_for_enum_type() + 'CFLAGS_EXTRAS': '"-DSIGNED_ENUM_CLASS_TYPE=int32_t"'}) + self.image_lookup_for_enum_type(True) @expectedFailureAll(oslist=['freebsd'], bugnumber='llvm.org/pr36527') @skipIf(dwarf_version=['<', '4']) @@ -46,8 +46,8 @@ class CPP11EnumTypesTestCase(TestBase): """Test C++11 enumeration class types as int64_t types.""" self.build( dictionary={ - 'CFLAGS_EXTRAS': '"-DTEST_BLOCK_CAPTURED_VARS=int64_t"'}) - self.image_lookup_for_enum_type() + 'CFLAGS_EXTRAS': '"-DSIGNED_ENUM_CLASS_TYPE=int64_t"'}) + self.image_lookup_for_enum_type(True) @expectedFailureAll(oslist=['freebsd'], bugnumber='llvm.org/pr36527') @skipIf(dwarf_version=['<', '4']) @@ -55,8 +55,8 @@ class CPP11EnumTypesTestCase(TestBase): """Test C++11 enumeration class types as uint8_t types.""" self.build( dictionary={ - 'CFLAGS_EXTRAS': '"-DTEST_BLOCK_CAPTURED_VARS=uint8_t"'}) - self.image_lookup_for_enum_type() + 'CFLAGS_EXTRAS': '"-DUNSIGNED_ENUM_CLASS_TYPE=uint8_t"'}) + self.image_lookup_for_enum_type(False) @expectedFailureAll(oslist=['freebsd'], bugnumber='llvm.org/pr36527') @skipIf(dwarf_version=['<', '4']) @@ -64,8 +64,8 @@ class CPP11EnumTypesTestCase(TestBase): """Test C++11 enumeration class types as uint16_t types.""" self.build( dictionary={ - 'CFLAGS_EXTRAS': '"-DTEST_BLOCK_CAPTURED_VARS=uint16_t"'}) - self.image_lookup_for_enum_type() + 'CFLAGS_EXTRAS': '"-DUNSIGNED_ENUM_CLASS_TYPE=uint16_t"'}) + self.image_lookup_for_enum_type(False) @expectedFailureAll(oslist=['freebsd'], bugnumber='llvm.org/pr36527') @skipIf(dwarf_version=['<', '4']) @@ -73,8 +73,8 @@ class CPP11EnumTypesTestCase(TestBase): """Test C++11 enumeration class types as uint32_t types.""" self.build( dictionary={ - 'CFLAGS_EXTRAS': '"-DTEST_BLOCK_CAPTURED_VARS=uint32_t"'}) - self.image_lookup_for_enum_type() + 'CFLAGS_EXTRAS': '"-DUNSIGNED_ENUM_CLASS_TYPE=uint32_t"'}) + self.image_lookup_for_enum_type(False) @expectedFailureAll(oslist=['freebsd'], bugnumber='llvm.org/pr36527') @skipIf(dwarf_version=['<', '4']) @@ -82,8 +82,8 @@ class CPP11EnumTypesTestCase(TestBase): """Test C++11 enumeration class types as uint64_t types.""" self.build( dictionary={ - 'CFLAGS_EXTRAS': '"-DTEST_BLOCK_CAPTURED_VARS=uint64_t"'}) - self.image_lookup_for_enum_type() + 'CFLAGS_EXTRAS': '"-DUNSIGNED_ENUM_CLASS_TYPE=uint64_t"'}) + self.image_lookup_for_enum_type(False) def setUp(self): # Call super's setUp(). @@ -91,7 +91,7 @@ class CPP11EnumTypesTestCase(TestBase): # Find the line number to break inside main(). self.line = line_number('main.cpp', '// Set break point at this line.') - def image_lookup_for_enum_type(self): + def image_lookup_for_enum_type(self, is_signed): """Test C++11 enumeration class types.""" exe = self.getBuildArtifact("a.out") self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET) @@ -125,16 +125,28 @@ class CPP11EnumTypesTestCase(TestBase): 'kNumDays', '}']) - enum_values = ['-4', - 'Monday', - 'Tuesday', - 'Wednesday', - 'Thursday', - 'Friday', - 'Saturday', - 'Sunday', - 'kNumDays', - '5'] + if is_signed: + enum_values = ['-4', + 'Monday', + 'Tuesday', + 'Wednesday', + 'Thursday', + 'Friday', + 'Saturday', + 'Sunday', + 'kNumDays', + '5'] + else: + enum_values = ['199', + 'Monday', + 'Tuesday', + 'Wednesday', + 'Thursday', + 'Friday', + 'Saturday', + 'Sunday', + 'kNumDays', + '208'] bkpt = self.target().FindBreakpointByID(bkpt_id) for enum_value in enum_values: diff --git a/lldb/packages/Python/lldbsuite/test/lang/cpp/enum_types/main.cpp b/lldb/packages/Python/lldbsuite/test/lang/cpp/enum_types/main.cpp index 31d130c..e00fc2d 100644 --- a/lldb/packages/Python/lldbsuite/test/lang/cpp/enum_types/main.cpp +++ b/lldb/packages/Python/lldbsuite/test/lang/cpp/enum_types/main.cpp @@ -11,7 +11,8 @@ int main (int argc, char const *argv[]) { - typedef int16_t enum_integer_t; +#ifdef SIGNED_ENUM_CLASS_TYPE + typedef SIGNED_ENUM_CLASS_TYPE enum_integer_t; enum class DayType : enum_integer_t { Monday = -3, Tuesday, @@ -23,10 +24,25 @@ int main (int argc, char const *argv[]) kNumDays }; enum_integer_t day_value; +#else + typedef UNSIGNED_ENUM_CLASS_TYPE enum_integer_t; + enum class DayType : enum_integer_t { + Monday = 200, + Tuesday, + Wednesday, + Thursday, + Friday, + Saturday, + Sunday, + kNumDays + }; + enum_integer_t day_value; +#endif + for (day_value = (enum_integer_t)DayType::Monday - 1; day_value <= (enum_integer_t)DayType::kNumDays + 1; ++day_value) { DayType day = (DayType)day_value; printf("day as int is %i\n", (int)day); // Set break point at this line. } - return 0; + return 0; // Break here for char tests } diff --git a/lldb/source/Symbol/ClangASTContext.cpp b/lldb/source/Symbol/ClangASTContext.cpp index 038b1f3..a1637ca 100644 --- a/lldb/source/Symbol/ClangASTContext.cpp +++ b/lldb/source/Symbol/ClangASTContext.cpp @@ -9386,18 +9386,21 @@ static bool DumpEnumValue(const clang::QualType &qual_type, Stream *s, } } + // Unsigned values make more sense for flags. + offset = byte_offset; + const uint64_t enum_uvalue = data.GetMaxU64Bitfield( + &offset, byte_size, bitfield_bit_size, bitfield_bit_offset); + // No exact match, but we don't think this is a bitfield. Print the value as // decimal. if (!can_be_bitfield) { - s->Printf("%" PRIi64, enum_svalue); + if (qual_type->isSignedIntegerOrEnumerationType()) + s->Printf("%" PRIi64, enum_svalue); + else + s->Printf("%" PRIu64, enum_uvalue); return true; } - // Unsigned values make more sense for flags. - offset = byte_offset; - const uint64_t enum_uvalue = data.GetMaxU64Bitfield( - &offset, byte_size, bitfield_bit_size, bitfield_bit_offset); - uint64_t remaining_value = enum_uvalue; std::vector> values; values.reserve(num_enumerators); -- 2.7.4