Regression: Invalid data type for function to be called. [Re: FYI: fix PR 9514] http://sourceware.org/ml/gdb-patches/2012-07/msg00043.html reverted: http://sourceware.org/ml/gdb-cvs/2012-06/msg00148.html diff -dup -rup gdb-7.4.50.20120703-orig/gdb/c-exp.y gdb-7.4.50.20120703/gdb/c-exp.y --- gdb-7.4.50.20120703-orig/gdb/c-exp.y 2012-07-03 20:08:15.976418420 +0200 +++ gdb-7.4.50.20120703/gdb/c-exp.y 2012-07-03 20:08:35.935390282 +0200 @@ -172,10 +172,9 @@ static struct stoken operator_stoken (co /* %type block */ /* Fancy type parsing. */ -%type func_mod direct_abs_decl abs_decl ptr_operator +%type func_mod direct_abs_decl abs_decl %type ptype %type array_mod -%type conversion_type_id %token INT %token FLOAT @@ -932,7 +931,9 @@ variable: name_not_typename ; space_identifier : '@' NAME - { insert_type_address_space (copy_name ($2.stoken)); } + { push_type_address_space (copy_name ($2.stoken)); + push_type (tp_space_identifier); + } ; const_or_volatile: const_or_volatile_noopt @@ -951,23 +952,14 @@ const_or_volatile_or_space_identifier: | ; -ptr_operator: - ptr_operator '*' - { insert_type (tp_pointer); } - const_or_volatile_or_space_identifier - { $$ = 0; } - | '*' - { insert_type (tp_pointer); } - const_or_volatile_or_space_identifier - { $$ = 0; } +abs_decl: '*' + { push_type (tp_pointer); $$ = 0; } + | '*' abs_decl + { push_type (tp_pointer); $$ = $2; } | '&' - { insert_type (tp_reference); $$ = 0; } - | '&' ptr_operator - { insert_type (tp_reference); $$ = 0; } - ; - -abs_decl: ptr_operator direct_abs_decl - | ptr_operator + { push_type (tp_reference); $$ = 0; } + | '&' abs_decl + { push_type (tp_reference); $$ = $2; } | direct_abs_decl ; @@ -1211,30 +1203,22 @@ nonempty_typelist ; ptype : typebase - | ptype abs_decl - { $$ = follow_types ($1); } - ; - -conversion_type_id: typebase conversion_declarator + | ptype const_or_volatile_or_space_identifier abs_decl const_or_volatile_or_space_identifier { $$ = follow_types ($1); } ; -conversion_declarator: /* Nothing. */ - | ptr_operator conversion_declarator - ; - const_and_volatile: CONST_KEYWORD VOLATILE_KEYWORD | VOLATILE_KEYWORD CONST_KEYWORD ; const_or_volatile_noopt: const_and_volatile - { insert_type (tp_const); - insert_type (tp_volatile); + { push_type (tp_const); + push_type (tp_volatile); } | CONST_KEYWORD - { insert_type (tp_const); } + { push_type (tp_const); } | VOLATILE_KEYWORD - { insert_type (tp_volatile); } + { push_type (tp_volatile); } ; operator: OPERATOR NEW @@ -1341,7 +1325,7 @@ operator: OPERATOR NEW { $$ = operator_stoken ("()"); } | OPERATOR '[' ']' { $$ = operator_stoken ("[]"); } - | OPERATOR conversion_type_id + | OPERATOR ptype { char *name; long length; struct ui_file *buf = mem_fileopen (); diff -dup -rup gdb-7.4.50.20120703-orig/gdb/parse.c gdb-7.4.50.20120703/gdb/parse.c --- gdb-7.4.50.20120703-orig/gdb/parse.c 2012-07-03 20:08:15.979418415 +0200 +++ gdb-7.4.50.20120703/gdb/parse.c 2012-07-03 20:08:35.938390277 +0200 @@ -1370,49 +1370,6 @@ check_type_stack_depth (void) } } -/* A helper function for insert_type and insert_type_address_space. - This does work of expanding the type stack and inserting the new - element, ELEMENT, into the stack at location SLOT. */ - -static void -insert_into_type_stack (int slot, union type_stack_elt element) -{ - check_type_stack_depth (); - - if (slot < type_stack_depth) - memmove (&type_stack[slot + 1], &type_stack[slot], - (type_stack_depth - slot) * sizeof (union type_stack_elt)); - type_stack[slot] = element; - ++type_stack_depth; -} - -/* Insert a new type, TP, at the bottom of the type stack. If TP is - tp_pointer or tp_reference, it is inserted at the bottom. If TP is - a qualifier, it is inserted at slot 1 (just above a previous - tp_pointer) if there is anything on the stack, or simply pushed if - the stack is empty. Other values for TP are invalid. */ - -void -insert_type (enum type_pieces tp) -{ - union type_stack_elt element; - int slot; - - gdb_assert (tp == tp_pointer || tp == tp_reference - || tp == tp_const || tp == tp_volatile); - - /* If there is anything on the stack (we know it will be a - tp_pointer), insert the qualifier above it. Otherwise, simply - push this on the top of the stack. */ - if (type_stack_depth && (tp == tp_const || tp == tp_volatile)) - slot = 1; - else - slot = 0; - - element.piece = tp; - insert_into_type_stack (slot, element); -} - void push_type (enum type_pieces tp) { @@ -1427,32 +1384,10 @@ push_type_int (int n) type_stack[type_stack_depth++].int_val = n; } -/* Insert a tp_space_identifier and the corresponding address space - value into the stack. STRING is the name of an address space, as - recognized by address_space_name_to_int. If the stack is empty, - the new elements are simply pushed. If the stack is not empty, - this function assumes that the first item on the stack is a - tp_pointer, and the new values are inserted above the first - item. */ - void -insert_type_address_space (char *string) +push_type_address_space (char *string) { - union type_stack_elt element; - int slot; - - /* If there is anything on the stack (we know it will be a - tp_pointer), insert the address space qualifier above it. - Otherwise, simply push this on the top of the stack. */ - if (type_stack_depth) - slot = 1; - else - slot = 0; - - element.piece = tp_space_identifier; - insert_into_type_stack (slot, element); - element.int_val = address_space_name_to_int (parse_gdbarch, string); - insert_into_type_stack (slot, element); + push_type_int (address_space_name_to_int (parse_gdbarch, string)); } enum type_pieces Only in gdb-7.4.50.20120703-orig/gdb: parse.c.orig diff -dup -rup gdb-7.4.50.20120703-orig/gdb/parser-defs.h gdb-7.4.50.20120703/gdb/parser-defs.h --- gdb-7.4.50.20120703-orig/gdb/parser-defs.h 2012-07-03 20:08:15.980418414 +0200 +++ gdb-7.4.50.20120703/gdb/parser-defs.h 2012-07-03 20:08:35.939390275 +0200 @@ -192,13 +192,11 @@ extern int end_arglist (void); extern char *copy_name (struct stoken); -extern void insert_type (enum type_pieces); - extern void push_type (enum type_pieces); extern void push_type_int (int); -extern void insert_type_address_space (char *); +extern void push_type_address_space (char *); extern enum type_pieces pop_type (void); diff -dup -rup gdb-7.4.50.20120703-orig/gdb/testsuite/gdb.base/whatis.exp gdb-7.4.50.20120703/gdb/testsuite/gdb.base/whatis.exp --- gdb-7.4.50.20120703-orig/gdb/testsuite/gdb.base/whatis.exp 2012-07-03 20:08:15.981418413 +0200 +++ gdb-7.4.50.20120703/gdb/testsuite/gdb.base/whatis.exp 2012-07-03 20:08:35.940390273 +0200 @@ -465,17 +465,3 @@ gdb_test "whatis char_addr" \ gdb_test "whatis a_char_addr" \ "type = char_addr" \ "whatis applied to variable defined by typedef" - -# Regression tests for PR 9514. - -gdb_test "whatis void (**)()" \ - "type = void \\(\\*\\*\\)\\(\\)" \ - "whatis applied to pointer to pointer to function" - -gdb_test "whatis void (** const)()" \ - "type = void \\(\\*\\* const\\)\\(\\)" \ - "whatis applied to const pointer to pointer to function" - -gdb_test "whatis void (* const *)()" \ - "type = void \\(\\* const \\*\\)\\(\\)" \ - "whatis applied to pointer to const pointer to function"