Blob Blame History Raw
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"