237 lines
7.4 KiB
Diff
237 lines
7.4 KiB
Diff
|
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 <bval> block */
|
||
|
|
||
|
/* Fancy type parsing. */
|
||
|
-%type <voidval> func_mod direct_abs_decl abs_decl ptr_operator
|
||
|
+%type <voidval> func_mod direct_abs_decl abs_decl
|
||
|
%type <tval> ptype
|
||
|
%type <lval> array_mod
|
||
|
-%type <tval> conversion_type_id
|
||
|
|
||
|
%token <typed_val_int> INT
|
||
|
%token <typed_val_float> 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"
|