diff options
author | Jason Merrill <jason@gcc.gnu.org> | 2000-10-21 17:44:04 -0400 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2000-10-21 17:44:04 -0400 |
commit | aca77bd196cb6f04c215db0380c77dda140b0258 (patch) | |
tree | 9e176ae2ca30f22b3b8c361b8ed56389f44884f1 /gcc/cp | |
parent | fac045536fefda3972f6c5d42ab60431a41f6d03 (diff) | |
download | gcc-aca77bd196cb6f04c215db0380c77dda140b0258.zip gcc-aca77bd196cb6f04c215db0380c77dda140b0258.tar.gz gcc-aca77bd196cb6f04c215db0380c77dda140b0258.tar.bz2 |
parse.y (operator): Set got_object from got_scope.
* parse.y (operator): Set got_object from got_scope.
Set looking_for_typename.
* decl.c (lookup_name_real): Clear val after setting from_obj.
Reorganize diagnostic.
From-SVN: r37000
Diffstat (limited to 'gcc/cp')
-rw-r--r-- | gcc/cp/ChangeLog | 9 | ||||
-rw-r--r-- | gcc/cp/decl.c | 18 | ||||
-rw-r--r-- | gcc/cp/parse.y | 11 |
3 files changed, 26 insertions, 12 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index c3582fc..1c66708 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,10 @@ +2000-10-21 Jason Merrill <jason@redhat.com> + + * parse.y (operator): Set got_object from got_scope. + Set looking_for_typename. + * decl.c (lookup_name_real): Clear val after setting from_obj. + Reorganize diagnostic. + 2000-10-20 Jason Merrill <jason@redhat.com> * tree.c (walk_tree): Don't walk into default args. @@ -419,7 +426,7 @@ Thu Sep 14 12:10:45 2000 Richard Kenner <kenner@vlsi1.ultra.nyu.edu> (cp_parse_init): Adjust. (do_id): If lastiddecl is NULL, do do_identifier. (operator): Save scope information. - (unoperator): new reduction. Restore scope information. + (unoperator): New reduction. Restore scope information. (operator_name): Append unoperator. Call frob_opname. * spew.c (frob_opname): Define. diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 7963a52..8040137 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -5946,7 +5946,10 @@ lookup_name_real (name, prefer_type, nonclass, namespaces_only) if (got_scope) goto done; else if (got_object && val) - from_obj = val; + { + from_obj = val; + val = NULL_TREE; + } } else { @@ -6015,13 +6018,12 @@ lookup_name_real (name, prefer_type, nonclass, namespaces_only) { if (looking_for_typename && TREE_CODE (from_obj) == TYPE_DECL && TREE_CODE (val) == TYPE_DECL - && TREE_TYPE (from_obj) != TREE_TYPE (val)) - { - cp_pedwarn ("lookup of `%D' in the scope of `%#T' (`%#T')", - name, got_object, TREE_TYPE (from_obj)); - cp_pedwarn (" does not match lookup in the current scope (`%#T')", - TREE_TYPE (val)); - } + && ! same_type_p (TREE_TYPE (from_obj), TREE_TYPE (val))) + cp_pedwarn ("\ +lookup of `%D' in the scope of `%#T' (`%#T') \ +does not match lookup in the current scope (`%#T')", + name, got_object, TREE_TYPE (from_obj), + TREE_TYPE (val)); /* We don't change val to from_obj if got_object depends on template parms because that breaks implicit typename for diff --git a/gcc/cp/parse.y b/gcc/cp/parse.y index 27075e8..5e99862 100644 --- a/gcc/cp/parse.y +++ b/gcc/cp/parse.y @@ -3745,9 +3745,15 @@ conversion_declarator: operator: OPERATOR - { saved_scopes = tree_cons (got_scope, got_object, saved_scopes); - got_scope = NULL_TREE; got_object = NULL_TREE; } + { + saved_scopes = tree_cons (got_scope, got_object, saved_scopes); + /* We look for conversion-type-id's in both the class and current + scopes, just as for ID in 'ptr->ID::'. */ + looking_for_typename = 1; got_object = got_scope; + got_scope = NULL_TREE; + } ; + unoperator: { got_scope = TREE_PURPOSE (saved_scopes); got_object = TREE_VALUE (saved_scopes); @@ -3821,7 +3827,6 @@ operator_name: { $$ = frob_opname (ansi_opname (VEC_NEW_EXPR)); } | operator DELETE '[' ']' unoperator { $$ = frob_opname (ansi_opname (VEC_DELETE_EXPR)); } - /* Names here should be looked up in class scope ALSO. */ | operator type_specifier_seq conversion_declarator unoperator { $$ = frob_opname (grokoptypename ($2.t, $3)); } | operator error unoperator |