Revert the accidental checkin in revision 158918.
authorhjl <hjl@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 1 May 2010 13:52:52 +0000 (13:52 +0000)
committerhjl <hjl@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 1 May 2010 13:52:52 +0000 (13:52 +0000)
gcc/cp/

2010-05-01  H.J. Lu  <hongjiu.lu@intel.com>

PR c++/43951
* init.c (build_new_1): Revert the accidental checkin in
revision 158918.

gcc/testsuite/

2010-05-01  H.J. Lu  <hongjiu.lu@intel.com>

PR c++/43951
* g++.dg/init/new28.C: New.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@158959 138bc75d-0d04-0410-961f-82ee72b054a4

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

index 1818d0c..51559e8 100644 (file)
@@ -1,3 +1,9 @@
+2010-05-01  H.J. Lu  <hongjiu.lu@intel.com>
+
+       PR c++/43951
+       * init.c (build_new_1): Revert the accidental checkin in
+       revision 158918.
+
 2010-04-30  Jason Merrill  <jason@redhat.com>
 
        PR c++/43868
index 70e3d38..4fc90e6 100644 (file)
@@ -1911,13 +1911,13 @@ build_new_1 (VEC(tree,gc) **placement, tree type, tree nelts,
 
   is_initialized = (TYPE_NEEDS_CONSTRUCTING (elt_type) || *init != NULL);
 
-  if (*init == NULL)
+  if (*init == NULL && !type_has_user_provided_constructor (elt_type))
     {
-      bool maybe_uninitialized_error = false;
+      bool uninitialized_error = false;
       /* A program that calls for default-initialization [...] of an
         entity of reference type is ill-formed. */
       if (CLASSTYPE_REF_FIELDS_NEED_INIT (elt_type))
-       maybe_uninitialized_error = true;
+       uninitialized_error = true;
 
       /* A new-expression that creates an object of type T initializes
         that object as follows:
@@ -1932,9 +1932,9 @@ build_new_1 (VEC(tree,gc) **placement, tree type, tree nelts,
           const-qualified type, the program is ill-formed; */
 
       if (CLASSTYPE_READONLY_FIELDS_NEED_INIT (elt_type))
-       maybe_uninitialized_error = true;
+       uninitialized_error = true;
 
-      if (maybe_uninitialized_error)
+      if (uninitialized_error)
        {
          if (complain & tf_error)
            diagnose_uninitialized_cst_or_ref_member (elt_type,
index 4ef7a6f..8e1b484 100644 (file)
@@ -1,3 +1,8 @@
+2010-05-01  H.J. Lu  <hongjiu.lu@intel.com>
+
+       PR c++/43951
+       * g++.dg/init/new28.C: New.
+
 2010-04-30  Iain Sandoe <iains@gcc.gnu.org>
 
        PR objc++/32052
diff --git a/gcc/testsuite/g++.dg/init/new28.C b/gcc/testsuite/g++.dg/init/new28.C
new file mode 100644 (file)
index 0000000..41a78be
--- /dev/null
@@ -0,0 +1,27 @@
+// PR c++/43951
+// { dg-do run }
+// { dg-options "-O2" }
+
+extern "C" void abort ();
+
+class Foo 
+{
+public:
+  Foo () : xxx (1) {};
+  const int xxx;
+};
+Foo *
+bar ()
+{
+  return new Foo;
+}
+
+int
+main ()
+{
+  Foo *p = bar ();
+
+  if (p->xxx != 1)
+    abort ();
+  return 0;
+}