2018-11-07 Richard Biener <rguenther@suse.de>
[official-gcc.git] / gcc / testsuite / g++.dg / torture / pr53011.C
blob4882f23b19eddf09d4eda7cac2523dfdde95a4a4
1 // { dg-do compile }
2 // { dg-additional-options "-Wno-return-type" }
4 extern "C" class WvFastString;
5 typedef WvFastString& WvStringParm;
6 struct WvFastString {
7   ~WvFastString();
8   operator char* () {}
9 };
10 class WvString : WvFastString {};
11 class WvAddr {};
12 class WvIPAddr : WvAddr {};
13 struct WvIPNet : WvIPAddr {
14   bool is_default() {}
16 template<class T, bool> struct WvTraits_Helper {
17   static void release(T *obj) {
18     delete obj;
19   }
21 template<class From> struct WvTraits {
22   static void release(From *obj) {
23     WvTraits_Helper<From, 0>::release(obj);
24   }
26 struct WvLink {
27   void   *data;
28   WvLink *next;
29   bool    autofree;
30   WvLink(bool, int) : autofree() {}
31   bool get_autofree() {}
33   void unlink() {
34     delete this;
35   }
37 struct WvListBase {
38   WvLink head, *tail;
39   WvListBase() : head(0, 0) {}
41 template<class T> struct WvList : WvListBase {
42   ~WvList() {
43     zap();
44   }
46   void zap(bool destroy = 1) {
47     while (head.next) unlink_after(&head, destroy);
48   }
50   void unlink_after(WvLink *after, bool destroy) {
51     WvLink *next = 0;
52     T *obj       = (destroy && next->get_autofree()) ? 
53                    static_cast<T*>(next->data) : 0;
55     if (tail) tail = after;
56     next->unlink();
57     WvTraits<T>::release(obj);
58   }
60 typedef WvList<WvString>WvStringListBase;
61 class WvStringList : WvStringListBase {};
62 class WvSubProc {
63   WvStringList last_args, env;
65 void addroute(WvIPNet& dest, WvStringParm table) {
66   if (dest.is_default() || (table != "default")) WvSubProc checkProc;