To me it sounds like someone messed up merging the previous standard with the new one.
Previously the standard said this: (C++14 N4140, 7.1.6.4.7 [dcl.spec.auto]):
When a […]
returnstatement occurs in a function
declared with a return type that contains a placeholder type, the deduced return type or variable type
is determined from the type of its initializer. In the case of areturnwith no operand, the initializer is
considered to bevoid().
The newer standard allows for if constexpr statements, so the language needed to change to reflect that. if constexpr leads to the concept of a potentially discarded return statement (if the return is in the not-taken branch of a constexpr if, then it’s discarded and the return type is inferred from other return statements, if any).
Probably the new wording should be something like:
for a non-discarded return statement that occurs in a function
declared with a return type that contains a placeholder type,Tis the
declared return type andeis the operand of thereturnstatement. If
the return statement has no operand, thenTisautoand the deduced return type isvoid