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)
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. */
29 #include "coretypes.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. */
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
75 static int start_current_locals
= 0;
77 static int num_current_words
;
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) \
89 while (--n >= 0) DST[n] = SRC1[n] & SRC2[n]; \
92 #define UNION(DST, SRC1, SRC2) \
93 UNIONN (DST, SRC1, SRC2, num_current_words)
95 #define UNIONN(DST, SRC1, SRC2, N) \
97 while (--n >= 0) DST[n] = SRC1[n] | SRC2[n]; \
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
);
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. */
165 get_variable_decl (tree exp
)
167 if (TREE_CODE (exp
) == VAR_DECL
)
169 if (! TREE_STATIC (exp
) || FIELD_FINAL (exp
))
172 /* We only care about final parameters. */
173 else if (TREE_CODE (exp
) == PARM_DECL
)
175 if (DECL_FINAL (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
)))
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
));
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. */
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. */
250 check_bool2_init (enum tree_code code
, tree exp0
, tree exp1
,
251 words before
, words when_false
, words when_true
)
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
);
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
);
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
);
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. */
317 check_bool_init (tree exp
, words before
, words when_false
, words when_true
)
319 switch (TREE_CODE (exp
))
322 check_cond_init (TREE_OPERAND (exp
, 0), TREE_OPERAND (exp
, 1),
323 TREE_OPERAND (exp
, 2),
324 before
, when_false
, when_true
);
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
);
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
);
338 check_bool_init (TREE_OPERAND (exp
, 0), before
, when_true
, when_false
);
342 tree tmp
= TREE_OPERAND (exp
, 0);
343 if ((tmp
= get_variable_decl (tmp
)) != NULL_TREE
)
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
);
352 SET_ASSIGNED (when_false
, index
);
353 SET_ASSIGNED (when_true
, index
);
354 CLEAR_UNASSIGNED (when_false
, index
);
355 CLEAR_UNASSIGNED (when_true
, index
);
367 check_bool2_init (TREE_CODE (exp
),
368 TREE_OPERAND (exp
, 0), TREE_OPERAND (exp
, 1),
369 before
, when_false
, when_true
);
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
);
382 if (integer_zerop (exp
))
385 COPY (when_false
, before
);
389 SET_ALL (when_false
);
390 COPY (when_true
, before
);
395 check_init (exp
, before
);
396 COPY (when_false
, before
);
397 COPY (when_true
, before
);
401 /* Used to keep track of control flow branches. */
405 struct alternatives
*outer
;
407 /* The value of num_current_locals at the start of this compound. */
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. */
414 int save_start_current_locals
;
416 /* If num_current_words==1, combined==&one_word, for efficiency. */
419 /* The intersection of the "after" sets from previous branches. */
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 ? ¤t.one_word \
436 : ALLOC_WORDS (num_current_words); \
437 SET_ALL (current.combined); \
438 current.outer = alternatives; \
439 alternatives = ¤t; \
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. */
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 != ¤t.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. */
471 check_init (tree exp
, words before
)
475 switch (TREE_CODE (exp
))
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
))
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;
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
))
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;
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
)
520 check_init (TREE_OPERAND (exp
, 1), before
);
521 check_final_reassigned (tmp
, before
);
522 index
= DECL_BIT_INDEX (tmp
);
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
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;
542 else if (TREE_CODE (tmp
= TREE_OPERAND (exp
, 0)) == COMPONENT_REF
)
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
));
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
);
561 if (BLOCK_EXPR_BODY (exp
))
563 tree decl
= BLOCK_EXPR_DECLS (exp
);
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
);
579 num_current_words
= words_needed
;
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
))))
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
;
613 num_current_words
= save_num_current_words
;
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
);
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
;
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
)
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
);
658 case LABELED_BLOCK_EXPR
:
660 struct alternatives alt
;
661 BEGIN_ALTERNATIVES (before
, alt
);
663 if (LABELED_BLOCK_BODY (exp
))
664 check_init (LABELED_BLOCK_BODY (exp
), before
);
665 done_alternative (before
, &alt
);
666 END_ALTERNATIVES (before
, alt
);
669 case EXIT_BLOCK_EXPR
:
671 tree block
= TREE_OPERAND (exp
, 0);
672 struct alternatives
*alt
= alternatives
;
673 while (alt
->block
!= block
)
675 done_alternative (before
, alt
);
681 struct alternatives alt
;
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
);
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
);
700 struct alternatives
*alt
= alternatives
;
701 while (TREE_CODE (alt
->block
) != SWITCH_EXPR
)
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
);
711 tree try_clause
= TREE_OPERAND (exp
, 0);
712 tree clause
= TREE_OPERAND (exp
, 1);
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
);
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);
727 check_init (catch_clause
, tmp
);
728 done_alternative (tmp
, &alt
);
734 END_ALTERNATIVES (before
, alt
);
738 case TRY_FINALLY_EXPR
:
740 DECLARE_BUFFERS(tmp
, 1);
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
);
751 if (TREE_OPERAND (exp
, 0))
752 check_init (TREE_OPERAND (exp
, 0), before
);
753 goto never_continues
;
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
);
773 if (exp
== empty_stmt_node
)
775 /* ... else fall through ... */
776 case UNARY_PLUS_EXPR
:
789 case NON_LVALUE_EXPR
:
790 case INSTANCEOF_EXPR
:
796 /* Avoid needless recursion. */
797 exp
= TREE_OPERAND (exp
, 0);
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);
813 if (IS_INIT_CHECKED (exp
))
815 IS_INIT_CHECKED (exp
) = 1;
816 exp
= TREE_OPERAND (exp
, 0);
851 check_init (TREE_OPERAND (exp
, 0), before
);
852 /* Avoid needless recursion, especially for COMPOUND_EXPR. */
853 exp
= TREE_OPERAND (exp
, 1);
861 case JAVA_EXC_OBJ_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
;
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
);
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
)
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
;
908 ("internal error in check-init: tree code not implemented: %s",
909 tree_code_name
[(int) TREE_CODE (exp
)]);
914 check_for_initialization (tree body
, tree mdecl
)
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
);
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;
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;
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
);
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
);
967 check_init (body
, before
);
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;