From 3bcb89d76b126181f4394edf429a1e87ae406b12 Mon Sep 17 00:00:00 2001 From: jimb Date: Thu, 21 Feb 2002 20:34:14 +0000 Subject: [PATCH] * gdb.base/ptype.exp, gdb.base/ptype.c: Add tests for printing types of pointers to prototyped functions. --- gdb/testsuite/ChangeLog | 5 ++++ gdb/testsuite/gdb.base/ptype.c | 49 ++++++++++++++++++++++++++++++------- gdb/testsuite/gdb.base/ptype.exp | 52 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 98 insertions(+), 8 deletions(-) diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 7b6f57e4c4..645e78b390 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2002-02-21 Jim Blandy + + * gdb.base/ptype.exp, gdb.base/ptype.c: Add tests for printing + types of pointers to prototyped functions. + 2002-02-20 Andrew Cagney * gdb.base/sizeof.c (main): Call fill_structs. Print value of diff --git a/gdb/testsuite/gdb.base/ptype.c b/gdb/testsuite/gdb.base/ptype.c index 801343530e..2c85c7c88f 100644 --- a/gdb/testsuite/gdb.base/ptype.c +++ b/gdb/testsuite/gdb.base/ptype.c @@ -6,6 +6,7 @@ /* * First the basic C types. */ +#include #if !defined (__STDC__) && !defined (_AIX) #define signed /**/ @@ -211,23 +212,54 @@ enum colors {yellow, purple, pink} nonprimary; enum {chevy, ford} clunker; enum cars {bmw, porsche} sportscar; +#undef FALSE +#undef TRUE typedef enum {FALSE, TRUE} boolean; boolean v_boolean; -typedef enum bvals {false, true} boolean2; +/*note: aCC has bool type predefined with 'false' and 'true'*/ +typedef enum bvals {my_false, my_true} boolean2; boolean2 v_boolean2; enum misordered {two = 2, one = 1, zero = 0, three = 3}; +/* Seems like we need a variable of this type to get the type to be put + in the executable, at least for AIX xlc. */ +enum misordered v_misordered = three; + +/**** Pointers to functions *******/ + +typedef int (*func_type) (int (*) (int, float), float); +double (*old_fptr) (); +double (*new_fptr) (void); +int (*fptr) (int, float); +int *(*fptr2) (int (*) (int, float), float); +int (*xptr) (int (*) (), int (*) (void), int); +int (*(*ffptr) (char)) (short); +int (*(*(*fffptr) (char)) (short)) (long); + +/* Here are the sort of stabs we expect to see for the above: + + .stabs "func_type:t(0,100)=*(0,101)=g(0,1)(0,102)=*(0,103)=g(0,1)(0,1)(0,14)#(0,14)#",128,0,234,0 + .stabs "old_fptr:G(0,110)=*(0,111)=f(0,15)",32,0,231,0 + .stabs "new_fptr:G(0,120)=*(0,121)=g(0,15)(0,122)=(0,122)#",32,0,232,0 + .stabs "fptr:G(0,130)=*(0,103)#",32,0,233,0 + .stabs "fptr2:G(0,140)=*(0,141)=g(0,142)=*(0,1)(0,102)(0,14)#",32,0,235,0 + .stabs "xptr:G(0,150)=*(0,151)=g(0,1)(0,152)=*(0,153)=f(0,1)(0,154)=*(0,155)=g(0,1)(0,122)#(0,1)#",32,0,236,0 + .stabs "ffptr:G(0,160)=*(0,161)=g(0,162)=*(0,163)=g(0,1)(0,8)#(0,2)#",32,0,237,0\ + .stabs "fffptr:G(0,170)=*(0,171)=g(0,172)=*(0,173)=g(0,174)=*(0,175)=g(0,1)(0,3)#(0,8)#(0,2)#",32,0,237,0 + + Most of these use Sun's extension for prototyped function types --- + the 'g' type descriptor. As of around 9 Feb 2002, GCC didn't emit + those, but GDB can read them, so the related tests in ptype.exp + will all xfail. */ + + /***********/ -main () +int main () { /* Ensure that malloc is a pointer type; avoid use of "void" and any include files. */ - extern char *malloc(); - - /* Seems like we need a variable of this type to get the type to be put - in the executable, at least for AIX xlc. */ - enum misordered v_misordered = three; +/* extern char *malloc();*/ /* Some of the tests in ptype.exp require invoking malloc, so make sure it is linked in to this program. */ @@ -309,5 +341,6 @@ main () v_t_struct_p = 0; v_boolean = FALSE; - v_boolean2 = false; + v_boolean2 = my_false; + return 0; } diff --git a/gdb/testsuite/gdb.base/ptype.exp b/gdb/testsuite/gdb.base/ptype.exp index 6e0bda5d37..2851e8937f 100644 --- a/gdb/testsuite/gdb.base/ptype.exp +++ b/gdb/testsuite/gdb.base/ptype.exp @@ -533,6 +533,58 @@ gdb_test "ptype nested_su.inner_struct_instance.inner_int" "type = int.*" "ptype gdb_test "ptype nested_su.inner_union_instance" "type = union ${outer}inner_union \{.*\[\r\n\] int inner_union_int;.*\[\r\n\] (long|long int|int) inner_union_long;.*\[\r\n\]\}.*" "ptype nested union" + +get_debug_format + +# Print the type of the identifier ID, and check the response: +# - Expect to see PROTOTYPED as the type. PROTOTYPED is not a regular +# expression; it's a literal string. +# - If we instead see the unprototyped type PLAIN, and we're using STABS +# generated by GCC, that's an xfail; as of 9 Feb 2002, GCC never emits +# prototyped function types in STABS. Like PROTOTYPED, PLAIN is a +# literal string, not a regular expression. +# - Otherwise, it's a failure. +proc ptype_maybe_prototyped { id prototyped plain } { + global gdb_prompt + global gcc_compiled + + # Turn `prototyped' and `plain', which are literal strings, into + # regular expressions by quoting any special characters they contain. + regsub -all "\[\]\[*()\]" $prototyped "\\\\&" prototyped + regsub -all "\[\]\[*()\]" $plain "\\\\&" plain + + send_gdb "ptype $id\n" + gdb_expect { + -re "type = $prototyped\[\r\n\]+$gdb_prompt $" { + pass "ptype $id" + } + -re "type = $plain\[\r\n\]+$gdb_prompt $" { + if {$gcc_compiled} { setup_xfail_format "stabs" } + fail "ptype $id (compiler doesn't emit prototyped types)" + } + -re "$gdb_prompt $" { + fail "ptype $id" + } + timeout { + fail "ptype $id (timeout)" + } + } +} + +ptype_maybe_prototyped "func_type" "int (*)(int (*)(int, float), float)" \ + "int (*)()" +ptype_maybe_prototyped "old_fptr" "double (*)()" "double (*)()" +ptype_maybe_prototyped "new_fptr" "double (*)(void)" "double (*)()" +ptype_maybe_prototyped "fptr" "int (*)(int, float)" "int (*)()" +ptype_maybe_prototyped "fptr2" "int *(*)(int (*)(int, float), float)" \ + "int *(*)()" +ptype_maybe_prototyped "xptr" "int (*)(int (*)(), int (*)(void), int)" \ + "int (*)()" +ptype_maybe_prototyped "ffptr" "int (*(*)(char))(short int)" \ + "int (*(*)())()" +ptype_maybe_prototyped "fffptr" "int (*(*(*)(char))(short int))(long int)" \ + "int (*(*(*)())())()" + # Test printing type of string constants and array constants, but # requires a running process. These call malloc, and can take a long # time to execute over a slow serial link, so increase the timeout. -- 2.11.0