[PATCH] Java: miscellaneous fixes.
Alexandre Petit-Bianco
apbianco@cygnus.com
Wed Jan 10 08:22:00 GMT 2001
I'm checking this in. It fixes a few things, among which this problem:
http://gcc.gnu.org/ml/gcc-bugs/2001-01/msg00107.html
./A
2001-01-08 Alexandre Petit-Bianco <apbianco@cygnus.com>
* java-tree.h (lang_printable_name_wls): New prototype.
* lang.c (put_decl_name): Removed dead code. Use DECL_CONTEXT
rather than `current_class' to print type name. Don't prepend type
names when printing constructor names.
(lang_printable_name_wls): New function.
* jcf-parse.c (jcf_parse_source): Constify `file' argument to
`build_expr_wfl.'
* parse.y (patch_method_invocation): Message tuned for constructors.
(not_accessible_p): Grant `private' access from within
enclosing contexts.
2001-01-05 Alexandre Petit-Bianco <apbianco@cygnus.com>
* parse.y (patch_binop): Compute missing type in error situations.
Index: java-tree.h
===================================================================
RCS file: /cvs/gcc/egcs/gcc/java/java-tree.h,v
retrieving revision 1.90
diff -u -p -r1.90 java-tree.h
--- java-tree.h 2000/12/06 18:55:42 1.90
+++ java-tree.h 2001/01/10 15:47:22
@@ -1111,6 +1111,7 @@ extern boolean java_hash_compare_tree_no
hash_table_key));
extern void java_check_methods PARAMS ((tree));
extern void init_jcf_parse PARAMS((void));
+extern const char *lang_printable_name_wls PARAMS ((tree, int));
/* We use ARGS_SIZE_RTX to indicate that gcc/expr.h has been included
to declare `enum expand_modifier'. */
Index: jcf-parse.c
===================================================================
RCS file: /cvs/gcc/egcs/gcc/java/jcf-parse.c,v
retrieving revision 1.67
diff -u -p -r1.67 jcf-parse.c
--- jcf-parse.c 2000/12/16 01:51:51 1.67
+++ jcf-parse.c 2001/01/10 15:47:24
@@ -569,7 +569,7 @@ jcf_parse_source ()
java_push_parser_context ();
BUILD_FILENAME_IDENTIFIER_NODE (file, current_jcf->filename);
if (wfl_operator == NULL_TREE)
- wfl_operator = build_expr_wfl (NULL_TREE, file, 0, 0);
+ wfl_operator = build_expr_wfl (NULL_TREE, (const char *)file, 0, 0);
else
EXPR_WFL_FILENAME_NODE (wfl_operator) = file;
input_filename = ggc_strdup (current_jcf->filename);
Index: lang.c
===================================================================
RCS file: /cvs/gcc/egcs/gcc/java/lang.c,v
retrieving revision 1.55
diff -u -p -r1.55 lang.c
--- lang.c 2001/01/09 10:54:01 1.55
+++ lang.c 2001/01/10 15:47:25
@@ -498,18 +498,13 @@ put_decl_node (node)
if (TREE_CODE_CLASS (TREE_CODE (node)) == 'd'
&& DECL_NAME (node) != NULL_TREE)
{
-#if 0
- if (DECL_CONTEXT (node) != NULL_TREE)
- {
- put_decl_node (DECL_CONTEXT (node));
- put_decl_string (".", 1);
- }
-#endif
+ /* We want to print the type the DECL belongs to. We don't do
+ that when we handle constructors. */
if (TREE_CODE (node) == FUNCTION_DECL
- && DECL_INIT_P (node)
- && !DECL_ARTIFICIAL (node) && current_class)
- put_decl_node (TYPE_NAME (current_class));
- else
+ && ! DECL_CONSTRUCTOR_P (node)
+ && ! DECL_ARTIFICIAL (node) && DECL_CONTEXT (node))
+ put_decl_node (TYPE_NAME (DECL_CONTEXT (node)));
+ else if (! DECL_CONSTRUCTOR_P (node))
put_decl_node (DECL_NAME (node));
if (TREE_CODE (node) == FUNCTION_DECL && TREE_TYPE (node) != NULL_TREE)
{
@@ -567,6 +562,21 @@ lang_printable_name (decl, v)
decl_bufpos = 0;
put_decl_node (decl);
put_decl_string ("", 1);
+ return decl_buf;
+}
+
+/* Does the same thing that lang_printable_name, but add a leading
+ space to the DECL name string -- With Leading Space. */
+
+const char *
+lang_printable_name_wls (decl, v)
+ tree decl;
+ int v __attribute__ ((__unused__));
+{
+ decl_bufpos = 1;
+ put_decl_node (decl);
+ put_decl_string ("", 1);
+ decl_buf [0] = ' ';
return decl_buf;
}
Index: parse.y
===================================================================
RCS file: /cvs/gcc/egcs/gcc/java/parse.y,v
retrieving revision 1.239
diff -u -p -r1.239 parse.y
--- parse.y 2001/01/06 05:06:02 1.239
+++ parse.y 2001/01/10 15:48:02
@@ -9701,11 +9701,16 @@ not_accessible_p (reference, member, fro
}
/* Check access on private members. Access is granted only if it
- occurs from within the class in which it is declared. Exceptions
- are accesses from inner-classes. */
+ occurs from within the class in which it is declared -- that does
+ it for innerclasses too. */
if (access_flag & ACC_PRIVATE)
- return (current_class == DECL_CONTEXT (member) ? 0 :
- (INNER_CLASS_TYPE_P (current_class) ? 0 : 1));
+ {
+ if (reference == DECL_CONTEXT (member))
+ return 0;
+ if (enclosing_context_p (reference, DECL_CONTEXT (member)))
+ return 0;
+ return 1;
+ }
/* Default access are permitted only when occuring within the
package in which the type (REFERENCE) is declared. In other words,
@@ -10054,10 +10059,13 @@ patch_method_invocation (patch, primary,
if (not_accessible_p (DECL_CONTEXT (current_function_decl), list, 0))
{
char *fct_name = xstrdup (lang_printable_name (list, 0));
+ int ctor_p = DECL_CONSTRUCTOR_P (list);
parse_error_context
- (wfl, "Can't access %s method `%s %s.%s' from `%s'",
+ (wfl, "Can't access %s %s `%s%s.%s' from `%s'",
java_accstring_lookup (get_access_flags_from_decl (list)),
- lang_printable_name (TREE_TYPE (TREE_TYPE (list)), 0),
+ (ctor_p ? "constructor" : "method"),
+ (ctor_p ?
+ "" : lang_printable_name_wls (TREE_TYPE (TREE_TYPE (list)), 0)),
IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (DECL_CONTEXT (list)))),
fct_name, IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (current_class))));
free (fct_name);
@@ -13116,6 +13124,26 @@ patch_binop (node, wfl_op1, wfl_op2)
int error_found = 0;
EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node);
+
+ /* If either op<n>_type are NULL, this might be early signs of an
+ error situation, unless it's too early to tell (in case we're
+ handling a `+', `==', `!=' or `instanceof'.) We want to set op<n>_type
+ correctly so the error can be later on reported accurately. */
+ if (! (code == PLUS_EXPR || code == NE_EXPR
+ || code == EQ_EXPR || code == INSTANCEOF_EXPR))
+ {
+ tree n;
+ if (! op1_type)
+ {
+ n = java_complete_tree (op1);
+ op1_type = TREE_TYPE (n);
+ }
+ if (! op2_type)
+ {
+ n = java_complete_tree (op2);
+ op2_type = TREE_TYPE (n);
+ }
+ }
switch (code)
{
More information about the Gcc-patches
mailing list