===================================================================
@@ -200,6 +200,9 @@ static GTY(()) struct gnat_binding_level
/* A chain of gnat_binding_level structures awaiting reuse. */
static GTY((deletable)) struct gnat_binding_level *free_binding_level;
+/* The context to be used for global declarations. */
+static GTY(()) tree global_context;
+
/* An array of global declarations. */
static GTY(()) VEC(tree,gc) *global_decls;
@@ -497,15 +500,19 @@ gnat_zaplevel (void)
free_binding_level = level;
}
-/* Records a ..._DECL node DECL as belonging to the current lexical scope
- and uses GNAT_NODE for location information and propagating flags. */
+/* Record DECL as belonging to the current lexical scope and use GNAT_NODE
+ for location information and flag propagation. */
void
gnat_pushdecl (tree decl, Node_Id gnat_node)
{
- /* If this decl is public external or at toplevel, there is no context. */
+ /* If DECL is public external or at top level, it has global context. */
if ((TREE_PUBLIC (decl) && DECL_EXTERNAL (decl)) || global_bindings_p ())
- DECL_CONTEXT (decl) = 0;
+ {
+ if (!global_context)
+ global_context = build_translation_unit_decl (NULL_TREE);
+ DECL_CONTEXT (decl) = global_context;
+ }
else
{
DECL_CONTEXT (decl) = current_function_decl;
@@ -518,11 +525,12 @@ gnat_pushdecl (tree decl, Node_Id gnat_n
DECL_STATIC_CHAIN (decl) = 1;
}
- TREE_NO_WARNING (decl) = (gnat_node == Empty || Warnings_Off (gnat_node));
+ TREE_NO_WARNING (decl) = (No (gnat_node) || Warnings_Off (gnat_node));
/* Set the location of DECL and emit a declaration for it. */
if (Present (gnat_node))
Sloc_to_locus (Sloc (gnat_node), &DECL_SOURCE_LOCATION (decl));
+
add_decl_expr (decl, gnat_node);
/* Put the declaration on the list. The list of declarations is in reverse
@@ -1982,7 +1990,7 @@ end_subprog_body (tree body)
DECL_SAVED_TREE (fndecl) = body;
- current_function_decl = DECL_CONTEXT (fndecl);
+ current_function_decl = decl_function_context (fndecl);
/* We cannot track the location of errors past this point. */
error_gnat_node = Empty;
@@ -1995,7 +2003,7 @@ end_subprog_body (tree body)
dump_function (TDI_original, fndecl);
/* ??? This special handling of nested functions is probably obsolete. */
- if (!DECL_CONTEXT (fndecl))
+ if (!decl_function_context (fndecl))
cgraph_finalize_function (fndecl, false);
else
/* Register this function with cgraph just far enough to get it
===================================================================
@@ -450,8 +450,8 @@ extern void set_block_jmpbuf_decl (tree
/* Get the setjmp_decl, if any, for the current binding level. */
extern tree get_block_jmpbuf_decl (void);
-/* Records a ..._DECL node DECL as belonging to the current lexical scope
- and uses GNAT_NODE for location information. */
+/* Record DECL as belonging to the current lexical scope and use GNAT_NODE
+ for location information and flag propagation. */
extern void gnat_pushdecl (tree decl, Node_Id gnat_node);
extern void gnat_init_gcc_eh (void);
===================================================================
@@ -3182,9 +3182,7 @@ canonicalize_cond_expr_cond (tree t)
{
/* Strip conversions around boolean operations. */
if (CONVERT_EXPR_P (t)
- && (truth_value_p (TREE_CODE (TREE_OPERAND (t, 0)))
- || TREE_CODE (TREE_TYPE (TREE_OPERAND (t, 0)))
- == BOOLEAN_TYPE))
+ && truth_value_p (TREE_CODE (TREE_OPERAND (t, 0))))
t = TREE_OPERAND (t, 0);
/* For !x use x == 0. */