当程序对函数指针进行指针算术运算时,clang和gcc是否应生成诊断消息?

This program compiles without errors, for example with clang -Wall -std=c11 a.c and gcc -Wall -std=c11 a.c. Is this a bug in clang and gcc? Because arithmetic is not defined on pointers to function types.

#include <stdio.h>

void f(void) {}

int main(void){
    void (*p)(void) = f;
    printf("%p\n", p);
    printf("%p\n", p + 1);

    return 0;
}

There's a constraint on addition that either both operands have arithmetic type, or one is a pointer to a complete object type. I believe p is a pointer to a function type, not a a pointer to any sort of object type. Here's the C11 standard:

6.5.6加法运算符      约束条件         另外,两个操作数都应具有算术类型,或者一个操作数应为a。   指向完整对象类型的指针,另一个应具有整数   类型。 (递增等于加1。)

如果任何翻译单元违反约束,则要求合格的编译器生成诊断消息。同样,C11标准:

5.1.1.3诊断         符合的实现应产生至少一个诊断消息(在实现定义中标识   方式)是否为预处理翻译单元或翻译单元   包含违反任何语法规则或约束的内容,即使   行为也明确指定为undefined或   实现定义的。诊断消息不需要在   其他情况。