diff -r 98e7a0d3af21 -r e3d4dca7520b stage1_2/iec_bison.yy --- a/stage1_2/iec_bison.yy Wed Dec 10 12:06:45 2014 +0000 +++ b/stage1_2/iec_bison.yy Sun Dec 14 18:40:20 2014 +0000 @@ -2776,11 +2776,11 @@ signed_integer DOTDOT signed_integer {$$ = new subrange_c($1, $3, locloc(@$));} | any_identifier DOTDOT signed_integer - {$$ = new subrange_c($1, $3, locloc(@$));} + {$$ = new subrange_c(new symbolic_constant_c($1, locloc(@1)), $3, locloc(@$));} | signed_integer DOTDOT any_identifier - {$$ = new subrange_c($1, $3, locloc(@$));} + {$$ = new subrange_c($1, new symbolic_constant_c($3, locloc(@3)), locloc(@$));} | any_identifier DOTDOT any_identifier - {$$ = new subrange_c($1, $3, locloc(@$));} + {$$ = new subrange_c(new symbolic_constant_c($1, locloc(@1)), new symbolic_constant_c($3, locloc(@3)), locloc(@$));} /* ERROR_CHECK_BEGIN */ | signed_integer signed_integer {$$ = NULL; print_err_msg(locl(@1), locf(@2), "'..' missing between bounds in subrange definition."); yynerrs++;} @@ -4333,6 +4333,18 @@ ; + +/* Warning: When handling VAR_EXTERNAL declarations, the constant folding algorithm may (depending on the command line parameters) + * set the symbol_c->const_value annotations on both the external_var_name as well as on its VAR_EXTERNAL datatype specification symbol. + * Setting the const_value on the datatype specification symbol of a VAR_EXTERNAL declaration is only possible if the declaration of + * several external variables in a list is not allowed (as each variable could have a potentially distinct initial value). + * VAR_EXTERNAL + * a, b, c, d: INT; (* incorrect syntax! *) + * END_VAR + * + * If anybody considers extending this standard syntax to allow the above syntax (several variables in a list), then be sure to go + * and fix the constant folding algorithm (more precisely, the constant_folding_c::handle_var_extern_global_pair() function. + */ external_declaration: global_var_name ':' simple_specification {$$ = new external_declaration_c($1, $3, locloc(@$));