Fix wrong assumption in contains_type_p (PR ipa/71207).

2017-01-17  Martin Liska  <mliska@suse.cz>

	PR ipa/71207
	* g++.dg/ipa/pr71207.C: New test.
2017-01-17  Martin Liska  <mliska@suse.cz>

	PR ipa/71207
	* ipa-polymorphic-call.c (contains_type_p): Fix wrong
	assumption and add comment.

From-SVN: r244530
This commit is contained in:
Martin Liska 2017-01-17 16:11:00 +01:00 committed by Martin Liska
parent 408de159d4
commit 4f197ff9a8
4 changed files with 59 additions and 6 deletions

View File

@ -1,3 +1,9 @@
2017-01-17 Martin Liska <mliska@suse.cz>
PR ipa/71207
* ipa-polymorphic-call.c (contains_type_p): Fix wrong
assumption and add comment.
2017-01-17 Nathan Sidwell <nathan@acm.org>
* ipa-visibility.c (localize_node): New function, broken out of ...

View File

@ -463,12 +463,12 @@ contains_type_p (tree outer_type, HOST_WIDE_INT offset,
/* Check that type is within range. */
if (offset < 0)
return false;
if (TYPE_SIZE (outer_type) && TYPE_SIZE (otr_type)
&& TREE_CODE (TYPE_SIZE (outer_type)) == INTEGER_CST
&& TREE_CODE (TYPE_SIZE (otr_type)) == INTEGER_CST
&& wi::ltu_p (wi::to_offset (TYPE_SIZE (outer_type)),
(wi::to_offset (TYPE_SIZE (otr_type)) + offset)))
return false;
/* PR ipa/71207
As OUTER_TYPE can be a type which has a diamond virtual inheritance,
it's not necessary that INNER_TYPE will fit within OUTER_TYPE with
a given offset. It can happen that INNER_TYPE also contains a base object,
however it would point to the same instance in the OUTER_TYPE. */
context.offset = offset;
context.outer_type = TYPE_MAIN_VARIANT (outer_type);

View File

@ -1,3 +1,8 @@
2017-01-17 Martin Liska <mliska@suse.cz>
PR ipa/71207
* g++.dg/ipa/pr71207.C: New test.
2017-01-17 Jan Hubicka <hubicka@ucw.cz>
PR middle-end/77445

View File

@ -0,0 +1,42 @@
/* PR ipa/71207 */
/* { dg-do run } */
class Class1
{
public:
Class1() {};
virtual ~Class1() {};
protected:
unsigned Field1;
};
class Class2 : public virtual Class1
{
};
class Class3 : public virtual Class1
{
public:
virtual void Method1() = 0;
void Method2()
{
Method1();
}
};
class Class4 : public Class2, public virtual Class3
{
public:
Class4() {};
virtual void Method1() {};
};
int main()
{
Class4 var1;
var1.Method2();
return 0;
}