Стандарт в основном касается диагностики, а не ошибок или предупреждений. Таким образом, все, что требуется для создания соответствующего компилятора, - это диагностика, которую выполняют оба эти компилятора.
Относительно того, почему -fpermissive
выдает только предупреждение в GCC в этом случае, но ошибка в Clang зависит от подхода, используемого этими компиляторами в отношении опции -fpermissive
.
Согласно GCC :
-fpermissive
Понизить некоторую диагностику несоответствующего кода с ошибок до предупреждений. Таким образом, использование -fpermissive
позволяет компилировать некоторый несоответствующий код.
У Clang сначала не было опции -fpermissive
. Это было добавлено позже. Из информации, которую мы имеем в сети, подход Clang к этому варианту:
-fpermissive
Не выдавать ошибку при расширении языка. Диагностика неверного кода с использованием известного
языковые расширения в текущем языковом режиме понижены до максимально
предупреждение.
Таким образом, в Clang только языковые расширения понижены до статуса предупреждения. Если это не расширение языка (как в данном примере), оно не будет преобразовано в предупреждение и будет диагностировано как ошибка.