else
$$ = mergeSpec($1,$2, "type_specifier declaration_specifiers");
}
- | function_specifier { $$ = $1; }
+ | 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 = lnk->next;
lnk->next = mergeSpec($1,lnk->next, "function_specifier declaration_specifiers - skipped");
$$ = $2 ;
}
}
| 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)floatFromVal(tval)) < 0)
+ {
+ werror(E_NEGATIVE_ARRAY_SIZE, $1->name);
+ size = 1;
+ }
+ }
+ DCL_ELEM(p) = size;
+ addDecl($1, 0, p);
}
;
}
| unqualified_pointer type_specifier_list pointer
{
- $$ = $1 ;
- 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;
- break;
- case S_IDATA:
- DCL_TYPE($3) = IPOINTER ;
- break;
- case S_PDATA:
- DCL_TYPE($3) = PPOINTER ;
- break;
- case S_DATA:
- DCL_TYPE($3) = POINTER ;
- break;
- case S_CODE:
- DCL_TYPE($3) = CPOINTER ;
- break;
- case S_EEPROM:
- DCL_TYPE($3) = EEPPOINTER;
- break;
- default:
- // this could be just "constant"
- // werror(W_PTR_TYPE_INVALID);
- ;
- }
- }
- else
- werror (W_PTR_TYPE_INVALID);
- $$->next = $3 ;
- }
+ $$ = $1 ;
+ 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;
+ break;
+ case S_IDATA:
+ DCL_TYPE($3) = IPOINTER ;
+ break;
+ case S_PDATA:
+ DCL_TYPE($3) = PPOINTER ;
+ break;
+ case S_DATA:
+ DCL_TYPE($3) = POINTER ;
+ break;
+ case S_CODE:
+ DCL_TYPE($3) = CPOINTER ;
+ break;
+ case S_EEPROM:
+ DCL_TYPE($3) = EEPPOINTER;
+ break;
+ default:
+ // this could be just "constant"
+ // werror(W_PTR_TYPE_INVALID);
+ ;
+ }
+ }
+ else
+ werror (W_PTR_TYPE_INVALID);
+ $$->next = $3 ;
+ }
;
unqualified_pointer
: IDENTIFIER { $$ = newSymbol ($1,NestLevel) ; }
;
%%
-
#include "SDCCerr.h"
-#define USE_STDOUT_FOR_ERRORS 0
+#define USE_STDOUT_FOR_ERRORS 0
#if USE_STDOUT_FOR_ERRORS
-#define DEFAULT_ERROR_OUT stdout
+#define DEFAULT_ERROR_OUT stdout
#else
-#define DEFAULT_ERROR_OUT stderr
+#define DEFAULT_ERROR_OUT stderr
#endif
struct SDCCERRG _SDCCERRG;
* entry in the array. It is only included in order to make
* human error lookup easier.
*/
-struct
+struct
{
- int errIndex;
- ERROR_LOG_LEVEL errType;
- const char *errText;
+ int errIndex;
+ ERROR_LOG_LEVEL errType;
+ const char *errText;
} ErrTab [] =
{
{ E_DUPLICATE, ERROR_LEVEL_ERROR,
{ E_INT_ARGS, ERROR_LEVEL_ERROR,
"interrupt routine cannot have arguments, arguments ingored" },
{ E_INCLUDE_MISSING, ERROR_LEVEL_ERROR,
- "critical compiler #include file missing. " },
+ "critical compiler #include file missing. " },
{ E_NO_MAIN, ERROR_LEVEL_ERROR,
"function 'main' undefined" },
{ E_EXTERN_INIT, ERROR_LEVEL_ERROR,
- "'extern' variable '%s' cannot be initialised " },
+ "'extern' variable '%s' cannot be initialised " },
{ E_PRE_PROC_FAILED, ERROR_LEVEL_ERROR,
"Pre-Processor %s" },
{ E_DUP_FAILED, ERROR_LEVEL_ERROR,
{ W_SYMBOL_NAME_TOO_LONG, ERROR_LEVEL_WARNING,
"symbol name too long, truncated to %d chars" },
{ W_CAST_STRUCT_PTR,ERROR_LEVEL_WARNING,
- "cast of struct %s * to struct %s * " },
+ "cast of struct %s * to struct %s * " },
{ W_LIT_OVERFLOW, ERROR_LEVEL_WARNING,
"overflow in implicit constant conversion" },
{ E_PARAM_NAME_OMITTED, ERROR_LEVEL_ERROR,
{ E_BAD_INLINE, ERROR_LEVEL_ERROR,
"Only functions may be qualified with 'inline'" },
{ E_BAD_INT_ARGUMENT, ERROR_LEVEL_ERROR,
- "Bad integer argument for option %s." },
+ "Bad integer argument for option %s" },
+{ E_NEGATIVE_ARRAY_SIZE, ERROR_LEVEL_ERROR,
+ "Size of array '%s' is negative" },
};
/*
switch(ErrTab[errNum].errType)
{
case ERROR_LEVEL_ERROR:
- fprintf(_SDCCERRG.out, "error %d: ", errNum);
- break;
+ fprintf(_SDCCERRG.out, "error %d: ", errNum);
+ break;
case ERROR_LEVEL_WARNING:
case ERROR_LEVEL_PEDANTIC:
fprintf(_SDCCERRG.out, "warning %d: ", errNum);
- break;
+ break;
case ERROR_LEVEL_INFO:
- fprintf(_SDCCERRG.out, "info %d: ", errNum);
- break;
- default:
- break;
+ fprintf(_SDCCERRG.out, "info %d: ", errNum);
+ break;
+ default:
+ break;
}
vfprintf(_SDCCERRG.out, ErrTab[errNum].errText,marker);