GCC编译器是否应该为这个涉及[[fallthrough]]属性的不正确的C++代码进行诊断?

P.W*_*P.W 12 c++ gcc gcc-warning fall-through c++17

我正在GCC编译器版本7.1.0上测试C++ 17的功能.这与fallthrough属性有关,以下示例(实例)在此处改编自在线CPP参考

#include "iostream"
using namespace std;

int f(int n) {

  switch (n) {
    case 1:
    case 2:
      n = n + 20;
     [[fallthrough]];
    case 3: // no warning on fallthrough      
      n = n + 30;
    case 4: // compiler may warn on fallthrough      
      [[fallthrough]]; // ill­formed, not before a case label
      //n = n + 40;  //commented out to test if compiler will warn.
  }
  return n;
}    

int main()
{
    cout << f(1) << endl;
    cout << f(2) << endl;
    cout << f(3) << endl;
    cout << f(4) << endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

最后一个[[fallthrough]](for case 4:)是不正确的.

关于"根据标准,对于格式错误的程序需要什么C++编译器?"的问题.这里有最好的答案说明:

总而言之:如果格式错误的程序包含可诊断的违规,标准没有明确指定"无需诊断",那么符合要求的实现应该发出诊断信息.

所以,我查阅了标准(N4713),看它是否表示此问题不需要诊断.我无法找到任何此类陈述.

有趣的是,在所有这些之后,当我在最后一个之后添加以下语句时 [[fallthrough]]

n = n + 40;
Run Code Online (Sandbox Code Playgroud)

编译器警告(实例):

警告:属性'fallthrough'不在案例标签或默认标签之前

那么,这里有两个问题:

  1. 编译器是否错过了发出诊断信息,或者我在这里遗漏了什么?
  2. 如果是编译器问题,是否严重到报告?

Sha*_*our 9

  1. 如果是编译器问题,是否严重到报告?

是的,一致性错误是重要的错误,开发人员依赖于符合标准的编译器(编译器可能具有不需要严格一致性的模式,即gcc需要-pedantic来获得标准所需的所有诊断)bug的优先级是不同的故事,但仅仅记录错误,并让编译器团队承认它是一个错误,可以为遇到错误的未来开发人员提供巨大的帮助.

  1. 编译器是否错过了发出诊断信息,或者我在这里遗漏了什么?

是的,根据[dcl.attr.fallthrough#] p1,这是不正确的:

...在fallthrough语句之后执行的下一个语句应该是带标签的语句,其标签是同一switch语句的case标签或default标签.如果没有这样的声明,该计划就是不正确的.

并且编译器需要根据[intro.compliance] p2.2发出至少一个诊断:

如果程序包含违反任何可诊断规则或在本文档中描述为"有条件支持"的构造的发生,当实现不支持该构造时, 符合要求的实现应发出至少一条诊断消息.