From: Paolo Carlini Date: Fri, 5 Jul 2013 16:28:35 +0000 (+0000) Subject: re PR c++/14263 (Cryptic diagnostic for cast from virtual base class not using dynami... X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=128be7f933402a4fba107e7b12751d09e8d85f5f;p=gcc.git re PR c++/14263 (Cryptic diagnostic for cast from virtual base class not using dynamic_cast) /cp 2013-07-05 Paolo Carlini PR c++/14263 * class.c (build_base_path): Improve diagnostic. /testsuite 2013-07-05 Paolo Carlini PR c++/14263 * g++.dg/inherit/virtual10.C: New. From-SVN: r200718 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 3a0ba58f743..c45c8be9aa6 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2013-07-05 Paolo Carlini + + PR c++/14263 + * class.c (build_base_path): Improve diagnostic. + 2013-07-04 Paolo Carlini PR c++/38634 diff --git a/gcc/cp/class.c b/gcc/cp/class.c index bb2c3fe80e4..e5166324e4c 100644 --- a/gcc/cp/class.c +++ b/gcc/cp/class.c @@ -291,9 +291,31 @@ build_base_path (enum tree_code code, if (code == MINUS_EXPR && v_binfo) { if (complain & tf_error) - error ("cannot convert from base %qT to derived type %qT via " - "virtual base %qT", BINFO_TYPE (binfo), BINFO_TYPE (d_binfo), - BINFO_TYPE (v_binfo)); + { + if (SAME_BINFO_TYPE_P (BINFO_TYPE (binfo), BINFO_TYPE (v_binfo))) + { + if (want_pointer) + error ("cannot convert from pointer to base class %qT to " + "pointer to derived class %qT because the base is " + "virtual", BINFO_TYPE (binfo), BINFO_TYPE (d_binfo)); + else + error ("cannot convert from base class %qT to derived " + "class %qT because the base is virtual", + BINFO_TYPE (binfo), BINFO_TYPE (d_binfo)); + } + else + { + if (want_pointer) + error ("cannot convert from pointer to base class %qT to " + "pointer to derived class %qT via virtual base %qT", + BINFO_TYPE (binfo), BINFO_TYPE (d_binfo), + BINFO_TYPE (v_binfo)); + else + error ("cannot convert from base class %qT to derived " + "class %qT via virtual base %qT", BINFO_TYPE (binfo), + BINFO_TYPE (d_binfo), BINFO_TYPE (v_binfo)); + } + } return error_mark_node; } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index e0320055521..4124aa4f9d6 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2013-07-05 Paolo Carlini + + PR c++/14263 + * g++.dg/inherit/virtual10.C: New. + 2013-07-04 Joern Rennecke PR c/57821 diff --git a/gcc/testsuite/g++.dg/inherit/virtual10.C b/gcc/testsuite/g++.dg/inherit/virtual10.C new file mode 100644 index 00000000000..4cb858b9293 --- /dev/null +++ b/gcc/testsuite/g++.dg/inherit/virtual10.C @@ -0,0 +1,11 @@ +// PR c++/14263 + +struct A { }; + +struct B : virtual A { }; + +int main() +{ + A* p = new B; + B* q = static_cast(p); // { dg-error "cannot convert from pointer to base class 'A' to pointer to derived class 'B' because the base is virtual" } +}