2001-09-20 Michael Snyder <msnyder@redhat.com>

Changes by Daniel Berlin  <dan@cgsoftware.com>, 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.
This commit is contained in:
Michael Snyder 2001-09-27 22:39:05 +00:00
parent 9b28427211
commit 2e2394a075
2 changed files with 37 additions and 1 deletions

View file

@ -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 ();

View file

@ -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