| // RUN: %clang_cc1 -fsyntax-only -verify -Werror=unreachable-code-aggressive %s |
| |
| // Test that analysis-based warnings honor #pragma diagnostic controls. |
| |
| struct [[clang::consumable(unconsumed)]] Linear { |
| [[clang::return_typestate(unconsumed)]] |
| Linear() {} |
| [[clang::callable_when(consumed)]] |
| ~Linear() {} |
| }; |
| |
| int a() { |
| Linear l; |
| return 0; // No -Wconsumed diagnostic, analysis is not enabled. |
| return 1; // expected-error {{'return' will never be executed}} |
| } |
| |
| #pragma clang diagnostic push |
| #pragma clang diagnostic error "-Wconsumed" |
| int b() { |
| Linear l; |
| return 0; // expected-error {{invalid invocation of method '~Linear' on object 'l' while it is in the 'unconsumed' state}} |
| return 1; // expected-error {{'return' will never be executed}} |
| } |
| #pragma clang diagnostic pop |
| |
| int c() { |
| #pragma clang diagnostic push |
| #pragma clang diagnostic error "-Wconsumed" |
| Linear l; |
| return 0; // expected-error {{invalid invocation of method '~Linear' on object 'l' while it is in the 'unconsumed' state}} |
| return 1; // expected-error {{'return' will never be executed}} |
| #pragma clang diagnostic pop |
| } |
| |
| int d() { |
| #pragma clang diagnostic push |
| #pragma clang diagnostic error "-Wconsumed" |
| #pragma clang diagnostic ignored "-Wunreachable-code-aggressive" |
| Linear l; |
| return 0; // expected-error {{invalid invocation of method '~Linear' on object 'l' while it is in the 'unconsumed' state}} |
| return 1; // Diagnostic is ignored |
| } |
| #pragma clang diagnostic pop |
| |
| int e() { |
| #pragma clang diagnostic push |
| #pragma clang diagnostic error "-Wconsumed" |
| #pragma clang diagnostic ignored "-Wunreachable-code-aggressive" |
| Linear l; |
| return 0; // expected-error {{invalid invocation of method '~Linear' on object 'l' while it is in the 'unconsumed' state}} |
| return 1; // Diagnostic is ignored |
| #pragma clang diagnostic pop |
| } |
| |
| int f() { |
| Linear l; |
| return 0; // No -Wconsumed diagnostic, analysis is not enabled |
| return 1; // expected-error {{'return' will never be executed}} |
| #pragma clang diagnostic push |
| #pragma clang diagnostic ignored "-Wunreachable-code-aggressive" |
| } |
| #pragma clang diagnostic pop |
| |
| int g() { |
| Linear l; |
| return 0; // No -Wconsumed diagnostic, the diagnostic generated at } is not enabled on this line. |
| return 1; // expected-error {{'return' will never be executed}} |
| #pragma clang diagnostic push |
| #pragma clang diagnostic warning "-Wconsumed" |
| } |
| #pragma clang diagnostic pop |
| |
| int h() { |
| #pragma clang diagnostic push |
| #pragma clang diagnostic error "-Wconsumed" |
| #pragma clang diagnostic ignored "-Wunreachable-code-aggressive" |
| #pragma clang diagnostic pop |
| |
| Linear l; |
| return 0; // No -Wconsumed diagnostic, the diagnostic generated at } is not enabled on this line. |
| return 1; // expected-error {{'return' will never be executed}} |
| } |