]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Fix internal error on library-level type extended locally
authorEric Botcazou <ebotcazou@adacore.com>
Mon, 7 Dec 2020 09:48:06 +0000 (10:48 +0100)
committerEric Botcazou <ebotcazou@adacore.com>
Tue, 8 Dec 2020 08:21:59 +0000 (09:21 +0100)
The compiler aborts on the local extension of a tagged type declared
at library level, with a progenitor given by an interface type having
a primitive that is a homograph of a primitive of the tagged type.

gcc/ada/ChangeLog:
* gcc-interface/trans.c (maybe_make_gnu_thunk): Return false if the
target is local and thunk and target do not have the same context.

gcc/ada/gcc-interface/trans.c

index 6f316e0ec1157849876bbc61316923d3aa7cb494..934db8894f2409723a218a1c47a2d3df15feddc8 100644 (file)
@@ -11306,8 +11306,11 @@ maybe_make_gnu_thunk (Entity_Id gnat_thunk, tree gnu_thunk)
 
   tree gnu_target = gnat_to_gnu_entity (gnat_target, NULL_TREE, false);
 
-  /* Thunk and target must have the same nesting level, if any.  */
-  gcc_assert (DECL_CONTEXT (gnu_thunk) == DECL_CONTEXT (gnu_target));
+  /* If the target is local, then thunk and target must have the same context
+     because cgraph_node::expand_thunk can only forward the static chain.  */
+  if (DECL_STATIC_CHAIN (gnu_target)
+      && DECL_CONTEXT (gnu_thunk) != DECL_CONTEXT (gnu_target))
+    return false;
 
   /* If the target returns by invisible reference and is external, apply the
      same transformation as Subprogram_Body_to_gnu here.  */