Parece um bug do gcc, a documentação -Wno-div-by-zero
diz claramente :
Não avise sobre a divisão inteira do tempo de compilação por zero. A divisão de ponto flutuante por zero não é alertada, pois pode ser uma forma legítima de obter infinitos e NaNs.
e após as conversões aritméticas usuais abordadas em [expr.arith.conv], ambos os operandos serão duplos :
Muitos operadores binários que esperam operandos do tipo aritmético ou enumeração causam conversões e produzem tipos de resultado de maneira semelhante. O objetivo é produzir um tipo comum, que também é o tipo do resultado. Esse padrão é chamado de conversões aritméticas usuais, que são definidas da seguinte maneira:
...
- Caso contrário, se um dos operandos for duplo, o outro deve ser convertido para duplo.
e [expr.mul] :
Os operandos de * e / devem ter tipo de enumeração aritmética ou sem escopo; os operandos de% devem ter tipo de enumeração integral ou sem escopo.
As conversões aritméticas usuais são realizadas nos operandos e determinam o tipo de resultado.
Com relação a se a divisão de ponto flutuante por zero é um comportamento indefinido e como diferentes implementações lidam com isso, parece minha resposta aqui . TL; DR; Parece que o gcc está em conformidade com o Anexo F em relação ao ponto flutuante dividido por zero, portanto, undefined não desempenha um papel aqui. A resposta seria diferente para clang.