re PR c++/89698 (Run-time error due to optimization of field access after cast at -Os/-O2 and higher)

2019-03-14  Richard Biener  <rguenther@suse.de>

	PR middle-end/89698
	* fold-const.c (operand_equal_p): For INDIRECT_REF check
	that the access types are similar.

	* g++.dg/torture/pr89698.C: New testcase.

From-SVN: r269677
This commit is contained in:
Richard Biener 2019-03-14 09:24:21 +00:00 committed by Richard Biener
parent f54e63dfa3
commit ea9d9d749c
4 changed files with 49 additions and 4 deletions

View File

@ -1,3 +1,9 @@
2019-03-14 Richard Biener <rguenther@suse.de>
PR middle-end/89698
* fold-const.c (operand_equal_p): For INDIRECT_REF check
that the access types are similar.
2019-03-14 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/89703

View File

@ -3220,10 +3220,16 @@ operand_equal_p (const_tree arg0, const_tree arg1, unsigned int flags)
switch (TREE_CODE (arg0))
{
case INDIRECT_REF:
if (!(flags & OEP_ADDRESS_OF)
&& (TYPE_ALIGN (TREE_TYPE (arg0))
!= TYPE_ALIGN (TREE_TYPE (arg1))))
return 0;
if (!(flags & OEP_ADDRESS_OF))
{
if (TYPE_ALIGN (TREE_TYPE (arg0))
!= TYPE_ALIGN (TREE_TYPE (arg1)))
return 0;
/* Verify that the access types are compatible. */
if (TYPE_MAIN_VARIANT (TREE_TYPE (arg0))
!= TYPE_MAIN_VARIANT (TREE_TYPE (arg1)))
return 0;
}
flags &= ~OEP_ADDRESS_OF;
return OP_SAME (0);

View File

@ -1,3 +1,8 @@
2019-03-14 Richard Biener <rguenther@suse.de>
PR middle-end/89698
* g++.dg/torture/pr89698.C: New testcase.
2019-03-14 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/89703

View File

@ -0,0 +1,28 @@
/* { dg-do run } */
extern "C" void abort (void);
class A {
virtual void f(){};
public:
int x;
A(int in): x(in) {};
};
class B: public A {
public:
int y;
B(int in):A(in-1), y(in) {};
};
int test(void)
{
int res;
B b(2);
A* bp = &b;
void* vp = dynamic_cast<void*>(bp);
if (((A*)vp)->x == 1 && ((B*)vp)->y == 2)
return 1;
return 0;
}
int main() { if (test() != 1) abort (); return 0; }