]> gcc.gnu.org Git - gcc.git/blame - gcc/java/parse.h
Warning fixes:
[gcc.git] / gcc / java / parse.h
CommitLineData
e04a16fb 1/* Language parser definitions for the GNU compiler for the Java(TM) language.
e511adc0 2 Copyright (C) 1997, 1998, 1999 Free Software Foundation, Inc.
e04a16fb
AG
3 Contributed by Alexandre Petit-Bianco (apbianco@cygnus.com)
4
5This file is part of GNU CC.
6
7GNU CC is free software; you can redistribute it and/or modify
8it under the terms of the GNU General Public License as published by
9the Free Software Foundation; either version 2, or (at your option)
10any later version.
11
12GNU CC is distributed in the hope that it will be useful,
13but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15GNU General Public License for more details.
16
17You should have received a copy of the GNU General Public License
18along with GNU CC; see the file COPYING. If not, write to
19the Free Software Foundation, 59 Temple Place - Suite 330,
20Boston, MA 02111-1307, USA.
21
22Java and all Java-based marks are trademarks or registered trademarks
23of Sun Microsystems, Inc. in the United States and other countries.
24The Free Software Foundation is independent of Sun Microsystems, Inc. */
25
26#ifndef JV_LANG_H
27#define JV_LANG_H
28
29#include "lex.h"
30
31/* Extern global variable declarations */
32extern int java_error_count;
33extern struct obstack temporary_obstack;
34extern struct obstack permanent_obstack;
35extern int quiet_flag;
36
37#ifndef JC1_LITE
38/* Function extern to java/ */
39extern int int_fits_type_p PROTO ((tree, tree));
40extern tree stabilize_reference PROTO ((tree));
41#endif
42
43/* Macros for verbose debug info */
44#ifdef VERBOSE_SKELETON
45#define RULE( rule ) printf ( "jv_yacc:%d: rule %s\n", lineno, rule )
46#else
47#define RULE( rule )
48#endif
49
5e942c50 50#ifdef VERBOSE_SKELETON
e04a16fb
AG
51#undef SOURCE_FRONTEND_DEBUG
52#define SOURCE_FRONTEND_DEBUG(X) \
53 {if (!quiet_flag) {printf ("* "); printf X; putchar ('\n');} }
54#else
55#define SOURCE_FRONTEND_DEBUG(X)
56#endif
57
58/* Macro for error recovering */
59#ifdef YYDEBUG
60#define RECOVERED \
61 { if (!quiet_flag) {printf ("** Recovered\n");} }
62#define DRECOVERED(s) \
63 { if (!quiet_flag) {printf ("** Recovered (%s)\n", #s);}}
64#else
65#define RECOVERED
66#define DRECOVERED(s)
67#endif
68
69#define DRECOVER(s) {yyerrok; DRECOVERED(s)}
70#define RECOVER {yyerrok; RECOVERED}
71
72#define YYERROR_NOW ctxp->java_error_flag = 1
73#define YYNOT_TWICE if (ctxp->prevent_ese != lineno)
74
75/* Accepted modifiers */
76#define CLASS_MODIFIERS ACC_PUBLIC|ACC_ABSTRACT|ACC_FINAL
77#define FIELD_MODIFIERS ACC_PUBLIC|ACC_PROTECTED|ACC_PRIVATE|ACC_FINAL| \
78 ACC_STATIC|ACC_TRANSIENT|ACC_VOLATILE
79#define METHOD_MODIFIERS ACC_PUBLIC|ACC_PROTECTED|ACC_PRIVATE|ACC_ABSTRACT| \
80 ACC_STATIC|ACC_FINAL|ACC_SYNCHRONIZED|ACC_NATIVE
81#define INTERFACE_MODIFIERS ACC_PUBLIC|ACC_ABSTRACT
82#define INTERFACE_METHOD_MODIFIERS ACC_PUBLIC|ACC_ABSTRACT
83#define INTERFACE_FIELD_MODIFIERS ACC_PUBLIC|ACC_STATIC|ACC_FINAL
84
85/* Getting a modifier WFL */
86#define MODIFIER_WFL(M) (ctxp->modifier_ctx [(M) - PUBLIC_TK])
87
88/* Check on modifiers */
89#define THIS_MODIFIER_ONLY(f, m, v, count, l) \
90 if ((f) & (m)) \
91 { \
92 tree node = ctxp->modifier_ctx [v]; \
93 if ((l) \
94 && ((EXPR_WFL_COLNO (node) > EXPR_WFL_COLNO (l)) \
95 || (EXPR_WFL_LINENO (node) > EXPR_WFL_LINENO (l)))) \
96 l = node; \
97 else if (!(l)) \
98 l = node; \
99 count++; \
100 }
101
22eed1e6
APB
102#define ABSTRACT_CHECK(FLAG, V, CL, S) \
103 if ((FLAG) & (V)) \
104 parse_error_context ((CL), S " method can't be abstract");
105
106#define JCONSTRUCTOR_CHECK(FLAG, V, CL, S) \
107 if ((FLAG) & (V)) \
108 parse_error_context ((CL), "Constructor can't be %s", (S)); \
109
e04a16fb
AG
110/* Misc. */
111#define exit_java_complete_class() \
112 { \
113 pop_obstacks (); \
114 return; \
115 }
116
117#define CLASS_OR_INTERFACE(decl, s1, s2) \
118 (decl ? \
119 ((get_access_flags_from_decl (TYPE_NAME (TREE_TYPE (decl))) \
120 & ACC_INTERFACE) ? \
121 s2 : s1) : ((s1 [0]=='S'|| s1 [0]=='s') ? \
122 (s1 [0]=='S' ? "Supertype" : "supertype") : \
123 (s1 [0] > 'A' ? "Type" : "type")))
124
c877974e
APB
125#define GET_REAL_TYPE(TYPE) \
126 (TREE_CODE (TYPE) == TREE_LIST ? TREE_PURPOSE (TYPE) : TYPE)
127
128#define GET_METHOD_NAME(METHOD) \
129 (TREE_CODE (DECL_NAME (METHOD)) == EXPR_WITH_FILE_LOCATION ? \
130 EXPR_WFL_NODE (DECL_NAME (METHOD)) : DECL_NAME (METHOD))
131
e04a16fb
AG
132/* Pedantic warning on obsolete modifiers. Note: when cl is NULL,
133 flags was set artificially, such as for a interface method */
134#define OBSOLETE_MODIFIER_WARNING(cl, flags, modifier, format, arg) \
135 { \
c877974e 136 if (flag_redundant && (cl) && ((flags) & (modifier))) \
e04a16fb
AG
137 parse_warning_context (cl, \
138 "Discouraged redundant use of `%s' modifier " \
139 "in declaration of " format, \
140 java_accstring_lookup (modifier), arg); \
141 }
142
143/* Quickly build a temporary pointer on hypothetical type NAME. */
144#define BUILD_PTR_FROM_NAME(ptr, name) \
145 { \
146 ptr = build (POINTER_TYPE, NULL_TREE); \
147 TYPE_NAME (ptr) = name; \
148 }
149
23a79c61
APB
150#define INCOMPLETE_TYPE_P(NODE) \
151 ((TREE_CODE (NODE) == POINTER_TYPE) \
152 && !TREE_TYPE (NODE) \
153 && TREE_CODE (TYPE_NAME (NODE)) == IDENTIFIER_NODE)
e04a16fb
AG
154
155/* Set the EMIT_LINE_NOTE flag of a EXPR_WLF to 1 if debug information
156 are requested. Works in the context of a parser rule. */
157#define JAVA_MAYBE_GENERATE_DEBUG_INFO(node) \
158 (debug_info_level != DINFO_LEVEL_NONE ? \
159 EXPR_WFL_EMIT_LINE_NOTE (node) = 1, node : node)
160
161/* Types classification, according to the JLS, section 4.2 */
e4de5a10
PB
162#define JFLOAT_TYPE_P(TYPE) (TYPE && TREE_CODE ((TYPE)) == REAL_TYPE)
163#define JINTEGRAL_TYPE_P(TYPE) ((TYPE) \
164 && (TREE_CODE ((TYPE)) == INTEGER_TYPE \
165 || TREE_CODE ((TYPE)) == CHAR_TYPE))
166#define JNUMERIC_TYPE_P(TYPE) ((TYPE) \
167 && (JFLOAT_TYPE_P ((TYPE)) \
168 || JINTEGRAL_TYPE_P ((TYPE))))
169#define JPRIMITIVE_TYPE_P(TYPE) ((TYPE) \
170 && (JNUMERIC_TYPE_P ((TYPE)) \
171 || TREE_CODE ((TYPE)) == BOOLEAN_TYPE))
e04a16fb 172
22eed1e6
APB
173#define JBSC_TYPE_P(TYPE) ((TYPE) && (((TYPE) == byte_type_node) \
174 || ((TYPE) == short_type_node) \
175 || ((TYPE) == char_type_node)))
176
e04a16fb 177/* Not defined in the LRM */
e4de5a10
PB
178#define JSTRING_TYPE_P(TYPE) ((TYPE) \
179 && ((TYPE) == string_type_node || \
180 (TREE_CODE (TYPE) == POINTER_TYPE && \
181 TREE_TYPE (TYPE) == string_type_node)))
182#define JSTRING_P(NODE) ((NODE) \
183 && (TREE_CODE (NODE) == STRING_CST \
184 || IS_CRAFTED_STRING_BUFFER_P (NODE) \
185 || JSTRING_TYPE_P (TREE_TYPE (NODE))))
186
187#define JREFERENCE_TYPE_P(TYPE) ((TYPE) \
188 && (TREE_CODE (TYPE) == RECORD_TYPE \
189 || (TREE_CODE (TYPE) == POINTER_TYPE \
190 && TREE_CODE (TREE_TYPE (TYPE)) == \
191 RECORD_TYPE)))
5e942c50
APB
192#define JNULLP_TYPE_P(TYPE) ((TYPE) && (TREE_CODE (TYPE) == POINTER_TYPE) \
193 && (TYPE) == TREE_TYPE (null_pointer_node))
e04a16fb
AG
194
195/* Other predicate */
34f4db93
APB
196#define JDECL_P(NODE) (NODE && (TREE_CODE (NODE) == PARM_DECL \
197 || TREE_CODE (NODE) == VAR_DECL \
198 || TREE_CODE (NODE) == FIELD_DECL))
e04a16fb
AG
199
200#define TYPE_INTERFACE_P(TYPE) \
201 (CLASS_P (TYPE) && CLASS_INTERFACE (TYPE_NAME (TYPE)))
202
203#define TYPE_CLASS_P(TYPE) (CLASS_P (TYPE) \
204 && !CLASS_INTERFACE (TYPE_NAME (TYPE)) \
205 && !TYPE_ARRAY_P (TYPE))
206
207/* Standard error messages */
208#define ERROR_CANT_CONVERT_TO_BOOLEAN(OPERATOR, NODE, TYPE) \
209 parse_error_context \
210 ((OPERATOR), "Incompatible type for `%s'. Can't convert `%s' to " \
0a2138e2 211 "boolean", operator_string ((NODE)), lang_printable_name ((TYPE),0))
e04a16fb
AG
212
213#define ERROR_CANT_CONVERT_TO_NUMERIC(OPERATOR, NODE, TYPE) \
214 parse_error_context \
215 ((OPERATOR), "Incompatible type for `%s'. Can't convert `%s' to " \
0a2138e2 216 "numeric type", operator_string ((NODE)), lang_printable_name ((TYPE), 0))
e04a16fb
AG
217
218#define ERROR_CAST_NEEDED_TO_INTEGRAL(OPERATOR, NODE, TYPE) \
219 parse_error_context \
220 ((OPERATOR), (JPRIMITIVE_TYPE_P (TYPE) ? \
221 "Incompatible type for `%s'. Explicit cast needed to convert " \
222 "`%s' to integral" : "Incompatible type for `%s'. Can't convert " \
223 "`%s' to integral"), operator_string ((NODE)), \
0a2138e2 224 lang_printable_name ((TYPE), 0))
e04a16fb
AG
225
226#define ERROR_VARIABLE_NOT_INITIALIZED(WFL, V) \
227 parse_error_context \
e4de5a10 228 ((WFL), "Variable `%s' may not have been initialized", \
e04a16fb
AG
229 IDENTIFIER_POINTER (V))
230
e4de5a10
PB
231/* Definition for loop handling. This is Java's own definition of a
232 loop body. See parse.y for documentation. It's valid once you hold
233 a loop's body (LOOP_EXPR_BODY) */
e04a16fb
AG
234
235/* The loop main block is the one hold the condition and the loop body */
236#define LOOP_EXPR_BODY_MAIN_BLOCK(NODE) TREE_OPERAND (NODE, 0)
237/* And then there is the loop update block */
238#define LOOP_EXPR_BODY_UPDATE_BLOCK(NODE) TREE_OPERAND (NODE, 1)
239
240/* Inside the loop main block, there is the loop condition and the
241 loop body. They may be reversed if the loop being described is a
242 do-while loop. NOTE: if you use a WFL around the EXIT_EXPR so you
243 can issue debug info for it, the EXIT_EXPR will be one operand
244 further. */
245#define LOOP_EXPR_BODY_CONDITION_EXPR(NODE, R) \
246 TREE_OPERAND (LOOP_EXPR_BODY_MAIN_BLOCK (NODE), (R ? 1 : 0))
247
248/* Here is the labeled block the loop real body is encapsulated in */
249#define LOOP_EXPR_BODY_LABELED_BODY(NODE, R) \
250 TREE_OPERAND (LOOP_EXPR_BODY_MAIN_BLOCK (NODE), (R ? 0 : 1))
251/* And here is the loop's real body */
252#define LOOP_EXPR_BODY_BODY_EXPR(NODE, R) \
253 LABELED_BLOCK_BODY (LOOP_EXPR_BODY_LABELED_BODY(NODE, R))
254
255/* Does a loop have a label ? */
256#define LOOP_HAS_LABEL_P(LOOP) \
257 (ctxp->current_labeled_block \
258 && LABELED_BLOCK_BODY (ctxp->current_labeled_block) == (LOOP))
259
260/* Same operation than the one performed above, but considering the
261 previous labeled block */
262#define LOOP_HAS_LABEL_SKIP_P(LOOP) \
263 (ctxp->current_labeled_block \
264 && TREE_CHAIN (ctxp->current_labeled_block) \
265 && LABELED_BLOCK_BODY (TREE_CHAIN (ctxp->current_labeled_block)) == (LOOP))
266
267#define PUSH_LABELED_BLOCK(B) \
268 { \
269 TREE_CHAIN (B) = ctxp->current_labeled_block; \
270 ctxp->current_labeled_block = (B); \
271 }
272#define POP_LABELED_BLOCK() \
273 ctxp->current_labeled_block = TREE_CHAIN (ctxp->current_labeled_block)
274
275#define PUSH_LOOP(L) \
276 { \
277 TREE_CHAIN (L) = ctxp->current_loop; \
278 ctxp->current_loop = (L); \
279 }
280#define POP_LOOP() ctxp->current_loop = TREE_CHAIN (ctxp->current_loop)
281
b9f7e36c
APB
282#define PUSH_EXCEPTIONS(E) \
283 currently_caught_type_list = \
284 tree_cons (NULL_TREE, (E), currently_caught_type_list);
285
286#define POP_EXCEPTIONS() \
287 currently_caught_type_list = TREE_CHAIN (currently_caught_type_list)
288
22eed1e6 289/* Check that we're inside a try block. */
b9f7e36c
APB
290#define IN_TRY_BLOCK_P() \
291 (currently_caught_type_list \
292 && ((TREE_VALUE (currently_caught_type_list) != \
293 DECL_FUNCTION_THROWS (current_function_decl)) \
294 || TREE_CHAIN (currently_caught_type_list)))
295
22eed1e6 296/* Check that we have exceptions in E. */
b9f7e36c
APB
297#define EXCEPTIONS_P(E) ((E) ? TREE_VALUE (E) : NULL_TREE)
298
e04a16fb
AG
299/* Invocation modes, as returned by invocation_mode (). */
300enum {
301 INVOKE_STATIC,
302 INVOKE_NONVIRTUAL,
303 INVOKE_SUPER,
304 INVOKE_INTERFACE,
305 INVOKE_VIRTUAL,
306};
307
308/* We need the resolution stuff only if we compile jc1 */
309#ifndef JC1_LITE
310
311/* Unresolved type identifiers handling. When we process the source
312 code, we blindly accept an unknown type identifier and try to
313 resolve it later. When an unknown type identifier is encountered
314 and used, we record in a struct jdep element what the incomplete
315 type is and what it should patch. Later, java_complete_class will
316 process all classes known to have unresolved type
317 dependencies. Within each of these classes, this routine will
318 process unresolved type dependencies (JDEP_TO_RESOLVE), patch what
319 needs to be patched in the dependent tree node (JDEP_GET_PATCH,
320 JDEP_APPLY_PATCH) and perform other actions dictated by the context
321 of the patch (JDEP_KIND). The ideas are: we patch only what needs
322 to be patched, and with java_complete_class called at the right
323 time, we will start processing incomplete function bodies tree
324 nodes with everything external to function's bodies already
325 completed, it makes things much simpler. */
326
327enum jdep_code {
328 JDEP_NO_PATCH, /* Must be first */
329 JDEP_SUPER, /* Patch the type of one type
330 supertype. Requires some check
331 before it's done */
332 JDEP_FIELD, /* Patch the type of a class field */
333
334 /* JDEP_{METHOD,METHOD_RETURN,METHOD_END} to be kept in order */
335 JDEP_METHOD, /* Mark the beginning of the patching
336 of a method declaration, including
337 it's arguments */
338 JDEP_METHOD_RETURN, /* Mark the beginning of the patching
339 of a method declaration. Arguments
340 aren't patched, only the returned
341 type is */
342 JDEP_METHOD_END, /* Mark the end of the patching of a
343 method declaration. It indicates
344 that it's time to compute and
345 install a new signature */
346
347 JDEP_INTERFACE, /* Patch the type of a Class/interface
348 extension */
349 JDEP_VARIABLE, /* Patch the type of a variable declaration */
350 JDEP_PARM, /* Patch the type of a parm declaration */
351 JDEP_TYPE, /* Patch a random tree node type,
352 without the need for any specific
353 actions */
b9f7e36c 354 JDEP_EXCEPTION, /* Patch exceptions specified by `throws' */
e04a16fb
AG
355};
356
357typedef struct _jdep {
358#ifdef ONLY_INT_FIELDS
359 int kind : 8; /* Type of patch */
360#else
361 enum jdep_code kind : 8;
362#endif
363
364 int flag0 : 1; /* Some flags */
365 tree decl; /* Tied decl/or WFL */
366 tree solv; /* What to solve */
367 tree wfl; /* Where thing to resolve where found */
368 tree misc; /* Miscellaneous info (optional). */
369 tree *patch; /* Address of a location to patch */
370 struct _jdep *next; /* Linked list */
371} jdep;
372
373
374#define JDEP_DECL(J) ((J)->decl)
375#define JDEP_DECL_WFL(J) ((J)->decl)
376#define JDEP_KIND(J) ((J)->kind)
377#define JDEP_SOLV(J) ((J)->solv)
378#define JDEP_WFL(J) ((J)->wfl)
379#define JDEP_MISC(J) ((J)->misc)
380#define JDEP_CLASS(J) ((J)->class)
381#define JDEP_APPLY_PATCH(J,P) (*(J)->patch = (P))
382#define JDEP_GET_PATCH(J) ((J)->patch)
383#define JDEP_CHAIN(J) ((J)->next)
78d21f92
PB
384#define JDEP_TO_RESOLVE(J) ((J)->solv)
385#define JDEP_RESOLVED_DECL(J) ((J)->solv)
386#define JDEP_RESOLVED(J, D) ((J)->solv = D)
387#define JDEP_RESOLVED_P(J) \
388 (!(J)->solv || TREE_CODE ((J)->solv) != POINTER_TYPE)
e04a16fb
AG
389
390typedef struct _jdeplist {
391 jdep *first;
392 jdep *last;
393 struct _jdeplist *next;
394} jdeplist;
e04a16fb
AG
395
396#endif /* JC1_LITE */
397
398#define CLASSD_FIRST(CD) ((CD)->first)
399#define CLASSD_LAST(CD) ((CD)->last)
400#define CLASSD_CHAIN(CD) ((CD)->next)
401
402#define JDEP_INSERT(L,J) \
403 { \
404 if (!(L)->first) \
405 (L)->last = (L)->first = (J); \
406 else \
407 { \
408 JDEP_CHAIN ((L)->last) = (J); \
409 (L)->last = (J); \
410 } \
411 }
412
c583dd46
APB
413/* if TYPE can't be resolved, obtain something suitable for its
414 resolution (TYPE is saved in SAVE before being changed). and set
415 CHAIN to 1. Otherwise, type is set to something usable. CHAIN is
c877974e
APB
416 usually used to determine that a new DEP must be installed on TYPE.
417 Note that when compiling java.lang.Object, references to Object are
418 java.lang.Object. */
419#define SET_TYPE_FOR_RESOLUTION(TYPE, SAVE, CHAIN) \
420 { \
421 tree returned_type; \
422 (CHAIN) = 0; \
423 if (TREE_TYPE (ctxp->current_parsed_class) == object_type_node \
424 && TREE_CODE (TYPE) == EXPR_WITH_FILE_LOCATION \
425 && EXPR_WFL_NODE (TYPE) == unqualified_object_id_node) \
426 (TYPE) = object_type_node; \
427 else \
428 { \
429 if (unresolved_type_p (type, &returned_type)) \
430 { \
431 if (returned_type) \
432 (TYPE) = returned_type; \
433 else \
434 { \
435 (SAVE) = (TYPE); \
436 (TYPE) = obtain_incomplete_type (TYPE); \
437 CHAIN = 1; \
438 } \
439 } \
440 } \
c583dd46 441 }
1886c9d8
APB
442/* Promote a type if it won't be registered as a patch */
443#define PROMOTE_RECORD_IF_COMPLETE(TYPE, IS_INCOMPLETE) \
444 { \
445 if (!(IS_INCOMPLETE) && TREE_CODE (TYPE) == RECORD_TYPE) \
446 (TYPE) = promote_type (TYPE); \
447 }
c583dd46 448
e04a16fb
AG
449/* Insert a DECL in the current block */
450#define BLOCK_CHAIN_DECL(NODE) \
451 { \
452 TREE_CHAIN ((NODE)) = \
453 BLOCK_EXPR_DECLS (DECL_FUNCTION_BODY (current_function_decl)); \
454 BLOCK_EXPR_DECLS (DECL_FUNCTION_BODY (current_function_decl)) = (NODE); \
455 }
456
15fdcfe9
PB
457/* For an artificial BLOCK (created to house a local variable declaration not
458 at the start of an existing block), the parent block; otherwise NULL. */
e04a16fb
AG
459#define BLOCK_EXPR_ORIGIN(NODE) BLOCK_ABSTRACT_ORIGIN(NODE)
460
461/* Merge an other line to the source line number of a decl. Used to
462 remember function's end. */
463#define DECL_SOURCE_LINE_MERGE(DECL,NO) DECL_SOURCE_LINE(DECL) |= (NO << 16)
464
465/* Retrieve those two info separately. */
466#define DECL_SOURCE_LINE_FIRST(DECL) (DECL_SOURCE_LINE(DECL) & 0x0000ffff)
467#define DECL_SOURCE_LINE_LAST(DECL) (DECL_SOURCE_LINE(DECL) >> 16)
468
469/* Build a WFL for expression nodes */
470#define BUILD_EXPR_WFL(NODE, WFL) \
471 build_expr_wfl ((NODE), input_filename, EXPR_WFL_LINENO ((WFL)), \
472 EXPR_WFL_COLNO ((WFL)))
473
474#define EXPR_WFL_QUALIFICATION(WFL) TREE_OPERAND ((WFL), 1)
475#define QUAL_WFL(NODE) TREE_PURPOSE (NODE)
476#define QUAL_RESOLUTION(NODE) TREE_VALUE (NODE)
f8976021
APB
477#define QUAL_DECL_TYPE(NODE) GET_SKIP_TYPE (NODE)
478
479#define GET_SKIP_TYPE(NODE) \
e04a16fb 480 (TREE_CODE (TREE_TYPE (NODE)) == POINTER_TYPE ? \
f8976021 481 TREE_TYPE (TREE_TYPE (NODE)): TREE_TYPE (NODE))
e04a16fb
AG
482
483/* Handy macros for the walk operation */
484#define COMPLETE_CHECK_OP(NODE, N) \
485{ \
486 TREE_OPERAND ((NODE), (N)) = \
487 java_complete_tree (TREE_OPERAND ((NODE), (N))); \
488 if (TREE_OPERAND ((NODE), (N)) == error_mark_node) \
489 return error_mark_node; \
490}
491#define COMPLETE_CHECK_OP_0(NODE) COMPLETE_CHECK_OP(NODE, 0)
492#define COMPLETE_CHECK_OP_1(NODE) COMPLETE_CHECK_OP(NODE, 1)
22eed1e6 493#define COMPLETE_CHECK_OP_2(NODE) COMPLETE_CHECK_OP(NODE, 2)
e04a16fb 494
e4de5a10 495/* Building invocations: append(ARG) and StringBuffer(ARG) */
061ac426
TT
496#define BUILD_APPEND(ARG) \
497 ((JSTRING_TYPE_P (TREE_TYPE (ARG)) || JPRIMITIVE_TYPE_P (TREE_TYPE (ARG))) \
498 ? build_method_invocation (wfl_append, \
499 ARG ? build_tree_list (NULL, (ARG)) : NULL_TREE)\
500 : build_method_invocation (wfl_append, \
501 ARG ? build_tree_list (NULL, \
502 build1 (CONVERT_EXPR, \
503 object_type_node,\
504 (ARG))) \
505 : NULL_TREE))
e4de5a10
PB
506#define BUILD_STRING_BUFFER(ARG) \
507 build_new_invocation (wfl_string_buffer, \
508 (ARG ? build_tree_list (NULL, (ARG)) : NULL_TREE))
509
b9f7e36c 510/* For exception handling, build diverse function calls */
b9f7e36c
APB
511#define BUILD_ASSIGN_EXCEPTION_INFO(WHERE, TO) \
512 { \
513 (WHERE) = build (MODIFY_EXPR, void_type_node, (TO), \
514 soft_exceptioninfo_call_node); \
515 TREE_SIDE_EFFECTS (WHERE) = 1; \
516 }
517
518#define BUILD_THROW(WHERE, WHAT) \
519 { \
520 (WHERE) = build (CALL_EXPR, void_type_node, \
521 build_address_of (throw_node), \
522 build_tree_list (NULL_TREE, (WHAT)), NULL_TREE); \
523 TREE_SIDE_EFFECTS ((WHERE)) = 1; \
524 }
525
526/* Set wfl_operator for the most accurate error location */
527#define SET_WFL_OPERATOR(WHICH, NODE, WFL) \
528 EXPR_WFL_LINECOL (WHICH) = \
529 (TREE_CODE (WFL) == EXPR_WITH_FILE_LOCATION ? \
530 EXPR_WFL_LINECOL (WFL) : EXPR_WFL_LINECOL (NODE))
531
532#define PATCH_METHOD_RETURN_ERROR() \
533 { \
534 if (ret_decl) \
535 *ret_decl = NULL_TREE; \
536 return error_mark_node; \
537 }
5e942c50
APB
538
539/* Convenient macro to check. Assumes that CLASS is a CLASS_DECL. */
540#define CHECK_METHODS(CLASS) \
541 { \
542 if (CLASS_INTERFACE ((CLASS))) \
543 java_check_abstract_methods ((CLASS)); \
544 else \
545 java_check_regular_methods ((CLASS)); \
546 }
547
548/* Using and reseting the @deprecated tag flag */
549#define CHECK_DEPRECATED(DECL) \
550 { \
551 if (ctxp->deprecated) \
552 DECL_DEPRECATED (DECL) = 1; \
553 ctxp->deprecated = 0; \
554 }
555
ba179f9f 556/* Register an import */
5e942c50
APB
557#define REGISTER_IMPORT(WHOLE, NAME) \
558{ \
559 IS_A_SINGLE_IMPORT_CLASSFILE_NAME_P ((NAME)) = 1; \
560 node = build_tree_list ((WHOLE), (NAME)); \
561 TREE_CHAIN (node) = ctxp->import_list; \
562 ctxp->import_list = node; \
563}
ba179f9f
APB
564
565/* Macro to access the osb (opening square bracket) count */
566#define CURRENT_OSB(C) (C)->osb_number [(C)->osb_depth]
b9f7e36c 567
e04a16fb
AG
568/* Parser context data structure. */
569struct parser_ctxt {
570
571 char *filename; /* Current filename */
572 FILE *finput; /* Current file input stream */
573 struct parser_ctxt *next;
574
575 struct java_line *p_line, *c_line; /* Previous and current line */
576 java_lc elc; /* Error's line column info */
577 unicode_t unget_utf8_value; /* An unget utf8 value */
578 int ccb_indent; /* Keep track of {} indent, lexer */
579 int first_ccb_indent1; /* First { at ident level 1 */
580 int last_ccb_indent1; /* Last } at ident level 1 */
581 int parser_ccb_indent; /* Keep track of {} indent, parser */
ba179f9f
APB
582 int osb_depth; /* Current depth of [ in an expression */
583 int osb_limit; /* Limit of this depth */
584 int *osb_number; /* Keep track of ['s */
e04a16fb 585 int minus_seen; /* Integral literal overflow */
23a79c61
APB
586 int lineno; /* Current lineno */
587 int java_error_flag; /* Report error when true */
5e942c50 588 int deprecated; /* @deprecated tag seen */
e04a16fb
AG
589
590 /* This section is defined only if we compile jc1 */
591#ifndef JC1_LITE
23a79c61 592 tree modifier_ctx [11]; /* WFL of modifiers */
e04a16fb
AG
593 tree current_class; /* Current class */
594 tree current_function_decl; /* Current function decl, save/restore */
595
8e1f2d4c 596 struct JCF *current_jcf; /* CU jcf */
e04a16fb
AG
597
598 int prevent_ese; /* Prevent expression statement error */
599 int class_err; /* Flag to report certain errors */
600
601 int formal_parameter_number; /* Number of parameters found */
602 int interface_number; /* # itfs declared to extend an itf def */
603
604 tree package; /* Defined package ID */
605
23a79c61 606 /* Those tow list are saved accross file traversal */
e04a16fb 607 tree incomplete_class; /* List of non-complete classes */
23a79c61
APB
608 tree gclass_list; /* All classes seen from source code */
609
610 /* These two lists won't survive file traversal */
e04a16fb
AG
611 tree class_list; /* List of classes in a CU */
612 jdeplist *classd_list; /* Classe dependencies in a CU */
613
23a79c61
APB
614 tree current_parsed_class; /* Class currently parsed */
615 tree current_parsed_class_un; /* Curr. parsed class unqualified name */
616
e04a16fb
AG
617 tree non_static_initialized; /* List of non static initialized fields */
618 tree static_initialized; /* List of static non final initialized */
619
620 tree import_list; /* List of import */
621 tree import_demand_list; /* List of import on demand */
622
23a79c61
APB
623 tree current_loop; /* List of the currently nested
624 loops/switches */
625 tree current_labeled_block; /* List of currently nested
626 labeled blocks. */
e04a16fb 627
23a79c61 628 int pending_block; /* Pending block to close */
22eed1e6 629
23a79c61
APB
630 int explicit_constructor_p; /* True when processing an explicit
631 constructor. This flag is used to trap
632 illegal argument usage during an
633 explicit constructor invocation. */
e04a16fb
AG
634#endif /* JC1_LITE */
635};
636
e04a16fb 637#ifndef JC1_LITE
e04a16fb
AG
638void safe_layout_class PROTO ((tree));
639void java_complete_class PROTO ((void));
640void java_check_circular_reference PROTO ((void));
641void java_check_final PROTO ((void));
e04a16fb
AG
642void java_layout_classes PROTO ((void));
643tree java_method_add_stmt PROTO ((tree, tree));
644char *java_get_line_col PROTO ((char *, int, int));
e4de5a10 645void java_expand_switch PROTO ((tree));
c877974e 646int java_report_errors PROTO (());
78d21f92 647extern tree do_resolve_class PROTO ((tree, tree, tree));
82371d41 648#endif
e04a16fb
AG
649
650/* Always in use, no matter what you compile */
e04a16fb 651void java_push_parser_context PROTO ((void));
b351b287 652void java_pop_parser_context PROTO ((int));
e04a16fb 653void java_init_lex PROTO ((void));
8e1f2d4c
KG
654extern void java_parser_context_save_global PROTO ((void));
655extern void java_parser_context_restore_global PROTO ((void));
e04a16fb 656int yyparse PROTO ((void));
8e1f2d4c 657extern int java_parse PROTO ((void));
e04a16fb
AG
658int yylex ();
659void yyerror PROTO ((char *));
8e1f2d4c 660extern void java_expand_classes PROTO ((void));
e04a16fb 661#endif
This page took 0.212193 seconds and 5 git commands to generate.