}
else if (show > 0 || type->name () == NULL)
{
- LONGEST lastval = 0;
-
/* We can't handle this case perfectly, as DWARF does not
tell us whether or not the underlying type was specified
in the source (and other debug formats don't provide this
gdb_printf (stream, ": %s ", underlying->name ());
}
- gdb_printf (stream, "{");
+ gdb_printf (stream, "{\n");
int len = type->num_fields ();
- for (int i = 0; i < len; i++)
+ if (len == 0)
+ gdb_printf (stream, "%*s%ps", level + 4, "",
+ styled_string (metadata_style.style (),
+ "<no enum values>"));
+ else
{
- QUIT;
- if (i)
- gdb_printf (stream, ", ");
- stream->wrap_here (4);
- fputs_styled (type->field (i).name (),
- variable_name_style.style (), stream);
- if (lastval != type->field (i).loc_enumval ())
+ for (int i = 0; i < len; i++)
{
+ QUIT;
+ if (i != 0)
+ gdb_printf (stream, ",\n");
+ gdb_printf (stream, "%*s%ps", level + 4, "",
+ styled_string (variable_name_style.style (),
+ type->field (i).name ()));
gdb_printf (stream, " = %s",
plongest (type->field (i).loc_enumval ()));
- lastval = type->field (i).loc_enumval ();
}
- lastval++;
}
- gdb_printf (stream, "}");
+ gdb_printf (stream, "\n%*s}", level, "");
}
}
set foo_t "$expect_out(1,string)"
pass "$test (${foo_t})"
}
+ -re "type = enum .*\\{\r\n.*\r\n\\}\r\n$gdb_prompt $" {
+ set foo_t "$expect_out(1,string)"
+ pass "$test (${foo_t})"
+ }
+ }
+ gdb_test_multiple "ptype/r foo" "ptype foo; ${testfile}" {
+ -re "type = .*$gdb_prompt $" {
+ set foo_t "$expect_out(1,string)"
+ pass "$test (${foo_t})"
+ }
}
- gdb_test "ptype/r foo" "type = ${foo_t}" "ptype foo; ${testfile} $expect_out(1,string)"
}
# with stabs compilers which fail to use a nameless stab (such as
# pre-2.4.5 versions of gcc and most non-gcc compilers).
+
+set re1 [multi_line \
+ "type = enum primary1_tag {" \
+ " red1 = 0," \
+ " green1 = 1," \
+ " blue1 = 2" \
+ "}.*$gdb_prompt $"]
+set re2 [multi_line \
+ "type = enum {" \
+ " red1 = 0," \
+ " green1 = 1," \
+ " blue1 = 2" \
+ "}.*$gdb_prompt $"]
+
gdb_test_multiple "ptype red1" "ptype unnamed enumeration member" {
- -re "type = enum primary1_tag \{red1, green1, blue1\}.*$gdb_prompt $" {
+ -re $re1 {
# The workaround is in effect. As this is a compiler, not GDB,
# bug, we'll make it a PASS but perhaps it should be an XFAIL.
pass "ptype unnamed enumeration member (worked around)"
}
- -re "type = enum \{red1, green1, blue1\}.*$gdb_prompt $" {
+ -re $re2 {
pass "ptype unnamed enumeration member"
}
}
# test ptype command with enums
#
-gdb_test "ptype primary" "type = enum .red, green, blue.*" "ptype unnamed enumeration"
+gdb_test "ptype primary" \
+ [multi_line \
+ "type = enum {" \
+ " red = 0," \
+ " green = 1," \
+ " blue = 2" \
+ "}"] "ptype unnamed enumeration"
-gdb_test "ptype enum colors" "type = enum colors \{yellow, purple, pink\}.*" "ptype named enumeration"
+gdb_test "ptype enum colors" \
+ [multi_line \
+ "type = enum colors {" \
+ " yellow = 0," \
+ " purple = 1," \
+ " pink = 2" \
+ "}"] "ptype named enumeration"
#
# test ptype command with enums as typedef
#
-gdb_test "ptype boolean" "type = enum (boolean |)\{FALSE, TRUE\}.*" "ptype unnamed typedef'd enumeration"
+gdb_test "ptype boolean" \
+ [multi_line \
+ "type = enum (boolean |){" \
+ " FALSE = 0," \
+ " TRUE = 1" \
+ "}"] "ptype unnamed typedef'd enumeration"
gdb_test "list -q main" ".*"
*double v_double_member;.*
*int v_int_member;.*\}" "printing typedef'd union"
-gdb_test "ptype enum bvals" "type = enum bvals \{my_false, my_true\}.*" "ptype named typedef'd enumf'd enum"
+gdb_test "ptype enum bvals" \
+ [multi_line \
+ "type = enum bvals {" \
+ " my_false = 0," \
+ " my_true = 1" \
+ "}"] "ptype named typedef'd enumf'd enum"
#
# test ptype command with out-of-order enum values
#
-gdb_test "ptype enum misordered" "type = enum misordered \{two = 2, one = 1, zero = 0, three = 3\}.*" "ptype misordered enumeration"
+gdb_test "ptype enum misordered" \
+ [multi_line \
+ "type = enum misordered {" \
+ " two = 2," \
+ " one = 1," \
+ " zero = 0," \
+ " three = 3" \
+ "}"] "ptype misordered enumeration"
#
# test ptype command with a named enum's value
#
-gdb_test "ptype three" "type = enum misordered \{two = 2, one = 1, zero = 0, three = 3\}.*" "ptype named enumeration member"
-
-gdb_test "ptype red" "type = enum \{red, green, blue\}.*" "ptype unnamed enumeration member #2"
+gdb_test "ptype three" \
+ [multi_line \
+ "type = enum misordered {" \
+ " two = 2," \
+ " one = 1," \
+ " zero = 0," \
+ " three = 3" \
+ "}"] "ptype named enumeration member"
+
+gdb_test "ptype red" \
+ [multi_line \
+ "type = enum {" \
+ " red = 0," \
+ " green = 1," \
+ " blue = 2" \
+ "}"] "ptype unnamed enumeration member #2"
#
# test ptype command with arrays
# with stabs compilers which fail to use a nameless stab (such as
# pre-2.4.5 versions of gcc and most non-gcc compilers).
+
+set re1 [multi_line \
+ "type = enum primary1_tag {" \
+ " red1 = 0," \
+ " green1 = 1," \
+ " blue1 = 2" \
+ "}.*$gdb_prompt $"]
+set re2 [multi_line \
+ "type = enum {" \
+ " red1 = 0," \
+ " green1 = 1," \
+ " blue1 = 2" \
+ "}.*$gdb_prompt $"]
+
gdb_test_multiple "ptype red1" "ptype unnamed enumeration member" {
- -re "type = enum primary1_tag \{red1, green1, blue1\}.*$gdb_prompt $" {
+ -re $re1 {
# The workaround is in effect. As this is a compiler, not GDB,
# bug, we'll make it a PASS but perhaps it should be an XFAIL.
pass "ptype unnamed enumeration member (worked around)"
}
- -re "type = enum \{red1, green1, blue1\}.*$gdb_prompt $" {
+ -re $re2 {
pass "ptype unnamed enumeration member"
}
}
# test ptype command with enums
#
-gdb_test "ptype primary" "type = enum .red, green, blue.*" "ptype unnamed enumeration"
+gdb_test "ptype primary" \
+ [multi_line \
+ "type = enum {" \
+ " red = 0," \
+ " green = 1," \
+ " blue = 2" \
+ "}"] "ptype unnamed enumeration"
-gdb_test "ptype enum colors" "type = enum colors \{yellow, purple, pink\}.*" "ptype named enumeration"
+gdb_test "ptype enum colors" \
+ [multi_line \
+ "type = enum colors {" \
+ " yellow = 0," \
+ " purple = 1," \
+ " pink = 2" \
+ "}"] "ptype named enumeration"
#
# test ptype command with enums as typedef
#
-gdb_test "ptype boolean" "type = enum (boolean |)\{FALSE, TRUE\}.*" "ptype unnamed typedef'd enumeration"
+gdb_test "ptype boolean" \
+ [multi_line \
+ "type = enum (boolean |){" \
+ " FALSE = 0," \
+ " TRUE = 1" \
+ "}"] "ptype unnamed typedef'd enumeration"
# And check that whatis shows the name, not "enum {...}".
# This probably fails for all DWARF 1 cases, so assume so for now. -fnf
*double v_double_member;.*
*int v_int_member;.*\}" "printing typedef'd union"
-gdb_test "ptype enum bvals" "type = enum bvals \{my_false, my_true\}.*" "ptype named typedef'd enumf'd enum"
+gdb_test "ptype enum bvals" \
+ [multi_line \
+ "type = enum bvals {" \
+ " my_false = 0," \
+ " my_true = 1" \
+ "}"] "ptype named typedef'd enumf'd enum"
#
# test ptype command with out-of-order enum values
#
-gdb_test "ptype enum misordered" "type = enum misordered \{two = 2, one = 1, zero = 0, three = 3\}.*" "ptype misordered enumeration"
+gdb_test "ptype enum misordered" \
+ [multi_line \
+ "type = enum misordered {" \
+ " two = 2," \
+ " one = 1," \
+ " zero = 0," \
+ " three = 3" \
+ "}"] "ptype misordered enumeration"
#
# test ptype command with a named enum's value
#
-gdb_test "ptype three" "type = enum misordered \{two = 2, one = 1, zero = 0, three = 3\}.*" "ptype named enumeration member"
-
-gdb_test "ptype red" "type = enum \{red, green, blue\}.*" "ptype unnamed enumeration member #2"
+gdb_test "ptype three" \
+ [multi_line \
+ "type = enum misordered {" \
+ " two = 2," \
+ " one = 1," \
+ " zero = 0," \
+ " three = 3" \
+ "}"] "ptype named enumeration member"
+
+gdb_test "ptype red" \
+ [multi_line \
+ "type = enum {" \
+ " red = 0," \
+ " green = 1," \
+ " blue = 2" \
+ "}"] "ptype unnamed enumeration member #2"
#
# test ptype command with basic C types
{"v_long_double_typedef" "long_double_typedef" "long double"}
{"v_long_double_typedef2" "long_double_typedef2" "long double"}
- {"colors_typedef" "(enum )?colors" "enum colors( : unsigned int)? {red, green, blue}"}
- {"colors_typedef2" "colors_typedef" "enum colors( : unsigned int)? {red, green, blue}"}
- {"v_colors_typedef" "colors_typedef" "enum colors( : unsigned int)? {red, green, blue}"}
- {"v_colors_typedef2" "colors_typedef2" "enum colors( : unsigned int)? {red, green, blue}"}
+ {"colors_typedef" "(enum )?colors" "enum colors( : unsigned int)? {.*red = 0,.* green = 1,.* blue = 2.*}"}
+ {"colors_typedef2" "colors_typedef" "enum colors( : unsigned int)? {.*red = 0,.* green = 1,.* blue = 2.*}"}
+ {"v_colors_typedef" "colors_typedef" "enum colors( : unsigned int)? {.*red = 0,.* green = 1,.* blue = 2.*}"}
+ {"v_colors_typedef2" "colors_typedef2" "enum colors( : unsigned int)? {.*red = 0,.* green = 1,.* blue = 2.*}"}
{"func_ftype" "void \\(void\\)" "void \\(void\\)"}
{"func_ftype2" "func_ftype" "void \\(void\\)"}
# ptype on the enum member
+ set re1 [multi_line \
+ "type = enum ClassWithEnum::PrivEnum (: unsigned (int|short|char) )?{" \
+ " ?(ClassWithEnum::)?red = 0," \
+ " (ClassWithEnum::)?green = 1," \
+ " (ClassWithEnum::)?blue = 2," \
+ " (ClassWithEnum::)?yellow = 42" \
+ "?}$nl$gdb_prompt $"]
+ set re2 [multi_line \
+ "type = enum PrivEnum {" \
+ " ?(ClassWithEnum::)?red = 0," \
+ " (ClassWithEnum::)?green = 1," \
+ " (ClassWithEnum::)?blue = 2," \
+ " (ClassWithEnum::)?yellow = 42" \
+ "?}$nl$gdb_prompt $"]
+ set re3 [multi_line \
+ "type = enum {" \
+ " ?red = 0," \
+ " green = 1," \
+ " blue = 2," \
+ " yellow = 42" \
+ "?}$nl$gdb_prompt $"]
gdb_test_multiple "ptype obj_with_enum.priv_enum" "ptype obj_with_enum.priv_enum" {
- -re "type = enum ClassWithEnum::PrivEnum (: unsigned (int|short|char) )?\{ ?(ClassWithEnum::)?red, (ClassWithEnum::)?green, (ClassWithEnum::)?blue, (ClassWithEnum::)?yellow = 42 ?\}$nl$gdb_prompt $" {
+ -re $re1 {
pass "ptype obj_with_enum.priv_enum"
}
- -re "type = enum PrivEnum \{ ?(ClassWithEnum::)?red, (ClassWithEnum::)?green, (ClassWithEnum::)?blue, (ClassWithEnum::)?yellow = 42 ?\}$nl$gdb_prompt $" {
+ -re $re2 {
# gcc 2.95.3 -gdwarf-2
# gcc 3.3.2 -gdwarf-2
pass "ptype obj_with_enum.priv_enum"
}
- -re "type = enum \{ ?red, green, blue, yellow = 42 ?\}$nl$gdb_prompt $" {
+ -re $re3 {
# This case case is a little dubious, but it's not clear what
# ought to be required of a ptype on a private enum...
# -sts 19990324
# Xfail for missing DW_AT_type in DW_TAG_enumeration_type, gcc PR debug/16063.
set have_xfail [expr {[test_compiler_info gcc-*] && [gcc_major_version] < 5}]
+set enum1 [multi_line "" \
+ "type = enum enum1 : unsigned int {" \
+ " <no enum values>" \
+ "}"]
+set enum1_no_type [multi_line "" \
+ "type = enum enum1 {" \
+ " <no enum values>" \
+ "}"]
gdb_test_multiple "ptype arg1" "" {
- -re -wrap "type = enum enum1 : unsigned int \\{\\}" {
+ -re -wrap $enum1 {
pass $gdb_test_name
}
- -re -wrap "type = enum enum1 \\{\\}" {
+ -re -wrap $enum1_no_type {
if { $have_xfail } {
setup_xfail *-*-* gcc/16063
}
}
}
+set enum2 [multi_line "" \
+ "type = enum class enum2 : unsigned char {" \
+ " <no enum values>" \
+ "}"]
+set enum2_no_type [multi_line "" \
+ "type = enum class enum2 {" \
+ " <no enum values>" \
+ "}"]
gdb_test_multiple "ptype arg2" "" {
- -re -wrap "type = enum class enum2 : unsigned char \\{\\}" {
+ -re -wrap $enum2 {
pass $gdb_test_name
}
- -re -wrap "type = enum class enum2 \\{\\}" {
+ -re -wrap $enum2_no_type {
if { $have_xfail } {
setup_xfail *-*-* gcc/16063
}
}
gdb_test "ptype E1" \
- "type = enum class E1 (: int )?{E1::HI = 7, E1::THERE}"
+ [multi_line \
+ "type = enum class E1 (: int )?{" \
+ " E1::HI = 7," \
+ " E1::THERE = 8" \
+ "}"]
gdb_test "print E1::HI" " = E1::HI"
gdb_test "print (int) E1::HI" " = 7"
upvar $result_var result
set s "[qual_name E$id $parent_list]"
- set a "[qual_name A$id $parent_list]"
- set b "[qual_name B$id $parent_list]"
- set c "[qual_name C$id $parent_list]"
+ set a "[qual_name A$id $parent_list] = 0"
+ set b "[qual_name B$id $parent_list] = 1"
+ set c "[qual_name C$id $parent_list] = 2"
lappend result [list "type" "public" "enum" $s [list $a $b $c]]
if {$log} {
gdb_test "print sizeof(enum E)" " = 4"
-gdb_test "ptype enum EU" "type = enum EU {TWO = 2}" \
- "ptype EU in enum C"
+gdb_test "ptype enum EU" \
+ [multi_line \
+ "type = enum EU {" \
+ " TWO = 2" \
+ "}"] "ptype EU in enum C"
gdb_test_no_output "set lang c++"
-gdb_test "ptype enum EU" "type = enum EU : unsigned int {TWO = 2}" \
- "ptype EU in C++"
+gdb_test "ptype enum EU" \
+ [multi_line \
+ "type = enum EU : unsigned int {" \
+ " TWO = 2" \
+ "}"] "ptype EU in C++"
gdb_test "p ns::val1" \
" = ns::val1"
" bool C @4;" \
" uint32_t D @5;" \
" uint32_t @6-7;" \
- " enum Z_values {yes = 1, no = 0, maybe = 2, so} Z @8-9;" \
+ " enum Z_values {" \
+ " yes = 1," \
+ " no = 0," \
+ " maybe = 2," \
+ " so = 3" \
+ " } Z @8-9;" \
"}"]
# Reggroups should have at least general and the extra foo group
gdb_test "maintenance print reggroups" \
switch $nested_key {
enum {
- set expected_result \
- "enum $nested_name (: (unsigned )?int )?\{"
- foreach c $nested_children {
- append expected_result "$c, "
- }
- set expected_result \
- [string trimright $expected_result { ,}]
- append expected_result "\};"
+ set expected_result "enum $nested_name : unsigned int \{"
cp_ptype_class_verbose \
"Expecting enum result: $expected_result"
- if {![regexp -- $expected_result $actual_line]} {
+ if {![string equal $expected_result $actual_line]} {
set txt "$in_testname // wrong nested type enum"
append txt " definition: $actual_line"
fail $txt
queue delete $line_queue
return false
}
+ # This will be followed by lines for each value of the
+ # enum.
+ cp_ptype_class_verbose "matched enum value"
+ foreach m $nested_children {
+ set actual_line \
+ [cp_support_internal::next_line $line_queue]
+ cp_ptype_class_verbose "Expecting enum value: $m"
+ # Remove the trailing comma from the actual line to
+ # simplify comparison.
+ set trimmed_actual_line \
+ [string trimright $actual_line " ,"]
+ if {![string equal $m $trimmed_actual_line]} {
+ set txt "$in_testname // unexpected enum value: "
+ append txt $m
+ fail $txt
+ queue delete $line_queue
+ return false
+ }
+ cp_ptype_class_verbose "matched enum value \"$m\""
+ }
+
+ # Nested enum values always end with a trailing curly brace.
+ set actual_line [cp_support_internal::next_line $line_queue]
+ if {![string equal $actual_line "\};"]} {
+ fail "$in_testname // missing closing curly brace"
+ queue delete $line_queue
+ return false
+ }
cp_ptype_class_verbose "passed enum $nested_name"
}