I built out quite a bit of the code for argument shadowing years ago. My recollection is that I just didn’t allow this because there was no use-case at the time, so it was better to start conservatively. I am +1 for adding it, it keeps the stack more orthogonal.
It is indeed a bug, but in a different place. The parser of gpu.launch_func should not be using parseArgument, at least not in its current implementation. It was intended for defining entry block arguments, such as arguments of a function, and therefore doesn’t allow for result numbers, correctly. Otherwise we would be able to write func.func @foo(%arg0#0: i32). The correct fix is to change the parser of gpu.launch_func.