| // RUN: %clang_cc1 -fsyntax-only -Wextra-semi-stmt -verify %s |
| // RUN: cp %s %t |
| // RUN: %clang_cc1 -x c++ -Wextra-semi-stmt -fixit %t |
| // RUN: %clang_cc1 -x c++ -Wextra-semi-stmt -Werror %t |
| |
| #define GOODMACRO(varname) int varname |
| #define BETTERMACRO(varname) GOODMACRO(varname); |
| #define NULLMACRO(varname) |
| |
| enum MyEnum { |
| E1, |
| E2 |
| }; |
| |
| void test() { |
| ; // expected-warning {{empty expression statement has no effect; remove unnecessary ';' to silence this warning}} |
| ; |
| |
| // This removal of extra semi also consumes all the comments. |
| // clang-format: off |
| ;;; |
| // clang-format: on |
| |
| // clang-format: off |
| ;NULLMACRO(ZZ); |
| // clang-format: on |
| |
| {}; // expected-warning {{empty expression statement has no effect; remove unnecessary ';' to silence this warning}} |
| |
| { |
| ; // expected-warning {{empty expression statement has no effect; remove unnecessary ';' to silence this warning}} |
| } |
| |
| if (true) { |
| ; // expected-warning {{empty expression statement has no effect; remove unnecessary ';' to silence this warning}} |
| } |
| |
| GOODMACRO(v0); // OK |
| |
| GOODMACRO(v1;) // OK |
| |
| BETTERMACRO(v2) // OK |
| |
| BETTERMACRO(v3;) // Extra ';', but within macro expansion, so ignored. |
| |
| BETTERMACRO(v4); // expected-warning {{empty expression statement has no effect; remove unnecessary ';' to silence this warning}} |
| |
| BETTERMACRO(v5;); // expected-warning {{empty expression statement has no effect; remove unnecessary ';' to silence this warning}} |
| |
| NULLMACRO(v6) // OK |
| |
| NULLMACRO(v7); // OK. This could be either GOODMACRO() or BETTERMACRO() situation, so we can't know we can drop it. |
| |
| if (true) |
| ; // OK |
| |
| while (true) |
| ; // OK |
| |
| do |
| ; // OK |
| while (true); |
| |
| for (;;) // OK |
| ; // OK |
| |
| MyEnum my_enum; |
| switch (my_enum) { |
| case E1: |
| // stuff |
| break; |
| case E2:; // OK |
| } |
| |
| for (;;) { |
| for (;;) { |
| goto contin_outer; |
| } |
| contin_outer:; // OK |
| } |
| } |
| |
| ; |
| |
| namespace NS {}; |
| |
| void foo(int x) { |
| switch (x) { |
| case 0: |
| [[fallthrough]]; |
| case 1: |
| return; |
| } |
| } |
| |
| [[]]; |