Fixed rare threading problem
[official-gcc.git] / gcc / java / check-init.c
blob82b14b57cfc86c164ff4ddc15864ebbe8e532eb1
1 /* Code to test for "definitive [un]assignment".
2 Copyright (C) 1999, 2000, 2001, 2003 Free Software Foundation, Inc.
4 This file is part of GCC.
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.
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.
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.
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. */
25 /* Written by Per Bothner <bothner@cygnus.com>, January 1999. */
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. */
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 */
42 /* One segment of a bitstring. */
43 typedef unsigned int word;
45 /* Pointer to a bitstring. */
46 typedef word *words;
48 /* Number of locals variables currently active. */
49 static int num_current_locals = 0;
51 /* The value of num_current_locals when we entered the closest
52 enclosing LOOP_EXPR. */
53 static int loop_current_locals;
55 /* The index of the first local variable in the current block.
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.
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;
77 static int num_current_words;
79 static tree wfl;
81 #define COPYN(DST, SRC, NWORDS) memcpy (DST, SRC, NWORDS * sizeof(word))
82 #define COPY(DST, SRC) COPYN (DST, SRC, num_current_words)
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))
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)
92 #define UNION(DST, SRC1, SRC2) \
93 UNIONN (DST, SRC1, SRC2, num_current_words)
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)
100 #define INTERSECT(DST, SRC1, SRC2) \
101 INTERSECTN (DST, SRC1, SRC2, num_current_words)
103 #define WORD_SIZE ((unsigned int)(sizeof(word) * BITS_PER_UNIT))
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);
115 #define ALLOC_WORDS(NUM) (xmalloc ((NUM) * sizeof (word)))
116 #define FREE_WORDS(PTR) (free (PTR))
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. */
127 #define DECLARE_BUFFERS(BUFFER, NUMBUFFERS) \
128 word BUFFER##_short[2 * NUMBUFFERS]; \
129 words BUFFER = ALLOC_BUFFER(BUFFER##_short, NUMBUFFERS * num_current_words)
131 #define RELEASE_BUFFERS(BUFFER) \
132 FREE_BUFFER(BUFFER, BUFFER##_short)
134 #define ALLOC_BUFFER(SHORTBUFFER, NUMWORDS) \
135 ((NUMWORDS) * sizeof(word) <= sizeof(SHORTBUFFER) ? SHORTBUFFER \
136 : ALLOC_WORDS(NUMWORDS))
138 #define FREE_BUFFER(BUFFER, SHORTBUFFER) \
139 if (BUFFER != SHORTBUFFER) FREE_WORDS(BUFFER)
141 #define SET_P(WORDS, BIT) \
142 (WORDS[(BIT) / WORD_SIZE] & (1 << ((BIT) % WORD_SIZE)))
144 #define CLEAR_BIT(WORDS, BIT) \
145 (WORDS[(BIT) / WORD_SIZE] &= ~ (1 << ((BIT) % WORD_SIZE)))
147 #define SET_BIT(WORDS, BIT) \
148 (WORDS[(BIT) / WORD_SIZE] |= (1 << ((BIT) % WORD_SIZE)))
150 #define WORDS_NEEDED(BITS) (((BITS)+(WORD_SIZE-1))/(WORD_SIZE))
152 #define ASSIGNED_P(WORDS, BIT) SET_P(WORDS, 2 * (BIT))
153 #define UNASSIGNED_P(WORDS, BIT) SET_P(WORDS, 2 * (BIT) + 1)
155 #define SET_ASSIGNED(WORDS, INDEX) SET_BIT (WORDS, 2 * (INDEX))
156 #define SET_UNASSIGNED(WORDS, INDEX) SET_BIT (WORDS, 2 * (INDEX) + 1)
158 #define CLEAR_ASSIGNED(WORDS, INDEX) CLEAR_BIT (WORDS, 2 * (INDEX))
159 #define CLEAR_UNASSIGNED(WORDS, INDEX) CLEAR_BIT (WORDS, 2 * (INDEX) + 1)
161 /* Get the "interesting" declaration from a MODIFY_EXPR or COMPONENT_REF.
162 Return the declaration or NULL_TREE if no interesting declaration. */
164 static tree
165 get_variable_decl (tree exp)
167 if (TREE_CODE (exp) == VAR_DECL)
169 if (! TREE_STATIC (exp) || FIELD_FINAL (exp))
170 return exp;
172 /* We only care about final parameters. */
173 else if (TREE_CODE (exp) == PARM_DECL)
175 if (DECL_FINAL (exp))
176 return exp;
178 /* See if exp is this.field. */
179 else if (TREE_CODE (exp) == COMPONENT_REF)
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))
189 op0 = TREE_OPERAND (op0, 0);
190 if (op0 == BLOCK_EXPR_DECLS (DECL_FUNCTION_BODY (mdecl)))
191 return op1;
194 return NULL_TREE;
197 static void
198 final_assign_error (tree name)
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));
205 static void
206 check_final_reassigned (tree decl, words before)
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)))
215 final_assign_error (DECL_NAME (decl));
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. */
223 static void
224 check_cond_init (tree test_exp, tree then_exp, tree else_exp,
225 words before, words when_false, words when_true)
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;
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;
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. */
249 static void
250 check_bool2_init (enum tree_code code, tree exp0, tree exp1,
251 words before, words when_false, words when_true)
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);
264 INTERSECT (before, when_false_1, when_true_1);
266 if (code == EQ_EXPR)
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);
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);
288 else if (code == BIT_AND_EXPR || code == TRUTH_AND_EXPR)
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);
294 else /* if (code == BIT_IOR_EXPR || code == TRUTH_OR_EXPR) */
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);
301 if (tmp != buf)
302 FREE_WORDS (tmp);
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. */
316 static void
317 check_bool_init (tree exp, words before, words when_false, words when_true)
319 switch (TREE_CODE (exp))
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;
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:
342 tree tmp = TREE_OPERAND (exp, 0);
343 if ((tmp = get_variable_decl (tmp)) != NULL_TREE)
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)
352 SET_ASSIGNED (when_false, index);
353 SET_ASSIGNED (when_true, index);
354 CLEAR_UNASSIGNED (when_false, index);
355 CLEAR_UNASSIGNED (when_true, index);
357 break;
360 goto do_default;
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;
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);
379 return;
381 case INTEGER_CST:
382 if (integer_zerop (exp))
384 SET_ALL (when_true);
385 COPY (when_false, before);
387 else
389 SET_ALL (when_false);
390 COPY (when_true, before);
392 break;
393 default:
394 do_default:
395 check_init (exp, before);
396 COPY (when_false, before);
397 COPY (when_true, before);
401 /* Used to keep track of control flow branches. */
403 struct alternatives
405 struct alternatives *outer;
407 /* The value of num_current_locals at the start of this compound. */
408 int num_locals;
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;
414 int save_start_current_locals;
416 /* If num_current_words==1, combined==&one_word, for efficiency. */
417 word one_word;
419 /* The intersection of the "after" sets from previous branches. */
420 words combined;
422 tree block;
425 struct alternatives * alternatives = NULL;
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. */
431 #define BEGIN_ALTERNATIVES(before, current) \
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; \
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. */
448 static void
449 done_alternative (words after, struct alternatives *current)
451 INTERSECTN (current->combined, current->combined, after,
452 WORDS_NEEDED (2 * current->num_locals));
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. */
459 #define END_ALTERNATIVES(after, current) \
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; \
468 /* Check for (un)initialized local variables in EXP. */
470 static void
471 check_init (tree exp, words before)
473 tree tmp;
474 again:
475 switch (TREE_CODE (exp))
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)
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))
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;
495 break;
497 case COMPONENT_REF:
498 check_init (TREE_OPERAND (exp, 0), before);
499 if ((tmp = get_variable_decl (exp)) != NULL_TREE)
501 int index = DECL_BIT_INDEX (tmp);
502 if (index >= 0 && ! ASSIGNED_P (before, index))
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;
511 break;
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)
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)
525 SET_ASSIGNED (before, index);
526 CLEAR_UNASSIGNED (before, index);
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)
537 num_current_locals--;
538 DECL_BIT_INDEX (tmp) = -1;
540 break;
542 else if (TREE_CODE (tmp = TREE_OPERAND (exp, 0)) == COMPONENT_REF)
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;
552 else if (TREE_CODE (tmp) == COMPONENT_REF && IS_ARRAY_LENGTH_ACCESS (tmp))
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);
558 else
559 goto binop;
560 case BLOCK:
561 if (BLOCK_EXPR_BODY (exp))
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))
572 DECL_BIT_INDEX (decl) = num_current_locals++;
574 words_needed = WORDS_NEEDED (2 * num_current_locals);
575 if (words_needed > num_current_words)
577 tmp = ALLOC_WORDS (words_needed);
578 COPY (tmp, before);
579 num_current_words = words_needed;
581 else
582 tmp = before;
583 for (i = start_current_locals; i < num_current_locals; i++)
585 CLEAR_ASSIGNED (tmp, i);
586 SET_UNASSIGNED (tmp, i);
588 check_init (BLOCK_EXPR_BODY (exp), tmp);
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))
594 if (LOCAL_CLASS_INITIALIZATION_FLAG_P (decl))
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);
606 DECL_BIT_INDEX (decl) = -1;
609 num_current_locals = start_current_locals;
610 start_current_locals = save_start_current_locals;
611 if (tmp != before)
613 num_current_words = save_num_current_words;
614 COPY (before, tmp);
615 FREE_WORDS (tmp);
618 break;
619 case LOOP_EXPR:
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. */
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;
643 case EXIT_EXPR:
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;
658 case LABELED_BLOCK_EXPR:
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;
669 case EXIT_BLOCK_EXPR:
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;
679 case SWITCH_EXPR:
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;
696 case CASE_EXPR:
697 case DEFAULT_EXPR:
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;
709 case TRY_EXPR:
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))
725 tree catch_clause = TREE_OPERAND (clause, 0);
726 COPY (tmp, save);
727 check_init (catch_clause, tmp);
728 done_alternative (tmp, &alt);
730 if (tmp != buf)
732 FREE_WORDS (tmp);
734 END_ALTERNATIVES (before, alt);
736 return;
738 case TRY_FINALLY_EXPR:
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);
747 return;
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;
755 case ERROR_MARK:
756 never_continues:
757 SET_ALL (before);
758 return;
760 case COND_EXPR:
761 case TRUTH_ANDIF_EXPR:
762 case TRUTH_ORIF_EXPR:
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);
770 break;
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 case FFS_EXPR:
796 /* Avoid needless recursion. */
797 exp = TREE_OPERAND (exp, 0);
798 goto again;
800 case PREDECREMENT_EXPR:
801 case PREINCREMENT_EXPR:
802 case POSTDECREMENT_EXPR:
803 case POSTINCREMENT_EXPR:
804 tmp = get_variable_decl (TREE_OPERAND (exp, 0));
805 if (tmp != NULL_TREE && DECL_FINAL (tmp))
806 final_assign_error (DECL_NAME (tmp));
808 /* Avoid needless recursion. */
809 exp = TREE_OPERAND (exp, 0);
810 goto again;
812 case SAVE_EXPR:
813 if (IS_INIT_CHECKED (exp))
814 return;
815 IS_INIT_CHECKED (exp) = 1;
816 exp = TREE_OPERAND (exp, 0);
817 goto again;
819 case COMPOUND_EXPR:
820 case PLUS_EXPR:
821 case MINUS_EXPR:
822 case MULT_EXPR:
823 case TRUNC_DIV_EXPR:
824 case TRUNC_MOD_EXPR:
825 case RDIV_EXPR:
826 case LSHIFT_EXPR:
827 case RSHIFT_EXPR:
828 case URSHIFT_EXPR:
829 case BIT_AND_EXPR:
830 case BIT_XOR_EXPR:
831 case BIT_IOR_EXPR:
832 case EQ_EXPR:
833 case NE_EXPR:
834 case GT_EXPR:
835 case GE_EXPR:
836 case LT_EXPR:
837 case LE_EXPR:
838 case MAX_EXPR:
839 case MIN_EXPR:
840 case ARRAY_REF:
841 case LROTATE_EXPR:
842 case RROTATE_EXPR:
843 case CEIL_DIV_EXPR:
844 case FLOOR_DIV_EXPR:
845 case ROUND_DIV_EXPR:
846 case CEIL_MOD_EXPR:
847 case FLOOR_MOD_EXPR:
848 case ROUND_MOD_EXPR:
849 case EXACT_DIV_EXPR:
850 binop:
851 check_init (TREE_OPERAND (exp, 0), before);
852 /* Avoid needless recursion, especially for COMPOUND_EXPR. */
853 exp = TREE_OPERAND (exp, 1);
854 goto again;
856 case RESULT_DECL:
857 case FUNCTION_DECL:
858 case INTEGER_CST:
859 case REAL_CST:
860 case STRING_CST:
861 case JAVA_EXC_OBJ_EXPR:
862 break;
864 case NEW_CLASS_EXPR:
865 case CALL_EXPR:
867 tree func = TREE_OPERAND (exp, 0);
868 tree x = TREE_OPERAND (exp, 1);
869 if (TREE_CODE (func) == ADDR_EXPR)
870 func = TREE_OPERAND (func, 0);
871 check_init (func, before);
873 for ( ; x != NULL_TREE; x = TREE_CHAIN (x))
874 check_init (TREE_VALUE (x), before);
875 if (func == throw_node)
876 goto never_continues;
878 break;
880 case NEW_ARRAY_INIT:
882 tree x = CONSTRUCTOR_ELTS (TREE_OPERAND (exp, 0));
883 for ( ; x != NULL_TREE; x = TREE_CHAIN (x))
884 check_init (TREE_VALUE (x), before);
886 break;
888 case EXPR_WITH_FILE_LOCATION:
890 const char *saved_input_filename = input_filename;
891 tree saved_wfl = wfl;
892 tree body = EXPR_WFL_NODE (exp);
893 int saved_lineno = input_line;
894 if (body == empty_stmt_node)
895 break;
896 wfl = exp;
897 input_filename = EXPR_WFL_FILENAME (exp);
898 input_line = EXPR_WFL_LINENO (exp);
899 check_init (body, before);
900 input_filename = saved_input_filename;
901 input_line = saved_lineno;
902 wfl = saved_wfl;
904 break;
906 default:
907 internal_error
908 ("internal error in check-init: tree code not implemented: %s",
909 tree_code_name [(int) TREE_CODE (exp)]);
913 void
914 check_for_initialization (tree body, tree mdecl)
916 tree decl;
917 word buf[2];
918 words before = buf;
919 tree owner = DECL_CONTEXT (mdecl);
920 int is_static_method = METHOD_STATIC (mdecl);
921 /* We don't need to check final fields of <init> it it calls this(). */
922 int is_finit_method = DECL_FINIT_P (mdecl) || DECL_INSTINIT_P (mdecl);
923 int is_init_method
924 = (is_finit_method || DECL_CLINIT_P (mdecl)
925 || (DECL_INIT_P (mdecl) && ! DECL_INIT_CALLS_THIS (mdecl)));
927 start_current_locals = num_current_locals = 0;
928 num_current_words = 2;
930 if (is_init_method)
932 int words_needed, i;
933 for (decl = TYPE_FIELDS (owner);
934 decl != NULL_TREE; decl = TREE_CHAIN (decl))
936 if (DECL_FINAL (decl) && FIELD_STATIC (decl) == is_static_method)
938 if (DECL_FIELD_FINAL_IUD (decl))
939 DECL_BIT_INDEX (decl) = -1;
940 else
941 DECL_BIT_INDEX (decl) = num_current_locals++;
944 words_needed = WORDS_NEEDED (2 * num_current_locals);
945 if (words_needed > 2)
947 num_current_words = words_needed;
948 before = ALLOC_WORDS(words_needed);
950 i = 0;
951 for (decl = TYPE_FIELDS (owner);
952 decl != NULL_TREE; decl = TREE_CHAIN (decl))
954 if (FIELD_FINAL (decl) && FIELD_STATIC (decl) == is_static_method)
956 if (! DECL_FIELD_FINAL_IUD (decl))
958 CLEAR_ASSIGNED (before, i);
959 SET_UNASSIGNED (before, i);
960 i++;
967 check_init (body, before);
969 if (is_init_method)
971 for (decl = TYPE_FIELDS (owner);
972 decl != NULL_TREE; decl = TREE_CHAIN (decl))
974 if (FIELD_FINAL (decl) && FIELD_STATIC (decl) == is_static_method)
976 int index = DECL_BIT_INDEX (decl);
977 if (index >= 0 && ! ASSIGNED_P (before, index))
979 if (! is_finit_method)
980 error_with_decl (decl, "final field '%s' may not have been initialized");
982 else if (is_finit_method)
983 DECL_FIELD_FINAL_IUD (decl) = 1;
985 /* Re-set to initial state, since we later may use the
986 same bit for DECL_POINTER_ALIAS_SET. */
987 DECL_BIT_INDEX (decl) = -1;
992 start_current_locals = num_current_locals = 0;