}
\f
-/* 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
function, we cannot honor both requests at the same time without cloning
We could inline it as well but it's probably better to err on the side
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,
- because they are not marked inline and we don't want them to block the
- inlining of the parent function. */
+ because they may be not marked inline and we don't want them to block
+ the inlining of the parent function. */
static void
check_inlining_for_nested_subprog (tree fndecl)
{
- if (!DECL_DECLARED_INLINE_P (fndecl)
- && current_function_decl
- && DECL_EXTERNAL (current_function_decl)
- && DECL_DECLARED_INLINE_P (current_function_decl))
+ if (DECL_IGNORED_P (current_function_decl) || DECL_IGNORED_P (fndecl))
+ return;
+
+ 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 loc2 = DECL_SOURCE_LOCATION (current_function_decl);
+ const location_t loc2 = DECL_SOURCE_LOCATION (parent_decl);
- if (lookup_attribute ("always_inline",
- DECL_ATTRIBUTES (current_function_decl)))
+ if (lookup_attribute ("always_inline", DECL_ATTRIBUTES (parent_decl)))
{
error_at (loc1, "subprogram %q+F not marked Inline_Always", fndecl);
error_at (loc2, "parent subprogram cannot be inlined");
warning_at (loc2, OPT_Winline, "parent subprogram cannot be inlined");
}
- DECL_DECLARED_INLINE_P (current_function_decl) = 0;
- DECL_UNINLINABLE (current_function_decl) = 1;
+ DECL_DECLARED_INLINE_P (parent_decl) = 0;
+ DECL_UNINLINABLE (parent_decl) = 1;
}
}
\f