From e6048600f84a09109027f93e6e0075667e4949d6 Mon Sep 17 00:00:00 2001 From: Mark Mitchell Date: Fri, 3 Jun 2005 23:24:54 +0000 Subject: [PATCH] re PR c++/21853 (constness of pointer to data member ignored) PR c++/21853 * typeck.c (casts_away_constness_r): Do not drop cv-qualifiers on the pointed-to type for a pointer-to-member. PR c++/21853 * g++.dg/expr/static_cast6.C: New test. From-SVN: r100564 --- gcc/cp/ChangeLog | 6 ++++++ gcc/cp/typeck.c | 22 ++++++++++++---------- gcc/testsuite/ChangeLog | 5 +++++ 3 files changed, 23 insertions(+), 10 deletions(-) diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 74f3b1b80f43..bd8c19605487 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2005-06-03 Mark Mitchell + + PR c++/21853 + * typeck.c (casts_away_constness_r): Do not drop cv-qualifiers on + the pointed-to type for a pointer-to-member. + 2005-06-03 Mark Mitchell PR c++/21336 diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c index 0c9c6c4630b1..7f6e8b869ef0 100644 --- a/gcc/cp/typeck.c +++ b/gcc/cp/typeck.c @@ -6314,11 +6314,6 @@ casts_away_constness_r (tree *t1, tree *t2) and pointers to members (conv.qual), the "member" aspect of a pointer to member level is ignored when determining if a const cv-qualifier has been cast away. */ - if (TYPE_PTRMEM_P (*t1)) - *t1 = build_pointer_type (TYPE_PTRMEM_POINTED_TO_TYPE (*t1)); - if (TYPE_PTRMEM_P (*t2)) - *t2 = build_pointer_type (TYPE_PTRMEM_POINTED_TO_TYPE (*t2)); - /* [expr.const.cast] For two pointer types: @@ -6336,9 +6331,8 @@ casts_away_constness_r (tree *t1, tree *t2) to Tcv2,(M-K+1) * cv2,(M-K+2) * ... cv2,M *. */ - - if (TREE_CODE (*t1) != POINTER_TYPE - || TREE_CODE (*t2) != POINTER_TYPE) + if ((!TYPE_PTR_P (*t1) && !TYPE_PTRMEM_P (*t1)) + || (!TYPE_PTR_P (*t2) && !TYPE_PTRMEM_P (*t2))) { *t1 = cp_build_qualified_type (void_type_node, cp_type_quals (*t1)); @@ -6349,8 +6343,16 @@ casts_away_constness_r (tree *t1, tree *t2) quals1 = cp_type_quals (*t1); quals2 = cp_type_quals (*t2); - *t1 = TREE_TYPE (*t1); - *t2 = TREE_TYPE (*t2); + + if (TYPE_PTRMEM_P (*t1)) + *t1 = TYPE_PTRMEM_POINTED_TO_TYPE (*t1); + else + *t1 = TREE_TYPE (*t1); + if (TYPE_PTRMEM_P (*t2)) + *t2 = TYPE_PTRMEM_POINTED_TO_TYPE (*t2); + else + *t2 = TREE_TYPE (*t2); + casts_away_constness_r (t1, t2); *t1 = build_pointer_type (*t1); *t2 = build_pointer_type (*t2); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 3b74f891fe8d..ac6e72a4925b 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2005-06-03 Mark Mitchell + + PR c++/21853 + * g++.dg/expr/static_cast6.C: New test. + 2005-06-03 Mark Mitchell PR c++/21336 -- 2.47.2