From: jason Date: Mon, 12 Apr 2010 19:58:27 +0000 (+0000) Subject: PR c++/25811 X-Git-Url: http://git.sourceforge.jp/view?p=pf3gnuchains%2Fgcc-fork.git;a=commitdiff_plain;h=8096679edecdd39e95252580a30d4cffda75c649;hp=8a76b485c274195fd4408e09ae855600720e1ed6 PR c++/25811 * cp-tree.h (diagnose_uninitialized_cst_or_ref_member): Declare. * init.c (build_new_1): Check for uninitialized const members and uninitialized reference members, when using new without new-initializer. Call diagnose_uninitialized_cst_or_ref_member. (diagnose_uninitialized_cst_or_ref_member): Define, call diagnose_uninitialized_cst_or_ref_member_1. (diagnose_uninitialized_cst_or_ref_member_1): New function. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@158239 138bc75d-0d04-0410-961f-82ee72b054a4 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 9cfb3d8fee3..b9420787985 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,14 @@ +2010-04-12 Fabien Chene + + PR c++/25811 + * cp-tree.h (diagnose_uninitialized_cst_or_ref_member): Declare. + * init.c (build_new_1): Check for uninitialized const members and + uninitialized reference members, when using new without + new-initializer. Call diagnose_uninitialized_cst_or_ref_member. + (diagnose_uninitialized_cst_or_ref_member): Define, call + diagnose_uninitialized_cst_or_ref_member_1. + (diagnose_uninitialized_cst_or_ref_member_1): New function. + 2010-04-12 Richard Guenther PR c++/43611 diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h index 361a6f26b37..9ae7f7f0105 100644 --- a/gcc/cp/cp-tree.h +++ b/gcc/cp/cp-tree.h @@ -4870,7 +4870,7 @@ extern tree create_temporary_var (tree); extern void initialize_vtbl_ptrs (tree); extern tree build_java_class_ref (tree); extern tree integral_constant_value (tree); -extern int diagnose_uninitialized_cst_or_ref_member (tree, bool, bool); +extern void diagnose_uninitialized_cst_or_ref_member (tree, bool); /* in lex.c */ extern void cxx_dup_lang_specific_decl (tree); diff --git a/gcc/cp/init.c b/gcc/cp/init.c index e45d2b882b5..cb56d9cbedf 100644 --- a/gcc/cp/init.c +++ b/gcc/cp/init.c @@ -54,7 +54,7 @@ static tree dfs_initialize_vtbl_ptrs (tree, void *); static tree build_dtor_call (tree, special_function_kind, int); static tree build_field_list (tree, tree, int *); static tree build_vtbl_address (tree); -static int diagnose_uninitialized_cst_or_ref_member_1 (tree, tree, bool, bool); +static void diagnose_uninitialized_cst_or_ref_member_1 (tree, tree, bool); /* We are about to generate some complex initialization code. Conceptually, it is all a single expression. However, we may want @@ -1772,18 +1772,13 @@ build_raw_new_expr (VEC(tree,gc) *placement, tree type, tree nelts, /* Diagnose uninitialized const members or reference members of type TYPE. USING_NEW is used to disambiguate the diagnostic between a - new expression without a new-initializer and a declaration. Returns - the error count. */ + new expression without a new-initializer and a declaration */ -static int +static void diagnose_uninitialized_cst_or_ref_member_1 (tree type, tree origin, - bool using_new, bool complain) + bool using_new) { tree field; - int error_count = 0; - - if (type_has_user_provided_constructor (type)) - return 0; for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field)) { @@ -1796,46 +1791,36 @@ diagnose_uninitialized_cst_or_ref_member_1 (tree type, tree origin, if (TREE_CODE (field_type) == REFERENCE_TYPE) { - ++ error_count; - if (complain) - { - if (using_new) - error ("uninitialized reference member in %q#T " - "using % without new-initializer", origin); - else - error ("uninitialized reference member in %q#T", origin); - inform (DECL_SOURCE_LOCATION (field), - "%qD should be initialized", field); - } + if (using_new) + error ("uninitialized reference member in %q#T using %", + origin); + else + error ("uninitialized reference member in %q#T", origin); + inform (DECL_SOURCE_LOCATION (field), + "%qD should be initialized", field); } if (CP_TYPE_CONST_P (field_type)) { - ++ error_count; - if (complain) - { - if (using_new) - error ("uninitialized const member in %q#T " - "using % without new-initializer", origin); - else - error ("uninitialized const member in %q#T", origin); - inform (DECL_SOURCE_LOCATION (field), - "%qD should be initialized", field); - } + if (using_new) + error ("uninitialized const member in %q#T using %", + origin); + else + error ("uninitialized const member in %q#T", origin); + inform (DECL_SOURCE_LOCATION (field), + "%qD should be initialized", field); } if (CLASS_TYPE_P (field_type)) - error_count - += diagnose_uninitialized_cst_or_ref_member_1 (field_type, origin, - using_new, complain); + diagnose_uninitialized_cst_or_ref_member_1 (field_type, + origin, using_new); } - return error_count; } -int -diagnose_uninitialized_cst_or_ref_member (tree type, bool using_new, bool complain) +void +diagnose_uninitialized_cst_or_ref_member (tree type, bool using_new) { - return diagnose_uninitialized_cst_or_ref_member_1 (type, type, using_new, complain); + diagnose_uninitialized_cst_or_ref_member_1 (type, type, using_new); } /* Generate code for a new-expression, including calling the "operator @@ -1924,13 +1909,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: @@ -1945,13 +1930,15 @@ 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 - && diagnose_uninitialized_cst_or_ref_member (elt_type, - /*using_new=*/true, - complain & tf_error)) - return error_mark_node; + if (uninitialized_error) + { + if (complain & tf_error) + diagnose_uninitialized_cst_or_ref_member (elt_type, + /*using_new*/true); + return error_mark_node; + } } if (CP_TYPE_CONST_P (elt_type) && *init == NULL diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index e25b828131e..f1f7364dc49 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2010-04-12 Fabien Chene + + PR c++/25811 + * g++.dg/init/pr25811.C: New test. + 2010-04-12 Rainer Orth * g++.dg/warn/miss-format-1.C: Removed *-*-solaris2.7 from