问题描述
两个月前,我报告了一个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 (将#修改为@)