* g++.dg/init/pm1.C: New test.
authoraoliva <aoliva@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 14 May 2002 17:21:21 +0000 (17:21 +0000)
committeraoliva <aoliva@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 14 May 2002 17:21:21 +0000 (17:21 +0000)
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@53462 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/init/pm1.C [new file with mode: 0644]

index 67fb3b1..9602bf0 100644 (file)
@@ -1,3 +1,7 @@
+2002-05-14  Jason Merrill  <jason@redhat.com>, Alexandre Oliva  <aoliva@redhat.com>
+
+       * g++.dg/init/pm1.C: New test.
+
 2002-05-12  David S. Miller  <davem@redhat.com>
 
        * gcc.c-torture/execute/conversion.c (ldnear): Use long double
diff --git a/gcc/testsuite/g++.dg/init/pm1.C b/gcc/testsuite/g++.dg/init/pm1.C
new file mode 100644 (file)
index 0000000..c0aed24
--- /dev/null
@@ -0,0 +1,88 @@
+// { dg-do run }
+
+// Copyright 2002  Free Software Foundation
+// Contributed by Jason Merrill and Alexandre Oliva
+
+// Test zero-initialization of pointers to data members.  Their NULL
+// value is represented with -1, not 0.
+
+#include <stdlib.h>
+
+struct A
+{
+  int i;
+};
+
+int A::* gp;
+
+typedef int A::* iApm;
+
+iApm gp_zero = 0;
+iApm gp_dflt = iApm();
+iApm gp_cast = (iApm)0;
+iApm gp_func = iApm(0);
+iApm gp_stat = static_cast<iApm>(0);
+
+struct AD : A {};
+
+int AD::* gp_impl = gp_dflt;
+int AD::* gp_down = static_cast<int AD::*>(gp_stat);
+
+int A::* ga[2];
+
+// Test use in a simple struct.
+struct B
+{
+  int A::* mp;
+};
+
+B gb;
+
+struct D;
+struct C;
+extern D gd;
+extern C gc;
+
+// Test that in a class with a constructor, the pointer to member is
+// zero-initialized until the constructor is run.
+struct C
+{
+  int A::* mp;
+  inline C ();
+};
+
+int fail;
+struct D
+{
+  int count;
+  inline D ();
+};
+
+C::C() : mp (&A::i) { gd.count++; }
+
+D::D() : count (0)
+{
+  if (gc.mp != 0)
+    abort ();
+}
+
+// The D must come first for this to work.
+D gd;
+C gc;
+
+int main()
+{
+  static int A::* slp;
+  static int A::* sla[2];
+  static B slb;
+
+  if (gp != 0 || slp != 0
+      || gp_zero != 0 || gp_dflt != 0 || gp_cast != 0
+      || gp_func != 0 || gp_stat != 0
+      || gp_impl != 0 || gp_down != 0)
+    abort ();
+  if (ga[1] != 0 || sla[1] != 0)
+    abort ();
+  if (gb.mp != 0 || slb.mp != 0)
+    abort ();
+}