En C moderno, la palabra clave auto permite declarar variables con tipo inferido, pero su análisis sintáctico encierra ambigüedades que enfrentan a GCC y Clang en sentidos opuestos. Cuando en un ámbito interno existe un typedef con el mismo nombre que el identificador de la declaración, ambos compiladores deben decidir si tratan ese identificador como nombre de tipo o como nueva variable, y esa decisión depende de mirar más allá del propio token, algo que solo uno de los dos hace correctamente en cada caso.
La situación se complica con los atributos sintácticos [[...]] colocados entre el identificador y el resto de la declaración, y todavía más cuando entran en juego declaradores de función o de puntero con auto, un caso que el estándar C23 declara de comportamiento definido por la implementación. Además, la extensión histórica __auto_type, presente en ambos compiladores desde antes de C23, no comparte las semánticas de declaraciones "subespecificadas" introducidas por el estándar, por lo que GCC y Clang divergen al evaluar la auto-referencia del identificador dentro de su propio inicializador.
El artículo repasa cada uno de estos casos con ejemplos concretos, muestra los mensajes de error opuestos que producen GCC y Clang y concluye que un analizador sintáctico correcto necesitaría, como mínimo, retrasar la decisión sobre el identificador hasta leer el siguiente token, parsear los atributos que le sigan y aplicarlos retroactivamente al tipo o a la variable según el resultado.
