craig.topper added a comment.
gcc also warns for this
short foo(char a) {
return a * a;
}
Despite the fact that the char would be promoted to int, the upper bits are just sign bits and the multiply result still fits in a short.
Repository:
rC Clang
https://reviews.llvm.org/D44559