diff options
-rw-r--r-- | gdb/ChangeLog | 7 | ||||
-rw-r--r-- | gdb/ada-lang.c | 18 |
2 files changed, 23 insertions, 2 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 23bc214..4ca5ea8 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,12 @@ 2014-08-18 Joel Brobecker <brobecker@adacore.com> + * ada-lang.c (ada_evaluate_subexp) <OP_VAR_VALUE>: + When noside is EVAL_AVOID_SIDE_EFFECTS, only return a statically + fixed value for records and unions for which some GNAT encodings + are present. + +2014-08-18 Joel Brobecker <brobecker@adacore.com> + * ada-lang.c (ada_evaluate_subexp) <OP_VAR_VALUE>: Slight code rewrite to avoid "else if" and "else" constructs. Should be a no-op in practice. diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c index a9b5e6f..c4e85d2 100644 --- a/gdb/ada-lang.c +++ b/gdb/ada-lang.c @@ -10185,8 +10185,22 @@ ada_evaluate_subexp (struct type *expect_type, struct expression *exp, } } - *pos += 4; - return value_zero (to_static_fixed_type (type), not_lval); + /* Records and unions for which GNAT encodings have been + generated need to be statically fixed as well. + Otherwise, non-static fixing produces a type where + all dynamic properties are removed, which prevents "ptype" + from being able to completely describe the type. + For instance, a case statement in a variant record would be + replaced by the relevant components based on the actual + value of the discriminants. */ + if ((TYPE_CODE (type) == TYPE_CODE_STRUCT + && dynamic_template_type (type) != NULL) + || (TYPE_CODE (type) == TYPE_CODE_UNION + && ada_find_parallel_type (type, "___XVU") != NULL)) + { + *pos += 4; + return value_zero (to_static_fixed_type (type), not_lval); + } } arg1 = evaluate_subexp_standard (expect_type, exp, pos, noside); |