Index: gdb/testsuite/lib/cp-support.exp |
diff --git a/gdb/testsuite/lib/cp-support.exp b/gdb/testsuite/lib/cp-support.exp |
index 8829f97df2b2bf1e5d9716592d85c0c76470f4e1..161e13f4826621165225c11150775cac250caf87 100644 |
--- a/gdb/testsuite/lib/cp-support.exp |
+++ b/gdb/testsuite/lib/cp-support.exp |
@@ -1,6 +1,6 @@ |
# This test code is part of GDB, the GNU debugger. |
-# Copyright 2003-2004, 2007-2012 Free Software Foundation, Inc. |
+# Copyright 2003-2013 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 |
@@ -45,9 +45,10 @@ proc cp_check_errata { expected_string actual_string errata_table } { |
# each line, matching it to the class description given in the |
# parameters. |
# |
-# IN_COMMAND and IN_TESTNAME are the command and testname for |
+# IN_EXP is the expression to use; the appropriate "ptype" invocation |
+# is prepended to it. IN_TESTNAME is the testname for |
# gdb_test_multiple. If IN_TESTNAME is the empty string, then it |
-# defaults to IN_COMMAND. |
+# defaults to "ptype IN_EXP". |
# |
# IN_KEY is "class" or "struct". For now, I ignore it, and allow either |
# "class" or "struct" in the output, as long as the access specifiers all |
@@ -81,6 +82,11 @@ proc cp_check_errata { expected_string actual_string errata_table } { |
# the class has a member function with the given access type |
# and the given declaration. |
# |
+# { typedef "access" "declaration" } |
+# |
+# the class has a typedef with the given access type and the |
+# given declaration. |
+# |
# If you test the same class declaration more than once, you can specify |
# IN_CLASS_TABLE as "ibid". "ibid" means: look for a previous class |
# table that had the same IN_KEY and IN_TAG, and re-use that table. |
@@ -94,6 +100,8 @@ proc cp_check_errata { expected_string actual_string errata_table } { |
# demangler syntax adjustment, so you have to make a bigger table |
# with lines for each output variation. |
# |
+# IN_PTYPE_ARG are arguments to pass to ptype. The default is "/r". |
+# |
# gdb can vary the output of ptype in several ways: |
# |
# . CLASS/STRUCT |
@@ -172,13 +180,16 @@ proc cp_check_errata { expected_string actual_string errata_table } { |
# |
# -- chastain 2004-08-07 |
-proc cp_test_ptype_class { in_command in_testname in_key in_tag in_class_table { in_tail "" } { in_errata_table { } } } { |
+proc cp_test_ptype_class { in_exp in_testname in_key in_tag in_class_table { in_tail "" } { in_errata_table { } } { in_ptype_arg /r } } { |
global gdb_prompt |
set wsopt "\[\r\n\t \]*" |
- # The test name defaults to the command. |
+ # The test name defaults to the command, but without the |
+ # arguments, for historical reasons. |
- if { "$in_testname" == "" } then { set in_testname "$in_command" } |
+ if { "$in_testname" == "" } then { set in_testname "ptype $in_exp" } |
+ |
+ set in_command "ptype${in_ptype_arg} $in_exp" |
# Save class tables in a history array for reuse. |
@@ -199,6 +210,7 @@ proc cp_test_ptype_class { in_command in_testname in_key in_tag in_class_table { |
set list_vbases { } |
set list_fields { } |
set list_methods { } |
+ set list_typedefs { } |
foreach class_line $in_class_table { |
switch [lindex $class_line 0] { |
@@ -206,6 +218,7 @@ proc cp_test_ptype_class { in_command in_testname in_key in_tag in_class_table { |
"vbase" { lappend list_vbases [lindex $class_line 1] } |
"field" { lappend list_fields [lrange $class_line 1 2] } |
"method" { lappend list_methods [lrange $class_line 1 2] } |
+ "typedef" { lappend list_typedefs [lrange $class_line 1 2] } |
default { fail "$in_testname // bad line in class table: $class_line"; return; } |
} |
} |
@@ -222,13 +235,13 @@ proc cp_test_ptype_class { in_command in_testname in_key in_tag in_class_table { |
set parse_okay 0 |
gdb_test_multiple "$in_command" "$in_testname // parse failed" { |
- -re "type = (struct|class)${wsopt}(\[A-Za-z0-9_\]*)${wsopt}((:\[^\{\]*)?)${wsopt}\{(.*)\}${wsopt}(\[^\r\n\]*)\[\r\n\]+$gdb_prompt $" { |
+ -re "type = (struct|class)${wsopt}(\[^ \t\]*)${wsopt}(\\\[with .*\\\]${wsopt})?((:\[^\{\]*)?)${wsopt}\{(.*)\}${wsopt}(\[^\r\n\]*)\[\r\n\]+$gdb_prompt $" { |
set parse_okay 1 |
set actual_key $expect_out(1,string) |
set actual_tag $expect_out(2,string) |
- set actual_base_string $expect_out(3,string) |
- set actual_body $expect_out(5,string) |
- set actual_tail $expect_out(6,string) |
+ set actual_base_string $expect_out(4,string) |
+ set actual_body $expect_out(6,string) |
+ set actual_tail $expect_out(7,string) |
} |
} |
if { ! $parse_okay } then { return } |
@@ -381,6 +394,22 @@ proc cp_test_ptype_class { in_command in_testname in_key in_tag in_class_table { |
} |
} |
+ # Typedef |
+ |
+ if {[llength $list_typedefs] > 0} { |
+ set typedef_access [lindex [lindex $list_typedefs 0] 0] |
+ set typedef_decl [lindex [lindex $list_typedefs 0] 1] |
+ if {[string equal $actual_line $typedef_decl]} { |
+ if {![string equal $access $typedef_access]} { |
+ cp_check_errata $typedef_access $access $in_errata_table |
+ fail "$in_testname // wrong access specifier for typedef: $access" |
+ return |
+ } |
+ set list_typedefs [lreplace $list_typedefs 0 0] |
+ continue |
+ } |
+ } |
+ |
# Synthetic operators. These are optional and can be mixed in |
# with the methods in any order, but duplicates are wrong. |
# |
@@ -452,6 +481,11 @@ proc cp_test_ptype_class { in_command in_testname in_key in_tag in_class_table { |
return |
} |
+ if {[llength $list_typedefs] > 0} { |
+ fail "$in_testname // missing typedefs" |
+ return |
+ } |
+ |
# Check the tail. |
set actual_tail [string trim $actual_tail] |