summaryrefslogtreecommitdiff
path: root/gcc/testsuite/g++.dg/torture/pr53011.C
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/testsuite/g++.dg/torture/pr53011.C')
-rw-r--r--gcc/testsuite/g++.dg/torture/pr53011.C66
1 files changed, 66 insertions, 0 deletions
diff --git a/gcc/testsuite/g++.dg/torture/pr53011.C b/gcc/testsuite/g++.dg/torture/pr53011.C
new file mode 100644
index 00000000000..2cd8a60332d
--- /dev/null
+++ b/gcc/testsuite/g++.dg/torture/pr53011.C
@@ -0,0 +1,66 @@
+// { dg-do compile }
+
+extern "C" class WvFastString;
+typedef WvFastString& WvStringParm;
+struct WvFastString {
+ ~WvFastString();
+ operator char* () {}
+};
+class WvString : WvFastString {};
+class WvAddr {};
+class WvIPAddr : WvAddr {};
+struct WvIPNet : WvIPAddr {
+ bool is_default() {}
+};
+template<class T, bool> struct WvTraits_Helper {
+ static void release(T *obj) {
+ delete obj;
+ }
+};
+template<class From> struct WvTraits {
+ static void release(From *obj) {
+ WvTraits_Helper<From, 0>::release(obj);
+ }
+};
+struct WvLink {
+ void *data;
+ WvLink *next;
+ bool autofree;
+ WvLink(bool, int) : autofree() {}
+ bool get_autofree() {}
+
+ void unlink() {
+ delete this;
+ }
+};
+struct WvListBase {
+ WvLink head, *tail;
+ WvListBase() : head(0, 0) {}
+};
+template<class T> struct WvList : WvListBase {
+ ~WvList() {
+ zap();
+ }
+
+ void zap(bool destroy = 1) {
+ while (head.next) unlink_after(&head, destroy);
+ }
+
+ void unlink_after(WvLink *after, bool destroy) {
+ WvLink *next = 0;
+ T *obj = (destroy && next->get_autofree()) ?
+ static_cast<T*>(next->data) : 0;
+
+ if (tail) tail = after;
+ next->unlink();
+ WvTraits<T>::release(obj);
+ }
+};
+typedef WvList<WvString>WvStringListBase;
+class WvStringList : WvStringListBase {};
+class WvSubProc {
+ WvStringList last_args, env;
+};
+void addroute(WvIPNet& dest, WvStringParm table) {
+ if (dest.is_default() || (table != "default")) WvSubProc checkProc;
+}