[multiple changes]
authorAlexandre Petit-Bianco <apbianco@redhat.com>
Thu, 5 Jul 2001 22:33:44 +0000 (15:33 -0700)
committerAlexandre Petit-Bianco <apbianco@gcc.gnu.org>
Thu, 5 Jul 2001 22:33:44 +0000 (15:33 -0700)
2001-07-03  Alexandre Petit-Bianco  <apbianco@redhat.com>

* parse.y (resolve_expression_name): Improved error message for
inner class cases.
Fixes PR java/1958

2001-06-27  Alexandre Petit-Bianco  <apbianco@redhat.com>

* jcf-parse.c (gcc_mark_jcf): Test for a finished JCF.
* jcf.h (typedef struct JCF): New bitfield `finished.'
(JCF_FINISH): Set `finished.'
(JCF_ZERO): Reset `finished.'
Fixes PR java/2633

2001-06-27  Alexandre Petit-Bianco  <apbianco@redhat.com>

* parse.y (class_body_declaration:): Don't install empty instance
initializers.
Fixes PR java/1314

(http://gcc.gnu.org/ml/gcc-patches/2001-07/msg00321.html )

From-SVN: r43793

gcc/java/ChangeLog
gcc/java/jcf-parse.c
gcc/java/jcf.h
gcc/java/parse.y

index 6a730858b319a6b5e679eb6e29626e4f7794f53a..28888f2f820c59d0027ab8a58589756387eae61d 100644 (file)
        * parse.y (fix_constructors): Test if a CALL_EXPR invokes
        `this'.  If so, don't build instance initializers.
 
+2001-07-03  Alexandre Petit-Bianco  <apbianco@redhat.com>
+
+       * parse.y (resolve_expression_name): Improved error message for
+       inner class cases.
+       Fixes PR java/1958
+
 2001-06-28  Gabriel Dos Reis  <gdr@codesourcery.com>
 
        * lang.c: #include diagnostic.h
        (java_dummy_print): Likewise.
        * Make-lang.in (JAVA_LEX_C): Depend on diagnostic.h
 
+2001-06-27  Alexandre Petit-Bianco  <apbianco@redhat.com>
+
+       * jcf-parse.c (gcc_mark_jcf): Test for a finished JCF.
+       * jcf.h (typedef struct JCF): New bitfield `finished.'
+       (JCF_FINISH): Set `finished.'
+       (JCF_ZERO): Reset `finished.'
+       Fixes PR java/2633
+
+2001-06-27  Alexandre Petit-Bianco  <apbianco@redhat.com>
+
+       * parse.y (class_body_declaration:): Don't install empty instance
+       initializers.
+       Fixes PR java/1314
+
 2001-06-27  Alexandre Petit-Bianco  <apbianco@redhat.com>
 
        * class.c (set_super_info): Call `set_class_decl_access_flags.'
index b4d5ba03aa77474d4b9885cc9931979fe5cae38e..d925205fe19d27b23cd9a64b6379950ce6a123c0 100644 (file)
@@ -101,14 +101,15 @@ static void jcf_parse PARAMS ((struct JCF*));
 static void load_inner_classes PARAMS ((tree));
 
 /* Mark (for garbage collection) all the tree nodes that are
-   referenced from JCF's constant pool table. */
+   referenced from JCF's constant pool table. Do that only if the JCF
+   hasn't been marked finished.  */
 
 static void
 ggc_mark_jcf (elt)
      void **elt;
 {
   JCF *jcf = *(JCF**) elt;
-  if (jcf != NULL)
+  if (jcf != NULL && !jcf->finished)
     {
       CPool *cpool = &jcf->cpool;
       int size = CPOOL_COUNT(cpool);
index 4586f06093a8df72ec8478e715dfff3c9324b70e..fc3cedfe838dea18e4aaec4506101921098b8693 100644 (file)
@@ -90,6 +90,7 @@ typedef struct JCF {
   unsigned char *read_end;
   int java_source : 1;
   int right_zip : 1;
+  int finished : 1;
   jcf_filbuf_t filbuf;
   void *read_state;
   const char *filename;
@@ -144,7 +145,8 @@ typedef struct JCF {
   CPOOL_FINISH(&(JCF)->cpool); \
   if ((JCF)->buffer) FREE ((JCF)->buffer); \
   if ((JCF)->filename) FREE ((char *) (JCF)->filename); \
-  if ((JCF)->classname) FREE ((char *) (JCF)->classname); }
+  if ((JCF)->classname) FREE ((char *) (JCF)->classname); \
+  (JCF)->finished = 1; }
   
 #define CPOOL_INIT(CPOOL) \
   ((CPOOL)->capacity = 0, (CPOOL)->count = 0, (CPOOL)->tags = 0, (CPOOL)->data = 0)
@@ -154,7 +156,8 @@ typedef struct JCF {
 #define JCF_ZERO(JCF)  \
   ((JCF)->buffer = (JCF)->buffer_end = (JCF)->read_ptr = (JCF)->read_end = 0,\
    (JCF)->read_state = 0, (JCF)->filename = (JCF)->classname = 0, \
-   CPOOL_INIT(&(JCF)->cpool), (JCF)->java_source = 0, (JCF)->zipd = 0)
+   CPOOL_INIT(&(JCF)->cpool), (JCF)->java_source = 0, (JCF)->zipd = 0, \
+   (JCF)->finished = 0)
 
 /* Given that PTR points to a 2-byte unsigned integer in network
    (big-endian) byte-order, return that integer. */
index ac062ad1cbb1b6185cde50299b0928c11da45454..e4e682b453b85b6d31a1cc9458d4642a6341fb96 100644 (file)
@@ -924,8 +924,11 @@ class_body_declaration:
 |      constructor_declaration
 |      block                   /* Added, JDK1.1, instance initializer */
                {
-                 TREE_CHAIN ($1) = CPC_INSTANCE_INITIALIZER_STMT (ctxp);
-                 SET_CPC_INSTANCE_INITIALIZER_STMT (ctxp, $1);
+                 if ($1 != empty_stmt_node)
+                   {
+                     TREE_CHAIN ($1) = CPC_INSTANCE_INITIALIZER_STMT (ctxp);
+                     SET_CPC_INSTANCE_INITIALIZER_STMT (ctxp, $1);
+                   }
                }
 ;
 
@@ -8952,8 +8955,15 @@ resolve_expression_name (id, orig)
     }
 
   /* We've got an error here */
-  parse_error_context (id, "Undefined variable `%s'", 
-                      IDENTIFIER_POINTER (name));
+  if (INNER_CLASS_TYPE_P (current_class))
+    parse_error_context (id, 
+                        "Local variable `%s' can't be accessed from within the inner class `%s' unless it is declared final",
+                        IDENTIFIER_POINTER (name),
+                        IDENTIFIER_POINTER (DECL_NAME
+                                            (TYPE_NAME (current_class))));
+  else
+    parse_error_context (id, "Undefined variable `%s'", 
+                        IDENTIFIER_POINTER (name));
 
   return error_mark_node;
 }