// 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}} }