* 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:
parent
191395156c
commit
fb6e675f95
3 changed files with 51 additions and 10 deletions
17
gdb/eval.c
17
gdb/eval.c
|
@ -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);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue