[PATCH 2/6] treewide: remove using list iterator after loop body as a ptr
segher at kernel.crashing.org
Tue Mar 1 07:53:07 AEDT 2022
On Mon, Feb 28, 2022 at 12:14:44PM -0800, Linus Torvalds wrote:
> On Mon, Feb 28, 2022 at 12:10 PM Linus Torvalds
> <torvalds at linux-foundation.org> wrote:
> > We can do
> > typeof(pos) pos
> > in the 'for ()' loop, and never use __iter at all.
> > That means that inside the for-loop, we use a _different_ 'pos' than outside.
> The thing that makes me throw up in my mouth a bit is that in that
> typeof(pos) pos
> the first 'pos' (that we use for just the typeof) is that outer-level
> 'pos', IOW it's a *different* 'pos' than the second 'pos' in that same
> declaration that declares the inner level shadowing new 'pos'
The new "pos" has not yet been declared, so this has to refer to the
outer "pos", it cannot be the inner one. Because it hasn't been
declared yet :-)
Compare this to
typeof (pos) pos = pos;
where that last "pos" *does* refer to the newly declared one: that
declaration has already been done! (So this code is UB btw, 22.214.171.124/2).
> If I was a compiler person, I would say "Linus, that thing is too ugly
> to live", and I would hate it. I'm just hoping that even compiler
> people say "that's *so* ugly it's almost beautiful".
It is perfectly well-defined. Well, it would be good if we (GCC) would
document it does work, and if someone tested it on LLVM as well. But it
is really hard to implement it to *not* work :-)
> Because it does seem to work. It's not pretty, but hey, it's not like
> our headers are really ever be winning any beauty contests...
It is very pretty! Needs a comment though :-)
More information about the Linux-aspeed