Mengapa GCC memperingatkan saya tentang fallthrough meskipun saya menggunakan [[fallthrough]]?

86

Dalam potongan kode berikut, saya menggunakan [[fallthrough]]atribut standar dari C ++ 1z untuk mendokumentasikan bahwa diperlukan fallthrough:

#include <iostream>

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

Dengan GCC 7.1, kode dikompilasi tanpa kesalahan. Namun, kompilator masih memperingatkan saya tentang kesalahan:

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

Mengapa?

s3rvac.dll
sumber
33
Dan di sinilah saya, berpikir Anda orang C ++ tidak mungkin membuat segalanya lebih buruk!
SnakeDoc
3
@SnakeDoc: Ini adalah hadiah!
Deduplicator
3
@SnakeDoc Itu seharusnya menjadi komentar atas jawabannya, yang membuatnya lebih buruk. :)
23
Saya tidak setuju dengan suara yang mendekati. Alasan "kesalahan ketik sederhana" ada untuk kasus di mana masalah OP hanya terjadi karena beberapa kesalahan yang tidak terkait dengan deskripsi pertanyaan dan tidak akan berguna untuk orang lain. Dalam hal ini kemungkinan besar orang lain lupa titik koma di tempat tersebut, mendapatkan kesalahan yang sama, dan menemukan pertanyaan ini ketika mencari solusi.
CodesInChaos
14
Saya sangat tidak suka komentar saya dihapus dari pertanyaan ini jadi saya terpaksa mengulanginya lagi - meskipun ini memang kesalahan ketik, sangat mungkin pengguna lain akan mengulanginya, mencarinya, dan menemukan pertanyaan ini dengan jawaban ini. Dengan demikian, ini adalah pertanyaan yang bagus dan jawaban yang bagus dan pantas untuk dibiarkan terbuka.
Barry

Jawaban:

105

Anda kehilangan titik koma setelah atribut:

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

The [[fallthrough]]atribut yang akan diterapkan untuk pernyataan kosong (lihat P0188R1 ). Batang Clang saat ini memberikan kesalahan yang berguna dalam kasus ini :

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

Pembaruan: Cody Grey melaporkan masalah ini ke tim GCC.

s3rvac.dll
sumber
Menyebutkan untuk apa atribut diterapkan tanpa titik koma akan menyenangkan. Saya berasumsi itu untuk kasus berikutnya?
CodesInChaos
2
@CodesInha fallthrough attribute is only allowed on empty statements; karena tidak diikuti oleh pernyataan kosong, gcc mengabaikannya
musicman523
2
@ musicman523 Itu ... sepertinya ... salah? Tampaknya, akan lebih bijaksana untuk meminta titik koma bahkan ketika diikuti dengan pernyataan kosong, dan menolak untuk mengkompilasi sebaliknya.
SnakeDoc
@SnakeDoc Rupanya ini hanya kasus atribut pernyataan tertentu, jadi parser mengizinkannya melewatinya, tetapi tidak memiliki semantik apa pun saat diterapkan ke pernyataan yang tidak kosong. Anggap saja sebagai bug jika Anda mau, dan clangperbaiki.
Barmar
2
@CodesInChaos Tanpa titik koma, atribut akan tetap berada di label.
TC