From: Mark Mitchell Date: Sun, 27 Jul 2003 18:25:57 +0000 (+0000) Subject: call.c (standard_conversion): Tweak handling of pointer-to-member types. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=b7a78333b1d28106f1c1326fb69b97452c98fc49;p=gcc.git call.c (standard_conversion): Tweak handling of pointer-to-member types. * call.c (standard_conversion): Tweak handling of pointer-to-member types. * pt.c (tsubst): Correctly qualify pointers-to-data member types. * typeck.c (comp_ptr_ttypes_real): Check qualifiers on pointer-to-data member types. * g++.dg/template/ptrmem6.C: New test. From-SVN: r69855 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index ad86f1aa5e0..209e1adce9e 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,11 @@ +2003-07-27 Mark Mitchell + + * call.c (standard_conversion): Tweak handling of + pointer-to-member types. + * pt.c (tsubst): Correctly qualify pointers-to-data member types. + * typeck.c (comp_ptr_ttypes_real): Check qualifiers on + pointer-to-data member types. + 2003-07-27 Nathan Sidwell * parser.c (cp_parser_type_parameter): Reformat. diff --git a/gcc/cp/call.c b/gcc/cp/call.c index 58888eacf52..7e3302fa0f7 100644 --- a/gcc/cp/call.c +++ b/gcc/cp/call.c @@ -715,8 +715,8 @@ standard_conversion (tree to, tree from, tree expr) } else { - to_pointee = to; - from_pointee = from; + to_pointee = TYPE_PTRMEM_POINTED_TO_TYPE (to); + from_pointee = TYPE_PTRMEM_POINTED_TO_TYPE (from); } if (same_type_p (from, to)) diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 66703723178..efbf75abb69 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -6827,7 +6827,9 @@ tsubst (tree t, tree args, tsubst_flags_t complain, tree in_decl) return build_ptrmemfunc_type (build_pointer_type (method_type)); } else - return build_ptrmem_type (r, type); + return cp_build_qualified_type_real (build_ptrmem_type (r, type), + TYPE_QUALS (t), + complain); } case FUNCTION_TYPE: case METHOD_TYPE: diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c index faa71975f5a..ec6765b28b0 100644 --- a/gcc/cp/typeck.c +++ b/gcc/cp/typeck.c @@ -6013,9 +6013,9 @@ comp_ptr_ttypes_real (tree to, tree from, int constp) return 0; if (TREE_CODE (from) == OFFSET_TYPE - && same_type_p (TYPE_OFFSET_BASETYPE (from), - TYPE_OFFSET_BASETYPE (to))) - continue; + && !same_type_p (TYPE_OFFSET_BASETYPE (from), + TYPE_OFFSET_BASETYPE (to))) + return 0; /* Const and volatile mean something different for function types, so the usual checks are not appropriate. */ @@ -6035,7 +6035,7 @@ comp_ptr_ttypes_real (tree to, tree from, int constp) constp &= TYPE_READONLY (to); } - if (TREE_CODE (to) != POINTER_TYPE) + if (TREE_CODE (to) != POINTER_TYPE && !TYPE_PTR_TO_MEMBER_P (to)) return ((constp >= 0 || to_more_cv_qualified) && same_type_ignoring_top_level_qualifiers_p (to, from)); } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index c06df55a540..1057be5c667 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2003-07-27 Mark Mitchell + + * g++.dg/template/ptrmem6.C: New test. + 2003-07-26 Geoffrey Keating * gcc.c-torture/compile/zero-strct-2.c: New test. diff --git a/gcc/testsuite/g++.dg/template/ptrmem6.C b/gcc/testsuite/g++.dg/template/ptrmem6.C new file mode 100644 index 00000000000..0d7dec21981 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/ptrmem6.C @@ -0,0 +1,10 @@ +struct S {}; + +void g(int S::**); + +template +void f (int T::* volatile *p) { + g(p); // { dg-error "" } +} + +template void f(int S::* volatile *); // { dg-error "instantiated" }