Annotation of researchv10no/cmd/lcc/ph/c32.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 SKIP32
        !            12: /*
        !            13:  * 3.2 - Conversions.
        !            14:  */
        !            15: #include "defs.h"
        !            16: 
        !            17: static void c3_2_1_1();
        !            18: static void c3_2_1_2();
        !            19: static void c3_2_1_3();
        !            20: static void c3_2_1_4();
        !            21: static void c3_2_1_5();
        !            22: static void c3_2_2_1();
        !            23: static void c3_2_2_2();
        !            24: static void c3_2_2_3();
        !            25:  
        !            26: 
        !            27: void c3_2()
        !            28:        {
        !            29:        Filename = "c32.c";
        !            30:        c3_2_1_1();
        !            31:        c3_2_1_2();
        !            32:        c3_2_1_3();
        !            33:        c3_2_1_4();
        !            34:        c3_2_1_5();
        !            35:        c3_2_2_1();
        !            36:        c3_2_2_2();
        !            37:        c3_2_2_3();
        !            38:        }
        !            39: 
        !            40: /*
        !            41:  * 3.2.1.1 - Characters and integers
        !            42:  */
        !            43: static void c3_2_1_1()
        !            44:        {
        !            45:        char c;
        !            46:        short ss;
        !            47: #if ANSI
        !            48:        signed char sc;
        !            49: #endif
        !            50: 
        !            51: 
        !            52: 
        !            53: #if ANSI                                                                                                                                                                       /* 3.2.1.1 (cont.) */
        !            54:        UCHAR uc;
        !            55:        USHORT us;
        !            56: #endif
        !            57: 
        !            58: #if ANSI
        !            59: /* check signed and unsigned integral promotions */
        !            60:        sc = ivalue(4);
        !            61:        ss = ivalue(5);
        !            62:        dequals(__LINE__, (double)(sc-5), -1.);
        !            63:        dequals(__LINE__, (double)(ss-6), -1.);
        !            64:        uc = ivalue(4);
        !            65:        us = ivalue(5);
        !            66:        if (MAX_UCHAR <= MAX_INT)
        !            67:                dequals(__LINE__, (double)(uc-5), -1.);
        !            68:        else
        !            69:                dequals(__LINE__, (double)(uc-5), (double)MAX_UINT);
        !            70:        
        !            71:        if (MAX_USHORT <= MAX_INT)
        !            72:                dequals(__LINE__, (double)(us-6), -1.);
        !            73:        else
        !            74:                dequals(__LINE__, (double)(us-6), (double)MAX_UINT);
        !            75:        
        !            76: #endif
        !            77: 
        !            78:        /* sign of "plain" char is implem-def */
        !            79: #if SIGNED_CHAR
        !            80:        c = ivalue(-1);
        !            81:        iequals(__LINE__, c, -1);
        !            82: #endif
        !            83: #if ANSI
        !            84: #if UNSIGNED_CHAR
        !            85:        c = ~0u;
        !            86:        iequals(__LINE__, c, MAX_UCHAR);
        !            87: #endif /* UNSIGNED_CHAR */
        !            88:        /* demotion to shorter signed */
        !            89:        sc = ivalue(-1);
        !            90:        iequals(__LINE__, sc, -1);
        !            91: #endif /* ANSI */
        !            92:        ss = ivalue(-1);
        !            93:        iequals(__LINE__, ss, -1);
        !            94: 
        !            95: #if ANSI
        !            96:        uc = ~0u;
        !            97:        checkthat(__LINE__, uc == MAX_UCHAR);
        !            98:        us = ~0u;
        !            99:        checkthat(__LINE__, us == MAX_USHORT);
        !           100: #endif
        !           101:        }
        !           102: 
        !           103: /*
        !           104:  * 3.2.1.2 - Signed and unsigned integers
        !           105:  */
        !           106: static void c3_2_1_2()
        !           107:        {
        !           108: #if ANSI
        !           109:        signed int si;
        !           110:        int i;
        !           111:        signed short int ssi;
        !           112:        short int ss;
        !           113:        signed long int sl;
        !           114:        long int l;
        !           115:        signed int *psi = &i;   /* allowable, compatible type */
        !           116:        signed short int *pssi = &ss;
        !           117:        signed long int *psli = &l;
        !           118:        ULONG ul;
        !           119:        struct {
        !           120:                unsigned ubf2 : 2;
        !           121:                signed   sbf2 : 2;
        !           122:                int      ibf2 : 2;
        !           123:                } bf;
        !           124:        UCHAR uc=ivalue(4);
        !           125:        USHORT us=ivalue(5);
        !           126:        unsigned int ui;
        !           127: 
        !           128:        /* each of the pairs are compatible types */
        !           129:        iequals(__LINE__, sizeof(signed int), sizeof(int));
        !           130:        iequals(__LINE__, sizeof(signed short int), sizeof(short int));
        !           131:        iequals(__LINE__, sizeof(signed long int), sizeof(long int));
        !           132: 
        !           133:        /* when unsigned integers are converted to representable signed values, the value is unchanged.  */
        !           134:        uc = lvalue(MAX_UCHAR);
        !           135:        sl = uc;
        !           136:        /* allow for the rare case where sizeof(UCHAR) == sizeof(long) */
        !           137:        if (sizeof(sl) > sizeof(uc))
        !           138:                dequals(__LINE__, (double)sl, (double)MAX_UCHAR);
        !           139:        us = lvalue(MAX_USHORT);
        !           140:        sl = us;
        !           141:        /* allow for the rare case where sizeof(USHORT) == sizeof(long) */
        !           142:        if (sizeof(sl) > sizeof(us))
        !           143:                dequals(__LINE__, (double)sl, (double)MAX_USHORT);
        !           144: 
        !           145:        checkthat(__LINE__, (unsigned char)(long)(UCHAR_MAX+1+ivalue(2)) == 2);
        !           146:        checkthat(__LINE__, (unsigned long)(short)ivalue(-2) == (ULONG_MAX-1));
        !           147:        bf.ubf2 = ivalue(-1);
        !           148:        iequals(__LINE__, bf.ubf2, 3);
        !           149:        bf.sbf2 = ivalue(-1);
        !           150:        iequals(__LINE__, bf.sbf2, -1);
        !           151:        bf.ibf2 = ivalue(-1);
        !           152:        checkthat(__LINE__, bf.ibf2 == -1 || bf.ibf2 == 3);
        !           153: 
        !           154:        /* signed to unsigned of equal or greater length: if non-negative, value unchanged */                                                                   /* 3.2.1.2 (cont.) */
        !           155:        ssi = ivalue(4);
        !           156:        ui = ssi;
        !           157:        checkthat(__LINE__, ui == 4);
        !           158:        /* signed to unsigned of equal or greater length: if negative, converted modulo "largest plus one" */
        !           159:        ssi = ivalue(-1);
        !           160:        ul = (unsigned long) ivalue(ssi);
        !           161:        checkthat(__LINE__, ul == MAX_ULONG);
        !           162:        us = ssi;
        !           163:        checkthat(__LINE__, us == MAX_USHORT);
        !           164: 
        !           165:        /* integer demoted to smaller unsigned: modulo "largest plus one" */
        !           166:        sl = ivalue(-3);
        !           167:        uc = sl;
        !           168:        iequals(__LINE__, uc, MAX_UCHAR-2);
        !           169: #endif
        !           170:        }
        !           171: 
        !           172: 
        !           173: 
        !           174: 
        !           175: 
        !           176: 
        !           177: 
        !           178: 
        !           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: /*
        !           204:  * 3.2.1.3 - floating and integral
        !           205:  */
        !           206: static void c3_2_1_3()
        !           207:        {
        !           208: #if ANSI
        !           209:        float f;
        !           210:        double d;
        !           211:        char c;
        !           212:        short ss;
        !           213:        int si;
        !           214:        long sl;
        !           215:        unsigned int ui;
        !           216:        unsigned char uc;
        !           217:        unsigned short us;
        !           218:        unsigned long ul;
        !           219:        signed char sc;
        !           220:        enum { a, b } en;
        !           221:        struct { unsigned u : 7; signed i : 7; } su;
        !           222: 
        !           223:        /* conversion from floating->integral truncates positive numbers */
        !           224:        f = dvalue(99.999);
        !           225:        c = f;  iequals(__LINE__, c, ivalue(99));
        !           226:        sc = f; iequals(__LINE__, sc, ivalue(99));
        !           227:        uc = f; iequals(__LINE__, uc, ivalue(99));
        !           228:        ss = f; iequals(__LINE__, ss, ivalue(99));
        !           229:        us = f; iequals(__LINE__, us, ivalue(99));
        !           230:        si = f; iequals(__LINE__, si, ivalue(99));
        !           231:        ui = f; iequals(__LINE__, ui, ivalue(99));
        !           232:        en = f; iequals(__LINE__, en, ivalue(99));
        !           233:        su.u = f; iequals(__LINE__, su.u, ivalue(99));
        !           234:        su.i = 33.333; iequals(__LINE__, su.i, ivalue(33));
        !           235:        sl = f; lequals(__LINE__, sl, lvalue(99L));
        !           236:        ul = f; lequals(__LINE__, ul, lvalue(99L));
        !           237:        d = dvalue(99.999);
        !           238:        c = d;  iequals(__LINE__, c, ivalue(99));
        !           239:        sc = d; iequals(__LINE__, sc, ivalue(99));
        !           240:        uc = d; iequals(__LINE__, uc, ivalue(99));
        !           241:        ss = d; iequals(__LINE__, ss, ivalue(99));
        !           242:        us = d; iequals(__LINE__, us, ivalue(99));
        !           243:        si = d; iequals(__LINE__, si, ivalue(99));
        !           244:        ui = d; iequals(__LINE__, ui, ivalue(99));
        !           245:        en = d; iequals(__LINE__, en, ivalue(99));
        !           246:        su.u = d; iequals(__LINE__, su.u, ivalue(99));
        !           247:        su.i = 33.333; iequals(__LINE__, su.i, ivalue(33));
        !           248:        sl = d; lequals(__LINE__, sl, lvalue(99L));
        !           249:        ul = d; lequals(__LINE__, ul, lvalue(99L));
        !           250: #endif
        !           251:        }
        !           252: 
        !           253: /*
        !           254:  * 3.2.1.4 - Floating types
        !           255:  */
        !           256: static void c3_2_1_4()
        !           257:        {
        !           258:        float f;
        !           259:        double d;
        !           260: #if ANSI
        !           261:        long double l;
        !           262: #endif
        !           263: 
        !           264:        /* float->double, etc. has no value change */
        !           265:        f = dvalue(1.23456789012345);
        !           266:        d = dvalue(f);
        !           267:        dequals(__LINE__, f, d);
        !           268: #if ANSI
        !           269:        l = dvalue(f);
        !           270:        ldequals(__LINE__, (long double)f, l);
        !           271:        d = dvalue(1.23456789012345);
        !           272:        l = d;
        !           273:        ldequals(__LINE__, (long double)d, l);
        !           274: #endif
        !           275: 
        !           276:        d = dvalue(.25);
        !           277:        f = dvalue(d);
        !           278:        checkthat(__LINE__, f == .25);
        !           279: 
        !           280:        /* conversion downward has undefined behavior if not representable */
        !           281: 
        !           282:        }
        !           283: 
        !           284: 
        !           285: 
        !           286: 
        !           287: 
        !           288: 
        !           289: 
        !           290: 
        !           291: 
        !           292: 
        !           293: 
        !           294: 
        !           295: 
        !           296: 
        !           297: 
        !           298: 
        !           299: 
        !           300: 
        !           301: 
        !           302: 
        !           303: /*
        !           304:  * 3.2.1.5 - Usual arithmetic conversions 
        !           305:  * These will be checked in greater detail in 'expressions'.
        !           306:  */
        !           307: static void c3_2_1_5()
        !           308:        {
        !           309: #if ANSI
        !           310:        long double ld = dvalue(3.0);
        !           311:        signed char sc = ivalue(4);
        !           312:        char c = ivalue(5);
        !           313:        int si = ivalue(6);
        !           314:        short ss = ivalue(7);
        !           315:        long sl = ivalue(8);
        !           316:        unsigned int ui = ivalue(9);
        !           317:        float f = ivalue(10);
        !           318:        double d = ivalue(11);
        !           319:        UCHAR uc = ivalue(12);
        !           320:        USHORT us = ivalue(13);
        !           321:        ULONG ul = ivalue(14);
        !           322: 
        !           323:        /* if either argument is long double, that is the type of the result */
        !           324:        ldequals(__LINE__, ld+sc, 7.0L);
        !           325: 
        !           326:        /* if either argument is double, that is the type of the result */
        !           327:        dequals(__LINE__, d+f, 21.0);
        !           328:        dequals(__LINE__, d+si, 17.0);
        !           329:        dequals(__LINE__, (double)f+si, 16.0);
        !           330: 
        !           331:        /* otherwise, if either float, then float */
        !           332:        iequals(__LINE__, sizeof(d+c), sizeof(double));
        !           333:        iequals(__LINE__, sizeof(f+c), sizeof(float));
        !           334:        /* otherwise, int promotions are performed. Then, following rules: */
        !           335: 
        !           336:        /* if either unsigned long int, then that */
        !           337:        ldequals(__LINE__, (long double)(ss-ul), (long double)(MAX_ULONG-6));
        !           338:        /* otherwise, if long vs unsigned int:  */
        !           339:        if (UINT_MAX <= LONG_MAX) /* if unsigned int can be held in long, then long */
        !           340:                ldequals(__LINE__, sl-ui, -1);
        !           341:        else                                                    /* if unsigned int cannot be held in long, then unsigned long */
        !           342:                ldequals(__LINE__, sl-ui, MAX_ULONG);
        !           343:        /* otherwise, if either long int, then that */
        !           344:        ldequals(__LINE__, (long double)(si-sl), (long double)(-2));
        !           345:        iequals(__LINE__, sizeof(si-sl), sizeof(long));
        !           346: 
        !           347:        /* otherwise, if either unsigned int, then that */
        !           348:        ldequals(__LINE__, (long double)(ss-ui), (long double)(MAX_UINT - 1));
        !           349:        /* integral widening has been tested in 3.2.1.1 */
        !           350: #endif
        !           351:        }
        !           352: 
        !           353: /*
        !           354:  * 3.2.2.1 - Lvalues and function designators
        !           355:  */
        !           356: #if ANSI
        !           357: static char iarray[6] = "abcdef";
        !           358: #else
        !           359: static char iarray[6] = "abcde";
        !           360: #endif
        !           361: static void c3_2_2_1()
        !           362:        {
        !           363:        char *p;
        !           364: 
        !           365:        /* the name of an array is equivalent to a pointer to the first element */
        !           366:        aequals(__LINE__, iarray, &iarray[0]);
        !           367: 
        !           368:        /* except for use in 'sizeof' */
        !           369:        iequals(__LINE__, sizeof(iarray), 6 * sizeof(char));
        !           370: #if ANSI
        !           371:        /* ... or as operand of & */
        !           372:        {
        !           373:        char (*pa)[6] = &iarray;
        !           374: 
        !           375:        checkthat(__LINE__, pa == &iarray);
        !           376:        }
        !           377: #endif
        !           378: 
        !           379:        /* or except as a string literal initializer */
        !           380:        iequals(__LINE__, iarray[0], 'a');
        !           381:        iequals(__LINE__, iarray[1], 'b');
        !           382:        iequals(__LINE__, iarray[2], 'c');
        !           383:        iequals(__LINE__, iarray[3], 'd');
        !           384:        iequals(__LINE__, iarray[4], 'e');
        !           385:        iequals(__LINE__, iarray[5], ANSI ? 'f' : '\0');
        !           386: 
        !           387:        /* similarly we can overaddress and check a pointer */
        !           388:        for (p = iarray; p < &iarray[6]; ++p)
        !           389:                ;
        !           390:        aequals(__LINE__, p, iarray+6);
        !           391: 
        !           392:        /* function name takes on type 'pointer to function returning type' */
        !           393:        checkthat(__LINE__, c3_2_2_1 != 0);
        !           394: #if ANSI
        !           395:        checkthat(__LINE__, &c3_2_2_1 == c3_2_2_1);
        !           396: #endif
        !           397:        }
        !           398: 
        !           399: 
        !           400: 
        !           401: 
        !           402: 
        !           403: /*
        !           404:  * 3.2.2.2 - Void
        !           405:  */
        !           406: static void c3_2_2_2()
        !           407:        {
        !           408:        static int iterations = 0;
        !           409: 
        !           410:        if (iterations++ == 0)
        !           411: #if ANSI8709
        !           412:                (void)c3_2_2_2();
        !           413: #else
        !           414:                c3_2_2_2();
        !           415: #endif
        !           416:        else
        !           417:                {
        !           418:                (void)1;
        !           419:                (void)iequals(__LINE__, 1, ivalue(1));
        !           420:                (void)(iterations + 1);
        !           421:                iequals(__LINE__, 7, ((void)3, ivalue(7)));
        !           422:                (void)++iterations;
        !           423:                return;
        !           424:                }
        !           425:        iequals(__LINE__, iterations, 3);
        !           426:        }
        !           427: 
        !           428: 
        !           429: 
        !           430: 
        !           431: 
        !           432: 
        !           433: 
        !           434: 
        !           435: 
        !           436: 
        !           437: 
        !           438: 
        !           439: 
        !           440: 
        !           441: 
        !           442: 
        !           443: 
        !           444: 
        !           445: 
        !           446: 
        !           447: 
        !           448: 
        !           449: 
        !           450: 
        !           451: 
        !           452: 
        !           453: /*
        !           454:  * 3.2.2.3 - Pointers
        !           455:  */
        !           456: static void c3_2_2_3()
        !           457:        {
        !           458:        long li, *pl = (long *)avalue(&li);
        !           459:        double d, *pd = (double *)avalue(&d);
        !           460:        char *pc;
        !           461: 
        !           462:        int (*ipf)();
        !           463: #if ANSI
        !           464:        /* pointer to void can be converted to any ptr-to-object */
        !           465:        void *gp;
        !           466: 
        !           467:        gp = avalue(pl);
        !           468:        aequals(__LINE__, pl, gp);
        !           469: #endif
        !           470: #if ANSI8706
        !           471:        {
        !           472:        struct unknown *pu;
        !           473: 
        !           474:        pu = avalue(gp);
        !           475:        gp = avalue(pu);
        !           476:        pu = avalue(gp);
        !           477:        aequals(__LINE__, gp, pu);
        !           478:        }
        !           479: #endif
        !           480: 
        !           481:        /* A pointer can be converted to one of less strict alignment
        !           482:         * and back again without loss of information.  (See 3.3.4.)
        !           483:         */
        !           484:        li = ivalue(1234); pc = (char *)pl; do_nothing(&pc, &pl); pl = (long *)pc;
        !           485:        lequals(__LINE__, *pl, 1234L);
        !           486: 
        !           487:        d = dvalue(3.1416); pc = (char *)pd; do_nothing(&pc, &pd); pd = (double *)pc;
        !           488:        dequals(__LINE__, *pd, 3.1416);
        !           489: 
        !           490:        /* null pointers */
        !           491:        pc = 0;
        !           492:        do_nothing(&pc);
        !           493:        checkthat(__LINE__, pc == 0);
        !           494:        pd = 0;
        !           495:        do_nothing(&pd);
        !           496:        checkthat(__LINE__, pd == 0);
        !           497:        pd = &d;        /* again */
        !           498: 
        !           499: 
        !           500: 
        !           501: 
        !           502: 
        !           503: #if ANSI8712                                                                                                                                                           /* 3.2.2.3 (cont.) */
        !           504:        {
        !           505:        void *gp;
        !           506:        struct unknown *pu, *pu2;
        !           507:        const long *pcl;
        !           508: 
        !           509:        /* a ptr-to-void may be converted to/from a ptr to any object type */
        !           510:        li = ivalue(1234); gp = pl; do_nothing(&gp, &pl); pl = gp;
        !           511:        lequals(__LINE__, *pl, 1234L);
        !           512: 
        !           513:        d = dvalue(3.1416); gp = pd; do_nothing(&gp, &pd); pd = gp;
        !           514:        dequals(__LINE__, *pd, 3.1416);
        !           515: 
        !           516:        /* a ptr-to-void may be converted to/from a ptr to any incomplete type */
        !           517:        pu = (struct unknown *)pl; gp = pu; pu2 = gp;
        !           518:        checkthat(__LINE__, pu == pu2);
        !           519: 
        !           520:        /* qualifiers do not affect comparisons */
        !           521:        pcl = (const long *)pl;
        !           522:        checkthat(__LINE__, pcl == pl);
        !           523: 
        !           524:        /* null pointer can be e.g. 0L or (void *)0 */
        !           525:        pc = 0L;
        !           526:        do_nothing(&pc);
        !           527:        checkthat(__LINE__, pc == 0L);
        !           528:        pd = 0L;
        !           529:        do_nothing(&pd);
        !           530:        checkthat(__LINE__, pd == 0L);
        !           531: 
        !           532:        pc = (void *)0;
        !           533:        do_nothing(&pc);
        !           534:        checkthat(__LINE__, pc == (void *)0);
        !           535:        pd = (void *)0;
        !           536:        do_nothing(&pd);
        !           537:        checkthat(__LINE__, pd == (void *)0);
        !           538: 
        !           539:        /* two null pointers, thru different cast sequences, compare equal */
        !           540:        checkthat(__LINE__, (char *)(long *)pc == (char *)(float *)pd);
        !           541:        }
        !           542: #endif
        !           543:        }
        !           544: #else /* if SKIP32 */
        !           545: 
        !           546: void c3_2() { pr_skip("c3_2: SKIPPED ENTIRELY\n"); }
        !           547: #endif /* SKIP32 */
        !           548: 
        !           549: /*
        !           550:  * Section 3.2.2.4 (const and volatile) has been moved to 3.5.3
        !           551:  * See c35.c
        !           552:  */

unix.superglobalmegacorp.com

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