diff options
Diffstat (limited to 'gcc/cp/optimize.c')
-rw-r--r-- | gcc/cp/optimize.c | 29 |
1 files changed, 15 insertions, 14 deletions
diff --git a/gcc/cp/optimize.c b/gcc/cp/optimize.c index 5ba9ea7..63ec81a 100644 --- a/gcc/cp/optimize.c +++ b/gcc/cp/optimize.c @@ -463,10 +463,6 @@ inlinable_function_p (fn, id) it. */ else if (!DECL_INLINE (fn)) ; - /* If we don't have the function body available, we can't inline - it. */ - else if (!DECL_SAVED_TREE (fn)) - ; /* We can't inline varargs functions. */ else if (varargs_function_p (fn)) ; @@ -481,6 +477,21 @@ inlinable_function_p (fn, id) /* Squirrel away the result so that we don't have to check again. */ DECL_UNINLINABLE (fn) = !inlinable; + /* We can inline a template instantiation only if it's fully + instantiated. */ + if (inlinable + && DECL_TEMPLATE_INFO (fn) + && TI_PENDING_TEMPLATE_FLAG (DECL_TEMPLATE_INFO (fn))) + { + fn = instantiate_decl (fn, /*defer_ok=*/0); + inlinable = !TI_PENDING_TEMPLATE_FLAG (DECL_TEMPLATE_INFO (fn)); + } + + /* If we don't have the function body available, we can't inline + it. */ + if (!DECL_SAVED_TREE (fn)) + inlinable = 0; + /* Don't do recursive inlining, either. We don't record this in DECL_UNLINABLE; we may be able to inline this function later. */ if (inlinable) @@ -492,16 +503,6 @@ inlinable_function_p (fn, id) inlinable = 0; } - /* We can inline a template instantiation only if it's fully - instantiated. */ - if (inlinable - && DECL_TEMPLATE_INFO (fn) - && TI_PENDING_TEMPLATE_FLAG (DECL_TEMPLATE_INFO (fn))) - { - fn = instantiate_decl (fn); - inlinable = !TI_PENDING_TEMPLATE_FLAG (DECL_TEMPLATE_INFO (fn)); - } - /* Return the result. */ return inlinable; } |