Small fix to PLACEHOLDER_EXPR handling in loc_list_from_tree_1
authorEric Botcazou <ebotcazou@adacore.com>
Thu, 10 Dec 2020 14:35:28 +0000 (15:35 +0100)
committerEric Botcazou <ebotcazou@adacore.com>
Thu, 10 Dec 2020 14:45:16 +0000 (15:45 +0100)
This handles the discriminated record types of Ada: the PLACEHOLDER_EXPR is
the "template" expression for the discriminant in the type definition. Now
for some components, typically arrays whose upper bound is the discriminant,
the compiler creates a local subtype for the component, so the code needs to
be able to deal with this nested type.

gcc/ChangeLog:
* dwarf2out.c (loc_list_from_tree_1) <PLACEHOLDER_EXPR>: Deal with
a nested context type

gcc/dwarf2out.c

index 7b340baf42236a8dfb0278f5faa6167ca8992440..0baa056447c2678371c8555723bab16415d3fef8 100644 (file)
@@ -18245,10 +18245,11 @@ loc_list_from_tree_1 (tree loc, int want_address,
     case PLACEHOLDER_EXPR:
       /* This case involves extracting fields from an object to determine the
         position of other fields. It is supposed to appear only as the first
-         operand of COMPONENT_REF nodes and to reference precisely the type
-         that the context allows.  */
+        operand of COMPONENT_REF nodes and to reference precisely the type
+        that the context allows or its enclosing type.  */
       if (context != NULL
-          && TREE_TYPE (loc) == context->context_type
+         && (TREE_TYPE (loc) == context->context_type
+             || TREE_TYPE (loc) == TYPE_CONTEXT (context->context_type))
          && want_address >= 1)
        {
          if (dwarf_version >= 3 || !dwarf_strict)