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