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