Specially handle array contexts in Ada expression resolution
authorTom Tromey <tromey@adacore.com>
Mon, 25 Jan 2021 14:38:21 +0000 (07:38 -0700)
committerTom Tromey <tromey@adacore.com>
Mon, 25 Jan 2021 14:38:21 +0000 (07:38 -0700)
A user noticed that the Ada expression code in gdb did not
automatically disambiguate an enumerator in an array context.  That
is, an expression like "print array(enumerator)" is not ambiguous,
even if "enumerator" is declared in multiple enumerations, because the
correct one can be found by examining the array's index type.

This patch changes the Ada expression resolution code to handle this
case.

gdb/ChangeLog
2021-01-25  Tom Tromey  <tromey@adacore.com>

* ada-lang.c (resolve_subexp): Handle array context.

gdb/testsuite/ChangeLog
2021-01-25  Tom Tromey  <tromey@adacore.com>

* gdb.ada/local-enum.exp: Add enumerator resolution test.

gdb/ChangeLog
gdb/ada-lang.c
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.ada/local-enum.exp

index 9f9681fef84389d14f22e29b43225258725737ec..3a4844fc70c78f24ad1cb6e1e64e45837b8eb4ee 100644 (file)
@@ -1,3 +1,7 @@
+2021-01-25  Tom Tromey  <tromey@adacore.com>
+
+       * ada-lang.c (resolve_subexp): Handle array context.
+
 2021-01-23  Tom Tromey  <tom@tromey.com>
 
        PR compile/25575
index e2befe1d82e7e9ff25001d254700df58707c06ae..8d912402462460c0446046cad66bb9791fff173c 100644 (file)
@@ -3474,6 +3474,12 @@ resolve_subexp (expression_up *expp, int *pos, int deprocedure_p,
   struct value **argvec;        /* Vector of operand types (alloca'ed).  */
   int nargs;                    /* Number of operands.  */
   int oplen;
+  /* If we're resolving an expression like ARRAY(ARG...), then we set
+     this to the type of the array, so we can use the index types as
+     the expected types for resolution.  */
+  struct type *array_type = nullptr;
+  /* The arity of ARRAY_TYPE.  */
+  int array_arity = 0;
 
   argvec = NULL;
   nargs = 0;
@@ -3490,7 +3496,12 @@ resolve_subexp (expression_up *expp, int *pos, int deprocedure_p,
       else
        {
          *pos += 3;
-         resolve_subexp (expp, pos, 0, NULL, parse_completion, tracker);
+         struct value *lhs = resolve_subexp (expp, pos, 0, NULL,
+                                             parse_completion, tracker);
+         struct type *lhstype = ada_check_typedef (value_type (lhs));
+         array_arity = ada_array_arity (lhstype);
+         if (array_arity > 0)
+           array_type = lhstype;
        }
       nargs = longest_to_int (exp->elts[pc + 1].longconst);
       break;
@@ -3627,8 +3638,13 @@ resolve_subexp (expression_up *expp, int *pos, int deprocedure_p,
 
   argvec = XALLOCAVEC (struct value *, nargs + 1);
   for (i = 0; i < nargs; i += 1)
-    argvec[i] = resolve_subexp (expp, pos, 1, NULL, parse_completion,
-                               tracker);
+    {
+      struct type *subtype = nullptr;
+      if (i < array_arity)
+       subtype = ada_index_type (array_type, i + 1, "array type");
+      argvec[i] = resolve_subexp (expp, pos, 1, subtype, parse_completion,
+                                 tracker);
+    }
   argvec[i] = NULL;
   exp = expp->get ();
 
index 5789500167c74dce571262bb4edb631ab7eaf039..7fa1074598e37a1c7a7fdc2b95e584056beabe02 100644 (file)
@@ -1,3 +1,7 @@
+2021-01-25  Tom Tromey  <tromey@adacore.com>
+
+       * gdb.ada/local-enum.exp: Add enumerator resolution test.
+
 2021-01-25  Tom Tromey  <tromey@adacore.com>
 
        * gdb.ada/local-enum.exp: New file.
index 32daf9a0d96d1c5ac5657a227a92e697694a5d48..fc49bca13086327bda927e7550c56db2c9c106d4 100644 (file)
@@ -81,3 +81,8 @@ proc print_three {which_enum value} {
 
 print_three e2 0
 print_three e1 2
+
+# These will not result in a menu, as expression resolution should
+# disambiguate the meaning of 'three'.
+gdb_test "print v1(three)" " = 2" "print v1 element"
+gdb_test "print v2(three)" " = 3" "print v2 element"