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