aboutsummaryrefslogtreecommitdiff
path: root/gdb/c-exp.y
diff options
context:
space:
mode:
authorJim Kingdon <jkingdon@engr.sgi.com>1993-10-18 01:10:25 +0000
committerJim Kingdon <jkingdon@engr.sgi.com>1993-10-18 01:10:25 +0000
commitf843c95fc3d55bb449ed9e681848808c9f637ee4 (patch)
tree139637eb69a38c92edc87506e010d755776dfd55 /gdb/c-exp.y
parentcf4d863151f03057f70f5dacba3a56b5f10e97cc (diff)
downloadgdb-f843c95fc3d55bb449ed9e681848808c9f637ee4.zip
gdb-f843c95fc3d55bb449ed9e681848808c9f637ee4.tar.gz
gdb-f843c95fc3d55bb449ed9e681848808c9f637ee4.tar.bz2
* parse.c, parser-defs.h (follow_types): New function.
* c-exp.y (ptype : typebase abs_decl): Use it. * c-exp.y (ptype): Add support for type qualifiers after the typebase. The typebase rule already has support for them before the typebase. * Makefile.in: Change the expected number of shift/reduce conflicts to 6. This is OK--the 2 new conflicts are basically the same as one of the old ones.
Diffstat (limited to 'gdb/c-exp.y')
-rw-r--r--gdb/c-exp.y65
1 files changed, 24 insertions, 41 deletions
diff --git a/gdb/c-exp.y b/gdb/c-exp.y
index 37a00d2..0e7d39a 100644
--- a/gdb/c-exp.y
+++ b/gdb/c-exp.y
@@ -722,48 +722,23 @@ variable: name_not_typename
;
+/* shift/reduce conflict: "typebase ." and the token is '('. (Shows up
+ twice, once where qualified_name is a possibility and once where
+ it is not). */
+/* shift/reduce conflict: "typebase CONST_KEYWORD ." and the token is '('. */
+/* shift/reduce conflict: "typebase VOLATILE_KEYWORD ." and the token is
+ '('. */
ptype : typebase
+ /* "const" and "volatile" are curently ignored. A type qualifier
+ before the type is currently handled in the typebase rule. */
+ | typebase CONST_KEYWORD
+ | typebase VOLATILE_KEYWORD
| typebase abs_decl
- {
- /* This is where the interesting stuff happens. */
- int done = 0;
- int array_size;
- struct type *follow_type = $1;
- struct type *range_type;
-
- while (!done)
- switch (pop_type ())
- {
- case tp_end:
- done = 1;
- break;
- case tp_pointer:
- follow_type = lookup_pointer_type (follow_type);
- break;
- case tp_reference:
- follow_type = lookup_reference_type (follow_type);
- break;
- case tp_array:
- array_size = pop_type_int ();
- if (array_size != -1)
- {
- range_type =
- create_range_type ((struct type *) NULL,
- builtin_type_int, 0,
- array_size - 1);
- follow_type =
- create_array_type ((struct type *) NULL,
- follow_type, range_type);
- }
- else
- follow_type = lookup_pointer_type (follow_type);
- break;
- case tp_function:
- follow_type = lookup_function_type (follow_type);
- break;
- }
- $$ = follow_type;
- }
+ { $$ = follow_types ($1); }
+ | typebase CONST_KEYWORD abs_decl
+ { $$ = follow_types ($1); }
+ | typebase VOLATILE_KEYWORD abs_decl
+ { $$ = follow_types ($1); }
;
abs_decl: '*'
@@ -790,6 +765,10 @@ direct_abs_decl: '(' abs_decl ')'
push_type (tp_array);
$$ = 0;
}
+
+ /* shift/reduce conflict. "direct_abs_decl . func_mod", and the token
+ is '('. */
+
| direct_abs_decl func_mod
{ push_type (tp_function); }
| func_mod
@@ -808,6 +787,8 @@ func_mod: '(' ')'
{ free ((PTR)$2); $$ = 0; }
;
+/* shift/reduce conflict: "type '(' typebase COLONCOLON '*' ')' ." and the
+ token is '('. */
type : ptype
| typebase COLONCOLON '*'
{ $$ = lookup_member_type (builtin_type_int, $1); }
@@ -871,7 +852,9 @@ typebase /* Implements (approximately): (type-qualifier)* type-specifier */
{ $$ = lookup_template_type(copy_name($2), $4,
expression_context_block);
}
- /* "const" and "volatile" are curently ignored. */
+ /* "const" and "volatile" are curently ignored. A type qualifier
+ after the type is handled in the ptype rule. I think these could
+ be too. */
| CONST_KEYWORD typebase { $$ = $2; }
| VOLATILE_KEYWORD typebase { $$ = $2; }
;