1// { dg-do compile } 2 3extern "C" class WvFastString; 4typedef WvFastString& WvStringParm; 5struct WvFastString { 6 ~WvFastString(); 7 operator char* () {} 8}; 9class WvString : WvFastString {}; 10class WvAddr {}; 11class WvIPAddr : WvAddr {}; 12struct WvIPNet : WvIPAddr { 13 bool is_default() {} 14}; 15template<class T, bool> struct WvTraits_Helper { 16 static void release(T *obj) { 17 delete obj; 18 } 19}; 20template<class From> struct WvTraits { 21 static void release(From *obj) { 22 WvTraits_Helper<From, 0>::release(obj); 23 } 24}; 25struct WvLink { 26 void *data; 27 WvLink *next; 28 bool autofree; 29 WvLink(bool, int) : autofree() {} 30 bool get_autofree() {} 31 32 void unlink() { 33 delete this; 34 } 35}; 36struct WvListBase { 37 WvLink head, *tail; 38 WvListBase() : head(0, 0) {} 39}; 40template<class T> struct WvList : WvListBase { 41 ~WvList() { 42 zap(); 43 } 44 45 void zap(bool destroy = 1) { 46 while (head.next) unlink_after(&head, destroy); 47 } 48 49 void unlink_after(WvLink *after, bool destroy) { 50 WvLink *next = 0; 51 T *obj = (destroy && next->get_autofree()) ? 52 static_cast<T*>(next->data) : 0; 53 54 if (tail) tail = after; 55 next->unlink(); 56 WvTraits<T>::release(obj); 57 } 58}; 59typedef WvList<WvString>WvStringListBase; 60class WvStringList : WvStringListBase {}; 61class WvSubProc { 62 WvStringList last_args, env; 63}; 64void addroute(WvIPNet& dest, WvStringParm table) { 65 if (dest.is_default() || (table != "default")) WvSubProc checkProc; 66} 67