Merge from branches/gcc-4_8-branch up to rev 207411.
[official-gcc.git] / gcc-4_8-branch / gcc / testsuite / g++.dg / torture / pr53011.C
blob2cd8a60332df29b5f697791d00544997d21985f9
1 // { dg-do compile }
3 extern "C" class WvFastString;
4 typedef WvFastString& WvStringParm;
5 struct WvFastString {
6   ~WvFastString();
7   operator char* () {}
8 };
9 class WvString : WvFastString {};
10 class WvAddr {};
11 class WvIPAddr : WvAddr {};
12 struct WvIPNet : WvIPAddr {
13   bool is_default() {}
15 template<class T, bool> struct WvTraits_Helper {
16   static void release(T *obj) {
17     delete obj;
18   }
20 template<class From> struct WvTraits {
21   static void release(From *obj) {
22     WvTraits_Helper<From, 0>::release(obj);
23   }
25 struct WvLink {
26   void   *data;
27   WvLink *next;
28   bool    autofree;
29   WvLink(bool, int) : autofree() {}
30   bool get_autofree() {}
32   void unlink() {
33     delete this;
34   }
36 struct WvListBase {
37   WvLink head, *tail;
38   WvListBase() : head(0, 0) {}
40 template<class T> struct WvList : WvListBase {
41   ~WvList() {
42     zap();
43   }
45   void zap(bool destroy = 1) {
46     while (head.next) unlink_after(&head, destroy);
47   }
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;
54     if (tail) tail = after;
55     next->unlink();
56     WvTraits<T>::release(obj);
57   }
59 typedef WvList<WvString>WvStringListBase;
60 class WvStringList : WvStringListBase {};
61 class WvSubProc {
62   WvStringList last_args, env;
64 void addroute(WvIPNet& dest, WvStringParm table) {
65   if (dest.is_default() || (table != "default")) WvSubProc checkProc;