Pregunta de seguimiento para: ¿Cuál es el fundamento de "la violación de la semántica no requiere diagnóstico"? .
Borrador de trabajo N2596 — 11 de diciembre de 2020 ISO/IEC 9899:202x (E), 6.9.2 Definiciones de objetos externos, Semántica, 3:
Si la declaración de un identificador de un objeto es una definición provisional y tiene un vínculo interno, el tipo declarado no será un tipo incompleto.
Esto parece una restricción: ¿por qué se coloca en la sección "Semántica" (una violación del requisito no requiere un diagnóstico) en lugar de en la sección "Restricciones"?
UPD. Pregunta similar: comprensión de IEEE 754: ¿por qué convertFromInt y convertToIntegerXXX se clasifican como operaciones aritméticas y no como operaciones de conversión? .
Esto parece una restricción
Estoy de acuerdo.
— ¿Por qué se coloca en la sección "Semántica" (una violación del requisito no requiere un diagnóstico) en lugar de en la sección "Restricciones"?
Con respecto al paréntesis, no considero que la cuestión de si se requiere un diagnóstico sea una distinción clave entre una restricción del lenguaje y una regla semántica. Una restricción es una
Restricción, ya sea sintáctica o semántica, mediante la cual debe interpretarse la exposición de los elementos del lenguaje.
(C17, 3.8/1)
Eso es un bocado, sin duda, pero se trata de restricciones que son reglas sobre qué código que coincide con la gramática léxica de C se ajusta en general a la especificación del lenguaje, y qué no. Como consecuencia, el cumplimiento de la restricción de idioma siempre se puede evaluar en el momento de la traducción, y el código que no cumple con una restricción de idioma de manera efectiva no se expresa en C. Es decir, las restricciones son reglas que se aplican al código fuente. Este es el contexto para el requisito de que las implementaciones diagnostiquen violaciones de restricciones.
Las reglas semánticas, por otro lado, explican qué significa el código C o qué comportamiento del programa está asociado, si lo hay. Estas son reglas para el comportamiento en tiempo de ejecución de los programas y las implementaciones del lenguaje C.
Lo cual es un largo camino de regreso a: Estoy de acuerdo, a pesar de estar incluido entre las reglas semánticas, el párrafo 6.9.2/3 es por naturaleza una restricción de idioma.
Dudo que alguien pueda responder con autoridad sobre por qué se coloca entre las reglas semánticas, pero tal vez sea relevante aquí que exactamente la misma redacción aparece como regla semántica en todas las versiones publicadas de la especificación del idioma, hasta el final. a C89, que posicionó "tipos incompletos" de manera un poco diferente a C11 y posteriores.
Puede ser que el comité original de ANSI C se haya tomado la libertad aquí para excusar a los compiladores de diagnosticar este problema, quizás porque vieron una ambigüedad sobre si esa restricción debería aplicarse a los tipos incompletos que se completan más adelante en la unidad de traducción. No estoy seguro de eso yo mismo, hoy. Es muy posible que esto representara una posición de compromiso.