diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 4cadd4d2ca8..4649ffa4fd9 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2018-03-02 Eric Botcazou + + PR ipa/83983 + * ipa-devirt.c (odr_subtypes_equivalent_p): Get the ODR type of both + arguments if they are comparable. + 2018-03-02 Richard Sandiford PR tree-optimization/84634 diff --git a/gcc/ipa-devirt.c b/gcc/ipa-devirt.c index f66dc45deb8..fae82072a7e 100644 --- a/gcc/ipa-devirt.c +++ b/gcc/ipa-devirt.c @@ -684,9 +684,14 @@ odr_subtypes_equivalent_p (tree t1, tree t2, { if (!types_same_for_odr (t1, t2, true)) return false; - /* Limit recursion: If subtypes are ODR types and we know - that they are same, be happy. */ - if (!odr_type_p (t1) || !get_odr_type (t1, true)->odr_violated) + /* Limit recursion: if subtypes are ODR types and we know that they are + same, be happy. We need to call get_odr_type on both subtypes since + we don't know which among t1 and t2 defines the common ODR type and + therefore which call will report the ODR violation, if any. */ + if (!odr_type_p (t1) + || !odr_type_p (t2) + || (!get_odr_type (t1, true)->odr_violated + && !get_odr_type (t2, true)->odr_violated)) return true; }