On 11/18/16 23:15, Bernd Edlinger wrote:
>>> - TREE_NOTHROW (olddecl) = 0;
>>> + TREE_NOTHROW (olddecl) = TREE_NOTHROW (newdecl);
>>
>> I still think a better fix would be to add a copy of TREE_NOTHROW to the
>> else block of the if (types_match), to go with the existing copies of
>> TREE_READONLY and TREE_THIS_VOLATILE.
>>
Hmm, looking at it again, I start to think you are right.
It looks like it is *not* possible that something other than
a builtin function can reach the bottom of that function with
!types_match.
The upper half of duplicate_decls is structured like this:
/* Check for redeclaration and other discrepancies. */
if (TREE_CODE (olddecl) == FUNCTION_DECL
&& DECL_ARTIFICIAL (olddecl))
{
if (TREE_CODE (newdecl) != FUNCTION_DECL)
{
....
return NULL_TREE;
}
....
TREE_NOTHROW (olddecl) = 0;
....
}
else if (TREE_CODE (olddecl) != TREE_CODE (newdecl))
{
....
return error_mark_node;
}
else if (!types_match)
{
...
if (TREE_CODE (newdecl) == TEMPLATE_DECL)
{
....
return NULL_TREE;
}
if (TREE_CODE (newdecl) == FUNCTION_DECL)
{
if (DECL_EXTERN_C_P (newdecl) && DECL_EXTERN_C_P (olddecl))
{
...
return NULL_TREE;
}
else if (...)
{
....
return error_mark_node;
}
else
return NULL_TREE;
}
else
{
...
return error_mark_node;
}
}
else if (....)
....
So in the case types_match=true, it can neither be that olddecl
is something other than a builtin function decl,
nor can newdecl be something other than a function decl.
Everything else makes the function return already here.
Bernd.