One of my hot takes these days is that, if I made my own language, I don't think I would allow identifiers to be shadowed. In C in particular, it seems to enable some very strange semantics.
C is wild. Both GCC and Clang will tell you that you can't assign to 'struct s *' with a value of type 'struct s *'. What the messages don't convey is that the tag 's' refers to a different struct type based on the scopes of 'p' and 'v'. 1/