diff options
author | Eric Botcazou <ebotcazou@adacore.com> | 2008-09-20 08:41:55 +0000 |
---|---|---|
committer | Eric Botcazou <ebotcazou@gcc.gnu.org> | 2008-09-20 08:41:55 +0000 |
commit | d84b344a6c22cb816af1f204ff782b9f2e5166b5 (patch) | |
tree | 01f17ee8aeb1ae30d0a5919e846d0bead70c7d3a /gcc/ada/gcc-interface/utils.c | |
parent | 398857e4fbe5915a0d9a946ed6db4ac5c693ed77 (diff) | |
download | gcc-d84b344a6c22cb816af1f204ff782b9f2e5166b5.zip gcc-d84b344a6c22cb816af1f204ff782b9f2e5166b5.tar.gz gcc-d84b344a6c22cb816af1f204ff782b9f2e5166b5.tar.bz2 |
re PR ada/37585 (undefined references at -O for ACATS c650001)
PR ada/37585
* gcc-interface/utils.c (create_subprog_decl): Disable inlining for
inlined external functions if they contain a nested function not
declared inline.
From-SVN: r140511
Diffstat (limited to 'gcc/ada/gcc-interface/utils.c')
-rw-r--r-- | gcc/ada/gcc-interface/utils.c | 18 |
1 files changed, 10 insertions, 8 deletions
diff --git a/gcc/ada/gcc-interface/utils.c b/gcc/ada/gcc-interface/utils.c index 608f6ec..7f1bc7b 100644 --- a/gcc/ada/gcc-interface/utils.c +++ b/gcc/ada/gcc-interface/utils.c @@ -1973,12 +1973,16 @@ create_subprog_decl (tree subprog_name, tree asm_name, tree return_type = TREE_TYPE (subprog_type); tree subprog_decl = build_decl (FUNCTION_DECL, subprog_name, subprog_type); - /* If this is a function nested inside an inlined external function, it - means we aren't going to compile the outer function unless it is - actually inlined, so do the same for us. */ - if (current_function_decl && DECL_DECLARED_INLINE_P (current_function_decl) + /* If this is a non-inline function nested inside an inlined external + function, we cannot honor both requests without cloning the nested + function in the current unit since it is private to the other unit. + We could inline the nested function as well but it's probably better + to err on the side of too little inlining. */ + if (!inline_flag + && current_function_decl + && DECL_DECLARED_INLINE_P (current_function_decl) && DECL_EXTERNAL (current_function_decl)) - extern_flag = true; + DECL_DECLARED_INLINE_P (current_function_decl) = 0; DECL_EXTERNAL (subprog_decl) = extern_flag; TREE_PUBLIC (subprog_decl) = public_flag; @@ -1986,6 +1990,7 @@ create_subprog_decl (tree subprog_name, tree asm_name, TREE_READONLY (subprog_decl) = TYPE_READONLY (subprog_type); TREE_THIS_VOLATILE (subprog_decl) = TYPE_VOLATILE (subprog_type); TREE_SIDE_EFFECTS (subprog_decl) = TYPE_VOLATILE (subprog_type); + DECL_DECLARED_INLINE_P (subprog_decl) = inline_flag; DECL_ARGUMENTS (subprog_decl) = param_decl_list; DECL_RESULT (subprog_decl) = build_decl (RESULT_DECL, 0, return_type); DECL_ARTIFICIAL (DECL_RESULT (subprog_decl)) = 1; @@ -2004,9 +2009,6 @@ create_subprog_decl (tree subprog_name, tree asm_name, DECL_BY_REFERENCE (result_decl) = 1; } - if (inline_flag) - DECL_DECLARED_INLINE_P (subprog_decl) = 1; - if (asm_name) { SET_DECL_ASSEMBLER_NAME (subprog_decl, asm_name); |