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