diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 71cce5f64117..a90ffecede83 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2004-12-13 Andrew Pinski + + PR c++/18968 + * class.c (build_base_path): Convert the zero constant to the correct + type when comparing. + 2004-12-13 Mark Mitchell PR c++/18925 diff --git a/gcc/cp/class.c b/gcc/cp/class.c index f7e5c7b9083a..9625acca7cea 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 957c5eb4cee7..6b23ef11a183 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2004-12-13 Andrew Pinski + + PR c++/18968 + * g++.dg/opt/pr18968.C: New test. + 2004-12-13 Mark Mitchell 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 000000000000..cce73b579712 --- /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++; +} +