在可疑的情况下发出叮当警告:函数'foo'可以用属性"noreturn"声明吗?



我一直在玩[[noreturn]]属性,我正在尝试处理和使用它(我知道[[noreturn]]是C++11标准属性,__attribute__((noreturn))是GCC/Clang扩展)。作为其中的一部分,我启用了Clang警告-Wmissing noreturn。

> clang++ -v
Ubuntu clang version 3.7.1-svn253742-1~exp1 (branches/release_37) (based on LLVM 3.7.1)
Target: x86_64-pc-linux-gnu
Thread model: posix

foo.cpp:

enum bar
{
  A = 1,
  B,
  C
};
void foo()
{
  switch (bar())
  {
    case A:
    case B:
    case C:
    default:
      break;
  }
}
int main()
{
  foo();
  return 0;
}

然后编译:

> clang++ foo.cpp -o foo -Wmissing-noreturn -std=c++14
foo.cpp:9:1: warning: function 'foo' could be declared with attribute 'noreturn'
      [-Wmissing-noreturn]
{
^
1 warning generated.

我觉得它会回来的!这是怎么回事这是编译器错误吗?

如果从A中删除"=1",则它编译良好,不会发出警告。

如果我确实使foo()函数成为[[noreturn]] void foo(),那么它确实会因分段错误而崩溃。

好的,很抱歉删除最后一个答案。这是错误的。好的,noreturn意味着函数永远不会结束。分段犯规是因为bar不是变量

只是为了跟进一个老问题:clang是正确的,即使有点迂腐。

事实上,属性noreturn适用于foo()函数,因为它不返回任何内容。事实上,2016年的clang与枚举中的微小变化相混淆,这是一个问题。

但我们应该原谅clang的这种pecadillo,因为C++11语法不是可以称之为非常简单的语法。

相关内容

最新更新