OSDN Git Service

PR c++/29043
authorjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 28 Apr 2010 00:03:21 +0000 (00:03 +0000)
committerMasaki Muranaka <monaka@monami-software.com>
Sun, 23 May 2010 04:53:08 +0000 (13:53 +0900)
* init.c (perform_member_init): check for uninitialized const or
reference members, including array types.

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

gcc/cp/ChangeLog
gcc/cp/init.c
gcc/testsuite/ChangeLog

index 08746ba..3935cc2 100644 (file)
@@ -1,3 +1,9 @@
+2010-04-27  Fabien ChĂȘne  <fabien.chene@gmail.com>
+
+       PR c++/29043
+       * init.c (perform_member_init): check for uninitialized const or
+       reference members, including array types.
+
 2010-04-24  Jason Merrill  <jason@redhat.com>
 
        * tree.c (get_fns): Split out from get_first_fn.
 2010-04-24  Jason Merrill  <jason@redhat.com>
 
        * tree.c (get_fns): Split out from get_first_fn.
index e1dee1d..57b874d 100644 (file)
@@ -506,6 +506,7 @@ perform_member_init (tree member, tree init)
     {
       if (init == NULL_TREE)
        {
     {
       if (init == NULL_TREE)
        {
+         tree core_type;
          /* member traversal: note it leaves init NULL */
          if (TREE_CODE (type) == REFERENCE_TYPE)
            permerror (DECL_SOURCE_LOCATION (current_function_decl),
          /* member traversal: note it leaves init NULL */
          if (TREE_CODE (type) == REFERENCE_TYPE)
            permerror (DECL_SOURCE_LOCATION (current_function_decl),
@@ -515,6 +516,11 @@ perform_member_init (tree member, tree init)
            permerror (DECL_SOURCE_LOCATION (current_function_decl),
                       "uninitialized member %qD with %<const%> type %qT",
                       member, type);
            permerror (DECL_SOURCE_LOCATION (current_function_decl),
                       "uninitialized member %qD with %<const%> type %qT",
                       member, type);
+
+         core_type = strip_array_types (type);
+         if (CLASSTYPE_READONLY_FIELDS_NEED_INIT (core_type)
+             || CLASSTYPE_REF_FIELDS_NEED_INIT (core_type))
+           diagnose_uninitialized_cst_or_ref_member (core_type, /*using_new=*/false);
        }
       else if (TREE_CODE (init) == TREE_LIST)
        /* There was an explicit member initialization.  Do some work
        }
       else if (TREE_CODE (init) == TREE_LIST)
        /* There was an explicit member initialization.  Do some work
index 1bd00ff..ac3d6e6 100644 (file)
@@ -1,3 +1,8 @@
+2010-04-27  Fabien ChĂȘne  <fabien.chene@gmail.com>
+
+       PR c++/29043
+       * g++.dg/init/pr29043.C: New.
+
 2010-04-27  Jason Merrill  <jason@redhat.com>
 
        * g++.dg/lookup/scoped5.C: Adjust.
 2010-04-27  Jason Merrill  <jason@redhat.com>
 
        * g++.dg/lookup/scoped5.C: Adjust.