Subject: RE: [External] : Re: bug#51577: 27.2; Regression: reproducible hang with face functions

From: Drew Adams <[email-masked]>
Date: Thu, 4 Nov 2021 19:21:27 +0000

> As for detecting loops: it could be tricky.  It is easy enough to
> detect simple loops such as the one in this case, where a face
> inherits directly from itself, and the value of the :inherit attribute
> is the symbol of a face.  But inheritance loops could be less simple:
> a face could inherit from itself indirectly, and the value of the
> attribute could be a list, not a named face.  Detecting loops in those
> cases would require recording face specs/names we already saw in some
> list, and each time we get an :inherit attribute, check if its value
> is already in the list.  Is that worth our while, if the result will
> be a silent error message in *Messages*?

Yes, nested inherits are more complicated.

Whether some attempt is made in that regard
could maybe be a wishlist request.

Let's not let ideal become the enemy of good,
here.

I'd be happy just removing the regression, i.e.,
returning to the behavior prior to Emacs 27
(in this regard - I don't mean just reverting
code; how to remove the regression is up to you).

IOW, allow a face `foo' to have (and ignore) an
`:inherit foo' in its face spec.

Clearly, somehow Emacs 26 tolerated such simple
self-inheritance (as a no-op).  Whether it did
so in the right way or not, in terms of design
or implementation, I don't know.