#include <stdio.h>
#include <stddef.h>
template< int base_offs > struct pin {
int y1;
void test( void );
};
template< class pin1, class pin2 > struct wrap0 {
int x1;
char x2;
pin1 r3;
pin2 r4;
};
template< int base_offs >
void pin<base_offs>::test( void ) {
typedef wrap0< pin<0>,pin<0> > wrap;
wrap& W = *(wrap*)(((char*)this)-base_offs);
printf( "y1=%i W.x1=%i W.x2=%i\n", y1, W.x1, W.x2 );
}
typedef wrap0< pin<0>,pin<0> > wrap1;
typedef wrap0< pin< offsetof(wrap1,r3) >, pin< offsetof(wrap1,r4) > > wrap;
wrap Z = {456,123,33333,44444};
int main( void ) {
Z.r3.test();
Z.r4.test();
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRkZWYuaD4KCnRlbXBsYXRlPCBpbnQgYmFzZV9vZmZzID4gc3RydWN0IHBpbiB7CiAgaW50IHkxOwogIHZvaWQgdGVzdCggdm9pZCApOwp9OwoKdGVtcGxhdGU8IGNsYXNzIHBpbjEsIGNsYXNzIHBpbjIgPiBzdHJ1Y3Qgd3JhcDAgewogIGludCB4MTsKICBjaGFyIHgyOwogIHBpbjEgcjM7CiAgcGluMiByNDsKfTsKCnRlbXBsYXRlPCBpbnQgYmFzZV9vZmZzID4Kdm9pZCBwaW48YmFzZV9vZmZzPjo6dGVzdCggdm9pZCApIHsKICB0eXBlZGVmIHdyYXAwPCBwaW48MD4scGluPDA+ID4gd3JhcDsKICB3cmFwJiBXID0gKih3cmFwKikoKChjaGFyKil0aGlzKS1iYXNlX29mZnMpOwogIHByaW50ZiggInkxPSVpIFcueDE9JWkgVy54Mj0laVxuIiwgeTEsIFcueDEsIFcueDIgKTsKfQoKdHlwZWRlZiB3cmFwMDwgcGluPDA+LHBpbjwwPiA+IHdyYXAxOwoKdHlwZWRlZiB3cmFwMDwgcGluPCBvZmZzZXRvZih3cmFwMSxyMykgPiwgcGluPCBvZmZzZXRvZih3cmFwMSxyNCkgPiA+IHdyYXA7Cgp3cmFwIFogPSB7NDU2LDEyMywzMzMzMyw0NDQ0NH07CgppbnQgbWFpbiggdm9pZCApIHsKICBaLnIzLnRlc3QoKTsKICBaLnI0LnRlc3QoKTsKfQoKCg==