From: Jakub Jelinek Date: Fri, 24 Aug 2007 17:12:41 +0000 (+0200) Subject: re PR c++/31941 ("confused by earlier errors" message without earlier error message) X-Git-Tag: releases/gcc-4.2.2~123 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=77379503c5a90de7dfddffdb43c6a77fb7f66648;p=thirdparty%2Fgcc.git re PR c++/31941 ("confused by earlier errors" message without earlier error message) PR c++/31941 * error.c (resolve_virtual_fun_from_obj_type_ref): Handle TARGET_VTABLE_USES_DESCRIPTORS targets properly. * g++.dg/parse/crash37.C: New test. From-SVN: r127778 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index db4c828b133e..39875472b86c 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +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. + PR c++/32898 * name-lookup.c (set_decl_namespace): lookup_qualified_name failure is error_mark_node rather than NULL_TREE. diff --git a/gcc/cp/error.c b/gcc/cp/error.c index fa25db7978d7..c169cabedb64 100644 --- a/gcc/cp/error.c +++ b/gcc/cp/error.c @@ -1305,10 +1305,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 7e1bc9295060..4b2eca0b450c 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,8 @@ 2007-08-24 Jakub Jelinek + PR c++/31941 + * g++.dg/parse/crash37.C: New test. + PR c++/32898 * g++.dg/lookup/ns3.C: New test. 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" } +}