/* Language parser definitions for the GNU compiler for the Java(TM) language.
- Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003
+ Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004
Free Software Foundation, Inc.
Contributed by Alexandre Petit-Bianco (apbianco@cygnus.com)
#define MODIFIER_WFL(M) (ctxp->modifier_ctx [(M) - PUBLIC_TK])
/* Check on modifiers */
+#ifdef USE_MAPPED_LOCATION
+#define THIS_MODIFIER_ONLY(f, m, v, count, l) \
+ if ((f) & (m)) \
+ { \
+ tree node = MODIFIER_WFL (v); \
+ if (!l) \
+ l = node; \
+ else \
+ { \
+ expanded_location lloc = expand_location (EXPR_LOCATION (l)); \
+ expanded_location nloc = expand_location (EXPR_LOCATION (node)); \
+ if (nloc.column > lloc.column || nloc.line > lloc.line) \
+ l = node; \
+ } \
+ count++; \
+ }
+#else
#define THIS_MODIFIER_ONLY(f, m, v, count, l) \
if ((f) & (m)) \
{ \
l = node; \
count++; \
}
+#endif
#define ABSTRACT_CHECK(FLAG, V, CL, S) \
if ((FLAG) & (V)) \
{ \
if (flag_redundant && (cl) && ((flags) & (__modifier))) \
parse_warning_context (cl, \
- "Discouraged redundant use of `%s' modifier in declaration of %s", \
+ "Discouraged redundant use of %qs modifier in declaration of %s", \
java_accstring_lookup (__modifier), arg); \
}
#define OBSOLETE_MODIFIER_WARNING2(cl, flags, __modifier, arg1, arg2) \
{ \
if (flag_redundant && (cl) && ((flags) & (__modifier))) \
parse_warning_context (cl, \
- "Discouraged redundant use of `%s' modifier in declaration of %s `%s'", \
+ "Discouraged redundant use of %qs modifier in declaration of %s %qs", \
java_accstring_lookup (__modifier), arg1, arg2);\
}
/* Quickly build a temporary pointer on hypothetical type NAME. */
#define BUILD_PTR_FROM_NAME(ptr, name) \
do { \
- ptr = build (POINTER_TYPE, NULL_TREE); \
+ ptr = make_node (POINTER_TYPE); \
TYPE_NAME (ptr) = name; \
} while (0)
&& !TREE_TYPE (NODE) \
&& TREE_CODE (TYPE_NAME (NODE)) == IDENTIFIER_NODE)
+#ifndef USE_MAPPED_LOCATION
/* Set the EMIT_LINE_NOTE flag of a EXPR_WLF to 1 if debug information
are requested. Works in the context of a parser rule. */
#define JAVA_MAYBE_GENERATE_DEBUG_INFO(node) \
- (debug_info_level != DINFO_LEVEL_NONE ? \
- EXPR_WFL_EMIT_LINE_NOTE (node) = 1, node : node)
+ do {if (debug_info_level != DINFO_LEVEL_NONE) \
+ EXPR_WFL_EMIT_LINE_NOTE (node) = 1; } while (0)
+#endif
/* Types classification, according to the JLS, section 4.2 */
#define JFLOAT_TYPE_P(TYPE) (TYPE && TREE_CODE ((TYPE)) == REAL_TYPE)
/* Standard error messages */
#define ERROR_CANT_CONVERT_TO_BOOLEAN(OPERATOR, NODE, TYPE) \
parse_error_context ((OPERATOR), \
- "Incompatible type for `%s'. Can't convert `%s' to boolean", \
+ "Incompatible type for %qs. Can't convert %qs to boolean", \
operator_string ((NODE)), lang_printable_name ((TYPE),0))
#define ERROR_CANT_CONVERT_TO_NUMERIC(OPERATOR, NODE, TYPE) \
parse_error_context ((OPERATOR), \
- "Incompatible type for `%s'. Can't convert `%s' to numeric type", \
+ "Incompatible type for %qs. Can't convert %qs to numeric type", \
operator_string ((NODE)), lang_printable_name ((TYPE), 0))
#define ERROR_CAST_NEEDED_TO_INTEGRAL(OPERATOR, NODE, TYPE) \
tree _operator = (OPERATOR), _node = (NODE), _type = (TYPE); \
if (JPRIMITIVE_TYPE_P (_type)) \
parse_error_context (_operator, \
-"Incompatible type for `%s'. Explicit cast needed to convert `%s' to integral",\
+"Incompatible type for %qs. Explicit cast needed to convert %qs to integral",\
operator_string(_node), \
lang_printable_name (_type, 0)); \
else \
parse_error_context (_operator, \
- "Incompatible type for `%s'. Can't convert `%s' to integral", \
+ "Incompatible type for %qs. Can't convert %qs to integral", \
operator_string(_node), \
lang_printable_name (_type, 0)); \
} while (0)
#define ERROR_VARIABLE_NOT_INITIALIZED(WFL, V) \
parse_error_context \
- ((WFL), "Variable `%s' may not have been initialized", \
+ ((WFL), "Variable %qs may not have been initialized", \
IDENTIFIER_POINTER (V))
/* Definition for loop handling. This is Java's own definition of a
typedef struct _jdep {
ENUM_BITFIELD(jdep_code) kind : 8; /* Type of patch */
- int flag0 : 1; /* Some flags */
+ unsigned int flag0 : 1; /* Some flags */
tree decl; /* Tied decl/or WFL */
tree solv; /* What to solve */
tree wfl; /* Where thing to resolve where found */
#define GET_CURRENT_BLOCK(F) ((F) ? DECL_FUNCTION_BODY ((F)) : \
current_static_block)
+#ifndef USE_MAPPED_LOCATION
/* Retrieve line/column from a WFL. */
#define EXPR_WFL_GET_LINECOL(V,LINE,COL) \
{ \
(LINE) = (V) >> 12; \
(COL) = (V) & 0xfff; \
}
-/* Add X to the column number information */
-#define EXPR_WFL_ADD_COL(V, X) \
- (V) = (((V) & 0xfffff000) | ((((V) & 0xfff) + (X)) & 0xfff))
-
-/* Build a WFL for expression nodes */
-#define BUILD_EXPR_WFL(NODE, WFL) \
- build_expr_wfl ((NODE), input_filename, EXPR_WFL_LINENO ((WFL)), \
- EXPR_WFL_COLNO ((WFL)))
+#endif
-#define EXPR_WFL_QUALIFICATION(WFL) TREE_OPERAND ((WFL), 2)
+#define EXPR_WFL_QUALIFICATION(WFL) TREE_OPERAND ((WFL), 1)
#define QUAL_WFL(NODE) TREE_PURPOSE (NODE)
#define QUAL_RESOLUTION(NODE) TREE_VALUE (NODE)
#define QUAL_DECL_TYPE(NODE) GET_SKIP_TYPE (NODE)
#define BUILD_THROW(WHERE, WHAT) \
{ \
(WHERE) = \
- build (CALL_EXPR, void_type_node, \
- build_address_of (throw_node), \
- build_tree_list (NULL_TREE, (WHAT)), NULL_TREE); \
+ build3 (CALL_EXPR, void_type_node, \
+ build_address_of (throw_node), \
+ build_tree_list (NULL_TREE, (WHAT)), NULL_TREE); \
TREE_SIDE_EFFECTS ((WHERE)) = 1; \
}
/* Set wfl_operator for the most accurate error location */
+#ifdef USE_MAPPED_LOCATION
+#define SET_WFL_OPERATOR(WHICH, NODE, WFL) \
+ SET_EXPR_LOCATION (WHICH, \
+ (TREE_CODE (WFL) == EXPR_WITH_FILE_LOCATION ? \
+ EXPR_LOCATION (WFL) : EXPR_LOCATION (NODE)))
+#else
#define SET_WFL_OPERATOR(WHICH, NODE, WFL) \
EXPR_WFL_LINECOL (WHICH) = \
(TREE_CODE (WFL) == EXPR_WITH_FILE_LOCATION ? \
EXPR_WFL_LINECOL (WFL) : EXPR_WFL_LINECOL (NODE))
+#endif
#define PATCH_METHOD_RETURN_ERROR() \
{ \
/* Parser context data structure. */
struct parser_ctxt GTY(()) {
-
- const char *filename; /* Current filename */
+ const char *filename; /* Current filename */
+ location_t file_start_location;
+ location_t save_location;
struct parser_ctxt *next;
- java_lexer * GTY((skip (""))) lexer; /* Current lexer state */
+ java_lexer * GTY((skip)) lexer; /* Current lexer state */
char marker_begining; /* Marker. Should be a sub-struct */
- struct java_line * GTY ((skip (""))) p_line; /* Previous line */
- struct java_line * GTY ((skip (""))) c_line; /* Current line */
- java_lc elc; /* Error's line column info */
- int ccb_indent; /* Keep track of {} indent, lexer */
- int first_ccb_indent1; /* First { at ident level 1 */
- int last_ccb_indent1; /* Last } at ident level 1 */
+ int ccb_indent; /* Number of unmatched { seen. */
+ /* The next two fields are only source_location if USE_MAPPED_LOCATION.
+ Otherwise, they are integer line number, but we can't have #ifdefs
+ in GTY structures. */
+ source_location first_ccb_indent1; /* First { at ident level 1 */
+ source_location last_ccb_indent1; /* Last } at ident level 1 */
int parser_ccb_indent; /* Keep track of {} indent, parser */
int osb_depth; /* Current depth of [ in an expression */
int osb_limit; /* Limit of this depth */
- int * GTY ((skip (""))) osb_number; /* Keep track of ['s */
- int lineno; /* Current lineno */
+ int * GTY ((skip)) osb_number; /* Keep track of ['s */
char marker_end; /* End marker. Should be a sub-struct */
/* The flags section */
tree class_type; /* Current class */
tree function_decl; /* Current function decl, save/restore */
- struct JCF * current_jcf; /* CU jcf */
-
int prevent_ese; /* Prevent expression statement error */
int formal_parameter_number; /* Number of parameters found */
/* These two lists won't survive file traversal */
tree class_list; /* List of classes in a CU */
- jdeplist * GTY((skip (""))) classd_list; /* Classe dependencies in a CU */
+ jdeplist * GTY((skip)) classd_list; /* Classe dependencies in a CU */
tree current_parsed_class; /* Class currently parsed */
tree current_parsed_class_un; /* Curr. parsed class unqualified name */
an inner class is pushed. After, use FIXME. */
#define CPC_INNER_P() GET_CPC_LIST ()
-/* Get the currently parsed class DECL_TYPE node. */
+/* The TYPE_DECL node of the class currently being parsed. */
#define GET_CPC() TREE_VALUE (GET_CPC_LIST ())
/* Get the currently parsed class unqualified IDENTIFIER_NODE. */
!= TYPE_NAME (TREE_TYPE (TREE_TYPE (current_this)))) \
&& !inherits_from_p (TREE_TYPE (TREE_TYPE (current_this)), \
TREE_TYPE (DECL_CONTEXT (TYPE_NAME (T)))) \
- && !common_enclosing_context_p (TREE_TYPE (TREE_TYPE (current_this)), \
+ && !common_enclosing_instance_p (TREE_TYPE (TREE_TYPE (current_this)),\
(T)) \
&& INNER_CLASS_TYPE_P (TREE_TYPE (TREE_TYPE (current_this))) \
&& !inherits_from_p \
TREE_PURPOSE (CPC_INSTANCE_INITIALIZER_LIST (C)) = (S);
/* This is used by the lexer to communicate with the parser. It is
- set on an integer constant if the radix is 10, so that the parser
+ set on an integer constant if the radix is NOT 10, so that the parser
can correctly diagnose a numeric overflow. */
-#define JAVA_RADIX10_FLAG(NODE) TREE_LANG_FLAG_0(NODE)
+#define JAVA_NOT_RADIX10_FLAG(NODE) TREE_LANG_FLAG_0(NODE)
#ifndef JC1_LITE
void java_complete_class (void);
#endif
;
extern void java_expand_classes (void);
+extern void java_finish_classes (void);
extern GTY(()) struct parser_ctxt *ctxp;
extern GTY(()) struct parser_ctxt *ctxp_for_generation;