Annotation of researchv10no/cmd/lcc/ph/c35b.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: /*
        !            11:  * BITFIELDS - make sure that all operators work with bitfields.
        !            12:  * Called at or about line 48 in c3_5.
        !            13:  */
        !            14: 
        !            15: #include "flags.h"
        !            16: #ifndef SKIP35B
        !            17: #include "defs.h"
        !            18: 
        !            19: static int SideEffect = 0;
        !            20: struct fields
        !            21:        {
        !            22:        unsigned x1:1;
        !            23:        unsigned x2:2;
        !            24:        unsigned x3:3;
        !            25:        unsigned   :1;          /* just because it can be done */
        !            26:        unsigned x4:4;
        !            27:        };
        !            28: 
        !            29: void bitfields()
        !            30:        {
        !            31:        struct fields b, b2, *p = &b2, *bf();
        !            32: 
        !            33:        Filename = "c35b.c";
        !            34:        b.x2 = 2;
        !            35:        p->x3 = 7;
        !            36: 
        !            37:        iequals(__LINE__, b.x2++, 2);
        !            38:        iequals(__LINE__, b.x2--, 3);
        !            39:        iequals(__LINE__, ++b.x2, 3);
        !            40:        iequals(__LINE__, --b.x2, 2);
        !            41:        /* &bitfield is illegal */
        !            42: #if ANSI
        !            43:        iequals(__LINE__, +b.x2, 2);
        !            44: #endif
        !            45:        iequals(__LINE__, -b.x2, -2);
        !            46:        iequals(__LINE__, ~b.x2, ~2);
        !            47:        iequals(__LINE__, !b.x2, 0);
        !            48:        dequals(__LINE__, (double)b.x2, 2.0);
        !            49:        iequals(__LINE__, b.x2*p->x3, 14);
        !            50:        iequals(__LINE__, p->x3/b.x2, 3);
        !            51: 
        !            52: 
        !            53:        iequals(__LINE__, p->x3%b.x2, 1);
        !            54:        iequals(__LINE__, p->x3+b.x2, 9);
        !            55:        iequals(__LINE__, p->x3-b.x2, 5);
        !            56:        iequals(__LINE__, p->x3>>b.x2, 7>>2);
        !            57:        iequals(__LINE__, p->x3<<b.x2, 7<<2);
        !            58:        iequals(__LINE__, p->x3>b.x2, 1);
        !            59:        iequals(__LINE__, p->x3<b.x2, 0);
        !            60:        iequals(__LINE__, p->x3>=b.x2, 1);
        !            61:        iequals(__LINE__, p->x3<=b.x2, 0);
        !            62:        iequals(__LINE__, p->x3==b.x2, 0);
        !            63:        iequals(__LINE__, p->x3!=b.x2, 1);
        !            64:        iequals(__LINE__, p->x3&b.x2, 2);
        !            65:        iequals(__LINE__, p->x3^b.x2, 5);
        !            66:        iequals(__LINE__, p->x3|b.x2, 7);
        !            67:        iequals(__LINE__, p->x3&&b.x2, 1);
        !            68:        iequals(__LINE__, p->x3||b.x2, 1);
        !            69:        iequals(__LINE__, p->x3?b.x2:0, 2);
        !            70: 
        !            71:        /* the first two are tricky -- make sure that the expression value is
        !            72:         * the same as the left hand side after assignment (wraparound occurs).
        !            73:         */
        !            74:        iequals(__LINE__, p->x3=15, 7);
        !            75:        iequals(__LINE__, p->x3*=b.x2, 6);
        !            76:        iequals(__LINE__, p->x3/=b.x2, 3);
        !            77:        iequals(__LINE__, p->x3%=b.x2, 1);
        !            78:        iequals(__LINE__, p->x3+=b.x2, 3);
        !            79:        iequals(__LINE__, p->x3-=b.x2, 1);
        !            80:        iequals(__LINE__, p->x3<<=b.x2, 4);
        !            81:        iequals(__LINE__, p->x3>>=b.x2, 1);
        !            82:        b.x2 = 3;
        !            83:        iequals(__LINE__, p->x3&=b.x2, 1);
        !            84:        iequals(__LINE__, p->x3^=b.x2, 2);
        !            85:        iequals(__LINE__, p->x3|=b.x2, 3);
        !            86:        iequals(__LINE__, (p->x3,b.x2), 3);
        !            87: 
        !            88:        /* check for incorrect side effects */
        !            89:        bf()->x3 = 3;
        !            90:        bf()->x2 = 2;
        !            91:        iequals(__LINE__, bf()->x3 *= bf()->x2, 6);
        !            92:        iequals(__LINE__, bf()->x3 /= bf()->x2, 3);
        !            93:        iequals(__LINE__, bf()->x3 %= bf()->x2, 1);
        !            94:        iequals(__LINE__, bf()->x3 += (SideEffect++, bf())->x2, 3);
        !            95:        iequals(__LINE__, bf()->x3 -= (SideEffect++, bf())->x2, 1);
        !            96:        iequals(__LINE__, (SideEffect++, bf())->x3 <<= bf()->x2, 4);
        !            97:        iequals(__LINE__, (SideEffect++, bf())->x3 >>= bf()->x2, 1);
        !            98:        iequals(__LINE__, SideEffect, 20);
        !            99:        }
        !           100: 
        !           101: 
        !           102: 
        !           103: 
        !           104: struct fields *bf()
        !           105:        {
        !           106:        static struct fields f;
        !           107:        ++SideEffect;
        !           108:        return(&f);
        !           109:        }
        !           110: 
        !           111: #else /* if SKIP35B */
        !           112: void bitfields() { pr_skip("bitfields (c35b): SKIPPED ENTIRELY\n"); }
        !           113: #endif /* SKIP35B */
        !           114: 

unix.superglobalmegacorp.com

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