diff options
author | Andrew Haley <aph@redhat.com> | 2004-02-26 15:34:05 +0000 |
---|---|---|
committer | Andrew Haley <aph@gcc.gnu.org> | 2004-02-26 15:34:05 +0000 |
commit | bddefd4f80c73d80c3370a71ebb351b1acc164c1 (patch) | |
tree | 0c8713946b3a16d29998db9a16e78a4d0fd9009c /gcc/java | |
parent | 50106e8f8d39cd8bead63c0c17608964fef2b27a (diff) | |
download | gcc-bddefd4f80c73d80c3370a71ebb351b1acc164c1.zip gcc-bddefd4f80c73d80c3370a71ebb351b1acc164c1.tar.gz gcc-bddefd4f80c73d80c3370a71ebb351b1acc164c1.tar.bz2 |
re PR java/14231 (Incorrect interface method called when compiling against .class files)
2004-02-26 Andrew Haley <aph@redhat.com>
PR java/14231:
* parse.y (check_interface_throws_clauses): Check for
!METHOD_INVISIBLE (iface_method).
* class.c (layout_class_methods): Check for CLASS_INTERFACE as
well as CLASS_ABSTRACT.
From-SVN: r78505
Diffstat (limited to 'gcc/java')
-rw-r--r-- | gcc/java/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/java/class.c | 5 | ||||
-rw-r--r-- | gcc/java/parse.y | 3 |
3 files changed, 13 insertions, 3 deletions
diff --git a/gcc/java/ChangeLog b/gcc/java/ChangeLog index a1a3685..b300dd3 100644 --- a/gcc/java/ChangeLog +++ b/gcc/java/ChangeLog @@ -1,3 +1,11 @@ +2004-02-26 Andrew Haley <aph@redhat.com> + + PR java/14231: + * parse.y (check_interface_throws_clauses): Check for + !METHOD_INVISIBLE (iface_method). + * class.c (layout_class_methods): Check for CLASS_INTERFACE as + well as CLASS_ABSTRACT. + 2004-02-25 Per Bothner <per@bothner.com> * parse.y (build_assertion): If we're in an inner class, create the diff --git a/gcc/java/class.c b/gcc/java/class.c index f6471ef..be9958b 100644 --- a/gcc/java/class.c +++ b/gcc/java/class.c @@ -2053,7 +2053,7 @@ void layout_class_methods (tree this_class) { tree method_decl, dtable_count; - tree super_class; + tree super_class, type_name; if (TYPE_NVIRTUALS (this_class)) return; @@ -2070,7 +2070,8 @@ layout_class_methods (tree this_class) else dtable_count = integer_zero_node; - if (CLASS_ABSTRACT (TYPE_NAME (this_class))) + type_name = TYPE_NAME (this_class); + if (CLASS_ABSTRACT (type_name) || CLASS_INTERFACE (type_name)) { /* An abstract class can have methods which are declared only in an implemented interface. These are called "Miranda diff --git a/gcc/java/parse.y b/gcc/java/parse.y index 8e419a5..446661b 100644 --- a/gcc/java/parse.y +++ b/gcc/java/parse.y @@ -6525,7 +6525,8 @@ check_interface_throws_clauses (tree check_class_decl, tree class_decl) Also, multiple inheritance with conflicting throws clauses is fine in the absence of a concrete implementation. */ - if (method != NULL_TREE && !METHOD_ABSTRACT (method)) + if (method != NULL_TREE && !METHOD_ABSTRACT (method) + && !METHOD_INVISIBLE (iface_method)) { tree method_wfl = DECL_FUNCTION_WFL (method); check_throws_clauses (method, method_wfl, iface_method); |