내가 [[fallthrough]]를 사용해도 GCC가 폴 스루에 대해 경고하는 이유는 무엇입니까? switch (0) {

다음 코드에서는 [[fallthrough]]C ++ 1z 의 표준 속성을 사용하여 폴스 루가 필요함을 문서화합니다.

#include <iostream>

int main() {
    switch (0) {
        case 0:
            std::cout << "a\n";
            [[fallthrough]]
        case 1:
            std::cout << "b\n";
            break;
    }
}

GCC 7.1에서는 코드가 오류없이 컴파일됩니다. 그러나 컴파일러는 여전히 오류에 대해 경고합니다.

warning: this statement may fall through [-Wimplicit-fallthrough=]
    std::cout << "a\n";
    ~~~~~~~~~~^~~~~~~~

왜?



답변

속성 뒤에 세미콜론이 없습니다.

case 0:
    std::cout << "a\n";
    [[fallthrough]];
    //             ^
case 1:

[[fallthrough]]속성은 빈 문 (참조에 적용되는 P0188R1을 ). 현재 Clang 트렁크 는이 경우 유용한 오류를 제공합니다 .

error: fallthrough attribute is only allowed on empty statements
    [[fallthrough]]
      ^
note: did you forget ';'?
    [[fallthrough]]
                   ^
                   ;

업데이트 : Cody Gray 이 문제를 GCC 팀에 보고 했습니다.