ctor35.c

来自「开放源码的编译器open watcom 1.6.0版的源代码」· C语言 代码 · 共 358 行

C
358
字号
#include "fail.h"

unsigned trace[1000];
unsigned p;
unsigned should[1000] = {
    0x0101,
    0x0101,
    0x0102,
    0x0101,
    0x0101,
    0x0102,
    0x0103,
    0x0101,
    0x0101,
    0x0102,
    0x0101,
    0x0101,
    0x0102,
    0x0103,
    0x0104,
    0x0101,
    0x0101,
    0x0102,
    0x0101,
    0x0101,
    0x0102,
    0x0103,
    0x0101,
    0x0101,
    0x0102,
    0x0101,
    0x0101,
    0x0102,
    0x0103,
    0x0104,
    0x0105,
    0x0101,
    0x0101,
    0x0102,
    0x0101,
    0x0101,
    0x0102,
    0x0103,
    0x0101,
    0x0101,
    0x0102,
    0x0101,
    0x0101,
    0x0102,
    0x0103,
    0x0104,
    0x0101,
    0x0101,
    0x0102,
    0x0101,
    0x0101,
    0x0102,
    0x0103,
    0x0101,
    0x0101,
    0x0102,
    0x0101,
    0x0101,
    0x0102,
    0x0103,
    0x0104,
    0x0105,
    0x0106,
    0x0101,
    0x0101,
    0x0102,
    0x0101,
    0x0101,
    0x0102,
    0x0103,
    0x0101,
    0x0101,
    0x0102,
    0x0101,
    0x0101,
    0x0102,
    0x0103,
    0x0104,
    0x0101,
    0x0101,
    0x0102,
    0x0101,
    0x0101,
    0x0102,
    0x0103,
    0x0101,
    0x0101,
    0x0102,
    0x0101,
    0x0101,
    0x0102,
    0x0103,
    0x0104,
    0x0105,
    0x0101,
    0x0101,
    0x0102,
    0x0101,
    0x0101,
    0x0102,
    0x0103,
    0x0101,
    0x0101,
    0x0102,
    0x0101,
    0x0101,
    0x0102,
    0x0103,
    0x0104,
    0x0101,
    0x0101,
    0x0102,
    0x0101,
    0x0101,
    0x0102,
    0x0103,
    0x0101,
    0x0101,
    0x0102,
    0x0101,
    0x0101,
    0x0102,
    0x0103,
    0x0104,
    0x0105,
    0x0106,
    0x0201,
    0x0201,
    0x0201,
    0x0201,
    0x0201,
    0x0201,
    0x0201,
    0x0201,
    0x0201,
    0x0201,
    0x0201,
    0x0201,
    0x0201,
    0x0201,
    0x0201,
    0x0201,
    0x0201,
    0x0201,
    0x0201,
    0x0201,
    0x0201,
    0x0201,
    0x0201,
    0x0201,
    0x0201,
    0x0201,
    0x0201,
    0x0201,
    0x0201,
    0x0201,
    0x0201,
    0x0201,
    0x0201,
    0x0201,
    0x0201,
    0x0201,
    0x0201,
    0x0201,
    0x0201,
    0x0201,
    0x0201,
    0x0201,
    0x0201,
    0x0201,
    0x0201,
    0x0201,
    0x0201,
    0x0201,
    0x0201,
    0x0201,
    0x0201,
    0x0201,
    0x0201,
    0x0201,
    0x0201,
    0x0201,
    0x0201,
    0x0201,
    0x0201,
    0x0201,
    0x0201,
    0x0201,
    0x0201,
    0x0201,
    0x0303,
    0x0303,
    0x0303,
    0x0303,
    0x0303,
    0x0303,
    0x0303,
    0x0303,
    0x0303,
    0x0303,
    0x0303,
    0x0303,
    0x0303,
    0x0303,
    0x0303,
    0x0303,
    0x0405,
    0x0405,
    0x0405,
    0x0405,
    -1,
};
void use( unsigned i ) {
    if( should[p] == i ) {
	trace[p++] = i;
    } else {
	printf( "sequence: %u was %04x (should be %04x)\n", p, i, should[p] );
	_fail;
    }
}

#define MAKE_MESS( pref, m ) \
    struct pref##1 { \
	char a[13]; \
	pref##1() { \
	    use( m | 1 ); \
	} \
    }; \
    struct pref##2 : pref##1 { \
	pref##1 v; \
	pref##2() { \
	    use( m | 2 ); \
	} \
    }; \
    struct pref##3 : virtual pref##2 { \
	pref##2 v; \
	pref##3() { \
	    use( m | 3 ); \
	} \
    }; \
    struct pref##4 : pref##3 { \
	pref##3 v; \
	pref##4() { \
	    use( m | 4 ); \
	} \
    }; \
    struct pref##5 : virtual pref##4 { \
	pref##4 v; \
	pref##5() { \
	    use( m | 5 ); \
	} \
    }; \
    struct pref##6 : pref##5 { \
	pref##5 v; \
	pref##6() { \
	    use( m | 6 ); \
	} \
    }; \

#define MAKE_MESS1( pref, m ) \
    struct pref##1 { \
	char a[13]; \
	pref##1() { \
	    use( m | 1 ); \
	} \
    }; \
    struct pref##2 : pref##1 { \
	pref##1 v; \
    }; \
    struct pref##3 : virtual pref##2 { \
	pref##2 v; \
    }; \
    struct pref##4 : pref##3 { \
	pref##3 v; \
    }; \
    struct pref##5 : virtual pref##4 { \
	pref##4 v; \
    }; \
    struct pref##6 : pref##5 { \
	pref##5 v; \
    }; \

#define MAKE_MESS3( pref, m ) \
    struct pref##1 { \
	char a[13]; \
    }; \
    struct pref##2 : pref##1 { \
	pref##1 v; \
    }; \
    struct pref##3 : virtual pref##2 { \
	pref##2 v; \
	pref##3() { \
	    use( m | 3 ); \
	} \
    }; \
    struct pref##4 : pref##3 { \
	pref##3 v; \
    }; \
    struct pref##5 : virtual pref##4 { \
	pref##4 v; \
    }; \
    struct pref##6 : pref##5 { \
	pref##5 v; \
    }; \

#define MAKE_MESS5( pref, m ) \
    struct pref##1 { \
	char a[13]; \
    }; \
    struct pref##2 : pref##1 { \
	pref##1 v; \
    }; \
    struct pref##3 : virtual pref##2 { \
	pref##2 v; \
    }; \
    struct pref##4 : pref##3 { \
	pref##3 v; \
    }; \
    struct pref##5 : virtual pref##4 { \
	pref##4 v; \
	pref##5() { \
	    use( m | 5 ); \
	} \
    }; \
    struct pref##6 : pref##5 { \
	pref##5 v; \
    }; \

MAKE_MESS( A, 0x0100 )
MAKE_MESS1( B, 0x0200 )
MAKE_MESS3( C, 0x0300 )
MAKE_MESS5( D, 0x0400 )

struct V1 : virtual A6 {
    A6 v;
};
struct V2 : virtual V1, B6 {
    B6 v;
};
struct V3 : virtual V2, virtual C6 {
    C6 v;
};
struct V4 : virtual V3, D6 {
    D6 v;
};

int main() {
    p = 0;
    { V4 x; };
    if( should[p] != -1 ) _fail;
    _PASS;
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?