From: Jakub Jelinek Date: Fri, 24 Aug 2007 17:21:42 +0000 (+0200) Subject: re PR middle-end/32912 (ICE with vector code) X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f1dc185a6b972143046a9ddd51fcfa2637800a15;p=thirdparty%2Fgcc.git re PR middle-end/32912 (ICE with vector code) PR middle-end/32912 * fold-const.c (fold_binary): Only optimize X | ~X and X ^ ~X for integral types. * gcc.dg/pr32912-1.c: New test. * gcc.dg/pr32912-2.c: New test. From-SVN: r127781 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 3d66b0ef9929..3285436a6fcf 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2007-08-24 Jakub Jelinek + + PR c++/31941 + * error.c (resolve_virtual_fun_from_obj_type_ref): Handle + TARGET_VTABLE_USES_DESCRIPTORS targets properly. + 2007-08-20 Jakub Jelinek PR c++/32992 diff --git a/gcc/cp/error.c b/gcc/cp/error.c index 58ebe42250f4..1953d7de3d91 100644 --- a/gcc/cp/error.c +++ b/gcc/cp/error.c @@ -1291,10 +1291,14 @@ static tree resolve_virtual_fun_from_obj_type_ref (tree ref) { tree obj_type = TREE_TYPE (OBJ_TYPE_REF_OBJECT (ref)); - int index = tree_low_cst (OBJ_TYPE_REF_TOKEN (ref), 1); + HOST_WIDE_INT index = tree_low_cst (OBJ_TYPE_REF_TOKEN (ref), 1); tree fun = BINFO_VIRTUALS (TYPE_BINFO (TREE_TYPE (obj_type))); - while (index--) + while (index) + { fun = TREE_CHAIN (fun); + index -= (TARGET_VTABLE_USES_DESCRIPTORS + ? TARGET_VTABLE_USES_DESCRIPTORS : 1); + } return BV_FN (fun); } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 68aec998e280..a9651e69c8b7 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2007-08-24 Jakub Jelinek + + PR c++/31941 + * g++.dg/parse/crash37.C: New test. + 2007-08-22 Richard Guenther PR tree-optimization/33142 diff --git a/gcc/testsuite/g++.dg/parse/crash37.C b/gcc/testsuite/g++.dg/parse/crash37.C new file mode 100644 index 000000000000..8320dfaa50fb --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/crash37.C @@ -0,0 +1,15 @@ +// PR c++/31941 +// { dg-do compile } + +struct S +{ + S() throw () { } + virtual ~S () throw (); + virtual const char* what () const throw (); +}; + +const char * +foo (S &e) +{ + return e.what ().c_str (); // { dg-error "c_str.*S::what.*which is of non-class type" } +}