http://gcc.gnu.org/bugzilla/show_bug.cgi?id=49353
Summary: C++ frontend should not declare function EXTERN when
it forces them to stay
Product: gcc
Version: 4.6.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
AssignedTo: [email protected]
ReportedBy: [email protected]
Hi,
testsuite/g++.dg/opt/inline8.C shows problem where C++ frontend produce extern
inline function foo.
Now it wants to make it stay in program that happens via:
void
mark_needed (tree decl)
{
/* It's possible that we no longer need to set
TREE_SYMBOL_REFERENCED here directly, but doing so is
harmless. */
TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl)) = 1;
mark_decl_referenced (decl);
}
Note that symbol referenced hack. This match corresponding hack in
cgraphunit.c:
/* ??? If the assembler name is set by hand, it is possible to assemble
the name later after finalizing the function and the fact is noticed
in assemble_name then. This is arguably a bug. */
if (DECL_ASSEMBLER_NAME_SET_P (decl)
&& TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl)))
return true;
The declaration looks as:
<function_decl 0x7ffff76d9200 operator new
type <function_type 0x7ffff76d8540
type <pointer_type 0x7ffff77a2f18 type <void_type 0x7ffff77a2e70 void>
public unsigned DI
size <integer_cst 0x7ffff77a6260 constant 64>
unit size <integer_cst 0x7ffff77a6280 constant 8>
align 64 symtab 0 alias set -1 canonical type 0x7ffff77a2f18
pointer_to_this <pointer_type 0x7ffff77bc930>>
QI
size <integer_cst 0x7ffff77a6000 constant 8>
unit size <integer_cst 0x7ffff77a6020 constant 1>
align 8 symtab 0 alias set -1 canonical type 0x7ffff76d8498
arg-types <tree_list 0x7ffff76c9898 value <integer_type 0x7ffff77a2690
long unsigned int>
chain <tree_list 0x7ffff76c98c0 value <pointer_type 0x7ffff77a2f18>
chain <tree_list 0x7ffff77938e8 value <void_type 0x7ffff77a2e70
void>>>>
throws <tree_list 0x7ffff76c92f8>>
nothrow public static external weak autoinline decl_5 QI defer-output file
a.C line 6 col 14 align 8 context <translation_unit_decl 0x7ffff7798958 D.1>
initial <block 0x7ffff76e8000>
arguments <parm_decl 0x7ffff7795908 D.2065
type <integer_type 0x7ffff77a2690 long unsigned int public unsigned DI
size <integer_cst 0x7ffff77a6260 64> unit size <integer_cst 0x7ffff77a6280 8>
align 64 symtab 0 alias set -1 canonical type 0x7ffff77a2690
precision 64 min <integer_cst 0x7ffff77a62a0 0> max <integer_cst 0x7ffff77a6240
18446744073709551615>>
unsigned DI file a.C line 6 col 27 size <integer_cst 0x7ffff77a6260 64>
unit size <integer_cst 0x7ffff77a6280 8>
align 64 context <function_decl 0x7ffff76d9200 operator new>
arg-type <integer_type 0x7ffff77a2690 long unsigned int>
chain <parm_decl 0x7ffff7795990 p type <pointer_type 0x7ffff77a2f18>
used unsigned DI file a.C line 6 col 48 size <integer_cst
0x7ffff77a6260 64> unit size <integer_cst 0x7ffff77a6280 8>
align 64 context <function_decl 0x7ffff76d9200 operator new>
arg-type <pointer_type 0x7ffff77a2f18>>>
result <result_decl 0x7ffff7797300 D.2068 type <pointer_type
0x7ffff77a2f18>
unsigned ignored DI file a.C line 6 col 57 size <integer_cst
0x7ffff77a6260 64> unit size <integer_cst 0x7ffff77a6280 8>
align 64 context <function_decl 0x7ffff76d9200 operator new>>
full-name "void* operator new(long unsigned int, void*) throw ()"
not-really-extern pending-inline-info 0x7ffff778bcb0
struct-function 0x7ffff76da1c8 chain <function_decl 0x7ffff76c7e00
__cxa_call_unexpected>>
I believe that the correct way to represnet this is to drop "EXTERN" flag in
those and similar cases where C++ FE currently use mark_decl_referenced.
How hard is to fix this?