It's also legal even without using arrays, *but* only if the types match—otherwise there's an error. We could probably add some extra tests for that.
Okay. After making some tests, I concluded that some types are exchangeable and others not (uint <=> bool <=> int) and (half <=> float). I also realized that row vectors from row_major matrices aren't considered as equivalent to regular vectors, but since that case is really specific, I think we should be permissive. I left the associated tests as a `todo`.
Also a test that the variables don't really alias each other might be warranted. (I.e. assigning to one only affects that one.)
I added a test to check that arguments with the same semantic are not aliased. They have to be input arguments because duplicated output arguments are not allowed.