It's called process substitution and is a feature of bash, zsh and ksh (and possibly others, I don't know). It isn't POSIX and you shouldn't use it in portable code, but it's very useful.
Here's the relevant section of the bash manual:
3.5.6 Process Substitution
Process substitution is supported on systems that support named pipes
(FIFOs) or the /dev/fd method of naming open files. It takes the form
of
<(list)
or
>(list)
The process list is run with its input or output connected to a FIFO or some file in /dev/fd. The name of this file is passed as an
argument to the current command as the result of the expansion.
If the >(list) form is used, writing to the file will provide input for list. If the <(list) form is used, the file passed as an argument should be
read to obtain the output of list. Note that no space may appear
between the < or > and the left parenthesis, otherwise the construct
would be interpreted as a redirection.
When available, process substitution is performed simultaneously with
parameter and variable expansion, command substitution, and arithmetic
expansion.
git diff --no-index file1 <(cat file2)
will fail with:error: /dev/fd/63: unsupported file type
. You might also seeerror: readlink("/dev/fd/63"): No such file or directory
if the implementation creates a symlink to the pipe (appears as a broken link for me for some reason).