return candidates[i];
}
+/* Resolve a mention of a name where the context type is an
+ enumeration type. */
+
+static int
+ada_resolve_enum (std::vector<struct block_symbol> &syms,
+ const char *name, struct type *context_type,
+ bool parse_completion)
+{
+ gdb_assert (context_type->code () == TYPE_CODE_ENUM);
+ context_type = ada_check_typedef (context_type);
+
+ for (int i = 0; i < syms.size (); ++i)
+ {
+ /* We already know the name matches, so we're just looking for
+ an element of the correct enum type. */
+ if (ada_check_typedef (SYMBOL_TYPE (syms[i].symbol)) == context_type)
+ return i;
+ }
+
+ error (_("No name '%s' in enumeration type '%s'"), name,
+ ada_type_name (context_type));
+}
+
/* See ada-lang.h. */
block_symbol
error (_("No definition found for %s"), sym->print_name ());
else if (candidates.size () == 1)
i = 0;
+ else if (context_type != nullptr
+ && context_type->code () == TYPE_CODE_ENUM)
+ i = ada_resolve_enum (candidates, sym->linkage_name (), context_type,
+ parse_completion);
else if (deprocedure_p && !is_nonfunction (candidates))
{
i = ada_resolve_function
{
ada_add_block_symbols (result, block, lookup_name, domain, NULL);
- /* If we found a non-function match, assume that's the one. */
- if (is_nonfunction (result))
+ /* If we found a non-function match, assume that's the one. We
+ only check this when finding a function boundary, so that we
+ can accumulate all results from intervening blocks first. */
+ if (BLOCK_FUNCTION (block) != nullptr && is_nonfunction (result))
return;
block = BLOCK_SUPERBLOCK (block);
--- /dev/null
+# Copyright 2021 Free Software Foundation, Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+load_lib "ada.exp"
+
+if { [skip_ada_tests] } { return -1 }
+
+standard_ada_testfile qual
+
+if {[gdb_compile_ada "${srcfile}" "${binfile}" executable debug] != ""} {
+ return -1
+}
+
+clean_restart ${testfile}
+
+set bp_location [gdb_get_line_number "STOP" ${testdir}/qual.adb]
+runto "qual.adb:$bp_location"
+
+gdb_test "print kind'(no_element)" " = no_element" \
+ "print qualified no_element"
--- /dev/null
+-- Copyright 2021 Free Software Foundation, Inc.
+--
+-- This program is free software; you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation; either version 3 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+generic
+ type Component_T is private;
+package Gener is
+
+ No_Element : Component_T;
+
+end Gener;
--- /dev/null
+-- Copyright 2021 Free Software Foundation, Inc.
+--
+-- This program is free software; you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation; either version 3 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+with Gener;
+
+procedure Qual is
+
+ package P is new Gener (Integer);
+
+ type Kind is (Present, No_Element);
+ K : Kind := No_Element;
+
+begin
+ null; -- STOP
+end Qual;