aboutsummaryrefslogtreecommitdiff
path: root/gdb
diff options
context:
space:
mode:
authorJoel Brobecker <brobecker@gnat.com>2010-02-09 13:15:10 +0000
committerJoel Brobecker <brobecker@gnat.com>2010-02-09 13:15:10 +0000
commit31dbc1c5396158c36dc3619c0711f179a9458239 (patch)
treef89121969d39607422939f526f985e1b36b6c8ce /gdb
parent7865406bd6c32e692420042b07ecd9cadada540d (diff)
downloadgdb-31dbc1c5396158c36dc3619c0711f179a9458239.zip
gdb-31dbc1c5396158c36dc3619c0711f179a9458239.tar.gz
gdb-31dbc1c5396158c36dc3619c0711f179a9458239.tar.bz2
Wrong type description for tagged type parameter.
* ada-lang.c (ada_evaluate_subexp) [OP_VAR_VALUE]: When noside is EVAL_AVOID_SIDE_EFFECTS, also handle the case when type is a reference to a tagged type.
Diffstat (limited to 'gdb')
-rw-r--r--gdb/ChangeLog7
-rw-r--r--gdb/ada-lang.c9
2 files changed, 15 insertions, 1 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index ceb22c0..cbaeb4b 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,10 @@
+2010-02-09 Joel Brobecker <brobecker@adacore.com>
+
+ Wrong type description for tagged type parameter.
+ * ada-lang.c (ada_evaluate_subexp) [OP_VAR_VALUE]: When noside is
+ EVAL_AVOID_SIDE_EFFECTS, also handle the case when type is a
+ reference to a tagged type.
+
2010-02-09 Tristan Gingold <gingold@adacore.com>
* objfiles.c (objfile_separate_debug_iterate): Do not iterate on
diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c
index 40b70ab..7a2d2ca 100644
--- a/gdb/ada-lang.c
+++ b/gdb/ada-lang.c
@@ -8906,7 +8906,14 @@ ada_evaluate_subexp (struct type *expect_type, struct expression *exp,
else if (noside == EVAL_AVOID_SIDE_EFFECTS)
{
type = static_unwrap_type (SYMBOL_TYPE (exp->elts[pc + 2].symbol));
- if (ada_is_tagged_type (type, 0))
+ /* Check to see if this is a tagged type. We also need to handle
+ the case where the type is a reference to a tagged type, but
+ we have to be careful to exclude pointers to tagged types.
+ The latter should be shown as usual (as a pointer), whereas
+ a reference should mostly be transparent to the user. */
+ if (ada_is_tagged_type (type, 0)
+ || (TYPE_CODE(type) == TYPE_CODE_REF
+ && ada_is_tagged_type (TYPE_TARGET_TYPE (type), 0)))
{
/* Tagged types are a little special in the fact that the real
type is dynamic and can only be determined by inspecting the