aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gdb/ChangeLog7
-rw-r--r--gdb/ada-lang.c18
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);