* eval.c (language.h): Include.

* eval.c (evaluate_subexp_with_coercion):  Only coerce arrays
	to pointer types when the current language is C.  It loses for
	other languages when the lower index bound is nonzero.
	* valarith.c (value_subscript):  Take array lower bounds into
	account when performing subscripting operations.
	* valops.c (value_coerce_array):  Add comment describing why
	arrays with nonzero lower bounds are dealt with in value_subscript,
	rather than in value_coerce_array.
This commit is contained in:
Fred Fish 1993-01-03 22:24:21 +00:00
parent 191395156c
commit fb6e675f95
3 changed files with 51 additions and 10 deletions

View File

@ -1,3 +1,15 @@
Sun Jan 3 14:16:10 1993 Fred Fish (fnf@cygnus.com)
* eval.c (language.h): Include.
* eval.c (evaluate_subexp_with_coercion): Only coerce arrays
to pointer types when the current language is C. It loses for
other languages when the lower index bound is nonzero.
* valarith.c (value_subscript): Take array lower bounds into
account when performing subscripting operations.
* valops.c (value_coerce_array): Add comment describing why
arrays with nonzero lower bounds are dealt with in value_subscript,
rather than in value_coerce_array.
Sat Jan 2 12:16:41 1993 Fred Fish (fnf@cygnus.com)
**** start-sanitize-chill ****

View File

@ -24,6 +24,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
#include "expression.h"
#include "target.h"
#include "frame.h"
#include "language.h" /* For CAST_IS_CONVERSION */
/* Values of NOSIDE argument to eval_subexp. */
enum noside
@ -1041,9 +1042,16 @@ evaluate_subexp_for_address (exp, pos, noside)
}
/* Evaluate like `evaluate_subexp' except coercing arrays to pointers.
When used in contexts where arrays will be coerced anyway,
this is equivalent to `evaluate_subexp'
but much faster because it avoids actually fetching array contents. */
When used in contexts where arrays will be coerced anyway, this is
equivalent to `evaluate_subexp' but much faster because it avoids
actually fetching array contents.
Note that we currently only do the coercion for C expressions, where
arrays are zero based and the coercion is correct. For other languages,
with nonzero based arrays, coercion loses. Use CAST_IS_CONVERSION
to decide if coercion is appropriate.
*/
static value
evaluate_subexp_with_coercion (exp, pos, noside)
@ -1063,7 +1071,8 @@ evaluate_subexp_with_coercion (exp, pos, noside)
{
case OP_VAR_VALUE:
var = exp->elts[pc + 1].symbol;
if (TYPE_CODE (SYMBOL_TYPE (var)) == TYPE_CODE_ARRAY)
if (TYPE_CODE (SYMBOL_TYPE (var)) == TYPE_CODE_ARRAY
&& CAST_IS_CONVERSION)
{
(*pos) += 3;
val = locate_var_value (var, (FRAME) 0);

View File

@ -104,17 +104,35 @@ an integer nor a pointer of the same type.");
return value_binop (arg1, arg2, BINOP_SUB);
}
/* Return the value of ARRAY[IDX]. */
/* Return the value of ARRAY[IDX].
See comments in value_coerce_array() for rationale for reason for
doing lower bounds adjustment here rather than there.
FIXME: Perhaps we should validate that the index is valid and if
verbosity is set, warn about invalid indices (but still use them). */
value
value_subscript (array, idx)
value array, idx;
{
if (TYPE_CODE (VALUE_TYPE (array)) == TYPE_CODE_ARRAY
&& VALUE_LVAL (array) != lval_memory)
return value_subscripted_rvalue (array, idx);
else
return value_ind (value_add (array, idx));
int lowerbound;
value bound;
struct type *range_type;
if (TYPE_CODE (VALUE_TYPE (array)) == TYPE_CODE_ARRAY)
{
range_type = TYPE_FIELD_TYPE (VALUE_TYPE (array), 0);
lowerbound = TYPE_FIELD_BITPOS (range_type, 0);
if (lowerbound != 0)
{
bound = value_from_longest (builtin_type_int, (LONGEST) lowerbound);
idx = value_sub (idx, bound);
}
if (VALUE_LVAL (array) != lval_memory)
{
return value_subscripted_rvalue (array, idx);
}
}
return value_ind (value_add (array, idx));
}
/* Return the value of EXPR[IDX], expr an aggregate rvalue
@ -423,7 +441,9 @@ value_binop (arg1, arg2, op)
error ("Invalid operation on booleans.");
}
/* start-sanitize-chill (FIXME!) */
val = allocate_value (builtin_type_chill_bool);
/* end-sanitize-chill */
SWAP_TARGET_AND_HOST (&v, sizeof (v));
*(LONGEST *) VALUE_CONTENTS_RAW (val) = v;
}