Commit ae5a77fa by Eric Botcazou Committed by Eric Botcazou

re PR ada/69219 (error on nested subprograms with Inline_Always and Intrinsic)

	PR ada/69219
	* gcc-interface/trans.c (check_inlining_for_nested_subprog): Consider
	the parent function instead of the current function in order to issue
	the warning or the error.  Add guard for ignored functions.

From-SVN: r232498
parent 11e57fc6
2016-01-18 Eric Botcazou <ebotcazou@adacore.com>
PR ada/69219
* gcc-interface/trans.c (check_inlining_for_nested_subprog): Consider
the parent function instead of the current function in order to issue
the warning or the error. Add guard for ignored functions.
2016-01-17 Jakub Jelinek <jakub@redhat.com> 2016-01-17 Jakub Jelinek <jakub@redhat.com>
* adaint.c (__gnat_killprocesstree): Avoid -Wparentheses warning. * adaint.c (__gnat_killprocesstree): Avoid -Wparentheses warning.
......
...@@ -1487,7 +1487,7 @@ Pragma_to_gnu (Node_Id gnat_node) ...@@ -1487,7 +1487,7 @@ Pragma_to_gnu (Node_Id gnat_node)
} }
/* Check the inlining status of nested function FNDECL in the current context. /* Check the inline status of nested function FNDECL wrt its parent function.
If a non-inline nested function is referenced from an inline external If a non-inline nested function is referenced from an inline external
function, we cannot honor both requests at the same time without cloning function, we cannot honor both requests at the same time without cloning
...@@ -1495,24 +1495,27 @@ Pragma_to_gnu (Node_Id gnat_node) ...@@ -1495,24 +1495,27 @@ Pragma_to_gnu (Node_Id gnat_node)
We could inline it as well but it's probably better to err on the side We could inline it as well but it's probably better to err on the side
of too little inlining. of too little inlining.
This must be invoked only on nested functions present in the source code This must be done only on nested functions present in the source code
and not on nested functions generated by the compiler, e.g. finalizers, and not on nested functions generated by the compiler, e.g. finalizers,
because they are not marked inline and we don't want them to block the because they may be not marked inline and we don't want them to block
inlining of the parent function. */ the inlining of the parent function. */
static void static void
check_inlining_for_nested_subprog (tree fndecl) check_inlining_for_nested_subprog (tree fndecl)
{ {
if (!DECL_DECLARED_INLINE_P (fndecl) if (DECL_IGNORED_P (current_function_decl) || DECL_IGNORED_P (fndecl))
&& current_function_decl return;
&& DECL_EXTERNAL (current_function_decl)
&& DECL_DECLARED_INLINE_P (current_function_decl)) if (DECL_DECLARED_INLINE_P (fndecl))
return;
tree parent_decl = decl_function_context (fndecl);
if (DECL_EXTERNAL (parent_decl) && DECL_DECLARED_INLINE_P (parent_decl))
{ {
const location_t loc1 = DECL_SOURCE_LOCATION (fndecl); const location_t loc1 = DECL_SOURCE_LOCATION (fndecl);
const location_t loc2 = DECL_SOURCE_LOCATION (current_function_decl); const location_t loc2 = DECL_SOURCE_LOCATION (parent_decl);
if (lookup_attribute ("always_inline", if (lookup_attribute ("always_inline", DECL_ATTRIBUTES (parent_decl)))
DECL_ATTRIBUTES (current_function_decl)))
{ {
error_at (loc1, "subprogram %q+F not marked Inline_Always", fndecl); error_at (loc1, "subprogram %q+F not marked Inline_Always", fndecl);
error_at (loc2, "parent subprogram cannot be inlined"); error_at (loc2, "parent subprogram cannot be inlined");
...@@ -1524,8 +1527,8 @@ check_inlining_for_nested_subprog (tree fndecl) ...@@ -1524,8 +1527,8 @@ check_inlining_for_nested_subprog (tree fndecl)
warning_at (loc2, OPT_Winline, "parent subprogram cannot be inlined"); warning_at (loc2, OPT_Winline, "parent subprogram cannot be inlined");
} }
DECL_DECLARED_INLINE_P (current_function_decl) = 0; DECL_DECLARED_INLINE_P (parent_decl) = 0;
DECL_UNINLINABLE (current_function_decl) = 1; DECL_UNINLINABLE (parent_decl) = 1;
} }
} }
......
2016-01-18 Eric Botcazou <ebotcazou@adacore.com>
* gnat.dg/inline12.adb: New test.
2016-01-18 Bin Cheng <bin.cheng@arm.com> 2016-01-18 Bin Cheng <bin.cheng@arm.com>
PR tree-optimization/66797 PR tree-optimization/66797
......
-- PR ada/69219
-- Testcae by yuta tomino <demoonlit@panathenaia.halfmoon.jp> */
-- { dg-do compile }
procedure Inline12 is
procedure NI;
procedure IA;
pragma Convention (Intrinsic, IA);
pragma Inline_Always (IA);
procedure IA is
begin
NI;
end;
procedure NI is null;
begin
IA;
end;
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment