clang ++的选项-fno-strict-enums有什么作用?

问题描述

两个月前,我报告了一个clang++错误,它是使用z编译时,下面的C ++程序将4294967295设置为clang++ -O2 -fno-strict-enums

enum e { e1,e2 } e;

long long x,y,z;

char *p;

void f(void) {
    e = (enum e) 4294967295;
    x = (long long) e;
    y = e > e1;
    z = &p[e] - p;
}

由于该程序未定义,我的错误报告被关闭为无效。我的感觉是使用选项-fno-strict-enums对其进行了定义。

据我所知,Clang没有值得称呼的文档,因为它的目的是在接受的选项及其含义方面与GCC兼容。我阅读了GCC关于选项-fno-strict-enums的文档,说该程序应将z的值设置为-1

-fstrict-enums

允许编译器使用枚举类型的值只能是枚举值之一的假设进行优化 (如C ++标准中所定义;基本上,该值可以是 以代表所有 枚举数)。如果程序使用以下命令,则此假设可能无效: 强制将任意整数值转换为枚举类型。

请注意,仅记录了选项-fstrict-enums,但似乎很清楚,-fno-strict-enums禁用了-fstrict-enums启用的编译器行为。我无法针对GCC的文档提出错误,因为生成的二进制文件将z强制设置为-1-fno-strict-enums正是将g++ -O2 -fno-strict-enums设置为-fno-strict-enums。 >

有人能告诉我{{1}}在Clang中的作用吗(如果我误解了它在GCC中的作用,那么在GCC中),以及选项的值是否对Clang的任何地方都有效?

作为参考,我的错误报告是here,并且显示我的意思的Compiler Explorer链接是here。用作参考的版本是针对I32LP64体系结构的Clang 10.0.1和GCC 10.2。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)