* ada-lang.c (ada_evaluate_subexp): Evaluate tagged types in
authorJoel Brobecker <brobecker@gnat.com>
Fri, 4 Jan 2008 19:01:30 +0000 (19:01 +0000)
committerJoel Brobecker <brobecker@gnat.com>
Fri, 4 Jan 2008 19:01:30 +0000 (19:01 +0000)
        EVAL_NORMAL mode when noside is EVAL_AVOID_SIDE_EFFECTS.

gdb/ChangeLog
gdb/ada-lang.c

index 6c6be45add22462ed5a1dbfe03e039bd78118732..82f6ae80d99a8e8b3add7abe26e76a0ea92be596 100644 (file)
@@ -1,3 +1,8 @@
+2008-01-04  Joel Brobecker  <brobecker@adacore.com>
+
+       * ada-lang.c (ada_evaluate_subexp): Evaluate tagged types in
+       EVAL_NORMAL mode when noside is EVAL_AVOID_SIDE_EFFECTS.
+
 2008-01-04  Joel Brobecker  <brobecker@adacore.com>
 
        * ada-exp.y (chop_separator): New function.
index 2c617057f17fcd3c65d5b453a59371b50c65f4f6..134244f1d31195bbbaafdf168fae03d3e7bb36c5 100644 (file)
@@ -8339,6 +8339,15 @@ ada_evaluate_subexp (struct type *expect_type, struct expression *exp,
 
     case OP_VAR_VALUE:
       *pos -= 1;
+
+      /* Tagged types are a little special in the fact that the real type
+         is dynamic and can only be determined by inspecting the object
+         value.  So even if we're support to do an EVAL_AVOID_SIDE_EFFECTS
+         evaluation, we force an EVAL_NORMAL evaluation for tagged types.  */
+      if (noside == EVAL_AVOID_SIDE_EFFECTS
+          && ada_is_tagged_type (SYMBOL_TYPE (exp->elts[pc + 2].symbol), 1))
+        noside = EVAL_NORMAL;
+
       if (noside == EVAL_SKIP)
         {
           *pos += 4;