Esto parece un error de gcc, la documentación -Wno-div-by-zero dice claramente :
No advierta sobre la división de enteros en tiempo de compilación por cero. No se advierte sobre la división en coma flotante por cero, ya que puede ser una forma legítima de obtener infinitos y NaN.
y después de las conversiones aritméticas habituales cubiertas en [expr.arith.conv] ambos operandos serán dobles :
Muchos operadores binarios que esperan operandos de tipo aritmético o enumeración provocan conversiones y producen tipos de resultados de forma similar. El propósito es producir un tipo común, que también es el tipo de resultado. Este patrón se denomina conversiones aritméticas habituales, que se definen de la siguiente manera:
...
- De lo contrario, si alguno de los operandos es doble, el otro se convertirá en doble.
y [expr.mul] :
Los operandos de * y / deberán tener un tipo de enumeración aritmético o sin ámbito; los operandos de% deberán tener un tipo de enumeración integral o sin ámbito.
Las conversiones aritméticas habituales se realizan en los operandos y determinan el tipo de resultado.
Con respecto a si el punto flotante dividir por cero es un comportamiento indefinido y cómo lo maneja la implementación diferente, parece mi respuesta aquí . TL; DR; Parece que gcc se ajusta al Anexo F wrt para dividir el punto flotante por cero, por lo que undefined no juega un papel aquí. La respuesta sería diferente para clang.