From 5e24eafb253809eaac88fc1d4c82f6549c640235 Mon Sep 17 00:00:00 2001 From: Michael Snyder Date: Thu, 27 Sep 2001 22:39:05 +0000 Subject: 2001-09-20 Michael Snyder Changes by Daniel Berlin , to support better parsing of const and volatile type expressions. * c-exp.y (const_and_volatile, const_or_volatile_noopt, const_or_volatile): New non-terminals. (ptype): Use new rule for const_or_volatile. (typebase): Use new rule for const_or_volatile_noopt. * parser-defs.h (enum type_pieces): New values tp_const, tp_volatile. * parse.c (follow_types): Handle tp_const and tp_volatile on the type stack: call make_cv_type to create new const/volatile type. --- gdb/parse.c | 30 ++++++++++++++++++++++++++++++ gdb/parser-defs.h | 8 +++++++- 2 files changed, 37 insertions(+), 1 deletion(-) (limited to 'gdb') diff --git a/gdb/parse.c b/gdb/parse.c index 1c4324b8f61..64966edf2b5 100644 --- a/gdb/parse.c +++ b/gdb/parse.c @@ -1255,6 +1255,8 @@ struct type * follow_types (struct type *follow_type) { int done = 0; + int make_const = 0; + int make_volatile = 0; int array_size; struct type *range_type; @@ -1263,12 +1265,40 @@ follow_types (struct type *follow_type) { case tp_end: done = 1; + if (make_const) + follow_type = make_cv_type (make_const, + TYPE_VOLATILE (follow_type), + follow_type, 0); + if (make_volatile) + follow_type = make_cv_type (TYPE_CONST (follow_type), + make_volatile, + follow_type, 0); + break; + case tp_const: + make_const = 1; + break; + case tp_volatile: + make_volatile = 1; break; case tp_pointer: follow_type = lookup_pointer_type (follow_type); + if (make_const) + follow_type = make_cv_type (make_const, + TYPE_VOLATILE (follow_type), + follow_type, 0); + if (make_volatile) + follow_type = make_cv_type (TYPE_CONST (follow_type), + make_volatile, + follow_type, 0); + make_const = make_volatile = 0; break; case tp_reference: follow_type = lookup_reference_type (follow_type); + if (make_const) + follow_type = make_cv_type (make_const, TYPE_VOLATILE (follow_type), follow_type, 0); + if (make_volatile) + follow_type = make_cv_type (TYPE_CONST (follow_type), make_volatile, follow_type, 0); + make_const = make_volatile = 0; break; case tp_array: array_size = pop_type_int (); diff --git a/gdb/parser-defs.h b/gdb/parser-defs.h index cf8539965d1..bd7fb39e4b7 100644 --- a/gdb/parser-defs.h +++ b/gdb/parser-defs.h @@ -84,7 +84,13 @@ struct symtoken An array should be preceded in the list by the size of the array. */ enum type_pieces { - tp_end = -1, tp_pointer, tp_reference, tp_array, tp_function + tp_end = -1, + tp_pointer, + tp_reference, + tp_array, + tp_function, + tp_const, + tp_volatile }; /* The stack can contain either an enum type_pieces or an int. */ union type_stack_elt -- cgit v1.2.1