mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-04-13 18:30:59 +08:00
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:
parent
f54e63dfa3
commit
ea9d9d749c
@ -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
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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
|
||||
|
28
gcc/testsuite/g++.dg/torture/pr89698.C
Normal file
28
gcc/testsuite/g++.dg/torture/pr89698.C
Normal 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; }
|
Loading…
x
Reference in New Issue
Block a user