diff options
| -rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
| -rw-r--r-- | gcc/cp/class.c | 7 | ||||
| -rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
| -rw-r--r-- | gcc/testsuite/g++.dg/opt/pr18968.C | 18 |
4 files changed, 34 insertions, 2 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 71cce5f..a90ffec 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2004-12-13 Andrew Pinski <pinskia@physics.uc.edu> + + PR c++/18968 + * class.c (build_base_path): Convert the zero constant to the correct + type when comparing. + 2004-12-13 Mark Mitchell <mark@codesourcery.com> PR c++/18925 diff --git a/gcc/cp/class.c b/gcc/cp/class.c index f7e5c7b..9625acc 100644 --- a/gcc/cp/class.c +++ b/gcc/cp/class.c @@ -295,8 +295,11 @@ build_base_path (enum tree_code code, /* Now that we've saved expr, build the real null test. */ if (null_test) - null_test = fold (build2 (NE_EXPR, boolean_type_node, - expr, integer_zero_node)); + { + tree zero = cp_convert (TREE_TYPE (expr), integer_zero_node); + null_test = fold (build2 (NE_EXPR, boolean_type_node, + expr, zero)); + } /* If this is a simple base reference, express it as a COMPONENT_REF. */ if (code == PLUS_EXPR && !virtual_access diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 957c5eb..6b23ef1 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2004-12-13 Andrew Pinski <pinskia@physics.uc.edu> + + PR c++/18968 + * g++.dg/opt/pr18968.C: New test. + 2004-12-13 Mark Mitchell <mark@codesourcery.com> PR c++/18925 diff --git a/gcc/testsuite/g++.dg/opt/pr18968.C b/gcc/testsuite/g++.dg/opt/pr18968.C new file mode 100644 index 0000000..cce73b5 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr18968.C @@ -0,0 +1,18 @@ +// { dg-do compile } +// { dg-options "-O1" } +struct X +{ + int i; +}; +struct Y : virtual X {}; +struct Z : Y {}; +struct A +{ + Z* p; + A(); +}; +A::A() : p(0) +{ + ((X*)(Y*)p)->i++; +} + |
