On 10/19/21 11:21, Jakub Jelinek wrote:
On Tue, Oct 19, 2021 at 10:48:04AM -0400, Jason Merrill wrote:
What if we use NULL_TREE for the error case instead of error_mark_node, i.e.

-  DECL_LOCAL_DECL_ALIAS (decl) = alias;
+  if (alias != error_mark_node)
+    DECL_LOCAL_DECL_ALIAS (decl) = alias;

?  That ought to avoid the need to change other functions, since they
already check for null.

True, but I'm worried about e.g. maybe_version_functions which does
   if (DECL_LOCAL_DECL_P (olddecl))
     {
       olddecl = DECL_LOCAL_DECL_ALIAS (olddecl);
       maybe_mark_function_versioned (olddecl);
     }
(I think the above will crash of DECL_LOCAL_DECL_ALIAS is NULL) and
   if (DECL_LOCAL_DECL_P (newdecl))
     {
       /* Unfortunately, we can get here before pushdecl naturally calls
          push_local_extern_decl_alias, so we need to call it directly.  */
       if (!DECL_LOCAL_DECL_ALIAS (newdecl))
         push_local_extern_decl_alias (newdecl);
       newdecl = DECL_LOCAL_DECL_ALIAS (newdecl);
       maybe_mark_function_versioned (newdecl);
     }
which means that if there is an error from push_local_extern_decl_alias,
we'd report it twice rather than once (once from here, another time
from do_pushdecl).
I'm afraid maybe_version_functions needs fixing no matter what,
but the NULL vs. error_mark_node decision is probably dependent on whether
it is ok to error twice or not.

Ah, true.  Your earlier patch is OK.

Jason

Reply via email to