1f08c3bdfSopenharmony_ci#define __cond_lock(c) ((c) ? ({ __context__(1); 1; }) : 0) 2f08c3bdfSopenharmony_ci 3f08c3bdfSopenharmony_cistatic void a(void) __attribute__((context(0,1))) 4f08c3bdfSopenharmony_ci{ 5f08c3bdfSopenharmony_ci __context__(1); 6f08c3bdfSopenharmony_ci} 7f08c3bdfSopenharmony_ci 8f08c3bdfSopenharmony_cistatic void r(void) __attribute__((context(1,0))) 9f08c3bdfSopenharmony_ci{ 10f08c3bdfSopenharmony_ci __context__(-1); 11f08c3bdfSopenharmony_ci} 12f08c3bdfSopenharmony_ci 13f08c3bdfSopenharmony_ciextern int _ca(int fail); 14f08c3bdfSopenharmony_ci#define ca(fail) __cond_lock(_ca(fail)) 15f08c3bdfSopenharmony_ci 16f08c3bdfSopenharmony_cistatic void good_paired1(void) 17f08c3bdfSopenharmony_ci{ 18f08c3bdfSopenharmony_ci a(); 19f08c3bdfSopenharmony_ci r(); 20f08c3bdfSopenharmony_ci} 21f08c3bdfSopenharmony_ci 22f08c3bdfSopenharmony_cistatic void good_paired2(void) 23f08c3bdfSopenharmony_ci{ 24f08c3bdfSopenharmony_ci a(); 25f08c3bdfSopenharmony_ci r(); 26f08c3bdfSopenharmony_ci a(); 27f08c3bdfSopenharmony_ci r(); 28f08c3bdfSopenharmony_ci} 29f08c3bdfSopenharmony_ci 30f08c3bdfSopenharmony_cistatic void good_paired3(void) 31f08c3bdfSopenharmony_ci{ 32f08c3bdfSopenharmony_ci a(); 33f08c3bdfSopenharmony_ci a(); 34f08c3bdfSopenharmony_ci r(); 35f08c3bdfSopenharmony_ci r(); 36f08c3bdfSopenharmony_ci} 37f08c3bdfSopenharmony_ci 38f08c3bdfSopenharmony_cistatic void good_lock1(void) __attribute__((context(0,1))) 39f08c3bdfSopenharmony_ci{ 40f08c3bdfSopenharmony_ci a(); 41f08c3bdfSopenharmony_ci} 42f08c3bdfSopenharmony_ci 43f08c3bdfSopenharmony_cistatic void good_lock2(void) __attribute__((context(0,1))) 44f08c3bdfSopenharmony_ci{ 45f08c3bdfSopenharmony_ci a(); 46f08c3bdfSopenharmony_ci r(); 47f08c3bdfSopenharmony_ci a(); 48f08c3bdfSopenharmony_ci} 49f08c3bdfSopenharmony_ci 50f08c3bdfSopenharmony_cistatic void good_lock3(void) __attribute__((context(0,1))) 51f08c3bdfSopenharmony_ci{ 52f08c3bdfSopenharmony_ci a(); 53f08c3bdfSopenharmony_ci a(); 54f08c3bdfSopenharmony_ci r(); 55f08c3bdfSopenharmony_ci} 56f08c3bdfSopenharmony_ci 57f08c3bdfSopenharmony_cistatic void good_unlock1(void) __attribute__((context(1,0))) 58f08c3bdfSopenharmony_ci{ 59f08c3bdfSopenharmony_ci r(); 60f08c3bdfSopenharmony_ci} 61f08c3bdfSopenharmony_ci 62f08c3bdfSopenharmony_cistatic void good_unlock2(void) __attribute__((context(1,0))) 63f08c3bdfSopenharmony_ci{ 64f08c3bdfSopenharmony_ci a(); 65f08c3bdfSopenharmony_ci r(); 66f08c3bdfSopenharmony_ci r(); 67f08c3bdfSopenharmony_ci} 68f08c3bdfSopenharmony_ci 69f08c3bdfSopenharmony_cistatic void warn_lock1(void) 70f08c3bdfSopenharmony_ci{ 71f08c3bdfSopenharmony_ci a(); 72f08c3bdfSopenharmony_ci} 73f08c3bdfSopenharmony_ci 74f08c3bdfSopenharmony_cistatic void warn_lock2(void) 75f08c3bdfSopenharmony_ci{ 76f08c3bdfSopenharmony_ci a(); 77f08c3bdfSopenharmony_ci r(); 78f08c3bdfSopenharmony_ci a(); 79f08c3bdfSopenharmony_ci} 80f08c3bdfSopenharmony_ci 81f08c3bdfSopenharmony_cistatic void warn_lock3(void) 82f08c3bdfSopenharmony_ci{ 83f08c3bdfSopenharmony_ci a(); 84f08c3bdfSopenharmony_ci a(); 85f08c3bdfSopenharmony_ci r(); 86f08c3bdfSopenharmony_ci} 87f08c3bdfSopenharmony_ci 88f08c3bdfSopenharmony_cistatic void warn_unlock1(void) 89f08c3bdfSopenharmony_ci{ 90f08c3bdfSopenharmony_ci r(); 91f08c3bdfSopenharmony_ci} 92f08c3bdfSopenharmony_ci 93f08c3bdfSopenharmony_cistatic void warn_unlock2(void) 94f08c3bdfSopenharmony_ci{ 95f08c3bdfSopenharmony_ci a(); 96f08c3bdfSopenharmony_ci r(); 97f08c3bdfSopenharmony_ci r(); 98f08c3bdfSopenharmony_ci} 99f08c3bdfSopenharmony_ci 100f08c3bdfSopenharmony_ciextern int condition, condition2; 101f08c3bdfSopenharmony_ci 102f08c3bdfSopenharmony_cistatic int good_if1(void) 103f08c3bdfSopenharmony_ci{ 104f08c3bdfSopenharmony_ci a(); 105f08c3bdfSopenharmony_ci if(condition) { 106f08c3bdfSopenharmony_ci r(); 107f08c3bdfSopenharmony_ci return -1; 108f08c3bdfSopenharmony_ci } 109f08c3bdfSopenharmony_ci r(); 110f08c3bdfSopenharmony_ci return 0; 111f08c3bdfSopenharmony_ci} 112f08c3bdfSopenharmony_ci 113f08c3bdfSopenharmony_cistatic void good_if2(void) 114f08c3bdfSopenharmony_ci{ 115f08c3bdfSopenharmony_ci if(condition) { 116f08c3bdfSopenharmony_ci a(); 117f08c3bdfSopenharmony_ci r(); 118f08c3bdfSopenharmony_ci } 119f08c3bdfSopenharmony_ci} 120f08c3bdfSopenharmony_ci 121f08c3bdfSopenharmony_cistatic void good_if3(void) 122f08c3bdfSopenharmony_ci{ 123f08c3bdfSopenharmony_ci a(); 124f08c3bdfSopenharmony_ci if(condition) { 125f08c3bdfSopenharmony_ci a(); 126f08c3bdfSopenharmony_ci r(); 127f08c3bdfSopenharmony_ci } 128f08c3bdfSopenharmony_ci r(); 129f08c3bdfSopenharmony_ci} 130f08c3bdfSopenharmony_ci 131f08c3bdfSopenharmony_cistatic int warn_if1(void) 132f08c3bdfSopenharmony_ci{ 133f08c3bdfSopenharmony_ci a(); 134f08c3bdfSopenharmony_ci if(condition) 135f08c3bdfSopenharmony_ci return -1; 136f08c3bdfSopenharmony_ci r(); 137f08c3bdfSopenharmony_ci return 0; 138f08c3bdfSopenharmony_ci} 139f08c3bdfSopenharmony_ci 140f08c3bdfSopenharmony_cistatic int warn_if2(void) 141f08c3bdfSopenharmony_ci{ 142f08c3bdfSopenharmony_ci a(); 143f08c3bdfSopenharmony_ci if(condition) { 144f08c3bdfSopenharmony_ci r(); 145f08c3bdfSopenharmony_ci return -1; 146f08c3bdfSopenharmony_ci } 147f08c3bdfSopenharmony_ci return 0; 148f08c3bdfSopenharmony_ci} 149f08c3bdfSopenharmony_ci 150f08c3bdfSopenharmony_cistatic void good_while1(void) 151f08c3bdfSopenharmony_ci{ 152f08c3bdfSopenharmony_ci a(); 153f08c3bdfSopenharmony_ci while(condition) 154f08c3bdfSopenharmony_ci ; 155f08c3bdfSopenharmony_ci r(); 156f08c3bdfSopenharmony_ci} 157f08c3bdfSopenharmony_ci 158f08c3bdfSopenharmony_cistatic void good_while2(void) 159f08c3bdfSopenharmony_ci{ 160f08c3bdfSopenharmony_ci while(condition) { 161f08c3bdfSopenharmony_ci a(); 162f08c3bdfSopenharmony_ci r(); 163f08c3bdfSopenharmony_ci } 164f08c3bdfSopenharmony_ci} 165f08c3bdfSopenharmony_ci 166f08c3bdfSopenharmony_cistatic void good_while3(void) 167f08c3bdfSopenharmony_ci{ 168f08c3bdfSopenharmony_ci while(condition) { 169f08c3bdfSopenharmony_ci a(); 170f08c3bdfSopenharmony_ci r(); 171f08c3bdfSopenharmony_ci if(condition2) 172f08c3bdfSopenharmony_ci break; 173f08c3bdfSopenharmony_ci a(); 174f08c3bdfSopenharmony_ci r(); 175f08c3bdfSopenharmony_ci } 176f08c3bdfSopenharmony_ci} 177f08c3bdfSopenharmony_ci 178f08c3bdfSopenharmony_cistatic void good_while4(void) 179f08c3bdfSopenharmony_ci{ 180f08c3bdfSopenharmony_ci a(); 181f08c3bdfSopenharmony_ci while(1) { 182f08c3bdfSopenharmony_ci if(condition2) { 183f08c3bdfSopenharmony_ci r(); 184f08c3bdfSopenharmony_ci break; 185f08c3bdfSopenharmony_ci } 186f08c3bdfSopenharmony_ci } 187f08c3bdfSopenharmony_ci} 188f08c3bdfSopenharmony_ci 189f08c3bdfSopenharmony_cistatic void good_while5(void) 190f08c3bdfSopenharmony_ci{ 191f08c3bdfSopenharmony_ci a(); 192f08c3bdfSopenharmony_ci while(1) { 193f08c3bdfSopenharmony_ci r(); 194f08c3bdfSopenharmony_ci if(condition2) 195f08c3bdfSopenharmony_ci break; 196f08c3bdfSopenharmony_ci a(); 197f08c3bdfSopenharmony_ci } 198f08c3bdfSopenharmony_ci} 199f08c3bdfSopenharmony_ci 200f08c3bdfSopenharmony_cistatic void warn_while1(void) 201f08c3bdfSopenharmony_ci{ 202f08c3bdfSopenharmony_ci while(condition) { 203f08c3bdfSopenharmony_ci a(); 204f08c3bdfSopenharmony_ci } 205f08c3bdfSopenharmony_ci} 206f08c3bdfSopenharmony_ci 207f08c3bdfSopenharmony_cistatic void warn_while2(void) 208f08c3bdfSopenharmony_ci{ 209f08c3bdfSopenharmony_ci while(condition) { 210f08c3bdfSopenharmony_ci r(); 211f08c3bdfSopenharmony_ci } 212f08c3bdfSopenharmony_ci} 213f08c3bdfSopenharmony_ci 214f08c3bdfSopenharmony_cistatic void warn_while3(void) 215f08c3bdfSopenharmony_ci{ 216f08c3bdfSopenharmony_ci while(condition) { 217f08c3bdfSopenharmony_ci a(); 218f08c3bdfSopenharmony_ci if(condition2) 219f08c3bdfSopenharmony_ci break; 220f08c3bdfSopenharmony_ci r(); 221f08c3bdfSopenharmony_ci } 222f08c3bdfSopenharmony_ci} 223f08c3bdfSopenharmony_ci 224f08c3bdfSopenharmony_cistatic void good_goto1(void) 225f08c3bdfSopenharmony_ci{ 226f08c3bdfSopenharmony_ci a(); 227f08c3bdfSopenharmony_ci goto label; 228f08c3bdfSopenharmony_cilabel: 229f08c3bdfSopenharmony_ci r(); 230f08c3bdfSopenharmony_ci} 231f08c3bdfSopenharmony_ci 232f08c3bdfSopenharmony_cistatic void good_goto2(void) 233f08c3bdfSopenharmony_ci{ 234f08c3bdfSopenharmony_ci a(); 235f08c3bdfSopenharmony_ci goto label; 236f08c3bdfSopenharmony_ci a(); 237f08c3bdfSopenharmony_ci r(); 238f08c3bdfSopenharmony_cilabel: 239f08c3bdfSopenharmony_ci r(); 240f08c3bdfSopenharmony_ci} 241f08c3bdfSopenharmony_ci 242f08c3bdfSopenharmony_cistatic void good_goto3(void) 243f08c3bdfSopenharmony_ci{ 244f08c3bdfSopenharmony_ci a(); 245f08c3bdfSopenharmony_ci if(condition) 246f08c3bdfSopenharmony_ci goto label; 247f08c3bdfSopenharmony_ci a(); 248f08c3bdfSopenharmony_ci r(); 249f08c3bdfSopenharmony_cilabel: 250f08c3bdfSopenharmony_ci r(); 251f08c3bdfSopenharmony_ci} 252f08c3bdfSopenharmony_ci 253f08c3bdfSopenharmony_cistatic void good_goto4(void) 254f08c3bdfSopenharmony_ci{ 255f08c3bdfSopenharmony_ci if(condition) 256f08c3bdfSopenharmony_ci goto label; 257f08c3bdfSopenharmony_ci a(); 258f08c3bdfSopenharmony_ci r(); 259f08c3bdfSopenharmony_cilabel: 260f08c3bdfSopenharmony_ci ; 261f08c3bdfSopenharmony_ci} 262f08c3bdfSopenharmony_ci 263f08c3bdfSopenharmony_cistatic void good_goto5(void) 264f08c3bdfSopenharmony_ci{ 265f08c3bdfSopenharmony_ci a(); 266f08c3bdfSopenharmony_ci if(condition) 267f08c3bdfSopenharmony_ci goto label; 268f08c3bdfSopenharmony_ci r(); 269f08c3bdfSopenharmony_ci return; 270f08c3bdfSopenharmony_cilabel: 271f08c3bdfSopenharmony_ci r(); 272f08c3bdfSopenharmony_ci} 273f08c3bdfSopenharmony_ci 274f08c3bdfSopenharmony_cistatic void warn_goto1(void) 275f08c3bdfSopenharmony_ci{ 276f08c3bdfSopenharmony_ci a(); 277f08c3bdfSopenharmony_ci goto label; 278f08c3bdfSopenharmony_ci r(); 279f08c3bdfSopenharmony_cilabel: 280f08c3bdfSopenharmony_ci ; 281f08c3bdfSopenharmony_ci} 282f08c3bdfSopenharmony_ci 283f08c3bdfSopenharmony_cistatic void warn_goto2(void) 284f08c3bdfSopenharmony_ci{ 285f08c3bdfSopenharmony_ci a(); 286f08c3bdfSopenharmony_ci goto label; 287f08c3bdfSopenharmony_ci r(); 288f08c3bdfSopenharmony_cilabel: 289f08c3bdfSopenharmony_ci a(); 290f08c3bdfSopenharmony_ci r(); 291f08c3bdfSopenharmony_ci} 292f08c3bdfSopenharmony_ci 293f08c3bdfSopenharmony_cistatic void warn_goto3(void) 294f08c3bdfSopenharmony_ci{ 295f08c3bdfSopenharmony_ci a(); 296f08c3bdfSopenharmony_ci if(condition) 297f08c3bdfSopenharmony_ci goto label; 298f08c3bdfSopenharmony_ci r(); 299f08c3bdfSopenharmony_cilabel: 300f08c3bdfSopenharmony_ci r(); 301f08c3bdfSopenharmony_ci} 302f08c3bdfSopenharmony_ci 303f08c3bdfSopenharmony_cistatic void good_cond_lock1(void) 304f08c3bdfSopenharmony_ci{ 305f08c3bdfSopenharmony_ci if(ca(condition)) { 306f08c3bdfSopenharmony_ci condition2 = 1; /* do stuff */ 307f08c3bdfSopenharmony_ci r(); 308f08c3bdfSopenharmony_ci } 309f08c3bdfSopenharmony_ci} 310f08c3bdfSopenharmony_ci 311f08c3bdfSopenharmony_cistatic void warn_cond_lock1(void) 312f08c3bdfSopenharmony_ci{ 313f08c3bdfSopenharmony_ci if(ca(condition)) 314f08c3bdfSopenharmony_ci condition2 = 1; /* do stuff */ 315f08c3bdfSopenharmony_ci r(); 316f08c3bdfSopenharmony_ci} 317f08c3bdfSopenharmony_ci/* 318f08c3bdfSopenharmony_ci * check-name: Check -Wcontext 319f08c3bdfSopenharmony_ci * 320f08c3bdfSopenharmony_ci * check-error-start 321f08c3bdfSopenharmony_cicontext.c:69:13: warning: context imbalance in 'warn_lock1' - wrong count at exit 322f08c3bdfSopenharmony_cicontext.c:74:13: warning: context imbalance in 'warn_lock2' - wrong count at exit 323f08c3bdfSopenharmony_cicontext.c:81:13: warning: context imbalance in 'warn_lock3' - wrong count at exit 324f08c3bdfSopenharmony_cicontext.c:88:13: warning: context imbalance in 'warn_unlock1' - unexpected unlock 325f08c3bdfSopenharmony_cicontext.c:93:13: warning: context imbalance in 'warn_unlock2' - unexpected unlock 326f08c3bdfSopenharmony_cicontext.c:131:12: warning: context imbalance in 'warn_if1' - wrong count at exit 327f08c3bdfSopenharmony_cicontext.c:140:12: warning: context imbalance in 'warn_if2' - different lock contexts for basic block 328f08c3bdfSopenharmony_cicontext.c:202:9: warning: context imbalance in 'warn_while1' - different lock contexts for basic block 329f08c3bdfSopenharmony_cicontext.c:210:17: warning: context imbalance in 'warn_while2' - unexpected unlock 330f08c3bdfSopenharmony_cicontext.c:216:9: warning: context imbalance in 'warn_while3' - wrong count at exit 331f08c3bdfSopenharmony_cicontext.c:274:13: warning: context imbalance in 'warn_goto1' - wrong count at exit 332f08c3bdfSopenharmony_cicontext.c:283:13: warning: context imbalance in 'warn_goto2' - wrong count at exit 333f08c3bdfSopenharmony_cicontext.c:300:5: warning: context imbalance in 'warn_goto3' - different lock contexts for basic block 334f08c3bdfSopenharmony_cicontext.c:315:5: warning: context imbalance in 'warn_cond_lock1' - different lock contexts for basic block 335f08c3bdfSopenharmony_ci * check-error-end 336f08c3bdfSopenharmony_ci */ 337