Annotation of researchv10no/cmd/lcc/ph/c33b.c, revision 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 SKIP33B
        !            12: /*
        !            13:  * c33b.c - extension of 3.3 (Expressions).
        !            14:  */
        !            15: #include "defs.h"
        !            16: static void c3_3_5();
        !            17: static void c3_3_6();
        !            18: static void c3_3_7();
        !            19: static void c3_3_8();
        !            20: static void c3_3_9();
        !            21: static void c3_3_10();
        !            22: static void c3_3_11();
        !            23: static void c3_3_12();
        !            24: static void c3_3_13();
        !            25: static void c3_3_14();
        !            26: static void c3_3_15();
        !            27: static void c3_3_16();
        !            28: static void c3_3_16_1();
        !            29: static void c3_3_16_2();
        !            30: static void c3_3_17();
        !            31: static long larray[10] = {0,1,2,3,4,5,6,7,8,9};
        !            32: void c3_3b()
        !            33:        {
        !            34:        Filename = "c33b.c";
        !            35:        c3_3_5();
        !            36:        c3_3_6();
        !            37:        c3_3_7();
        !            38:        c3_3_8();
        !            39:        c3_3_9();
        !            40:        c3_3_10();
        !            41:        c3_3_11();
        !            42:        c3_3_12();
        !            43:        c3_3_13();
        !            44:        c3_3_14();
        !            45:        c3_3_15();
        !            46:        c3_3_16();
        !            47:        c3_3_16_1((generic_ptr)Filename);
        !            48:        c3_3_16_2();
        !            49:        c3_3_17();
        !            50:        }
        !            51: 
        !            52: /*
        !            53:  * 3.3.5 - Multiplicative operators
        !            54:  */
        !            55: static void c3_3_5()
        !            56:        {
        !            57:        double d = 1.9, e = 2.7;
        !            58:        int i = 4, j = 7;
        !            59: 
        !            60:        /* commutativity */
        !            61:        iequals(__LINE__, i*j, j*i);
        !            62: 
        !            63:        /* associates L->R */
        !            64:        dequals(__LINE__, j % i * d, d * 3);
        !            65: 
        !            66:        /* "usual arith conversions" (ANSI) are value-preserving */
        !            67: #if ANSI
        !            68:        {
        !            69:        unsigned char uc = 5;
        !            70: 
        !            71: #if MAX_UCHAR <= MAX_INT
        !            72:        checkthat(__LINE__, uc / -2 == -3 || uc / -2 == -2);
        !            73: #endif
        !            74:        }
        !            75: #endif
        !            76: 
        !            77:        /* positive result of division must round toward 0 */
        !            78:        iequals(__LINE__, j / i, 1);
        !            79:        iequals(__LINE__, -j / -i, 1);
        !            80: 
        !            81:        /* mixed mode arithmetic -- this is done as double */
        !            82:        iequals(__LINE__, (int)(d * i), 7); 
        !            83:        iequals(__LINE__, (int)(i * d), 7); 
        !            84:        iequals(__LINE__, (int)(i / d), 2); 
        !            85: 
        !            86:        /* but not this */
        !            87:        iequals(__LINE__, i % (int)e, 0); 
        !            88: 
        !            89:        /* definitive property */
        !            90:        iequals(__LINE__, (i/j)*j + i%j, i);
        !            91:        i = -4;
        !            92:        iequals(__LINE__, (i/j)*j + i%j, i);
        !            93: 
        !            94:        }
        !            95: 
        !            96: 
        !            97: 
        !            98: 
        !            99: 
        !           100: 
        !           101: 
        !           102: /*
        !           103:  * 3.3.6 - Additive operators
        !           104:  */
        !           105: static void c3_3_6()
        !           106:        {
        !           107:        double d = 4.2;
        !           108:        long *pd1, *pd2;
        !           109:        int i = 1;
        !           110: 
        !           111:        /* check out mixed mode addition/subtraction */
        !           112:        dequals(__LINE__, d+ivalue(7), 11.2);
        !           113: 
        !           114:        /* adding/subtracting an integral expression from a pointer */
        !           115:        pd1 = &larray[4];
        !           116:        pd2 = &larray[7];
        !           117:        lequals(__LINE__, *(pd1 - ivalue(3)), 1L);
        !           118:        lequals(__LINE__, *(pd2 - ivalue(3)), 4L);
        !           119: 
        !           120:        /* pointer - pointer */
        !           121:        iequals(__LINE__, pd2 - pd1, 3);
        !           122:        iequals(__LINE__, pd1 - pd2, -3);
        !           123:        pd1 = &larray[9];
        !           124:        pd2 = pd1 + 1;
        !           125:        checkthat(__LINE__, pd2 - pd1 == 1);
        !           126: 
        !           127:        /* no re-grouping, except by "as-if" rule */
        !           128: #if ANSI
        !           129:        {
        !           130:        unsigned ui = MAX_UINT;
        !           131:        ULONG ul = 0;
        !           132:        double d1 = dvalue((DBL_MAX/3.)*2. + DBL_MAX/10.);
        !           133: 
        !           134:        ul = (ui + 1) + ul;
        !           135:        checkthat(__LINE__, ul == 0L);
        !           136: #define SUM (d1 + -(DBL_MAX/3.)*2.)
        !           137:        dequals(__LINE__, SUM + SUM, dvalue(DBL_MAX/10. + DBL_MAX/10.)); /* no re-grouping */
        !           138:        }
        !           139: #endif
        !           140:        } /* end c3_3_6 */
        !           141: 
        !           142: 
        !           143: 
        !           144: 
        !           145: 
        !           146: 
        !           147: 
        !           148: 
        !           149: 
        !           150: 
        !           151: 
        !           152: /*
        !           153:  * 3.3.7 - Bitwise shift operators
        !           154:  */
        !           155: static void c3_3_7()
        !           156:        {
        !           157:        unsigned char c = 1;
        !           158:        int i = 4;
        !           159:        unsigned int ui = 0xffff;
        !           160:        int count;
        !           161: 
        !           162:        /* how many bits in a char ? */
        !           163:        for (count = 0; c; c <<= 1, ++count)
        !           164:                ;
        !           165:        /* bits in a long */
        !           166:        count *= sizeof(long);
        !           167: 
        !           168: #if !ANSI
        !           169:        /* before ANSI, if either operand was long, the shift was long */
        !           170:        lequals(__LINE__, 1 << (count - 1L), 1L << (long)(count - 1L));
        !           171: #else
        !           172:        iequals(__LINE__, sizeof(c << 2L), sizeof(int));
        !           173:        iequals(__LINE__, count, CHAR_BIT * sizeof(long));
        !           174: #endif
        !           175: 
        !           176:        /* make sure that 'vacated bits' are filled with 0 */
        !           177:        checkthat(__LINE__, ((int)0xff << i)  == (int)0xff0); 
        !           178: 
        !           179:        /* shift of unsigned must 0 fill */
        !           180:        iequals(__LINE__, (ui >> i), (int)0x0fff); 
        !           181: 
        !           182:        /* right shift of signed item -- behavior is implem-defined */
        !           183:        checkthat( - __LINE__, (~0 >> 1) == ~0 || (~0 >> 1) == ((unsigned)~0 >> 1));
        !           184:        }
        !           185: 
        !           186: 
        !           187: 
        !           188: 
        !           189: 
        !           190: 
        !           191: 
        !           192: 
        !           193: 
        !           194: 
        !           195: 
        !           196: 
        !           197: 
        !           198: 
        !           199: 
        !           200: 
        !           201: 
        !           202: /*
        !           203:  * 3.3.8 - Relational operators
        !           204:  */
        !           205: static void c3_3_8()
        !           206:        {
        !           207:        long *pl1 = &larray[3];
        !           208:        long *pl2 = &larray[5];
        !           209:        double d = 11.0;
        !           210:        unsigned ui1 = 5;
        !           211:        int i = -2;
        !           212: 
        !           213:        /* (non-intuitive?) integer promotions */
        !           214:        checkthat(__LINE__, ui1 < i);
        !           215: 
        !           216:        /* value context */
        !           217:        iequals(__LINE__, pl1 < pl2, 1);
        !           218:        iequals(__LINE__, d > *pl1, 1);
        !           219:        iequals(__LINE__, pl1 <= pl2, 1);
        !           220:        iequals(__LINE__, d >= *pl1, 1);
        !           221: 
        !           222:        /* condition context */
        !           223:        if(pl1 < pl2)
        !           224:                ;
        !           225:        else
        !           226:                complain(__LINE__);
        !           227:        if(d > *pl1)
        !           228:                ;
        !           229:        else
        !           230:                complain(__LINE__);
        !           231: 
        !           232:        if(pl1 <= pl2)
        !           233:                ;
        !           234:        else
        !           235:                complain(__LINE__);
        !           236:        if(d >= *pl1)
        !           237:                ;
        !           238:        else
        !           239:                complain(__LINE__);
        !           240: 
        !           241:        /* check out associativity */
        !           242:        iequals(__LINE__, pl1[0] < d < pl1[1] , 1);
        !           243:        iequals(__LINE__, pl1[0] < d < 1 , 0);
        !           244:        iequals(__LINE__, pl1[0] < d <= 1 , 1);
        !           245:        iequals(__LINE__, *pl1 > d >= 0, 1);
        !           246: 
        !           247: 
        !           248: 
        !           249: 
        !           250: 
        !           251: 
        !           252: #if ANSI8706                                                                                                                                                           /* 3.3.8 (cont.) */
        !           253:        {
        !           254:        struct known { int i; } s = {0};
        !           255:        struct unknown *psu;
        !           256:        void *gp; volatile void *vgp;
        !           257: 
        !           258:        psu = (struct unknown *)&s;
        !           259:        vgp = gp = psu;
        !           260:        checkthat(__LINE__, gp == psu);
        !           261:        iequals(__LINE__, gp < vgp, 0);
        !           262:        iequals(__LINE__, (const struct unknown *)psu < (struct unknown *)avalue(psu), 0);
        !           263:        }
        !           264: #endif
        !           265: #if ANSI8709
        !           266:        iequals(__LINE__, (const char *)avalue(pl1) < (char *)avalue(pl1), 0);
        !           267: #endif
        !           268: 
        !           269:        /* special cases for "last-plus-one" members */
        !           270:        {
        !           271:        long a[10];
        !           272:        long *p = &a[9];
        !           273:        iequals(__LINE__, &a[9] < &a[10], 1);
        !           274:        iequals(__LINE__, p+1 > p, 1);
        !           275:        iequals(__LINE__, p+1 < p, 0);
        !           276:        iequals(__LINE__, &a[9] < a+10 , 1);
        !           277:        }
        !           278: 
        !           279:        /* result has type int */
        !           280: #if ANSI
        !           281:        { double x=0, y=0; iequals(__LINE__, sizeof(x < y), sizeof(int)); }
        !           282: #endif
        !           283:        } /* end c3_3_8 */
        !           284: 
        !           285: 
        !           286: 
        !           287: 
        !           288: 
        !           289: 
        !           290: 
        !           291: 
        !           292: 
        !           293: 
        !           294: 
        !           295: 
        !           296: 
        !           297: 
        !           298: 
        !           299: 
        !           300: 
        !           301: 
        !           302: /*
        !           303:  * 3.3.9 - Equality operators
        !           304:  */
        !           305: static void c3_3_9()
        !           306:        {
        !           307:        long *pl1 = &larray[4];
        !           308:        long *pl2 = &larray[6];
        !           309:        generic_ptr gp = (generic_ptr)pl1;
        !           310:        void (*p3_8)() = c3_3_8;
        !           311:        void (*p3_9)() = c3_3_9;
        !           312: 
        !           313:        /* equality of pointers */
        !           314:        checkthat(__LINE__, p3_8 == c3_3_8);
        !           315:        checkthat(__LINE__, p3_9 != c3_3_8);
        !           316: #if ANSI
        !           317:        checkthat(__LINE__, gp == pl1);
        !           318: #else
        !           319:        checkthat(__LINE__, gp == (generic_ptr)pl1);
        !           320: #endif
        !           321: #if ANSI8709
        !           322:        checkthat(__LINE__, (char *)pl1 == (void *)pl1);
        !           323:        checkthat(__LINE__, (const char *)pl1 == (char *)pl1);
        !           324:        checkthat(__LINE__, pl1 != (void *)0);
        !           325:        checkthat(__LINE__, pl1 != (const void *)pl2);
        !           326: #endif
        !           327: 
        !           328:        /* value context */
        !           329:        iequals(__LINE__, pl1 == &larray[4], 1);
        !           330:        iequals(__LINE__, pl1 == pl2, 0);
        !           331:        iequals(__LINE__, pl1 != 0, 1);
        !           332:        iequals(__LINE__, *pl1 != *pl2, 1);
        !           333: 
        !           334:        /* condition context */
        !           335:        if (pl1 == &larray[4])
        !           336:                ;
        !           337:        else
        !           338:                complain(__LINE__);
        !           339: 
        !           340:        if (pl1 != pl2)
        !           341:                ;
        !           342:        else
        !           343:                complain(__LINE__);
        !           344:        if (pl1 != 0)
        !           345:                ;
        !           346:        else
        !           347:                complain(__LINE__);
        !           348:        if (*pl1 != *pl2)
        !           349:                ;
        !           350:        else
        !           351:                complain(__LINE__);
        !           352:                                                                                                                                                                                        /* 3.3.9 (cont.) */
        !           353:        /* associativity */
        !           354:        iequals(__LINE__, *pl1 == *pl2 == 1, 0);
        !           355:        iequals(__LINE__, *pl1 != *pl2 == 1, 1);
        !           356:        iequals(__LINE__, pl1 < pl2 != pl2 < pl1, 1);
        !           357: 
        !           358:        /* result has type int */
        !           359: #if ANSI
        !           360:        { double x=0, y=0; iequals(__LINE__, sizeof(x != y), sizeof(int)); }
        !           361: #endif
        !           362:        }
        !           363: 
        !           364: 
        !           365: 
        !           366: 
        !           367: 
        !           368: 
        !           369: 
        !           370: 
        !           371: 
        !           372: 
        !           373: 
        !           374: 
        !           375: 
        !           376: 
        !           377: 
        !           378: 
        !           379: 
        !           380: 
        !           381: 
        !           382: 
        !           383: 
        !           384: 
        !           385: 
        !           386: 
        !           387: 
        !           388: 
        !           389: 
        !           390: 
        !           391: 
        !           392: 
        !           393: 
        !           394: 
        !           395: 
        !           396: 
        !           397: 
        !           398: 
        !           399: 
        !           400: 
        !           401: 
        !           402: /*
        !           403:  * 3.3.10 - Bitwise AND operator
        !           404:  */
        !           405: static void c3_3_10()
        !           406:        {
        !           407:        int a = 7, b = 2;
        !           408:        long l = 6;
        !           409: #if ANSI
        !           410:        iequals(__LINE__, sizeof(a & l), sizeof(long));
        !           411: #endif
        !           412:        lequals(__LINE__, a & l, 6L);
        !           413:        iequals(__LINE__, a & b, 2);
        !           414:        iequals(__LINE__, b & a, 2);
        !           415:        iequals(__LINE__, a & 0, 0);
        !           416:        iequals(__LINE__, a & ~0, a);
        !           417:        }
        !           418: /*
        !           419:  * 3.3.11 - Bitwise exclusive OR operator
        !           420:  */
        !           421: static void c3_3_11()
        !           422:        {
        !           423:        int a = 7, b = 2;
        !           424:        long l = 6;
        !           425: #if ANSI
        !           426:        iequals(__LINE__, sizeof(a ^ l), sizeof(long));
        !           427: #endif
        !           428:        lequals(__LINE__, a ^ l, 1L);
        !           429:        iequals(__LINE__, a ^ b, 5);
        !           430:        iequals(__LINE__, b ^ a, 5);
        !           431:        a = a^b; b = a^b; a = a^b;      /* swap a and b */
        !           432:        iequals(__LINE__, a, 2);
        !           433:        iequals(__LINE__, b, 7);
        !           434:        }
        !           435: /*
        !           436:  * 3.3.12 - Bitwise OR operator
        !           437:  */
        !           438: static void c3_3_12()
        !           439:        {
        !           440:        int a = 5, b = 2;
        !           441:        long l = 6;
        !           442: #if ANSI
        !           443:        iequals(__LINE__, sizeof(a | l), sizeof(long));
        !           444: #endif
        !           445:        lequals(__LINE__, a | l, 7L);
        !           446:        iequals(__LINE__, a | b, 7);
        !           447:        iequals(__LINE__, b | a, 7);
        !           448:        iequals(__LINE__, a | 0, a);
        !           449:        iequals(__LINE__, a | ~0, ~0);
        !           450:        }
        !           451: 
        !           452: /*
        !           453:  * 3.3.13 - Logical AND operator
        !           454:  */
        !           455: static void c3_3_13()
        !           456:        {
        !           457:        int zero = 0;
        !           458:        int one = 1;
        !           459:        extern int Side;
        !           460: 
        !           461:        /* side effect checks in a value producing context */
        !           462:        Side = 0;
        !           463:        scheck(__LINE__, ++Side && zero, 1, 0); 
        !           464:        scheck(__LINE__, ++Side && one, 1, 1); 
        !           465:        scheck(__LINE__, zero && ++Side, 0, 0);
        !           466:        scheck(__LINE__, one && ++Side, 1, 1);
        !           467: 
        !           468:        /* side effects in a condition producing context */
        !           469:        if (++Side && zero)
        !           470:                complain(__LINE__);
        !           471:        iequals(__LINE__, Side--, 1);
        !           472: 
        !           473:        if (++Side && one)
        !           474:                ;
        !           475:        else
        !           476:                complain(__LINE__);
        !           477:        iequals(__LINE__, Side--, 1);
        !           478: 
        !           479:        if (zero && ++Side)
        !           480:                complain(__LINE__);
        !           481:        iequals(__LINE__, Side, 0);
        !           482: 
        !           483:        if (one && ++Side)
        !           484:                ;
        !           485:        else
        !           486:                complain(__LINE__);
        !           487:        iequals(__LINE__, Side--, 1);
        !           488: 
        !           489: #if ANSI
        !           490:        /* result is of type int */
        !           491:        { double x=0, y=0; iequals(__LINE__, sizeof(x && y), sizeof(int)); }
        !           492: #endif
        !           493:        /* operands are of scalar type */
        !           494:        { double x=0, y=0; iequals(__LINE__, x && y, 0); }
        !           495:        { generic_ptr x=0, y=0; iequals(__LINE__, x && y, 0); }
        !           496:        { enum {z} x=0, y=0; iequals(__LINE__, x && y, 0); }
        !           497:        } /* end c3_3_14 */
        !           498: 
        !           499: 
        !           500: 
        !           501: 
        !           502: /*
        !           503:  * 3.3.14 - Logical OR operator
        !           504:  */
        !           505: static void c3_3_14()
        !           506:        {
        !           507:        int zero = 0;
        !           508:        int one = 1;
        !           509:        extern int Side;
        !           510: 
        !           511:        /* side effect checks in a value producing context */
        !           512:        Side = 0;
        !           513:        scheck(__LINE__, ++Side || zero, 1, 1); 
        !           514:        scheck(__LINE__, ++Side || one, 1, 1); 
        !           515:        scheck(__LINE__, zero || ++Side, 1, 1);
        !           516:        scheck(__LINE__, one || ++Side, 0, 1);
        !           517: 
        !           518:        /* side effects in a condition producing context */
        !           519:        if (++Side || zero)
        !           520:                ;
        !           521:        else
        !           522:                complain(__LINE__);
        !           523:        iequals(__LINE__, Side--, 1);
        !           524: 
        !           525:        if (++Side || one)
        !           526:                ;
        !           527:        else
        !           528:                complain(__LINE__);
        !           529:        iequals(__LINE__, Side--, 1);
        !           530: 
        !           531:        if (zero || ++Side)
        !           532:                ;
        !           533:        else
        !           534:                complain(__LINE__);
        !           535:        iequals(__LINE__, Side--, 1);
        !           536: 
        !           537:        if (one || ++Side)
        !           538:                ;
        !           539:        else
        !           540:                complain(__LINE__);
        !           541:        iequals(__LINE__, Side, 0);
        !           542: 
        !           543: #if ANSI
        !           544:        /* result is of type int */
        !           545:        { double x=0, y=0; iequals(__LINE__, sizeof(x || y), sizeof(int)); }
        !           546: #endif
        !           547:        /* operands are of scalar type */
        !           548:        { double x=0, y=0; iequals(__LINE__, x || y, 0); }
        !           549:        { generic_ptr x=0, y=0; iequals(__LINE__, x || y, 0); }
        !           550:        { enum {z} x=0, y=0; iequals(__LINE__, x || y, 0); }
        !           551:        } /* end c3_3_13 */
        !           552: /*
        !           553:  * 3.3.15 - Conditional operator
        !           554:  */
        !           555: static int If1, If2;
        !           556: void f1(){If1 = 7;}
        !           557: void f2(){If2 = 11;}
        !           558: static int iarray[] = {7, 11};
        !           559: static void c3_3_15()
        !           560:        {
        !           561:        int one = ivalue(1), zero = ivalue(0);
        !           562:        int *p1 = &one, *p0 = &zero;
        !           563:        generic_ptr gp = (generic_ptr)p1;
        !           564:        extern int Side;
        !           565:        char *pc;
        !           566: 
        !           567:        Side = 0;
        !           568:        /* side effect checks in a value producing context */
        !           569:        scheck(__LINE__, ++Side ? one : zero, 1, 1); 
        !           570:        scheck(__LINE__, zero ? one : ++Side, 1, 1);
        !           571:        scheck(__LINE__, one ? one : ++Side, 0, 1);
        !           572: 
        !           573:        /* side effects in a condition producing context */
        !           574:        if (++Side ? one : zero)
        !           575:                ;
        !           576:        else
        !           577:                complain(__LINE__);
        !           578:        iequals(__LINE__, Side--, 1);
        !           579: 
        !           580:        if (zero ? one : ++Side)
        !           581:                ;
        !           582:        else
        !           583:                complain(__LINE__);
        !           584:        iequals(__LINE__, Side--, 1);
        !           585: 
        !           586:        if (one ? ++Side: zero)
        !           587:                ;
        !           588:        else
        !           589:                complain(__LINE__);
        !           590:        iequals(__LINE__, Side, 1);
        !           591: 
        !           592: #if ANSI8709
        !           593:        checkthat(__LINE__, (one ? Side=5 : 6)                    == 5);
        !           594:        checkthat(__LINE__, (one ?  2,3  :  4)                    == 3);
        !           595:        checkthat(__LINE__, (one ? (char *)p1 : (const char *)p0) == (const char *)p1);
        !           596:        checkthat(__LINE__, (one ? (char *)p1 : (void *)p0)       == /* (void *) */ p1);
        !           597:        pc = zero ? (char *)p1 : 0;
        !           598:        checkthat(__LINE__, pc == 0);
        !           599:        { double x=0; char y=1; checkthat(__LINE__, sizeof(one ? x : y) == sizeof(x) && (one ? x : y) == 0); }
        !           600: #endif
        !           601: 
        !           602:        /* arms can be scalar, void, struct, pointer */                                                                                                                                         /* 3.3.15 (cont.) */
        !           603:        iequals(__LINE__, one ? one : zero, one); 
        !           604:        iequals(__LINE__, zero ? one : zero, zero); 
        !           605:        aequals(__LINE__, one ? p1 : p0, p1);
        !           606:        aequals(__LINE__, zero ? p1 : p0, p0);
        !           607:        aequals(__LINE__, one ? NULL : p0, NULL);
        !           608:        aequals(__LINE__, zero ? p1 : NULL, NULL);
        !           609:        iequals(__LINE__, *(one ? p1 : p0), 1); 
        !           610:        iequals(__LINE__, *(zero ? p1 : p0), 0); 
        !           611: #if ANSI
        !           612:        aequals(__LINE__, one ? gp : p0, gp);
        !           613:        checkthat(__LINE__, (zero ? &f1 : 0) == 0);
        !           614: #endif
        !           615:        checkthat(__LINE__, (one ? f1 : 0) == f1);
        !           616: #if ANSI
        !           617:        /* function calls in both arms -- only one should be called */
        !           618:        If1 = If2 = 0;
        !           619:        one ? f1(): f2();
        !           620:        iequals(__LINE__, If1, 7);
        !           621:        iequals(__LINE__, If2, 0);
        !           622:        If1 = If2 = 0;
        !           623:        zero ? f1(): f2();
        !           624:        iequals(__LINE__, If1, 0);
        !           625:        iequals(__LINE__, If2, 11);
        !           626: #endif
        !           627:        /* function pointers in both arms */
        !           628:        If1 = If2 = 0;
        !           629:        (*(one ? f1 : f2))();
        !           630:        iequals(__LINE__, If1, 7);
        !           631:        iequals(__LINE__, If2, 0);
        !           632:        If1 = If2 = 0;
        !           633:        (*(zero ? f1 : f2))();
        !           634:        iequals(__LINE__, If1, 0);
        !           635:        iequals(__LINE__, If2, 11);
        !           636: 
        !           637:        /* struct/union in arms are tested in structures() in c33c.c */
        !           638: 
        !           639:        /* check out nested question ops */
        !           640:        iequals(__LINE__,
        !           641:                zero ? 1 : zero ? 2 : zero ? 3 : zero ? 4 : 5, 5);
        !           642:        iequals(__LINE__,
        !           643:                one ? one ? one ? one ? one ? 1 : 2 : 3 : 4 : 5 : 6, 1);
        !           644: 
        !           645:        /* questions as array indexes */
        !           646:        iequals(__LINE__, iarray[zero ? zero : one], 11);
        !           647:        iequals(__LINE__, iarray[one ? zero : one], 7);
        !           648: 
        !           649: 
        !           650: 
        !           651: 
        !           652:        /* question in a switch */                                                                                                                                                                                      /* 3.3.15 (cont.) */
        !           653:        switch (one ? one : zero)
        !           654:                {
        !           655:                case 1 :
        !           656:                        break;
        !           657:                default :
        !           658:                        complain(__LINE__);
        !           659:                }
        !           660: 
        !           661:        /* conditional is a sequence point */
        !           662:        {
        !           663:        int i = ivalue(1);
        !           664: 
        !           665:        iequals(__LINE__, i++ == 1 ? i : 0, ivalue(2));
        !           666:        iequals(__LINE__, i++ != 2 ? 0 : i, ivalue(3));
        !           667:        }
        !           668: 
        !           669:        } /* end c3_3_15 */
        !           670: 
        !           671: 
        !           672: 
        !           673: 
        !           674: 
        !           675: 
        !           676: 
        !           677: 
        !           678: 
        !           679: 
        !           680: 
        !           681: /*
        !           682:  * 3.3.16 - Assignment operators
        !           683:  */
        !           684: static void c3_3_16()
        !           685:        {
        !           686:        int i = 3;
        !           687:        double d = 4.0;
        !           688:        /* takes type and value from the left operand */
        !           689:        iequals(__LINE__, i = d, 4);
        !           690:        i = 2;
        !           691:        dequals(__LINE__, d = i, 2.0);
        !           692:        iequals(__LINE__, i += d, 4);
        !           693: #if ANSI
        !           694:        { char x=0; double y=1; checkthat(__LINE__, sizeof(x = y) == sizeof(x) && (x = y) == 1); }
        !           695: #endif
        !           696:        }
        !           697: 
        !           698: 
        !           699: 
        !           700: 
        !           701: 
        !           702: /*
        !           703:  * 3.3.16.1 - Simple assignment
        !           704:  */
        !           705: static void c3_3_16_1(q)
        !           706:        generic_ptr q;
        !           707:        {
        !           708:        char *p;
        !           709:        unsigned ui;
        !           710: 
        !           711: #if ANSI8712
        !           712:        struct unk;     /* structure of unkown contents */
        !           713: 
        !           714: /* The constraints for assignment are quite detailed:
        !           715:  * Define a "sufficiently-qualified" (or "suf-qual") left operand type
        !           716:  * to be one that has all the qualifiers of the type pointed to by the
        !           717:  * right operand (and perhaps others).
        !           718:  * Let qual=qualified, arith=arithmetic, ptr=pointer.
        !           719:  * Then, as the Standard says, one of the folllowing
        !           720:  * shall hold:
        !           721:  
        !           722:        Left operand                            Right operand
        !           723: 1.     qual arith type                         arith type
        !           724: 2.     unqual arith type                       arith type
        !           725: 3.     qual struct type                        compatible struct type
        !           726: 4.     qual union type                         compatible union type
        !           727: 5.     unqual struct type                      compatible struct type
        !           728: 6.     unqual union type                       compatible union type
        !           729: 7.     ptr to suf-qual type            ptr to compatible qual type
        !           730: 8.     ptr to suf-qual type            ptr to compatible unqual type
        !           731: 9.     ptr to suf-qual object          ptr to qual void
        !           732: 10.    ptr to suf-qual object          ptr to unqual void
        !           733: 11.    ptr to suf-qual incomplete      ptr to qual void
        !           734: 12.    ptr to suf-qual incomplete      ptr to unqual void
        !           735: 13.    any ptr                                         null ptr constant       ...
        !           736:  */
        !           737:        /* 1 */ { volatile int a; int b={1}; a = b; iequals(__LINE__, a, b); }
        !           738:        /* 2 */ { int a; int b={2}; a = b; iequals(__LINE__, a, b); }
        !           739:        /* 3 */ { volatile struct s {int i;} a; struct s b={3}; a = b; iequals(__LINE__, a.i, b.i); }
        !           740:        /* 4 */ { volatile union u {int i;} a; union u b={4}; a = b; iequals(__LINE__, a.i, b.i); }
        !           741:        /* 5 */ { struct s {int i;} a; struct s b={5}; a = b; iequals(__LINE__, a.i, b.i); }
        !           742:        /* 6 */ { union u {int i;} a; union u b={6}; a = b; iequals(__LINE__, a.i, b.i); }
        !           743:        /* 7 */ { const int *a; const signed *b=q; a = b; aequals(__LINE__, a, b); }
        !           744:        /* 8 */ { const int *a; signed *b=q; a = b; aequals(__LINE__, a, b); }
        !           745:        /* 9 */ { const int *a; const void *b=q; a = b; aequals(__LINE__, a, (int *)b); }
        !           746:        /* 10*/ { volatile int *a; void *b=q; a = b; aequals(__LINE__, (int *)a, (int *)b); }
        !           747:        /* 11*/ { const struct unk *a; const void *b=q; a = b; aequals(__LINE__, a, (struct unk *)b); }
        !           748:        /* 12*/ { struct unk *a; void *b=q; a = b; aequals(__LINE__, a, (struct unk *)b); }
        !           749:        /* 13*/ { struct unk *a; a = (void *)0L; aequals(__LINE__, a, 0); }
        !           750: #endif
        !           751: 
        !           752:        /* struct/union assignments are done in structures() in c33c.c */
        !           753:                                                                                /* 3.3.16.1 (cont.) */
        !           754: 
        !           755:        /* assignment of pointers */
        !           756:        p = q;
        !           757:        aequals(__LINE__, p, Filename);
        !           758:        q = 0L;
        !           759:        aequals(__LINE__, q, NULL);
        !           760:        q = p;
        !           761:        aequals(__LINE__, p, q);
        !           762: 
        !           763:        /* integral constant expression with value 0 */
        !           764:        p = 0;
        !           765:        aequals(__LINE__, p, NULL);
        !           766: 
        !           767: #if (V7 || ANSI)
        !           768:        {
        !           769:        UCHAR c;
        !           770: 
        !           771:        /* right side values are converted to the type on the left */
        !           772:        c = MAX_ULONG;
        !           773:        iequals(__LINE__, c, MAX_UCHAR);
        !           774:        }
        !           775: #endif
        !           776: 
        !           777:        /* right side values are converted to the type on the left */
        !           778:        ui = MAX_ULONG;
        !           779:        checkthat(__LINE__, ui == MAX_UINT);
        !           780:        }
        !           781: 
        !           782: 
        !           783: 
        !           784: 
        !           785: 
        !           786: 
        !           787: 
        !           788: 
        !           789: 
        !           790: 
        !           791: 
        !           792: 
        !           793: 
        !           794: 
        !           795: 
        !           796: 
        !           797: 
        !           798: 
        !           799: 
        !           800: 
        !           801: 
        !           802: 
        !           803: /*
        !           804:  * 3.3.16.2 - Compound assignment
        !           805:  */
        !           806: static int *fpi() { ++If1; return & If2;}
        !           807: static void c3_3_16_2()
        !           808:        {
        !           809:        long *pl1 = &larray[4];
        !           810:        long *pl2 = &larray[6];
        !           811:        char c = 10;
        !           812:        double d = 1.21;
        !           813: 
        !           814:        /* allow pointer ops on += and -= */
        !           815:        aequals(__LINE__, pl1+=2, pl2);
        !           816:        aequals(__LINE__, pl1-=6, larray);
        !           817:        /* make sure that the left side is only evaluated once */
        !           818:        If2 = ivalue(5);
        !           819:        If1 = ivalue(0);
        !           820:        *fpi()*=2;
        !           821:        iequals(__LINE__, If1, 1);
        !           822:        iequals(__LINE__, If2, 10);
        !           823:        *fpi()/=2;
        !           824:        iequals(__LINE__, If1, 2);
        !           825:        iequals(__LINE__, If2, 5);
        !           826:        *fpi()%=2;
        !           827:        iequals(__LINE__, If1, 3);
        !           828:        iequals(__LINE__, If2, 1);
        !           829:        *fpi()+=2;
        !           830:        iequals(__LINE__, If1, 4);
        !           831:        iequals(__LINE__, If2, 3);
        !           832:        *fpi()-=2;
        !           833:        iequals(__LINE__, If1, 5);
        !           834:        iequals(__LINE__, If2, 1);
        !           835:        *fpi()<<=2;
        !           836:        iequals(__LINE__, If1, 6);
        !           837:        iequals(__LINE__, If2, 4);
        !           838:        *fpi()>>=2;
        !           839:        iequals(__LINE__, If1, 7);
        !           840:        iequals(__LINE__, If2, 1);
        !           841:        *fpi()&=7;
        !           842:        iequals(__LINE__, If1, 8);
        !           843:        iequals(__LINE__, If2, 1);
        !           844:        *fpi()^=7;
        !           845:        iequals(__LINE__, If1, 9);
        !           846:        iequals(__LINE__, If2, 6);
        !           847:        *fpi()|=1;
        !           848:        iequals(__LINE__, If1, 10);
        !           849:        iequals(__LINE__, If2, 7);
        !           850: 
        !           851: 
        !           852:                                                                                                                                                                                /* 3.3.16.2 (cont.) */
        !           853:        /* make sure that mixed mode ops are done right */
        !           854:        iequals(__LINE__, c *= d, 12);
        !           855:        iequals(__LINE__, c /= d, 9);
        !           856:        }
        !           857: 
        !           858: /*
        !           859:  * 3.3.17 - Comma operator
        !           860:  */
        !           861: static void c3_3_17()
        !           862:        {
        !           863:        If1 = ivalue(0);
        !           864:        iequals(__LINE__, (If1++,If1++,If1++,If1++,If1++,If1++,0), 0);
        !           865:        iequals(__LINE__, If1, 6);
        !           866:        iequals(__LINE__, (If1 = 6, If1 >>= 1, If1 + 2), 5);
        !           867:        If2 = ivalue(5);
        !           868:        If1 = ivalue(0);
        !           869:        iequals(__LINE__, (*fpi(), If1), 1);
        !           870: #if ANSI8809
        !           871:        {
        !           872:        char arr[100];
        !           873:        char c;
        !           874: 
        !           875:        /* array-conversion takes place in comma (3.2.2.1 doesn't mention it), ... */
        !           876:        /* but integral conversions do not take place (because no mention in Semantics of comma */
        !           877:        iequals(__LINE__, sizeof(0,arr), sizeof(&arr[0]));
        !           878:        iequals(__LINE__, sizeof(0,c), ivalue(1));
        !           879:        }
        !           880: #endif
        !           881:        }
        !           882: 
        !           883: #else /* if SKIP33B */
        !           884: 
        !           885: void c3_3b() { pr_skip("c3_3b: SKIPPED ENTIRELY\n"); }
        !           886: #endif /* SKIP33B */
        !           887: 

unix.superglobalmegacorp.com

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