diff options
author | Paolo Carlini <paolo.carlini@oracle.com> | 2013-07-05 16:28:35 +0000 |
---|---|---|
committer | Paolo Carlini <paolo@gcc.gnu.org> | 2013-07-05 16:28:35 +0000 |
commit | 128be7f933402a4fba107e7b12751d09e8d85f5f (patch) | |
tree | 81669bad4b1a4e092776311d0373543dfdea5446 /gcc | |
parent | 1c6269d3f574465892c1a100dfda81f4e3dba1ab (diff) | |
download | gcc-128be7f933402a4fba107e7b12751d09e8d85f5f.zip gcc-128be7f933402a4fba107e7b12751d09e8d85f5f.tar.gz gcc-128be7f933402a4fba107e7b12751d09e8d85f5f.tar.bz2 |
re PR c++/14263 (Cryptic diagnostic for cast from virtual base class not using dynamic_cast)
/cp
2013-07-05 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/14263
* class.c (build_base_path): Improve diagnostic.
/testsuite
2013-07-05 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/14263
* g++.dg/inherit/virtual10.C: New.
From-SVN: r200718
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/cp/class.c | 28 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/inherit/virtual10.C | 11 |
4 files changed, 46 insertions, 3 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 3a0ba58..c45c8be 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2013-07-05 Paolo Carlini <paolo.carlini@oracle.com> + + PR c++/14263 + * class.c (build_base_path): Improve diagnostic. + 2013-07-04 Paolo Carlini <paolo.carlini@oracle.com> PR c++/38634 diff --git a/gcc/cp/class.c b/gcc/cp/class.c index bb2c3fe..e516632 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 e032005..4124aa4 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2013-07-05 Paolo Carlini <paolo.carlini@oracle.com> + + PR c++/14263 + * g++.dg/inherit/virtual10.C: New. + 2013-07-04 Joern Rennecke <joern.rennecke@embecosm.com> 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 0000000..4cb858b --- /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<B*>(p); // { dg-error "cannot convert from pointer to base class 'A' to pointer to derived class 'B' because the base is virtual" } +} |