工具/软件:TI C/C++编译器
您好!
我们正在测试新的编译器版本8.3.4并验证(也使用 CGT 8.3.6)、在某些特定情况下存在编译失败、而 CGT7未出现这种情况。 我要附加示例代码(使用命令来生成)以重现问题:
typedef 枚举
{
A = 1、
B、
C
}X;
无符号 Fun (X param)
{
const unsigned int y[]={param};
返回 y[0];
}
int main()
{
无符号 i = 0;
i =趣味(c);
if (i>0)
{
;
}
}
e2e.ti.com/.../enum_5F00_issue_5F00_for_5F00_TI.zip
编译器错误:
"./main.cpp"、第10行:错误#2721-D:从"X"到"unsigned int"的无效缩窄转换
在编译"./main.cpp"时检测到1错误。
>>编译失败
使用 wandbox 的在线编译器进行了更深入的调查、以获得参考结果(GCC/Clang 均已选中)。 初始参考代码:
#include #include typedef 枚举 { A = 1、 B、 C }X; void Fun (X param) { const unsigned int y[]={param}; std:::cout <<"value of y="<< y[0]<< std:endl; } int main () { const unsigned int x[]={a、b、c}; 娱乐(c); std:::cout <<"值:"<< x[0]<<"、"<< sizeof (a)<<"、"<< sizeof (X)<< std:endl; }
带输出:
我们在 CGT 中观察到的错误是由 C++11引入的-为阵列初始化缩小转换范围意味着程序格式不正确(在此处查找"缩小转换范围"短语: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3337.pdf)。 要触发此错误、 可稍微更改代码:
#include #include typedef 枚举 { A = 1、 b = UINT_MAX、 C }X; void Fun (X param) { const unsigned int y[]={param}; std:::cout <<"value of y="<< y[0]<< std:endl; } int main () { const unsigned int x[]={a、b、c};//使用 b = 2、不使用 b = UINT_MAX tFun (c);//导致错误。 std:::cout <<"值:"<< x[0]<<"、"<< sizeof (a)<<"、"<< sizeof (X)<< std:endl; }
检测到错误:
PROG.cc:在函数"void Fun (X)"中:
prog.cc:14:32:错误:将"param"的转换从"long unsigned int"缩窄到"unsigned int"[-Wthing]
14 | const unsigned int y[]={param};
| ^~~~~μ A
prog.cc:在函数'int main()'中:
prog.cc:21:39:错误:将'c'的转换从'long unsigned int'缩窄到'unsigned int'[-Wthing]
21 | const unsigned int x[]={a、b、c}; //使用 b = 2、不使用 b = UINT_MAX
| ^μ A
1
要有完善的计划、应修改:
#include #include typedef 枚举 { A = 1、 b = UINT_MAX、 C }X; void Fun (X param) { const unsigned long int y[]={param}; std:::cout <<"value of y="<< y[0]<< std:endl; } int main () { const unsigned int x[]={A}; 娱乐(c); std:::cout <<"值:"<< x[0]<<"、"<< sizeof (a)<<"、"<< sizeof (X)<< std:endl; }
y=4294967296的值
值:1、8、8
0