Annotation of researchv10no/cmd/lcc/ph/c36.c, revision 1.1.1.1

1.1       root        1: /* The Plum Hall Validation Suite for C
                      2:  * Unpublished copyright (c) 1986-1991, Chiron Systems Inc and Plum Hall Inc.
                      3:  * VERSION: 4
                      4:  * DATE: 1993-01-01
                      5:  * The "ANSI" mode of this suite corresponds to official ANSI C, X3.159-1989.
                      6:  * As per your license agreement, your distribution is not to be moved or copied outside the Designated Site
                      7:  * without specific permission from Plum Hall Inc.
                      8:  */
                      9: 
                     10: #include "flags.h"
                     11: #ifndef SKIP36
                     12: /*
                     13:  * 3.6 - Statements
                     14:  */
                     15: #include "defs.h"
                     16: 
                     17: static void c3_6_1();
                     18: static void c3_6_2();
                     19: static void c3_6_3();
                     20: static void c3_6_4_1();
                     21: static void c3_6_4_2();
                     22: static void c3_6_5_1();
                     23: static void c3_6_5_2();
                     24: static void c3_6_5_3();
                     25: static void c3_6_6_1();
                     26: static void c3_6_6_2();
                     27: static void c3_6_6_3();
                     28: static void c3_6_6_4();
                     29: 
                     30: void c3_6()
                     31:        {
                     32:        Filename = "c36.c";
                     33:        c3_6_1();
                     34:        c3_6_2();
                     35:        c3_6_3();
                     36:        c3_6_4_1();
                     37:        c3_6_4_2();
                     38:        c3_6_5_1();
                     39:        c3_6_5_2();
                     40:        c3_6_5_3();
                     41:        c3_6_6_1();
                     42:        c3_6_6_2();
                     43:        c3_6_6_3();
                     44:        c3_6_6_4();
                     45:        }
                     46: 
                     47: 
                     48: 
                     49: 
                     50: 
                     51: 
                     52: /*
                     53:  * 3.6.1  - Labeled statements
                     54:  */
                     55: static void c3_6_1()
                     56:        {
                     57:        int i;
                     58:        /* labels do not interfere with the flow of control */
                     59:        i = 1;
                     60: a:
                     61:        iequals(__LINE__, i, 1);
                     62:        i = 2;
                     63: b:
                     64:        iequals(__LINE__, i, 2);
                     65:        i = 3;
                     66: c: d: e:
                     67:        iequals(__LINE__, i, 3);
                     68:        }
                     69: 
                     70: 
                     71: 
                     72: 
                     73: 
                     74: 
                     75: 
                     76: 
                     77: 
                     78: 
                     79: 
                     80: 
                     81: 
                     82: 
                     83: 
                     84: 
                     85: 
                     86: 
                     87: 
                     88: 
                     89: 
                     90: 
                     91: 
                     92: 
                     93: 
                     94: 
                     95: 
                     96: 
                     97: 
                     98: 
                     99: 
                    100: 
                    101: 
                    102: /*
                    103:  * 3.6.2  - Compound statement or block
                    104:  */
                    105: static void c3_6_2()
                    106:        {
                    107:        int i = 1;
                    108:                {
                    109:                int i = 2;
                    110:                        {
                    111:                        int i = 3, j = i + 1;
                    112:                        static float c3_6var = 5.;              /* see also 3.1.2.1 Scope */
                    113:                                {
                    114:                                /* initialize the block each time it is entered */
                    115:                                int j;
                    116:                                for (j = 7; j < 10; ++j)
                    117:                                lab:{
                    118:                                        int i = j;
                    119:                                        static int k = 9;
                    120: #if ANSI
                    121:                                        extern int c3_6var;
                    122:                                        iequals(__LINE__, i, j);
                    123:                                        iequals(__LINE__, k, 9);
                    124:                                        iequals(__LINE__, c3_6var, 12);
                    125: #endif /* ANSI */
                    126:                                        }
                    127:                                }
                    128:                        iequals(__LINE__, i, 3);
                    129:                        iequals(__LINE__, j, 4);
                    130:                        dequals(__LINE__, c3_6var, 5.);
                    131:                        }
                    132:                iequals(__LINE__, i, 2);
                    133:                }
                    134:        iequals(__LINE__, i, 1);
                    135:        }
                    136: int c3_6var = 12;
                    137: 
                    138: 
                    139: 
                    140: 
                    141: 
                    142: 
                    143: 
                    144: 
                    145: 
                    146: 
                    147: 
                    148: 
                    149: 
                    150: 
                    151: 
                    152: /*
                    153:  * 3.6.3  Expression and null statement
                    154:  */
                    155: static void c3_6_3()
                    156:        {
                    157:        int i, j, k;
                    158:        char p[4];
                    159:        /* expressions don't have to do anything */
                    160:        i = ivalue(11);
                    161:        ;;;;;
                    162:        i;
                    163:        1;2;(void)3;
                    164:        iequals(__LINE__, i, 11);
                    165: 
                    166: #if (V7 || ANSI)
                    167:        /* evaluate an expression for its side effects */
                    168:        (void)str_cpye(p, "abc");
                    169:        checkthat(__LINE__, str_cmp(p, "abc") == 0);
                    170:        str_cpye(p, "xyz");
                    171:        checkthat(__LINE__, str_cmp(p, "xyz") == 0);
                    172: #endif
                    173: 
                    174:        /* null statement in use */
                    175:        for (i = 0; i < 10; ++i)
                    176:                ;
                    177:        iequals(__LINE__, i, 10);
                    178: label: ;
                    179:        }
                    180: 
                    181: 
                    182: 
                    183: 
                    184: 
                    185: 
                    186: 
                    187: 
                    188: 
                    189: 
                    190: 
                    191: 
                    192: 
                    193: 
                    194: 
                    195: 
                    196: 
                    197: 
                    198: 
                    199: 
                    200: 
                    201: 
                    202: /*
                    203:  * 3.6.4 - Selection statements
                    204:  */
                    205: 
                    206: /*
                    207:  * 3.6.4.1  - The 'if' statement
                    208:  */
                    209: static void c3_6_4_1()
                    210:        {
                    211:        int i = ivalue(1), j = ivalue(2), k = ivalue(3);
                    212:        double d = dvalue(1.);
                    213:        char *p = 0;
                    214: 
                    215:        /* the controlling expr is of scalar type */
                    216:        if (d) dequals(__LINE__, d, 1.);
                    217:        else   complain(__LINE__);
                    218: 
                    219:        if (p) complain(__LINE__);
                    220:        else   aequals(__LINE__, p, (char *)0);
                    221: 
                    222:        /* check else binding (nearest if) */
                    223:        if (ivalue(i+j) == 0)
                    224:                complain(__LINE__);
                    225:        else if (ivalue(j+k) == 0)
                    226:                complain(__LINE__);
                    227:        else
                    228:                lab: i = 4;
                    229:        iequals(__LINE__, i, 4);
                    230: 
                    231:        /* and in the presence of labels */
                    232:        goto lab1;
                    233:        if (i != 0)
                    234: lab1:  i = 5;
                    235:        else
                    236:                i = 6;
                    237:        iequals(__LINE__, i, 5);
                    238: 
                    239:        goto lab2;
                    240:        if (i != 0)
                    241:                i = 7;
                    242:        else
                    243: lab2:  i = 8;
                    244:        iequals(__LINE__, i, 8);
                    245: 
                    246:        /* The tested expr is a sequence point. */
                    247:        i = ivalue(8);
                    248:        if (i == 0) { complain(__LINE__); if ( i > 0 ) complain(__LINE__); }
                    249:        else    iequals(__LINE__, i, 8);
                    250:        }
                    251: 
                    252: /*
                    253:  * 3.6.4.2 - The 'switch' statement
                    254:  */
                    255: static char carray[] = { 0, 1, 2, 3};
                    256: static short sarray[] = { 0, 1, 2, 3};
                    257: static long larray[] = { 0xff00000, 0xff10000, 0xff20000, 3};
                    258: static void c3_6_4_2()
                    259:        {
                    260: #if (ANSI || V7)
                    261:        enum e {zero, one, two, three} e;
                    262: #endif
                    263:        char c;
                    264:        int i, sum, flag;
                    265:        unsigned u;
                    266:        long l;
                    267:        short s;
                    268: 
                    269: #if ANSI
                    270:        {
                    271:        int a = 1;
                    272: 
                    273:        /* syntax does not require a block, only a stmt */
                    274:        switch (a) default: switch (a+1) default: a = 9;
                    275:        iequals(__LINE__, a, 9);
                    276:        switch(a) ;     /* do-nothing */
                    277:        }
                    278: #endif
                    279: 
                    280:        flag = sum = 0;
                    281:        for (i = 0; i < 10; ++i) 
                    282:                {
                    283:                switch(i)
                    284:                        {
                    285: inswitch:
                    286:                        case 0:
                    287:                        case 9:
                    288:                                sum += 1;
                    289:                                /* falls through */
                    290:                        case 1:
                    291:                        case 8:
                    292:                                sum += 2;
                    293:                                break;
                    294:                        default:
                    295:                                sum += 4;
                    296:                        }
                    297:                if (flag)
                    298:                        break;
                    299:                }
                    300: 
                    301: 
                    302:                                                                                                                                                                                /* 3.6.4.2 (cont.) */
                    303:        if (flag)
                    304:                /* gets here via goto below */
                    305:                iequals(__LINE__, sum, 37);
                    306:        else
                    307:                {
                    308:                iequals(__LINE__, sum, 34);
                    309:                /* check that switch control works on obscure entry */
                    310:                flag = 1;
                    311:                goto inswitch;
                    312:                }
                    313: 
                    314:        /* nested switch */
                    315:        for (i = 0; i < 2; ++i)
                    316:                switch(i)
                    317:                        {
                    318:                        default :
                    319:                                switch(i)
                    320:                                        {
                    321:                                        case 0:
                    322:                                                sum = 0;
                    323:                                                break;
                    324:                                        case 1 :
                    325:                                                sum += 1;
                    326:                                                break;
                    327:                                        }
                    328:                                break;
                    329:                        case 11:
                    330:                                sum = 123;
                    331:                        }
                    332:        iequals(__LINE__, sum, 1);
                    333: 
                    334:        /* the tested expr is a sequence point */
                    335:        i = ivalue(9);
                    336:        switch (i++)
                    337:                {
                    338:        case 9:
                    339:                iequals(__LINE__, i, 10);
                    340:                break;
                    341:        default:
                    342:                complain(__LINE__);
                    343:                }
                    344: 
                    345: 
                    346: 
                    347: 
                    348: 
                    349: 
                    350: 
                    351: 
                    352:                                                                                                                                                                                /* 3.6.4.2 (cont.) */
                    353:        /* switch with no match */
                    354:        switch(sum)
                    355:                {
                    356:                case 0:
                    357:                case 2:
                    358:                case 3:
                    359:                        sum = 123;
                    360:                        break;
                    361:                }
                    362:        iequals(__LINE__, sum, 1);
                    363: 
                    364:        /* unsigned should work correctly at the zero crossing */
                    365:        for (u = (unsigned)-1, sum = 0; u != 2; ++u)
                    366:                switch (u)
                    367:                        {
                    368:                        case -1:        /* promoted to unsigned */
                    369:                                sum += 1;
                    370:                                break;
                    371:                        case 0:
                    372:                                sum += 2;
                    373:                                break;
                    374:                        case 1:
                    375:                                sum += 4;
                    376:                                break;
                    377:                        default:
                    378:                                complain(__LINE__);
                    379:                        }
                    380:        iequals(__LINE__, sum, 7);
                    381: 
                    382: 
                    383: 
                    384: 
                    385: 
                    386: 
                    387: 
                    388: 
                    389: 
                    390: 
                    391: 
                    392: 
                    393: 
                    394: 
                    395: 
                    396: 
                    397: 
                    398: 
                    399: 
                    400: 
                    401: 
                    402:                                                                                                                                                                                /* 3.6.4.2 (cont.) */
                    403: #if ANSI
                    404:        /* ANSI allows all integral types to be used in a switch */
                    405:        for (i = 0, sum = 0; i <= 3; ++i)
                    406:                {
                    407:                switch (carray[i])
                    408:                        {
                    409:                        case 0:
                    410:                                sum += 1;
                    411:                                break;
                    412:                        case 1:
                    413:                                sum += 2;
                    414:                                break;
                    415:                        case 2:
                    416:                                sum += 4;
                    417:                                break;
                    418:                        case 3:
                    419:                                sum += 8;
                    420:                                break;
                    421:                        default:
                    422:                                complain(__LINE__);
                    423:                        }
                    424:                }
                    425:        iequals(__LINE__, sum, 15);
                    426: 
                    427:        for (i = 0, sum = 0; i <= 3; ++i)
                    428:                {
                    429:                switch (sarray[i])
                    430:                        {
                    431:                        case 0:
                    432:                                sum += 1;
                    433:                                break;
                    434:                        case 1:
                    435:                                sum += 2;
                    436:                                break;
                    437:                        case 2:
                    438:                                sum += 4;
                    439:                                break;
                    440:                        case 3:
                    441:                                sum += 8;
                    442:                                break;
                    443:                        default:
                    444:                                complain(__LINE__);
                    445:                        }
                    446:                }
                    447:        iequals(__LINE__, sum, 15);
                    448: 
                    449: 
                    450: 
                    451: 
                    452:                                                                                                                                                                                /* 3.6.4.2 (cont.) */
                    453:        for (i = 0, sum = 0; i <= 3; ++i)
                    454:                {
                    455:                switch (larray[i])
                    456:                        {
                    457:                        case 0xff00000:
                    458:                                sum += 1;
                    459:                                break;
                    460:                        case 0xff10000:
                    461:                                sum += 2;
                    462:                                break;
                    463:                        case 0xff20000:
                    464:                                sum += 4;
                    465:                                break;
                    466:                        case 3: /* must convert to long */
                    467:                                sum += 8;
                    468:                                break;
                    469:                        default:
                    470:                                complain(__LINE__);
                    471:                        }
                    472:                }
                    473:        iequals(__LINE__, sum, 15);
                    474:        for (e = (enum e)(i = 0), sum = 0; i <= 3; ++i, e = (enum e)i)
                    475:                {
                    476:                switch (e)
                    477:                        {
                    478:                        case zero:
                    479:                                sum += 1;
                    480:                                break;
                    481:                        case one:
                    482:                                sum += 2;
                    483:                                break;
                    484:                        case two:
                    485:                                sum += 4;
                    486:                                break;
                    487:                        case three:
                    488:                                sum += 8;
                    489:                                break;
                    490:                        default:
                    491:                                complain(__LINE__);
                    492:                        }
                    493:                }
                    494:        iequals(__LINE__, sum, 15);
                    495: #endif /* ANSI */
                    496:        } /* end c3_6_4_2 */
                    497: 
                    498: 
                    499: 
                    500: 
                    501: 
                    502: /*
                    503:  * 3.6.5  - Iteration statements
                    504:  */
                    505: 
                    506: /*
                    507:  * 3.6.5.1 - The 'while' statement
                    508:  */
                    509: static void c3_6_5_1()
                    510:        {
                    511:        int sum, i;
                    512: 
                    513:        /* the controlling expr is of scalar type */
                    514:        { float v=0;            while (v) { complain(__LINE__); break; } }
                    515:        { int (*v)()=0;         while (v) { complain(__LINE__); break; } }
                    516:        { char *v=0;            while (v) { complain(__LINE__); break; } }
                    517:        { struct unk *v=0;      while (v) { complain(__LINE__); break; } }
                    518:        { enum {z} v=0;         while (v) { complain(__LINE__); break; } }
                    519:        { char v=0;                     while (v) { complain(__LINE__); break; } }
                    520:        { unsigned v=0;         while (v) { complain(__LINE__); break; } }
                    521: 
                    522:        i = 10;
                    523:        sum = 0;
                    524:        /* make sure the bounds are computed each time through */
                    525:        while (i)
                    526:                {
                    527:                sum += i;
                    528:                if (--i == 5)
                    529:                        i = 0;
                    530:                }
                    531:        iequals(__LINE__, sum, 40); 
                    532: 
                    533:        /* zero execution loop */
                    534:        sum = 0;
                    535:        while (i)
                    536:                sum = 99;
                    537:        iequals(__LINE__, sum, 0);
                    538: 
                    539:        /* the controlling expr is a sequence point */
                    540:        i = ivalue(1);
                    541:        while ( i -- )
                    542:                iequals(__LINE__, i, 0);
                    543:        }
                    544: 
                    545: 
                    546: 
                    547: 
                    548: 
                    549: 
                    550: 
                    551: 
                    552: /*
                    553:  * 3.6.5.2 - The 'do' statement
                    554:  */
                    555: static void c3_6_5_2()
                    556:        {
                    557:        int sum, i;
                    558: 
                    559:        /* the controlling expr is of scalar type */
                    560:        { float v=0;            do { checkthat(__LINE__, v == 0); } while (v); }
                    561:        { int (*v)()=0;         do { checkthat(__LINE__, v == 0); } while (v); }
                    562:        { char *v=0;            do { checkthat(__LINE__, v == 0); } while (v); }
                    563:        { struct unk *v=0;      do { checkthat(__LINE__, v == 0); } while (v); }
                    564:        { enum {z} v=0;         do { checkthat(__LINE__, v == 0); } while (v); }
                    565:        { char v=0;                     do { checkthat(__LINE__, v == 0); } while (v); }
                    566:        { unsigned v=0;         do { checkthat(__LINE__, v == 0); } while (v); }
                    567:        i = 10;
                    568:        sum = 0;
                    569:        /* make sure the bounds are computed each time through */
                    570:        do 
                    571:                {
                    572:                sum += i;
                    573:                if (--i == 5)
                    574:                        i = 0;
                    575:                } while(i);
                    576:        iequals(__LINE__, sum, 40); 
                    577: 
                    578:        /* guarantee one execution of the loop */
                    579:        sum = 0;
                    580:        do
                    581:                {
                    582:                i = 0;
                    583:                sum ++;
                    584:                } while(i);
                    585:        iequals(__LINE__, sum, 1);
                    586: 
                    587:        /* the controlling expr is a sequence point */
                    588:        i = ivalue(1);
                    589:        do { } while (i-- == 1); iequals(__LINE__, i, -1);
                    590:        }
                    591: 
                    592: 
                    593: 
                    594: 
                    595: 
                    596: 
                    597: 
                    598: 
                    599: 
                    600: 
                    601: 
                    602: /*
                    603:  * 3.6.5.3 - The 'for' loop.
                    604:  */
                    605: static void c3_6_5_3()
                    606:        {
                    607:        int i, j;
                    608: 
                    609:        /* check that the for loop behaves the same as its decomposition */
                    610:        for (i = 0, j = 0; i < 10; ++i)
                    611:                j += i;
                    612:        iequals(__LINE__, j, 45);
                    613: 
                    614:        i = 0; j = 0;
                    615:        while(i < 10)
                    616:                {
                    617:                j += i;
                    618:                ++i;
                    619:                }
                    620:        iequals(__LINE__, j, 45);
                    621: 
                    622:        /* any of the three fields can be left out */
                    623:        i = 0; j = 0;
                    624:        for (; i < 10; ++i)
                    625:                j += i;
                    626:        iequals(__LINE__, j, 45);
                    627: 
                    628:        for (i = 0, j = 0; ; (void)++i)
                    629:                {
                    630:                j += i;
                    631:                if (i >= 10)
                    632:                        break;
                    633:                }
                    634:        iequals(__LINE__, j, 55);
                    635: 
                    636:        for (i = 0, (void)(j = 0); i < 10;)
                    637:                {
                    638:                j += i;
                    639:                ++i;
                    640:                }
                    641:        iequals(__LINE__, j, 45);
                    642: 
                    643:        /* a for loop can be jumped into */
                    644:        i = 5, j = 0;
                    645:        goto forloop;
                    646:        for (i = 0, j = 0; i < 10; ++i)
                    647:                forloop: j += i;
                    648:        iequals(__LINE__, j, 35);
                    649: 
                    650: 
                    651: 
                    652:        /* each 'for' line expr is a sequence point */
                    653:        for (i = ivalue(1); i-- ; )
                    654:                iequals(__LINE__, i, 0);
                    655:        } /* end 3.6.5.3 */
                    656: 
                    657: 
                    658: /*
                    659:  * 3.6.6 - Jump statements
                    660:  */
                    661: 
                    662: /*
                    663:  * 3.6.6.1  - The goto statement
                    664:  */
                    665: static void c3_6_6_1()
                    666:        {
                    667:        goto label;
                    668:        complain(__LINE__);
                    669:                {
                    670:                complain(__LINE__);
                    671:                label:;
                    672:                goto label2;
                    673:                complain(__LINE__);
                    674:                }
                    675:        complain(__LINE__);
                    676:        label2: ;
                    677:        }
                    678: 
                    679: 
                    680: 
                    681: 
                    682: 
                    683: 
                    684: 
                    685: 
                    686: 
                    687: 
                    688: 
                    689: 
                    690: 
                    691: 
                    692: 
                    693: 
                    694: 
                    695: 
                    696: 
                    697: 
                    698: 
                    699: 
                    700: 
                    701: 
                    702: /*
                    703:  * 3.6.6.2 - The 'continue' statement
                    704:  */
                    705: static void c3_6_6_2()
                    706:        {
                    707:        int i, j, k;
                    708:        /* check them out in for/while/do loops */
                    709:        /* a nested example ... */
                    710:        i = ivalue(0);
                    711:        for (k = 0; k < 3; ++k)
                    712:                {
                    713:                iequals(__LINE__, i, 0);
                    714:                for (i = 0, j = 0; i < 10; ++i)
                    715:                        if (i%2)
                    716:                                continue;
                    717:                        else
                    718:                                j += i;
                    719:                iequals(__LINE__, j, 20);
                    720:                i = ivalue(0);
                    721:                }
                    722: 
                    723:        i = ivalue(10);
                    724:        j = ivalue(0);
                    725:        while (--i)
                    726:                if (i%2)
                    727:                        continue;
                    728:                else
                    729:                        j += i;
                    730:        iequals(__LINE__, j, 20);
                    731: 
                    732:        j = ivalue(0);
                    733:        do
                    734:                if (i%2)
                    735:                        continue;
                    736:                else
                    737:                        j += i;
                    738:                while (++i < 10);
                    739:        iequals(__LINE__, j, 20);
                    740:        }
                    741: 
                    742: 
                    743: 
                    744: 
                    745: 
                    746: 
                    747: 
                    748: 
                    749: 
                    750: 
                    751: 
                    752: /*
                    753:  * 3.6.6.3  - The 'break' statement
                    754:  */
                    755: static void c3_6_6_3()
                    756:        {
                    757:        int i, j, k;
                    758: 
                    759:        /* test in each of for/while/do/switch */
                    760:        /* a nested example ... */
                    761:        for (k = 0; k < 3; ++k)
                    762:                {
                    763:                j = 0;
                    764:                for (i = 0; i < 10; ++i)
                    765:                        if (i == 4)
                    766:                                break;
                    767:                        else
                    768:                                j += i;
                    769:                iequals(__LINE__, j, 6);
                    770:                }
                    771:        iequals(__LINE__, k, 3);
                    772: 
                    773:        while (i--)
                    774:                if (i == 1)
                    775:                        break;
                    776:                else
                    777:                        --j;
                    778:        iequals(__LINE__, j, 4);
                    779: 
                    780:        do
                    781:                if (--j == 3)
                    782:                        break;
                    783:                else
                    784:                        ++i;
                    785:                while (j);
                    786:        iequals(__LINE__, i, 1);
                    787: 
                    788:        switch(i)
                    789:                {
                    790:                case 1:
                    791:                        break;
                    792:                default:
                    793:                        i = 99;
                    794:                }
                    795:        iequals(__LINE__, i, 1);
                    796:        }
                    797: 
                    798: 
                    799: 
                    800: 
                    801: 
                    802: /*
                    803:  * 3.6.6.4  - The 'return' statement
                    804:  */
                    805: double fc3_664() { return 99; }        /* must convert */
                    806: 
                    807: static void c3_6_6_4()
                    808:        {
                    809:        int i;
                    810: 
                    811:        dequals(__LINE__, fc3_664(), 99.);
                    812:        i = ivalue(0);
                    813:        if (!i)
                    814:                return;
                    815:        complain(__LINE__);
                    816: 
                    817:        /* the expression on the return stmt is a sequence point, */
                    818:        /* but so too is any means of examining its side-effects */
                    819:        }
                    820: 
                    821: #else /* if SKIP36 */
                    822: 
                    823: void c3_6() { pr_skip("c3_6: SKIPPED ENTIRELY\n"); }
                    824: #endif /* SKIP36 */
                    825: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.