1 /* Code to test for "definitive [un]assignment".
2    Copyright (C) 1999, 2000, 2001, 2003 Free Software Foundation, Inc.
3 
4 This file is part of GCC.
5 
6 GCC is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2, or (at your option)
9 any later version.
10 
11 GCC is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 GNU General Public License for more details.
15 
16 You should have received a copy of the GNU General Public License
17 along with GCC; see the file COPYING.  If not, write to
18 the Free Software Foundation, 59 Temple Place - Suite 330,
19 Boston, MA 02111-1307, USA.
20 
21 Java and all Java-based marks are trademarks or registered trademarks
22 of Sun Microsystems, Inc. in the United States and other countries.
23 The Free Software Foundation is independent of Sun Microsystems, Inc.  */
24 
25 /* Written by Per Bothner <bothner@cygnus.com>, January 1999. */
26 
27 #include "config.h"
28 #include "system.h"
29 #include "coretypes.h"
30 #include "tm.h"
31 #include "tree.h"
32 #include "flags.h" /* Needed for optimize. */
33 #include "java-tree.h"
34 #include "toplev.h" /* Needed for fatal. */
35 
36 /* The basic idea is that we assign each local variable declaration
37    and each blank final field an index, and then we pass around
38    bitstrings, where the (2*i)'th bit is set if decl whose DECL_BIT_INDEX
39    is i is definitely assigned, and the the (2*i=1)'th bit is set if
40    decl whose DECL_BIT_INDEX is i is definitely unassigned */
41 
42 /* One segment of a bitstring. */
43 typedef unsigned int word;
44 
45 /* Pointer to a bitstring. */
46 typedef word *words;
47 
48 /* Number of locals variables currently active. */
49 static int num_current_locals = 0;
50 
51 /* The value of num_current_locals when we entered the closest
52    enclosing LOOP_EXPR. */
53 static int loop_current_locals;
54 
55 /* The index of the first local variable in the current block.
56 
57    The variables whose DECL_BIT_INDEX are in the range from
58    start_current_locals (inclusive) up to num_current_locals (exclusive)
59    are declared in the "current" block.  If there is a loop or branch
60    form, we set start_current_locals to num_current_locals to indicate
61    there is no current block.
62 
63    The point is that if a variable in the current block is set,
64    there are no other control paths that we have to worry about.
65    Hence, we can remove it from the set of variables we are
66    checking, making its bit index available for some other variable.
67    For simplicity, we only do that if the variable's bit index
68    is (num_current_locals-1);  freeing up its bit index is then
69    just a simple matter of decrementing num_current_locals.
70    The reason this is worth doing is that it is simple, and
71    allows us to use short (usually one-word) bit-strings,
72    even for methods with thousands of local variables, as
73    long as most of them are initialized immediately after or in
74    their declaration. */
75 static int start_current_locals = 0;
76 
77 static int num_current_words;
78 
79 static tree wfl;
80 
81 #define COPYN(DST, SRC, NWORDS) memcpy (DST, SRC, NWORDS * sizeof(word))
82 #define COPY(DST, SRC) COPYN (DST, SRC, num_current_words)
83 
84 #define SET_ALL(DST) memset (DST, ~0, num_current_words * sizeof(word))
85 #define CLEAR_ALL(DST) memset (DST, 0, num_current_words * sizeof(word))
86 
87 #define INTERSECTN(DST, SRC1, SRC2, N) \
88   do { int n = N; \
89   while (--n >= 0) DST[n] = SRC1[n] & SRC2[n]; \
90   } while (0)
91 
92 #define UNION(DST, SRC1, SRC2) \
93   UNIONN (DST, SRC1, SRC2, num_current_words)
94 
95 #define UNIONN(DST, SRC1, SRC2, N) \
96   do { int n = N; \
97   while (--n >= 0) DST[n] = SRC1[n] | SRC2[n]; \
98   } while (0)
99 
100 #define INTERSECT(DST, SRC1, SRC2) \
101   INTERSECTN (DST, SRC1, SRC2, num_current_words)
102 
103 #define WORD_SIZE  ((unsigned int)(sizeof(word) * BITS_PER_UNIT))
104 
105 static void check_bool_init (tree, words, words, words);
106 static void check_init (tree, words);
107 static void check_cond_init (tree, tree, tree, words, words, words);
108 static void check_bool2_init (enum tree_code, tree, tree, words, words, words);
109 struct alternatives;
110 static void done_alternative (words, struct alternatives *);
111 static tree get_variable_decl (tree);
112 static void final_assign_error (tree);
113 static void check_final_reassigned (tree, words);
114 
115 #define ALLOC_WORDS(NUM) (xmalloc ((NUM) * sizeof (word)))
116 #define FREE_WORDS(PTR) (free (PTR))
117 
118 /* DECLARE_BUFFERS is used to allocate NUMBUFFER bit sets, each of
119    which is an array of length num_current_words number of words.
120    Declares a new local variable BUFFER to hold the result (or rather
121    a pointer to the first of the bit sets).  In almost all cases
122    num_current_words will be 1 or at most 2, so we try to stack
123    allocate the arrays in that case, using a stack array
124    named BUFFER##_short.  Each DECLARE_BUFFERS must be matched by
125    a corresponding RELEASE_BUFFERS to avoid memory leaks.  */
126 
127 #define DECLARE_BUFFERS(BUFFER, NUMBUFFERS) \
128   word BUFFER##_short[2 * NUMBUFFERS]; \
129   words BUFFER = ALLOC_BUFFER(BUFFER##_short, NUMBUFFERS * num_current_words)
130 
131 #define RELEASE_BUFFERS(BUFFER) \
132   FREE_BUFFER(BUFFER, BUFFER##_short)
133 
134 #define ALLOC_BUFFER(SHORTBUFFER, NUMWORDS) \
135   ((NUMWORDS) * sizeof(word) <= sizeof(SHORTBUFFER) ? SHORTBUFFER \
136    : ALLOC_WORDS(NUMWORDS))
137 
138 #define FREE_BUFFER(BUFFER, SHORTBUFFER) \
139   if (BUFFER != SHORTBUFFER) FREE_WORDS(BUFFER)
140 
141 #define SET_P(WORDS, BIT) \
142   (WORDS[(BIT) / WORD_SIZE] & (1 << ((BIT) % WORD_SIZE)))
143 
144 #define CLEAR_BIT(WORDS, BIT) \
145   (WORDS[(BIT) / WORD_SIZE] &= ~ (1 << ((BIT) % WORD_SIZE)))
146 
147 #define SET_BIT(WORDS, BIT) \
148   (WORDS[(BIT) / WORD_SIZE] |= (1 << ((BIT) % WORD_SIZE)))
149 
150 #define WORDS_NEEDED(BITS) (((BITS)+(WORD_SIZE-1))/(WORD_SIZE))
151 
152 #define ASSIGNED_P(WORDS, BIT)  SET_P(WORDS, 2 * (BIT))
153 #define UNASSIGNED_P(WORDS, BIT)  SET_P(WORDS, 2 * (BIT) + 1)
154 
155 #define SET_ASSIGNED(WORDS, INDEX) SET_BIT (WORDS, 2 * (INDEX))
156 #define SET_UNASSIGNED(WORDS, INDEX) SET_BIT (WORDS, 2 * (INDEX) + 1)
157 
158 #define CLEAR_ASSIGNED(WORDS, INDEX) CLEAR_BIT (WORDS, 2 * (INDEX))
159 #define CLEAR_UNASSIGNED(WORDS, INDEX) CLEAR_BIT (WORDS, 2 * (INDEX) + 1)
160 
161 /* Get the "interesting" declaration from a MODIFY_EXPR or COMPONENT_REF.
162    Return the declaration or NULL_TREE if no interesting declaration.  */
163 
164 static tree
get_variable_decl(tree exp)165 get_variable_decl (tree exp)
166 {
167   if (TREE_CODE (exp) == VAR_DECL)
168     {
169       if (! TREE_STATIC (exp) ||  FIELD_FINAL (exp))
170 	return exp;
171     }
172   /* We only care about final parameters. */
173   else if (TREE_CODE (exp) == PARM_DECL)
174     {
175       if (DECL_FINAL (exp))
176 	return exp;
177     }
178   /* See if exp is this.field. */
179   else if (TREE_CODE (exp) == COMPONENT_REF)
180     {
181       tree op0 = TREE_OPERAND (exp, 0);
182       tree op1 = TREE_OPERAND (exp, 1);
183       tree mdecl = current_function_decl;
184       if (TREE_CODE (op0) == INDIRECT_REF
185 	  && TREE_CODE (op1) == FIELD_DECL
186 	  && ! METHOD_STATIC (mdecl)
187 	  && FIELD_FINAL (op1))
188 	{
189 	  op0 = TREE_OPERAND (op0, 0);
190 	  if (op0 == BLOCK_EXPR_DECLS (DECL_FUNCTION_BODY (mdecl)))
191 	    return op1;
192 	}
193     }
194   return NULL_TREE;
195 }
196 
197 static void
final_assign_error(tree name)198 final_assign_error (tree name)
199 {
200   static const char format[]
201     = "can't reassign a value to the final variable '%s'";
202   parse_error_context (wfl, format, IDENTIFIER_POINTER (name));
203 }
204 
205 static void
check_final_reassigned(tree decl,words before)206 check_final_reassigned (tree decl, words before)
207 {
208   int index = DECL_BIT_INDEX (decl);
209   /* A final local already assigned or a final parameter
210      assigned must be reported as errors */
211   if (DECL_FINAL (decl) && index != -2
212       && (index < loop_current_locals /* I.e. -1, or outside current loop. */
213 	  || ! UNASSIGNED_P (before, index)))
214     {
215       final_assign_error (DECL_NAME (decl));
216     }
217 }
218 
219 /* Check a conditional form (TEST_EXP ? THEN_EXP : ELSE_EXP) for
220    definite [un]assignment.
221    BEFORE, WHEN_FALSE, and WHEN_TRUE are as in check_bool_init. */
222 
223 static void
check_cond_init(tree test_exp,tree then_exp,tree else_exp,words before,words when_false,words when_true)224 check_cond_init (tree test_exp, tree then_exp, tree else_exp,
225 		 words before, words when_false, words when_true)
226 {
227   int save_start_current_locals = start_current_locals;
228   DECLARE_BUFFERS(test_false, 6);
229   words test_true = test_false + num_current_words;
230   words then_false = test_true + num_current_words;
231   words then_true = then_false + num_current_words;
232   words else_false = then_true + num_current_words;
233   words else_true = else_false + num_current_words;
234   start_current_locals = num_current_locals;
235 
236   check_bool_init (test_exp, before, test_false, test_true);
237   check_bool_init (then_exp, test_true, then_false, then_true);
238   check_bool_init (else_exp, test_false, else_false, else_true);
239   INTERSECT (when_false, then_false, else_false);
240   INTERSECT (when_true, then_true, else_true);
241   RELEASE_BUFFERS(test_false);
242   start_current_locals = save_start_current_locals;
243 }
244 
245 /* Check a boolean binary form CODE (EXP0, EXP1),
246    where CODE is one of EQ_EXPR, BIT_AND_EXPR, or BIT_IOR_EXPR.
247    BEFORE, WHEN_FALSE, and WHEN_TRUE are as in check_bool_init. */
248 
249 static void
check_bool2_init(enum tree_code code,tree exp0,tree exp1,words before,words when_false,words when_true)250 check_bool2_init (enum tree_code code, tree exp0, tree exp1,
251 		  words before, words when_false, words when_true)
252 {
253   word buf[2*4];
254   words tmp = num_current_words <= 2 ? buf
255     : ALLOC_WORDS (4 * num_current_words);
256   words when_false_0 = tmp;
257   words when_false_1 = tmp+num_current_words;
258   words when_true_0 = tmp+2*num_current_words;
259   words when_true_1 = tmp+3*num_current_words;
260   check_bool_init (exp0, before, when_false_0, when_true_0);
261   INTERSECT (before, when_false_0, when_true_0);
262   check_bool_init (exp1, before, when_false_1, when_true_1);
263 
264   INTERSECT (before, when_false_1, when_true_1);
265 
266   if (code == EQ_EXPR)
267     {
268       /* Now set:
269        * when_true = (when_false_1 INTERSECTION when_true_1)
270        *   UNION (when_true_0 INTERSECTION when_false_1)
271        *   UNION (when_false_0 INTERSECTION when_true_1);
272        * using when_false and before as temporary working areas.  */
273       INTERSECT (when_true, when_true_0, when_false_1);
274       INTERSECT (when_false, when_true_0, when_false_1);
275       UNION (when_true, when_true, when_false);
276       UNION (when_true, when_true, before);
277 
278       /* Now set:
279        * when_false = (when_false_1 INTERSECTION when_true_1)
280        *   UNION (when_true_0 INTERSECTION when_true_1)
281        *   UNION (when_false_0 INTERSECTION when_false_1);
282        * using before as a temporary working area.  */
283       INTERSECT (when_false, when_true_0, when_true_1);
284       UNION (when_false, when_false, before);
285       INTERSECT (before, when_false_0, when_false_1);
286       UNION (when_false, when_false, before);
287     }
288   else if (code == BIT_AND_EXPR || code == TRUTH_AND_EXPR)
289     {
290       UNION (when_true, when_true_0, when_true_1);
291       INTERSECT (when_false, when_false_0, when_false_1);
292       UNION (when_false, when_false, before);
293     }
294   else /* if (code == BIT_IOR_EXPR || code == TRUTH_OR_EXPR) */
295     {
296       UNION (when_false, when_false_0, when_false_1);
297       INTERSECT (when_true, when_true_0, when_true_1);
298       UNION (when_true, when_true, before);
299     }
300 
301   if (tmp != buf)
302     FREE_WORDS (tmp);
303 }
304 
305 /* Check a boolean expression EXP for definite [un]assignment.
306    BEFORE is the set of variables definitely [un]assigned before the
307    conditional.  (This bitstring may be modified arbitrarily in this function.)
308    On output, WHEN_FALSE is the set of variables [un]definitely assigned after
309    the conditional when the conditional is false.
310    On output, WHEN_TRUE is the set of variables definitely [un]assigned after
311    the conditional when the conditional is true.
312    (WHEN_FALSE and WHEN_TRUE are overwritten with initial values ignored.)
313    (None of BEFORE, WHEN_FALSE, or WHEN_TRUE can overlap, as they may
314    be used as temporary working areas. */
315 
316 static void
check_bool_init(tree exp,words before,words when_false,words when_true)317 check_bool_init (tree exp, words before, words when_false, words when_true)
318 {
319   switch (TREE_CODE (exp))
320     {
321     case COND_EXPR:
322       check_cond_init (TREE_OPERAND (exp, 0), TREE_OPERAND (exp, 1),
323 		       TREE_OPERAND (exp, 2),
324 		       before, when_false, when_true);
325       return;
326 
327     case TRUTH_ANDIF_EXPR:
328       check_cond_init (TREE_OPERAND (exp, 0),
329 		       TREE_OPERAND (exp, 1), boolean_false_node,
330 		       before, when_false, when_true);
331       return;
332     case TRUTH_ORIF_EXPR:
333       check_cond_init (TREE_OPERAND (exp, 0),
334 		       boolean_true_node, TREE_OPERAND (exp, 1),
335 		       before, when_false, when_true);
336       return;
337     case TRUTH_NOT_EXPR:
338       check_bool_init (TREE_OPERAND (exp, 0), before, when_true, when_false);
339       return;
340     case MODIFY_EXPR:
341       {
342 	tree tmp = TREE_OPERAND (exp, 0);
343 	if ((tmp = get_variable_decl (tmp)) != NULL_TREE)
344 	  {
345 	    int index;
346 	    check_bool_init (TREE_OPERAND (exp, 1), before,
347 			     when_false, when_true);
348 	    check_final_reassigned (tmp, before);
349 	    index = DECL_BIT_INDEX (tmp);
350 	    if (index >= 0)
351 	      {
352 		SET_ASSIGNED (when_false, index);
353 		SET_ASSIGNED (when_true, index);
354 		CLEAR_UNASSIGNED (when_false, index);
355 		CLEAR_UNASSIGNED (when_true, index);
356 	      }
357 	    break;
358 	  }
359       }
360       goto do_default;
361 
362     case BIT_AND_EXPR:
363     case BIT_IOR_EXPR:
364     case TRUTH_AND_EXPR:
365     case TRUTH_OR_EXPR:
366     case EQ_EXPR:
367       check_bool2_init (TREE_CODE (exp),
368 			TREE_OPERAND (exp, 0), TREE_OPERAND (exp, 1),
369 			before, when_false, when_true);
370       return;
371 
372     case TRUTH_XOR_EXPR:
373     case BIT_XOR_EXPR:
374     case NE_EXPR:
375       /* Just like EQ_EXPR, but switch when_true and when_false. */
376       check_bool2_init (EQ_EXPR, TREE_OPERAND (exp, 0), TREE_OPERAND (exp, 1),
377 			before, when_true, when_false);
378 
379       return;
380 
381     case INTEGER_CST:
382       if (integer_zerop (exp))
383 	{
384 	  SET_ALL (when_true);
385 	  COPY (when_false, before);
386 	}
387       else
388 	{
389 	  SET_ALL (when_false);
390 	  COPY (when_true, before);
391 	}
392       break;
393     default:
394     do_default:
395       check_init (exp, before);
396       COPY (when_false, before);
397       COPY (when_true, before);
398     }
399 }
400 
401 /* Used to keep track of control flow branches. */
402 
403 struct alternatives
404 {
405   struct alternatives *outer;
406 
407   /* The value of num_current_locals at the start of this compound. */
408   int num_locals;
409 
410   /* The value of the "before" set at the start of the control structure.
411    Used for SWITCH_EXPR but not set for LABELED_BLOCK_EXPR. */
412   words saved;
413 
414   int save_start_current_locals;
415 
416   /* If num_current_words==1, combined==&one_word, for efficiency. */
417   word one_word;
418 
419   /* The intersection of the "after" sets from previous branches. */
420   words combined;
421 
422   tree block;
423 };
424 
425 struct alternatives * alternatives = NULL;
426 
427 /* Begin handling a control flow branch.
428    BEFORE is the state of [un]assigned variables on entry.
429    CURRENT is a struct alt to manage the branch alternatives. */
430 
431 #define BEGIN_ALTERNATIVES(before, current) \
432 { \
433   current.saved = NULL; \
434   current.num_locals = num_current_locals; \
435   current.combined = num_current_words <= 1 ? &current.one_word \
436     : ALLOC_WORDS (num_current_words); \
437   SET_ALL (current.combined); \
438   current.outer = alternatives; \
439   alternatives = &current; \
440   current.save_start_current_locals = start_current_locals; \
441   start_current_locals = num_current_locals; \
442 }
443 
444 /* We have finished with one branch of branching control flow.
445    Store the [un]assigned state, merging (intersecting) it with the state
446    of previous alternative branches. */
447 
448 static void
done_alternative(words after,struct alternatives * current)449 done_alternative (words after, struct alternatives *current)
450 {
451   INTERSECTN (current->combined, current->combined, after,
452 	      WORDS_NEEDED (2 * current->num_locals));
453 }
454 
455 /* Used when we done with a control flow branch and are all merged again.
456  * AFTER is the merged state of [un]assigned variables,
457    CURRENT is a struct alt that was passed to BEGIN_ALTERNATIVES. */
458 
459 #define END_ALTERNATIVES(after, current) \
460 { \
461   alternatives = current.outer; \
462   COPY (after, current.combined); \
463   if (current.combined != &current.one_word) \
464     FREE_WORDS (current.combined); \
465   start_current_locals = current.save_start_current_locals; \
466 }
467 
468 /* Check for (un)initialized local variables in EXP.  */
469 
470 static void
check_init(tree exp,words before)471 check_init (tree exp, words before)
472 {
473   tree tmp;
474  again:
475   switch (TREE_CODE (exp))
476     {
477     case VAR_DECL:
478     case PARM_DECL:
479       if (! FIELD_STATIC (exp) && DECL_NAME (exp) != NULL_TREE
480 	  && DECL_NAME (exp) != this_identifier_node)
481 	{
482 	  int index = DECL_BIT_INDEX (exp);
483 	  /* We don't want to report and mark as non initialized class
484 	     initialization flags. */
485 	  if (! LOCAL_CLASS_INITIALIZATION_FLAG_P (exp)
486 	      && index >= 0 && ! ASSIGNED_P (before, index))
487 	    {
488 	      parse_error_context
489 		(wfl, "Variable `%s' may not have been initialized",
490 		 IDENTIFIER_POINTER (DECL_NAME (exp)));
491 	      /* Suppress further errors. */
492 	      DECL_BIT_INDEX (exp) = -2;
493 	    }
494 	}
495       break;
496 
497     case COMPONENT_REF:
498       check_init (TREE_OPERAND (exp, 0), before);
499       if ((tmp = get_variable_decl (exp)) != NULL_TREE)
500 	{
501 	  int index = DECL_BIT_INDEX (tmp);
502 	  if (index >= 0 && ! ASSIGNED_P (before, index))
503 	    {
504 	      parse_error_context
505 		(wfl, "variable '%s' may not have been initialized",
506 		 IDENTIFIER_POINTER (DECL_NAME (tmp)));
507 	      /* Suppress further errors. */
508 	      DECL_BIT_INDEX (tmp) = -2;
509 	    }
510 	}
511       break;
512 
513     case MODIFY_EXPR:
514       tmp = TREE_OPERAND (exp, 0);
515       /* We're interested in variable declaration and parameter
516          declaration when they're declared with the `final' modifier. */
517       if ((tmp = get_variable_decl (tmp)) != NULL_TREE)
518 	{
519 	  int index;
520 	  check_init (TREE_OPERAND (exp, 1), before);
521 	  check_final_reassigned (tmp, before);
522 	  index = DECL_BIT_INDEX (tmp);
523 	  if (index >= 0)
524 	    {
525 	      SET_ASSIGNED (before, index);
526 	      CLEAR_UNASSIGNED (before, index);
527 	    }
528 	  /* Minor optimization.  See comment for start_current_locals.
529 	     If we're optimizing for class initialization, we keep
530 	     this information to check whether the variable is
531 	     definitely assigned when once we checked the whole
532 	     function. */
533 	  if (! STATIC_CLASS_INIT_OPT_P () /* FIXME */
534 	      && index >= start_current_locals
535 	      && index == num_current_locals - 1)
536 	    {
537 	      num_current_locals--;
538 	      DECL_BIT_INDEX (tmp) = -1;
539 	    }
540 	 break;
541        }
542       else if (TREE_CODE (tmp = TREE_OPERAND (exp, 0)) == COMPONENT_REF)
543 	{
544 	  tree decl;
545 	  check_init (tmp, before);
546 	  check_init (TREE_OPERAND (exp, 1), before);
547 	  decl = TREE_OPERAND (tmp, 1);
548 	  if (DECL_FINAL (decl))
549 	    final_assign_error (DECL_NAME (decl));
550 	  break;
551 	}
552       else if (TREE_CODE (tmp) == COMPONENT_REF && IS_ARRAY_LENGTH_ACCESS (tmp))
553 	{
554 	  /* We can't emit a more specific message here, because when
555 	     compiling to bytecodes we don't get here. */
556 	  final_assign_error (length_identifier_node);
557 	}
558      else
559        goto binop;
560     case BLOCK:
561       if (BLOCK_EXPR_BODY (exp))
562 	{
563 	  tree decl = BLOCK_EXPR_DECLS (exp);
564 	  int words_needed;
565 	  word* tmp;
566 	  int i;
567 	  int save_start_current_locals = start_current_locals;
568 	  int save_num_current_words = num_current_words;
569 	  start_current_locals = num_current_locals;
570 	  for (;  decl != NULL_TREE;  decl = TREE_CHAIN (decl))
571 	    {
572 	      DECL_BIT_INDEX (decl) = num_current_locals++;
573 	    }
574 	  words_needed = WORDS_NEEDED (2 * num_current_locals);
575 	  if (words_needed > num_current_words)
576 	    {
577 	      tmp = ALLOC_WORDS (words_needed);
578 	      COPY (tmp, before);
579 	      num_current_words = words_needed;
580 	    }
581 	  else
582 	    tmp = before;
583 	  for (i = start_current_locals;  i < num_current_locals;  i++)
584 	    {
585 	      CLEAR_ASSIGNED (tmp, i);
586 	      SET_UNASSIGNED (tmp, i);
587 	    }
588 	  check_init (BLOCK_EXPR_BODY (exp), tmp);
589 
590 	  /* Re-set DECL_BIT_INDEX since it is also DECL_POINTER_ALIAS_SET. */
591 	  for (decl = BLOCK_EXPR_DECLS (exp);
592 	       decl != NULL_TREE;  decl = TREE_CHAIN (decl))
593 	    {
594 	      if (LOCAL_CLASS_INITIALIZATION_FLAG_P (decl))
595 		{
596 		  int index = DECL_BIT_INDEX (decl);
597 		  tree fndecl = DECL_CONTEXT (decl);
598 		  if (fndecl && METHOD_STATIC (fndecl)
599 		      && (DECL_INITIAL (decl) == boolean_true_node
600 			  || (index >= 0 && ASSIGNED_P (tmp, index))))
601 		    *(htab_find_slot
602 		      (DECL_FUNCTION_INITIALIZED_CLASS_TABLE (fndecl),
603 		       DECL_FUNCTION_INIT_TEST_CLASS (decl), INSERT)) =
604 		      DECL_FUNCTION_INIT_TEST_CLASS (decl);
605 		}
606 	      DECL_BIT_INDEX (decl) = -1;
607 	    }
608 
609 	  num_current_locals = start_current_locals;
610 	  start_current_locals = save_start_current_locals;
611 	  if (tmp != before)
612 	    {
613 	      num_current_words = save_num_current_words;
614 	      COPY (before, tmp);
615 	      FREE_WORDS (tmp);
616 	    }
617 	}
618       break;
619     case LOOP_EXPR:
620       {
621 	/* The JLS 2nd edition discusses a complication determining
622 	   definite unassignment of loop statements.  They define a
623 	   "hypothetical" analysis model.  We do something much
624 	   simpler: We just disallow assignments inside loops to final
625 	   variables declared outside the loop.  This means we may
626 	   disallow some contrived assignments that the JLS, but I
627 	   can't see how anything except a very contrived testcase (a
628 	   do-while whose condition is false?) would care. */
629 
630 	struct alternatives alt;
631 	int save_loop_current_locals = loop_current_locals;
632 	int save_start_current_locals = start_current_locals;
633 	loop_current_locals = num_current_locals;
634 	start_current_locals = num_current_locals;
635 	BEGIN_ALTERNATIVES (before, alt);
636 	alt.block = exp;
637 	check_init (TREE_OPERAND (exp, 0), before);
638 	END_ALTERNATIVES (before, alt);
639 	loop_current_locals = save_loop_current_locals;
640 	start_current_locals = save_start_current_locals;
641 	return;
642       }
643     case EXIT_EXPR:
644       {
645 	struct alternatives *alt = alternatives;
646 	DECLARE_BUFFERS(when_true, 2);
647 	words when_false = when_true + num_current_words;
648 #ifdef ENABLE_JC1_CHECKING
649 	if (TREE_CODE (alt->block) != LOOP_EXPR)
650 	  abort ();
651 #endif
652 	check_bool_init (TREE_OPERAND (exp, 0), before, when_false, when_true);
653 	done_alternative (when_true, alt);
654 	COPY (before, when_false);
655 	RELEASE_BUFFERS(when_true);
656 	return;
657       }
658     case LABELED_BLOCK_EXPR:
659       {
660 	struct alternatives alt;
661 	BEGIN_ALTERNATIVES (before, alt);
662 	alt.block = exp;
663 	if (LABELED_BLOCK_BODY (exp))
664 	  check_init (LABELED_BLOCK_BODY (exp), before);
665 	done_alternative (before, &alt);
666 	END_ALTERNATIVES (before, alt);
667 	return;
668       }
669     case EXIT_BLOCK_EXPR:
670       {
671 	tree block = TREE_OPERAND (exp, 0);
672 	struct alternatives *alt = alternatives;
673 	while (alt->block != block)
674 	  alt = alt->outer;
675 	done_alternative (before, alt);
676 	SET_ALL (before);
677 	return;
678       }
679     case SWITCH_EXPR:
680       {
681 	struct alternatives alt;
682 	word buf[2];
683 	check_init (TREE_OPERAND (exp, 0), before);
684 	BEGIN_ALTERNATIVES (before, alt);
685 	alt.saved = ALLOC_BUFFER(buf, num_current_words);
686 	COPY (alt.saved, before);
687 	alt.block = exp;
688 	check_init (TREE_OPERAND (exp, 1), before);
689 	done_alternative (before, &alt);
690 	if (! SWITCH_HAS_DEFAULT (exp))
691 	  done_alternative (alt.saved, &alt);
692 	FREE_BUFFER(alt.saved, buf);
693 	END_ALTERNATIVES (before, alt);
694 	return;
695       }
696     case CASE_EXPR:
697     case DEFAULT_EXPR:
698       {
699 	int i;
700 	struct alternatives *alt = alternatives;
701 	while (TREE_CODE (alt->block) != SWITCH_EXPR)
702 	  alt = alt->outer;
703 	COPYN (before, alt->saved, WORDS_NEEDED (2 * alt->num_locals));
704 	for (i = alt->num_locals;  i < num_current_locals;  i++)
705 	  CLEAR_ASSIGNED (before, i);
706 	break;
707       }
708 
709     case TRY_EXPR:
710       {
711 	tree try_clause = TREE_OPERAND (exp, 0);
712 	tree clause = TREE_OPERAND (exp, 1);
713 	word buf[2*2];
714 	words tmp = (num_current_words <= 2 ? buf
715 		    : ALLOC_WORDS (2 * num_current_words));
716 	words save = tmp + num_current_words;
717 	struct alternatives alt;
718 	BEGIN_ALTERNATIVES (before, alt);
719 	COPY (save, before);
720 	COPY (tmp, save);
721 	check_init (try_clause, tmp);
722 	done_alternative (tmp, &alt);
723 	for ( ; clause != NULL_TREE;  clause = TREE_CHAIN (clause))
724 	  {
725 	    tree catch_clause = TREE_OPERAND (clause, 0);
726 	    COPY (tmp, save);
727 	    check_init (catch_clause, tmp);
728 	    done_alternative (tmp, &alt);
729 	  }
730 	if (tmp != buf)
731 	  {
732 	    FREE_WORDS (tmp);
733 	  }
734 	END_ALTERNATIVES (before, alt);
735       }
736     return;
737 
738     case TRY_FINALLY_EXPR:
739       {
740 	DECLARE_BUFFERS(tmp, 1);
741 	COPY (tmp, before);
742 	check_init (TREE_OPERAND (exp, 0), before);
743 	check_init (TREE_OPERAND (exp, 1), tmp);
744 	UNION (before, before, tmp);
745 	RELEASE_BUFFERS(tmp);
746       }
747       return;
748 
749     case RETURN_EXPR:
750     case THROW_EXPR:
751       if (TREE_OPERAND (exp, 0))
752 	check_init (TREE_OPERAND (exp, 0), before);
753       goto never_continues;
754 
755     case ERROR_MARK:
756     never_continues:
757       SET_ALL (before);
758       return;
759 
760     case COND_EXPR:
761     case TRUTH_ANDIF_EXPR:
762     case TRUTH_ORIF_EXPR:
763       {
764 	DECLARE_BUFFERS(when_true, 2);
765 	words when_false = when_true + num_current_words;
766 	check_bool_init (exp, before, when_false, when_true);
767 	INTERSECT (before, when_false, when_true);
768 	RELEASE_BUFFERS(when_true);
769       }
770       break;
771 
772     case NOP_EXPR:
773       if (exp == empty_stmt_node)
774 	break;
775       /* ... else fall through ... */
776     case UNARY_PLUS_EXPR:
777     case NEGATE_EXPR:
778     case TRUTH_AND_EXPR:
779     case TRUTH_OR_EXPR:
780     case TRUTH_XOR_EXPR:
781     case TRUTH_NOT_EXPR:
782     case BIT_NOT_EXPR:
783     case CONVERT_EXPR:
784     case BIT_FIELD_REF:
785     case FLOAT_EXPR:
786     case FIX_TRUNC_EXPR:
787     case INDIRECT_REF:
788     case ADDR_EXPR:
789     case NON_LVALUE_EXPR:
790     case INSTANCEOF_EXPR:
791     case FIX_CEIL_EXPR:
792     case FIX_FLOOR_EXPR:
793     case FIX_ROUND_EXPR:
794     case ABS_EXPR:
795       /* Avoid needless recursion. */
796       exp = TREE_OPERAND (exp, 0);
797       goto again;
798 
799     case PREDECREMENT_EXPR:
800     case PREINCREMENT_EXPR:
801     case POSTDECREMENT_EXPR:
802     case POSTINCREMENT_EXPR:
803       tmp = get_variable_decl (TREE_OPERAND (exp, 0));
804       if (tmp != NULL_TREE && DECL_FINAL (tmp))
805 	final_assign_error (DECL_NAME (tmp));
806 
807       /* Avoid needless recursion.  */
808       exp = TREE_OPERAND (exp, 0);
809       goto again;
810 
811     case SAVE_EXPR:
812       if (IS_INIT_CHECKED (exp))
813 	return;
814       IS_INIT_CHECKED (exp) = 1;
815       exp = TREE_OPERAND (exp, 0);
816       goto again;
817 
818     case COMPOUND_EXPR:
819     case PLUS_EXPR:
820     case MINUS_EXPR:
821     case MULT_EXPR:
822     case TRUNC_DIV_EXPR:
823     case TRUNC_MOD_EXPR:
824     case RDIV_EXPR:
825     case LSHIFT_EXPR:
826     case RSHIFT_EXPR:
827     case URSHIFT_EXPR:
828     case BIT_AND_EXPR:
829     case BIT_XOR_EXPR:
830     case BIT_IOR_EXPR:
831     case EQ_EXPR:
832     case NE_EXPR:
833     case GT_EXPR:
834     case GE_EXPR:
835     case LT_EXPR:
836     case LE_EXPR:
837     case MAX_EXPR:
838     case MIN_EXPR:
839     case ARRAY_REF:
840     case LROTATE_EXPR:
841     case RROTATE_EXPR:
842     case CEIL_DIV_EXPR:
843     case FLOOR_DIV_EXPR:
844     case ROUND_DIV_EXPR:
845     case CEIL_MOD_EXPR:
846     case FLOOR_MOD_EXPR:
847     case ROUND_MOD_EXPR:
848     case EXACT_DIV_EXPR:
849     binop:
850       check_init (TREE_OPERAND (exp, 0), before);
851       /* Avoid needless recursion, especially for COMPOUND_EXPR. */
852       exp = TREE_OPERAND (exp, 1);
853       goto again;
854 
855     case RESULT_DECL:
856     case FUNCTION_DECL:
857     case INTEGER_CST:
858     case REAL_CST:
859     case STRING_CST:
860     case JAVA_EXC_OBJ_EXPR:
861       break;
862 
863     case NEW_CLASS_EXPR:
864     case CALL_EXPR:
865       {
866 	tree func = TREE_OPERAND (exp, 0);
867 	tree x = TREE_OPERAND (exp, 1);
868 	if (TREE_CODE (func) == ADDR_EXPR)
869 	  func = TREE_OPERAND (func, 0);
870 	check_init (func, before);
871 
872 	for ( ;  x != NULL_TREE;  x = TREE_CHAIN (x))
873 	  check_init (TREE_VALUE (x), before);
874 	if (func == throw_node)
875 	  goto never_continues;
876       }
877       break;
878 
879     case NEW_ARRAY_INIT:
880       {
881 	tree x = CONSTRUCTOR_ELTS (TREE_OPERAND (exp, 0));
882 	for ( ;  x != NULL_TREE;  x = TREE_CHAIN (x))
883 	  check_init (TREE_VALUE (x), before);
884       }
885       break;
886 
887     case EXPR_WITH_FILE_LOCATION:
888       {
889 	location_t saved_location = input_location;
890 	tree saved_wfl = wfl;
891 	tree body = EXPR_WFL_NODE (exp);
892 	if (body == empty_stmt_node)
893 	  break;
894 	wfl = exp;
895 	input_filename = EXPR_WFL_FILENAME (exp);
896 	input_line = EXPR_WFL_LINENO (exp);
897 	check_init (body, before);
898 	input_location = saved_location;
899 	wfl = saved_wfl;
900       }
901       break;
902 
903     default:
904       internal_error
905 	("internal error in check-init: tree code not implemented: %s",
906 	 tree_code_name [(int) TREE_CODE (exp)]);
907     }
908 }
909 
910 void
check_for_initialization(tree body,tree mdecl)911 check_for_initialization (tree body, tree mdecl)
912 {
913   tree decl;
914   word buf[2];
915   words before = buf;
916   tree owner = DECL_CONTEXT (mdecl);
917   int is_static_method = METHOD_STATIC (mdecl);
918   /* We don't need to check final fields of <init> it it calls this(). */
919   int is_finit_method = DECL_FINIT_P (mdecl) || DECL_INSTINIT_P (mdecl);
920   int is_init_method
921     = (is_finit_method || DECL_CLINIT_P (mdecl)
922        || (DECL_INIT_P (mdecl) && ! DECL_INIT_CALLS_THIS (mdecl)));
923 
924   start_current_locals = num_current_locals = 0;
925   num_current_words = 2;
926 
927   if (is_init_method)
928     {
929       int words_needed, i;
930       for (decl = TYPE_FIELDS (owner);
931 	   decl != NULL_TREE;  decl = TREE_CHAIN (decl))
932 	{
933 	  if (DECL_FINAL (decl) && FIELD_STATIC (decl) == is_static_method)
934 	    {
935 	      if (DECL_FIELD_FINAL_IUD (decl))
936 		DECL_BIT_INDEX (decl) = -1;
937 	      else
938 		DECL_BIT_INDEX (decl) = num_current_locals++;
939 	    }
940 	}
941       words_needed = WORDS_NEEDED (2 * num_current_locals);
942       if (words_needed > 2)
943 	{
944 	  num_current_words = words_needed;
945 	  before = ALLOC_WORDS(words_needed);
946 	}
947       i = 0;
948       for (decl = TYPE_FIELDS (owner);
949 	   decl != NULL_TREE;  decl = TREE_CHAIN (decl))
950 	{
951 	  if (FIELD_FINAL (decl) && FIELD_STATIC (decl) == is_static_method)
952 	    {
953 	      if (! DECL_FIELD_FINAL_IUD (decl))
954 		{
955 		  CLEAR_ASSIGNED (before, i);
956 		  SET_UNASSIGNED (before, i);
957 		  i++;
958 		}
959 	    }
960 	}
961 
962     }
963 
964   check_init (body, before);
965 
966   if (is_init_method)
967     {
968       for (decl = TYPE_FIELDS (owner);
969 	   decl != NULL_TREE;  decl = TREE_CHAIN (decl))
970 	{
971 	  if (FIELD_FINAL (decl) && FIELD_STATIC (decl) == is_static_method)
972 	    {
973 	      int index = DECL_BIT_INDEX (decl);
974 	      if (index >= 0 && ! ASSIGNED_P (before, index))
975 		{
976 		  if (! is_finit_method)
977 		    error ("%Jfinal field '%D' may not have been initialized",
978                            decl, decl);
979 		}
980 	      else if (is_finit_method)
981 		DECL_FIELD_FINAL_IUD (decl) = 1;
982 
983 	      /* Re-set to initial state, since we later may use the
984 		 same bit for DECL_POINTER_ALIAS_SET. */
985 	      DECL_BIT_INDEX (decl) = -1;
986 	    }
987 	}
988     }
989 
990   start_current_locals = num_current_locals = 0;
991 }
992