ipa-devirt.c (warn_types_mismatch): Do not ICE when warning about mismatch between C and C++ type...

* ipa-devirt.c (warn_types_mismatch): Do not ICE when warning about
	mismatch between C and C++ type; compoare correctly ARG_TYPES
	for non-prototypes and output correctly parameter index for METHOD_TYPE.
	(odr_types_equivalent_p): Fix wording of warning about attributes;
	it is OK to match prototype and non-prototype.

From-SVN: r222985
This commit is contained in:
Jan Hubicka 2015-05-10 23:58:53 +02:00 committed by Jan Hubicka
parent 15296d46de
commit ad5bc3248e
2 changed files with 36 additions and 19 deletions

View File

@ -1,3 +1,11 @@
2015-05-09 Jan Hubicka <hubicka@ucw.cz>
* ipa-devirt.c (warn_types_mismatch): Do not ICE when warning about
mismatch between C and C++ type; compoare correctly ARG_TYPES
for non-prototypes and output correctly parameter index for METHOD_TYPE.
(odr_types_equivalent_p): Fix wording of warning about attributes;
it is OK to match prototype and non-prototype.
2015-05-09 Jan Hubicka <hubicka@ucw.cz>
* tree.c (free_lang_data_in_type): Free TREE_PURPOSE of

View File

@ -1028,7 +1028,9 @@ warn_types_mismatch (tree t1, tree t2)
t1 = t2;
t2 = tmp;
}
if (TYPE_NAME (t1) && TYPE_NAME (t2))
if (TYPE_NAME (t1) && TYPE_NAME (t2)
&& TREE_CODE (TYPE_NAME (t1)) == TYPE_DECL
&& TREE_CODE (TYPE_NAME (t2)) == TYPE_DECL)
{
inform (DECL_SOURCE_LOCATION (TYPE_NAME (t1)),
"type %qT defined in anonymous namespace can not match "
@ -1079,7 +1081,7 @@ warn_types_mismatch (tree t1, tree t2)
else if (TREE_CODE (t1) == METHOD_TYPE
|| TREE_CODE (t1) == FUNCTION_TYPE)
{
tree parms1, parms2;
tree parms1 = NULL, parms2 = NULL;
int count = 1;
if (!odr_subtypes_equivalent_p (TREE_TYPE (t1), TREE_TYPE (t2),
@ -1089,21 +1091,27 @@ warn_types_mismatch (tree t1, tree t2)
warn_types_mismatch (TREE_TYPE (t1), TREE_TYPE (t2));
return;
}
for (parms1 = TYPE_ARG_TYPES (t1), parms2 = TYPE_ARG_TYPES (t2);
parms1 && parms2;
parms1 = TREE_CHAIN (parms1), parms2 = TREE_CHAIN (parms2),
count++)
{
if (!odr_subtypes_equivalent_p
(TREE_VALUE (parms1), TREE_VALUE (parms2), &visited))
{
inform (UNKNOWN_LOCATION,
"type mismatch in parameter %i", count);
warn_types_mismatch (TREE_VALUE (parms1),
TREE_VALUE (parms2));
return;
}
}
if (prototype_p (t1) && prototype_p (t2))
for (parms1 = TYPE_ARG_TYPES (t1), parms2 = TYPE_ARG_TYPES (t2);
parms1 && parms2;
parms1 = TREE_CHAIN (parms1), parms2 = TREE_CHAIN (parms2),
count++)
{
if (!odr_subtypes_equivalent_p
(TREE_VALUE (parms1), TREE_VALUE (parms2), &visited))
{
if (count == 1 && TREE_CODE (t1) == METHOD_TYPE)
inform (UNKNOWN_LOCATION,
"implicit this pointer type mismatch");
else
inform (UNKNOWN_LOCATION,
"type mismatch in parameter %i",
count - (TREE_CODE (t1) == METHOD_TYPE));
warn_types_mismatch (TREE_VALUE (parms1),
TREE_VALUE (parms2));
return;
}
}
if (parms1 || parms2)
{
inform (UNKNOWN_LOCATION,
@ -1180,7 +1188,7 @@ odr_types_equivalent_p (tree t1, tree t2, bool warn, bool *warned,
if (comp_type_attributes (t1, t2) != 1)
{
warn_odr (t1, t2, NULL, NULL, warn, warned,
G_("a type with attributes "
G_("a type with different attributes "
"is defined in another translation unit"));
return false;
}
@ -1348,7 +1356,8 @@ odr_types_equivalent_p (tree t1, tree t2, bool warn, bool *warned,
return false;
}
if (TYPE_ARG_TYPES (t1) == TYPE_ARG_TYPES (t2))
if (TYPE_ARG_TYPES (t1) == TYPE_ARG_TYPES (t2)
|| !prototype_p (t1) || !prototype_p (t2))
return true;
else
{