diff options
Diffstat (limited to 'gcc/cp/init.c')
-rw-r--r-- | gcc/cp/init.c | 25 |
1 files changed, 19 insertions, 6 deletions
diff --git a/gcc/cp/init.c b/gcc/cp/init.c index bfce5564b4b..91dbf8a141c 100644 --- a/gcc/cp/init.c +++ b/gcc/cp/init.c @@ -913,16 +913,29 @@ member_init_ok_or_else (field, type, member_name) { if (field == error_mark_node) return 0; - if (field == NULL_TREE || initializing_context (field) != type) + if (!field) { error ("class `%T' does not have any field named `%D'", type, - member_name); + member_name); return 0; } - if (TREE_STATIC (field)) + if (TREE_CODE (field) == VAR_DECL) { - error ("field `%#D' is static; the only point of initialization is its definition", - field); + error ("`%#D' is a static data member; it can only be " + "initialized at its definition", + field); + return 0; + } + if (TREE_CODE (field) != FIELD_DECL) + { + error ("`%#D' is not a non-static data member of `%T'", + field, type); + return 0; + } + if (initializing_context (field) != type) + { + error ("class `%T' does not have any field named `%D'", type, + member_name); return 0; } @@ -1601,7 +1614,7 @@ build_offset_ref (type, name) decl = maybe_dummy_object (type, &basebinfo); - if (BASELINK_P (name)) + if (BASELINK_P (name) || DECL_P (name)) member = name; else { |