From b7151a8b8bbd798c9c62349baee6b4fef6eed770 Mon Sep 17 00:00:00 2001 From: dje Date: Fri, 25 Oct 2002 15:13:05 +0000 Subject: [PATCH] PR c++/7228 * cp-tree.h (CLASSTYPE_READONLY_FIELDS_NEED_INIT): Check that lang_type structure exists before accessing field. (SET_CLASSTYPE_READONLY_FIELDS_NEED_INIT): New macro. (CLASSTYPE_REF_FIELDS_NEED_INIT): Similar. (SET_CLASSTYPE_REF_FIELDS_NEED_INIT): New macro. * class.c (check_field_decls): Use new macros. * typeck2.c (process_init_constructor): Remove redundant check for existence of lang_type structure. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@58532 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/cp/ChangeLog | 12 ++++++++++++ gcc/cp/class.c | 9 +++++---- gcc/cp/cp-tree.h | 22 +++++++++++++++------- gcc/cp/typeck2.c | 3 +-- 4 files changed, 33 insertions(+), 13 deletions(-) diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index e90cb24..119bdc1 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,15 @@ +2002-10-24 David Edelsohn + + PR c++/7228 + * cp-tree.h (CLASSTYPE_READONLY_FIELDS_NEED_INIT): Check that + lang_type structure exists before accessing field. + (SET_CLASSTYPE_READONLY_FIELDS_NEED_INIT): New macro. + (CLASSTYPE_REF_FIELDS_NEED_INIT): Similar. + (SET_CLASSTYPE_REF_FIELDS_NEED_INIT): New macro. + * class.c (check_field_decls): Use new macros. + * typeck2.c (process_init_constructor): Remove redundant check for + existence of lang_type structure. + 2002-10-24 Mark Mitchell * class.c (end_of_base): New method. diff --git a/gcc/cp/class.c b/gcc/cp/class.c index c4b49b0..f4b9beb 100644 --- a/gcc/cp/class.c +++ b/gcc/cp/class.c @@ -3264,7 +3264,7 @@ check_field_decls (tree t, tree *access_decls, { CLASSTYPE_NON_POD_P (t) = 1; if (DECL_INITIAL (x) == NULL_TREE) - CLASSTYPE_REF_FIELDS_NEED_INIT (t) = 1; + SET_CLASSTYPE_REF_FIELDS_NEED_INIT (t, 1); /* ARM $12.6.2: [A member initializer list] (or, for an aggregate, initialization by a brace-enclosed list) is the @@ -3299,7 +3299,7 @@ check_field_decls (tree t, tree *access_decls, { C_TYPE_FIELDS_READONLY (t) = 1; if (DECL_INITIAL (x) == NULL_TREE) - CLASSTYPE_READONLY_FIELDS_NEED_INIT (t) = 1; + SET_CLASSTYPE_READONLY_FIELDS_NEED_INIT (t, 1); /* ARM $12.6.2: [A member initializer list] (or, for an aggregate, initialization by a brace-enclosed list) is the @@ -3316,8 +3316,9 @@ check_field_decls (tree t, tree *access_decls, else if (IS_AGGR_TYPE (type)) { C_TYPE_FIELDS_READONLY (t) |= C_TYPE_FIELDS_READONLY (type); - CLASSTYPE_READONLY_FIELDS_NEED_INIT (t) - |= CLASSTYPE_READONLY_FIELDS_NEED_INIT (type); + SET_CLASSTYPE_READONLY_FIELDS_NEED_INIT (t, + CLASSTYPE_READONLY_FIELDS_NEED_INIT (t) + | CLASSTYPE_READONLY_FIELDS_NEED_INIT (type)); } /* Core issue 80: A nonstatic data member is required to have a diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h index 364b545..40c4ab5 100644 --- a/gcc/cp/cp-tree.h +++ b/gcc/cp/cp-tree.h @@ -1476,13 +1476,21 @@ struct lang_type GTY(()) #define CLASSTYPE_DECLARED_CLASS(NODE) \ (LANG_TYPE_CLASS_CHECK (NODE)->declared_class) -/* Nonzero if this class has const members which have no specified initialization. */ -#define CLASSTYPE_READONLY_FIELDS_NEED_INIT(NODE) \ - (LANG_TYPE_CLASS_CHECK (NODE)->h.const_needs_init) - -/* Nonzero if this class has ref members which have no specified initialization. */ -#define CLASSTYPE_REF_FIELDS_NEED_INIT(NODE) \ - (LANG_TYPE_CLASS_CHECK (NODE)->h.ref_needs_init) +/* Nonzero if this class has const members + which have no specified initialization. */ +#define CLASSTYPE_READONLY_FIELDS_NEED_INIT(NODE) \ + (TYPE_LANG_SPECIFIC (NODE) \ + ? LANG_TYPE_CLASS_CHECK (NODE)->h.const_needs_init : 0) +#define SET_CLASSTYPE_READONLY_FIELDS_NEED_INIT(NODE, VALUE) \ + (LANG_TYPE_CLASS_CHECK (NODE)->h.const_needs_init = (VALUE)) + +/* Nonzero if this class has ref members + which have no specified initialization. */ +#define CLASSTYPE_REF_FIELDS_NEED_INIT(NODE) \ + (TYPE_LANG_SPECIFIC (NODE) \ + ? LANG_TYPE_CLASS_CHECK (NODE)->h.ref_needs_init : 0) +#define SET_CLASSTYPE_REF_FIELDS_NEED_INIT(NODE, VALUE) \ + (LANG_TYPE_CLASS_CHECK (NODE)->h.ref_needs_init = (VALUE)) /* Nonzero if this class is included from a header file which employs `#pragma interface', and it is not included in its implementation file. */ diff --git a/gcc/cp/typeck2.c b/gcc/cp/typeck2.c index cc712b9..b8d0869 100644 --- a/gcc/cp/typeck2.c +++ b/gcc/cp/typeck2.c @@ -830,8 +830,7 @@ process_init_constructor (type, init, elts) { if (TREE_READONLY (field)) error ("uninitialized const member `%D'", field); - else if (TYPE_LANG_SPECIFIC (TREE_TYPE (field)) - && CLASSTYPE_READONLY_FIELDS_NEED_INIT (TREE_TYPE (field))) + else if (CLASSTYPE_READONLY_FIELDS_NEED_INIT (TREE_TYPE (field))) error ("member `%D' with uninitialized const fields", field); else if (TREE_CODE (TREE_TYPE (field)) == REFERENCE_TYPE) -- 2.7.4