From 1bc5aee63eb72b341f506ad058502cd0361f0d10 Mon Sep 17 00:00:00 2001 From: Ben Cheng Date: Tue, 25 Mar 2014 22:37:19 -0700 Subject: Initial checkin of GCC 4.9.0 from trunk (r208799). Change-Id: I48a3c08bb98542aa215912a75f03c0890e497dba --- gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/20040317-1.C | 38 ++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/20040317-1.C (limited to 'gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/20040317-1.C') diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/20040317-1.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/20040317-1.C new file mode 100644 index 000000000..e2f3dcdce --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/20040317-1.C @@ -0,0 +1,38 @@ +/* { dg-do run } */ +/* { dg-options "-O2" } */ + +/* Test provided by Brian Ryner in PR 14511. The alias analyzer was + not handling structures containing arrays properly. In this case, + the static cast was introducing two assignments of the form + + this_6->_vptr.IFoo = &_ZTV4IFoo[2]; + this_4->_vptr.IFoo = &_ZTV3Bar[2]; + + which were not considered to alias each other because the alias + analyzer was not computing a proper pointer to array elements. + Another related bug was the type based alias analyzer not computing + alias relations to _ZTV4IFoo and _ZTV3Bar. Since those variables + are read-only, it was disregarding alias information for them. + So, the memory tags for the two 'this' variables were not being + marked as aliased with these variables. Resulting in the two + assignments not aliasing each other. + + This was causing the optimizers to generate a call to the virtual + method Foo() instead of the overloaded version. */ + +struct IFoo +{ + virtual void Foo() = 0; +}; + +struct Bar : IFoo +{ + void Foo() { } +}; + +int main(int argc, char **argv) +{ + Bar* b = new Bar(); + static_cast(b)->Foo(); + return 0; +} -- cgit v1.2.3