1986-03-10 13:07:55 +00:00
|
|
|
/* $Header$ */
|
|
|
|
/* D E C L A R A T O R M A N I P U L A T I O N */
|
|
|
|
|
1986-09-29 14:01:34 +00:00
|
|
|
#include "botch_free.h"
|
1986-03-10 13:07:55 +00:00
|
|
|
#include "alloc.h"
|
|
|
|
#include "arith.h"
|
|
|
|
#include "type.h"
|
|
|
|
#include "Lpars.h"
|
1986-03-10 15:10:56 +00:00
|
|
|
#include "declar.h"
|
1986-03-10 13:07:55 +00:00
|
|
|
#include "storage.h"
|
|
|
|
#include "idf.h"
|
|
|
|
#include "label.h"
|
|
|
|
#include "expr.h"
|
|
|
|
#include "sizes.h"
|
|
|
|
|
|
|
|
struct declarator null_declarator;
|
|
|
|
|
|
|
|
struct type *
|
|
|
|
declare_type(tp, dc)
|
|
|
|
struct type *tp;
|
|
|
|
struct declarator *dc;
|
|
|
|
{
|
|
|
|
/* Applies the decl_unary list starting at dc->dc_decl_unary
|
|
|
|
to the type tp and returns the result.
|
|
|
|
*/
|
|
|
|
register struct decl_unary *du = dc->dc_decl_unary;
|
|
|
|
|
|
|
|
while (du) {
|
|
|
|
tp = construct_type(du->du_fund, tp, du->du_count);
|
|
|
|
du = du->next;
|
|
|
|
}
|
|
|
|
return tp;
|
|
|
|
}
|
|
|
|
|
1986-07-18 21:10:42 +00:00
|
|
|
add_decl_unary(dc, fund, count, fm)
|
1986-09-24 13:53:16 +00:00
|
|
|
register struct declarator *dc;
|
1986-03-10 13:07:55 +00:00
|
|
|
arith count;
|
1986-07-18 21:10:42 +00:00
|
|
|
struct formal *fm;
|
1986-03-10 13:07:55 +00:00
|
|
|
{
|
|
|
|
/* A decl_unary describing a constructor with fundamental
|
|
|
|
type fund and with size count is inserted in front of the
|
|
|
|
declarator dc.
|
|
|
|
*/
|
|
|
|
register struct decl_unary *new = new_decl_unary();
|
|
|
|
|
|
|
|
clear((char *)new, sizeof(struct decl_unary));
|
|
|
|
new->next = dc->dc_decl_unary;
|
|
|
|
new->du_fund = fund;
|
|
|
|
new->du_count = count;
|
1986-07-18 21:10:42 +00:00
|
|
|
if (fm) {
|
1986-03-10 13:07:55 +00:00
|
|
|
if (dc->dc_decl_unary) {
|
|
|
|
/* paramlist only allowed at first decl_unary */
|
|
|
|
error("formal parameter list discarded");
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
/* register the parameters */
|
1986-07-18 21:10:42 +00:00
|
|
|
dc->dc_formal = fm;
|
1986-03-10 13:07:55 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
dc->dc_decl_unary = new;
|
|
|
|
}
|
|
|
|
|
|
|
|
remove_declarator(dc)
|
|
|
|
struct declarator *dc;
|
|
|
|
{
|
|
|
|
/* The decl_unary list starting at dc->dc_decl_unary is
|
|
|
|
removed.
|
|
|
|
*/
|
|
|
|
register struct decl_unary *du = dc->dc_decl_unary;
|
|
|
|
|
|
|
|
while (du) {
|
|
|
|
struct decl_unary *old_du = du;
|
|
|
|
|
|
|
|
du = du->next;
|
|
|
|
free_decl_unary(old_du);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
reject_params(dc)
|
1986-09-24 13:53:16 +00:00
|
|
|
register struct declarator *dc;
|
1986-03-10 13:07:55 +00:00
|
|
|
{
|
|
|
|
/* The declarator is checked to have no parameters, if it
|
|
|
|
is a function.
|
|
|
|
*/
|
1986-07-18 21:10:42 +00:00
|
|
|
if (dc->dc_formal) {
|
1986-03-10 13:07:55 +00:00
|
|
|
error("non_empty formal parameter pack");
|
1986-07-18 21:10:42 +00:00
|
|
|
free_formals(dc->dc_formal);
|
|
|
|
dc->dc_formal = 0;
|
1986-03-10 13:07:55 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
1986-09-28 20:33:15 +00:00
|
|
|
check_array_subscript(expr)
|
1986-09-24 13:53:16 +00:00
|
|
|
register struct expr *expr;
|
1986-03-10 13:07:55 +00:00
|
|
|
{
|
|
|
|
arith size = expr->VL_VALUE;
|
|
|
|
|
|
|
|
if (size < 0) {
|
|
|
|
error("negative number of array elements");
|
|
|
|
expr->VL_VALUE = (arith)1;
|
|
|
|
}
|
|
|
|
else
|
1986-04-28 09:56:33 +00:00
|
|
|
if (size == 0) {
|
|
|
|
warning("empty array declaration");
|
|
|
|
expr->VL_VALUE = (arith)-1;
|
|
|
|
}
|
|
|
|
else
|
1986-09-28 20:33:15 +00:00
|
|
|
if (size & ~max_unsigned) { /* absolutely ridiculous */
|
1986-03-10 13:07:55 +00:00
|
|
|
expr_error(expr, "overflow in array size");
|
|
|
|
expr->VL_VALUE = (arith)1;
|
|
|
|
}
|
|
|
|
}
|