%type <sym> declaration_list identifier_list
%type <sym> declarator2_function_attributes while do for critical
%type <lnk> pointer type_specifier_list type_specifier type_name
-%type <lnk> storage_class_specifier struct_or_union_specifier
+%type <lnk> storage_class_specifier struct_or_union_specifier function_specifier
%type <lnk> declaration_specifiers sfr_reg_bit sfr_attributes type_specifier2
%type <lnk> function_attribute function_attributes enum_specifier
%type <lnk> abstract_declarator abstract_declarator2 unqualified_pointer
function_attributes
: USING constant_expr {
$$ = newLink(SPECIFIER) ;
- FUNC_REGBANK($$) = (int) floatFromVal(constExprValue($2,TRUE));
+ FUNC_REGBANK($$) = (int) ulFromVal(constExprValue($2,TRUE));
}
| REENTRANT { $$ = newLink (SPECIFIER);
FUNC_ISREENT($$)=1;
else
$$ = mergeSpec($1,$2, "type_specifier declaration_specifiers");
}
+ | function_specifier { $$ = $1; }
+ | function_specifier declaration_specifiers {
+ /* if the decl $2 is not a specifier */
+ /* find the spec and replace it */
+ if ( !IS_SPEC($2)) {
+ sym_link *lnk = $2 ;
+ while (lnk && !IS_SPEC(lnk->next))
+ lnk = lnk->next;
+ lnk->next = mergeSpec($1,lnk->next, "function_specifier declaration_specifiers - skipped");
+ $$ = $2 ;
+ }
+ else
+ $$ = mergeSpec($1,$2, "function_specifier declaration_specifiers");
+ }
;
init_declarator_list
}
;
+function_specifier
+ : INLINE {
+ $$ = newLink (SPECIFIER) ;
+ SPEC_INLINE($$) = 1 ;
+ }
+ ;
+
Interrupt_storage
: INTERRUPT { $$ = INTNO_UNSPEC ; }
| INTERRUPT constant_expr
- { int intno = (int) floatFromVal(constExprValue($2,TRUE));
+ { int intno = (int) ulFromVal(constExprValue($2,TRUE));
if ((intno >= 0) && (intno <= INTNO_MAX))
$$ = intno;
else
/* add this to the storage class specifier */
SPEC_ABSA($1) = 1; /* set the absolute addr flag */
/* now get the abs addr from value */
- SPEC_ADDR($1) = (unsigned) floatFromVal(constExprValue($3,TRUE)) ;
+ SPEC_ADDR($1) = (unsigned int) ulFromVal(constExprValue($3,TRUE)) ;
}
;
$$=newLink(SPECIFIER);
SPEC_VOLATILE($$) = 1 ;
}
+ | RESTRICT {
+ $$=newLink(SPECIFIER);
+ SPEC_RESTRICT($$) = 1 ;
+ }
| FLOAT {
$$=newLink(SPECIFIER);
SPEC_NOUN($$) = V_FLOAT;
| ':' constant_expr {
unsigned int bitsize;
$$ = newSymbol (genSymName(NestLevel),NestLevel) ;
- bitsize= (unsigned int) floatFromVal(constExprValue($2,TRUE));
+ bitsize = (unsigned int) ulFromVal(constExprValue($2,TRUE));
if (bitsize > (port->s.int_size * 8)) {
bitsize = port->s.int_size * 8;
werror(E_BITFLD_SIZE, bitsize);
| declarator ':' constant_expr
{
unsigned int bitsize;
- bitsize= (unsigned int) floatFromVal(constExprValue($3,TRUE));
+ bitsize = (unsigned int) ulFromVal(constExprValue($3,TRUE));
if (bitsize > (port->s.int_size * 8)) {
bitsize = port->s.int_size * 8;
werror(E_BITFLD_SIZE, bitsize);
{
werror(E_ENUM_NON_INTEGER);
SNPRINTF(lbuff, sizeof(lbuff),
- "%d",(int) floatFromVal(val));
+ "%d", (int) ulFromVal(val));
val = constVal(lbuff);
}
$$ = cenum = val ;
| {
if (cenum) {
SNPRINTF(lbuff, sizeof(lbuff),
- "%d",(int) floatFromVal(cenum)+1);
+ "%d", (int) ulFromVal(cenum)+1);
$$ = cenum = constVal(lbuff);
}
else {
- $$ = cenum = constVal("0");
+ $$ = cenum = constCharVal(0);
}
}
;
}
| declarator3 '[' constant_expr ']'
{
- sym_link *p ;
- value *tval;
+ sym_link *p;
+ value *tval;
+ int size;
- tval = constExprValue($3,TRUE);
+ tval = constExprValue($3, TRUE);
/* if it is not a constant then Error */
p = newLink (DECLARATOR);
- DCL_TYPE(p) = ARRAY ;
- if ( !tval || (SPEC_SCLS(tval->etype) != S_LITERAL)) {
- werror(E_CONST_EXPECTED) ;
- /* Assume a single item array to limit the cascade */
- /* of additional errors. */
- DCL_ELEM(p) = 1;
- }
- else {
- DCL_ELEM(p) = (int) floatFromVal(tval) ;
- }
- addDecl($1,0,p);
+ DCL_TYPE(p) = ARRAY;
+
+ if (!tval || (SPEC_SCLS(tval->etype) != S_LITERAL))
+ {
+ werror(E_CONST_EXPECTED);
+ /* Assume a single item array to limit the cascade */
+ /* of additional errors. */
+ size = 1;
+ }
+ else
+ {
+ if ((size = (int) ulFromVal(tval)) < 0)
+ {
+ werror(E_NEGATIVE_ARRAY_SIZE, $1->name);
+ size = 1;
+ }
+ }
+ DCL_ELEM(p) = size;
+ addDecl($1, 0, p);
}
;
DCL_TSPEC($1) = $2;
DCL_PTR_CONST($1) = SPEC_CONST($2);
DCL_PTR_VOLATILE($1) = SPEC_VOLATILE($2);
+ DCL_PTR_RESTRICT($1) = SPEC_RESTRICT($2);
}
else
werror (W_PTR_TYPE_INVALID);
if (IS_SPEC($2) && DCL_TYPE($3) == UPOINTER) {
DCL_PTR_CONST($1) = SPEC_CONST($2);
DCL_PTR_VOLATILE($1) = SPEC_VOLATILE($2);
+ DCL_PTR_RESTRICT($1) = SPEC_RESTRICT($2);
switch (SPEC_SCLS($2)) {
case S_XDATA:
DCL_TYPE($3) = FPOINTER;
value *val ;
$$ = newLink (DECLARATOR);
DCL_TYPE($$) = ARRAY ;
- DCL_ELEM($$) = (int) floatFromVal(val = constExprValue($2,TRUE));
+ DCL_ELEM($$) = (int) ulFromVal(val = constExprValue($2,TRUE));
}
| abstract_declarator2 '[' ']' {
$$ = newLink (DECLARATOR);
value *val ;
$$ = newLink (DECLARATOR);
DCL_TYPE($$) = ARRAY ;
- DCL_ELEM($$) = (int) floatFromVal(val = constExprValue($3,TRUE));
+ DCL_ELEM($$) = (int) ulFromVal(val = constExprValue($3,TRUE));
$$->next = $1 ;
}
| '(' ')' { $$ = NULL;}
: IDENTIFIER { $$ = newSymbol ($1,NestLevel) ; }
;
%%
-