Существует ограничение 6.7.4(p3)
:
Встроенное определение функции с внешней связью не должно содержать определение модифицируемого объекта со статической или длительностью хранения потока и не должно содержатьссылка на идентификатор с внутренней связью.
Рассмотрим следующий пример:
static const int i = 10;
void do_print(void);
inline void do_print(void){
printf("%d/n", i); //Reference to an identifier with internal linkage
//constraint violation
}
DEMO
Здесь встроенное определениеФункция с внешней связью использует идентификатор с внутренней связью.Таким образом, в соответствии с 5.1.1.3(p1)
:
Соответствующая реализация должна выдать хотя бы одно диагностическое сообщение (идентифицируется способом, определяемым реализацией), если блок преобразования или блок предварительной обработки содержит нарушение какого-либо синтаксического правила или ограничения, даже если поведение также явно указано как неопределенное или определенное реализацией.
Я ожидал, что компилятор как-то сообщит о нарушении этого ограничения (некоторые предупреждения).Но код компилируется просто без предупреждений или каких-либо других сообщений.
Вопрос: : Почему диагностическое сообщение не выдается в случае нарушения ограничения, указанного выше?