In the "ON CONFLICT Clause" section of the official INSERT documentation ( https://www.postgresql.org/docs/10/static/sql-insert.html#sql-on-conflict ) you can read: "index_column_name The name of a table_name column." This seems misleading to me as multiple columns may be named there. The second sentence of this section's second paragraph is clear ("When performing inference, it consists of one or more index_column_name") but a reader jumping to the detail may miss this information.
Suggestion: s/The name of a table_name column/The name of at least one column/
But index_column_name *is*the name of only a single column. The syntax is (irrelevant parts omitted):
( index_column_name [, ...] )
which means "opening parenthesis, index_column_name followed by zero or more index_column_name, and a closing parenthesis". The documentation seems correct to me.