aboutsummaryrefslogtreecommitdiff
path: root/gdb/testsuite/gdb.cp
diff options
context:
space:
mode:
authorTom Tromey <tromey@redhat.com>2014-03-27 12:24:27 -0600
committerTom Tromey <tromey@redhat.com>2014-04-14 11:42:18 -0600
commit3d567982aca11c85a7fa31f13046de3271d3afc8 (patch)
tree2531411a9a2aed81fb3a31d7be8960c34c9759e8 /gdb/testsuite/gdb.cp
parentc848d64244912f9f411bec7b1c045bf14c72b61b (diff)
downloadgdb-3d567982aca11c85a7fa31f13046de3271d3afc8.zip
gdb-3d567982aca11c85a7fa31f13046de3271d3afc8.tar.gz
gdb-3d567982aca11c85a7fa31f13046de3271d3afc8.tar.bz2
implement support for "enum class"
This adds support for the C++11 "enum class" feature. This is PR c++/15246. I chose to use the existing TYPE_DECLARED_CLASS rather than introduce a new type code. This seemed both simple and clear to me. I made overloading support for the new enum types strict. This is how it works in C++; and it didn't seem like an undue burden to keep this, particularly because enum constants are printed symbolically by gdb. Built and regtested on x86-64 Fedora 20. 2014-04-14 Tom Tromey <tromey@redhat.com> PR c++/15246: * c-exp.y (type_aggregate_p): New function. (qualified_name, classify_inner_name): Use it. * c-typeprint.c (c_type_print_base): Handle TYPE_DECLARED_CLASS and TYPE_TARGET_TYPE of an enum type. * dwarf2read.c (read_enumeration_type): Set TYPE_DECLARED_CLASS on an enum type. (determine_prefix) <case DW_TAG_enumeration_type>: New case; handle TYPE_DECLARED_CLASS. * gdbtypes.c (rank_one_type): Handle TYPE_DECLARED_CLASS on enum types. * gdbtypes.h (TYPE_DECLARED_CLASS): Update comment. * valops.c (enum_constant_from_type): New function. (value_aggregate_elt): Use it. * cp-namespace.c (cp_lookup_nested_symbol): Handle TYPE_CODE_ENUM. 2014-04-14 Tom Tromey <tromey@redhat.com> * gdb.cp/classes.exp (test_enums): Handle underlying type. * gdb.dwarf2/enum-type.exp: Add test for enum with underlying type. * gdb.cp/enum-class.exp: New file. * gdb.cp/enum-class.cc: New file.
Diffstat (limited to 'gdb/testsuite/gdb.cp')
-rw-r--r--gdb/testsuite/gdb.cp/classes.exp2
-rw-r--r--gdb/testsuite/gdb.cp/enum-class.cc46
-rw-r--r--gdb/testsuite/gdb.cp/enum-class.exp48
3 files changed, 95 insertions, 1 deletions
diff --git a/gdb/testsuite/gdb.cp/classes.exp b/gdb/testsuite/gdb.cp/classes.exp
index 7c1a5d1..0141e3a 100644
--- a/gdb/testsuite/gdb.cp/classes.exp
+++ b/gdb/testsuite/gdb.cp/classes.exp
@@ -410,7 +410,7 @@ proc test_enums {} {
# ptype on the enum member
gdb_test_multiple "ptype obj_with_enum.priv_enum" "ptype obj_with_enum.priv_enum" {
- -re "type = enum ClassWithEnum::PrivEnum \{ ?(ClassWithEnum::)?red, (ClassWithEnum::)?green, (ClassWithEnum::)?blue, (ClassWithEnum::)?yellow = 42 ?\}$nl$gdb_prompt $" {
+ -re "type = enum ClassWithEnum::PrivEnum (: unsigned int )?\{ ?(ClassWithEnum::)?red, (ClassWithEnum::)?green, (ClassWithEnum::)?blue, (ClassWithEnum::)?yellow = 42 ?\}$nl$gdb_prompt $" {
pass "ptype obj_with_enum.priv_enum"
}
-re "type = enum PrivEnum \{ ?(ClassWithEnum::)?red, (ClassWithEnum::)?green, (ClassWithEnum::)?blue, (ClassWithEnum::)?yellow = 42 ?\}$nl$gdb_prompt $" {
diff --git a/gdb/testsuite/gdb.cp/enum-class.cc b/gdb/testsuite/gdb.cp/enum-class.cc
new file mode 100644
index 0000000..bddfbbb
--- /dev/null
+++ b/gdb/testsuite/gdb.cp/enum-class.cc
@@ -0,0 +1,46 @@
+/* This testcase is part of GDB, the GNU debugger.
+
+ Copyright 2014 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+enum class E1 {
+ HI = 7, THERE
+};
+
+enum class E2 {
+ HI = 23, THERE
+};
+
+// overload1(E1::HI) is ok.
+// overload1(77) is ok.
+int overload1 (int v) { return 0; }
+int overload1 (E1 v) { return static_cast<int> (v); }
+int overload1 (E2 v) { return - static_cast<int> (v); }
+
+// overload2(E1::HI) is ok.
+// overload1(77) fails.
+int overload2 (E1 v) { return static_cast<int> (v); }
+int overload2 (E2 v) { return - static_cast<int> (v); }
+
+// overload3(E1::HI) fails.
+// overload1(77) is ok.
+int overload3 (int v) { return 0; }
+int overload3 (E2 v) { return static_cast<int> (v); }
+
+int
+main (void)
+{
+ return 0;
+}
diff --git a/gdb/testsuite/gdb.cp/enum-class.exp b/gdb/testsuite/gdb.cp/enum-class.exp
new file mode 100644
index 0000000..2246f50
--- /dev/null
+++ b/gdb/testsuite/gdb.cp/enum-class.exp
@@ -0,0 +1,48 @@
+# Copyright 2014 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+# This file is part of the gdb testsuite
+
+if {[skip_cplus_tests]} { continue }
+
+standard_testfile .cc
+
+if {[prepare_for_testing $testfile.exp $testfile $srcfile \
+ {debug c++ additional_flags=-std=c++11}]} {
+ return -1
+}
+
+if {![runto_main]} {
+ return -1
+}
+
+gdb_test "ptype E1" \
+ "type = enum class E1 (: int )?{E1::HI = 7, E1::THERE}"
+
+gdb_test "print E1::HI" " = E1::HI"
+gdb_test "print (int) E1::HI" " = 7"
+gdb_test "print (int) E2::HI" " = 23"
+gdb_test "print HI" "No symbol .HI.*"
+
+gdb_test "print overload1(E1::THERE)" " = 8"
+gdb_test "print overload1(77)" " = 0"
+
+gdb_test "print overload2(E1::THERE)" " = 8"
+gdb_test "print overload2(77)" \
+ "Cannot resolve function overload2 to any overloaded instance"
+
+gdb_test "print overload3(E1::THERE)" \
+ "Cannot resolve function overload3 to any overloaded instance"
+gdb_test "print overload3(77)" " = 0"