modernc.org/ccgo/v3@v3.16.14/lib/testdata/gcc-9.1.0/gcc/testsuite/gcc.c-torture/execute/pr33870.c (about) 1 extern void abort (void); 2 3 typedef struct PgHdr PgHdr; 4 typedef unsigned char u8; 5 struct PgHdr { 6 unsigned int pgno; 7 PgHdr *pNextHash, *pPrevHash; 8 PgHdr *pNextFree, *pPrevFree; 9 PgHdr *pNextAll; 10 u8 inJournal; 11 short int nRef; 12 PgHdr *pDirty, *pPrevDirty; 13 unsigned int notUsed; 14 }; 15 16 static inline PgHdr *merge_pagelist(PgHdr *pA, PgHdr *pB) 17 { 18 PgHdr result; 19 PgHdr *pTail; 20 pTail = &result; 21 while( pA && pB ){ 22 if( pA->pgno<pB->pgno ){ 23 pTail->pDirty = pA; 24 pTail = pA; 25 pA = pA->pDirty; 26 }else{ 27 pTail->pDirty = pB; 28 pTail = pB; 29 pB = pB->pDirty; 30 } 31 } 32 if( pA ){ 33 pTail->pDirty = pA; 34 }else if( pB ){ 35 pTail->pDirty = pB; 36 }else{ 37 pTail->pDirty = 0; 38 } 39 return result.pDirty; 40 } 41 42 PgHdr * __attribute__((noinline)) sort_pagelist(PgHdr *pIn) 43 { 44 PgHdr *a[25], *p; 45 int i; 46 __builtin_memset (a, 0, sizeof (a)); 47 while( pIn ){ 48 p = pIn; 49 pIn = p->pDirty; 50 p->pDirty = 0; 51 for(i=0; i<25 -1; i++){ 52 if( a[i]==0 ){ 53 a[i] = p; 54 break; 55 }else{ 56 p = merge_pagelist(a[i], p); 57 a[i] = 0; 58 } 59 } 60 if( i==25 -1 ){ 61 a[i] = merge_pagelist(a[i], p); 62 } 63 } 64 p = a[0]; 65 for(i=1; i<25; i++){ 66 p = merge_pagelist (p, a[i]); 67 } 68 return p; 69 } 70 71 int main() 72 { 73 PgHdr a[5]; 74 PgHdr *p; 75 a[0].pgno = 5; 76 a[0].pDirty = &a[1]; 77 a[1].pgno = 4; 78 a[1].pDirty = &a[2]; 79 a[2].pgno = 1; 80 a[2].pDirty = &a[3]; 81 a[3].pgno = 3; 82 a[3].pDirty = 0; 83 p = sort_pagelist (&a[0]); 84 if (p->pDirty == p) 85 abort (); 86 return 0; 87 }