| extern void exit (int); |
| extern void abort (void); |
| |
| typedef struct T |
| { |
| char val; |
| const __as struct T *l, *r; |
| } tree; |
| |
| /* |
| abcd |
| / \ |
| ab cd |
| / \ / \ |
| a b c d |
| */ |
| |
| const __as tree a = { 'a', 0, 0 }; |
| const __as tree b = { 'b', 0, 0 }; |
| const __as tree c = { 'c', 0, 0 }; |
| const __as tree d = { 'd', 0, 0 }; |
| |
| const __as tree ab = { 'A', &a, &b }; |
| const __as tree cd = { 'C', &c, &d }; |
| |
| const __as tree abcd = { '*', &ab, &cd }; |
| |
| static void |
| test1 (void) |
| { |
| if (abcd.val != '*') |
| abort(); |
| |
| if (abcd.l->val != 'A') |
| abort(); |
| if (abcd.r->val != 'C') |
| abort(); |
| |
| if (abcd.l->l->val != 'a') |
| abort(); |
| if (abcd.l->r->val != 'b') |
| abort(); |
| if (abcd.r->l->val != 'c') |
| abort(); |
| if (abcd.r->r->val != 'd') |
| abort(); |
| } |
| |
| static void |
| test2 (const __as tree *t) |
| { |
| if (t->val != '*') |
| abort(); |
| |
| if (t->l->val != 'A') |
| abort(); |
| if (t->r->val != 'C') |
| abort(); |
| |
| if (t->l->l->val != 'a') |
| abort(); |
| if (t->l->r->val != 'b') |
| abort(); |
| if (t->r->l->val != 'c') |
| abort(); |
| if (t->r->r->val != 'd') |
| abort(); |
| } |
| |
| static void |
| test3 (const __as tree *pt) |
| { |
| tree t = *pt; |
| |
| if (t.val != '*') |
| abort(); |
| |
| if (t.l->val != 'A') |
| abort(); |
| if (t.r->val != 'C') |
| abort(); |
| |
| if (t.l->l->val != 'a') |
| abort(); |
| if (t.l->r->val != 'b') |
| abort(); |
| if (t.r->l->val != 'c') |
| abort(); |
| if (t.r->r->val != 'd') |
| abort(); |
| } |
| |
| int main (void) |
| { |
| const __as tree *t = &abcd; |
| test1(); |
| test2 (&abcd); |
| test3 (&abcd); |
| |
| __asm ("" : "+r" (t)); |
| test2 (t); |
| test3 (t); |
| |
| exit (0); |
| return 0; |
| } |