可疑案件中的Clang警告:function' foo'可以用属性声明noreturn'?

时间:2016-04-01 01:16:32

标签: c++ c++11 clang warnings noreturn

我一直在玩[[noreturn]]属性,我试图掌握并使用它(我理解[[noreturn]]C++11 standard attribute __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.

在我看来它会回归!这里发生了什么?这是编译错误吗?

如果删除" = 1"从A开始,它会在没有警告的情况下编译好。

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

2 个答案:

答案 0 :(得分:-1)

很抱歉删除了最后一个答案。那是错的。好的noreturn意味着功能永远不会结束。并且分裂可能是因为bar不是变量

答案 1 :(得分:-1)

只需跟进一个老问题:clang是正确的,即使有点学究。

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

但是对于这个 pecadillo ,我们应该原谅clang,因为C ++ 11语法并不是什么简单的语法。