Функция toupper
(со строчной буквой U) принимает либо значение беззнакового символа, либо EOF. Если char подписан, передача char в toupper () без преобразования его в unsigned char сначала может передать другие значения с неопределенным поведением. Реализация toupper часто выглядит так:
int toupper(int c)
{
return touppermap[c+1];
}
так что проблема здесь реальна. (Эта реализация предполагает, что EOF равен -1, что формально нельзя сделать, но ничто не мешает реализации быть осведомленной о своих собственных характеристиках).