From: Dodji Seketeli Date: Tue, 3 Nov 2009 09:23:41 +0000 (+0000) Subject: re PR c++/37093 (ICE with pointer to member template parameters) X-Git-Tag: releases/gcc-4.3.5~316 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=9ee57797357a63cde16e8d5f94e8a79f87ca0076;p=thirdparty%2Fgcc.git re PR c++/37093 (ICE with pointer to member template parameters) Fix PR c++/37093 gcc/cp/ChangeLog: PR c++/37093 * pt.c (check_valid_ptrmem_cst_expr): New function. (convert_nontype_argument): Use it to output an error for illegal pointer to member expressions used as template arguments. gcc/testsuite/ChangeLog: PR c++/37093 * g++.dg/other/ptrmem10.C: New test. * g++.dg/other/ptrmem11.C: Likewise. From-SVN: r153841 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index bdb69b238ba8..f25835a640ab 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,10 @@ +2009-11-03 Dodji Seketeli + + PR c++/37093 + * pt.c (check_valid_ptrmem_cst_expr): New function. + (convert_nontype_argument): Use it to output an error for + illegal pointer to member expressions used as template arguments. + 2009-08-04 Dodji Seketeli PR debug/39706 diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 46866c030485..5a87d5d7e5d3 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -4298,6 +4298,22 @@ convert_nontype_argument_function (tree type, tree expr) return fn; } +/* Subroutine of convert_nontype_argument. + Check if EXPR of type TYPE is a valid pointer-to-member constant. + Emit an error otherwise. */ + +static bool +check_valid_ptrmem_cst_expr (tree type, tree expr) +{ + STRIP_NOPS (expr); + if (expr && (null_ptr_cst_p (expr) || TREE_CODE (expr) == PTRMEM_CST)) + return true; + error ("%qE is not a valid template argument for type %qT", + expr, type); + error ("it must be a pointer-to-member of the form `&X::Y'"); + return false; +} + /* Attempt to convert the non-type template parameter EXPR to the indicated TYPE. If the conversion is successful, return the converted value. If the conversion is unsuccessful, return @@ -4597,6 +4613,11 @@ convert_nontype_argument (tree type, tree expr) if (expr == error_mark_node) return error_mark_node; + /* [temp.arg.nontype] bullet 1 says the pointer to member + expression must be a pointer-to-member constant. */ + if (!check_valid_ptrmem_cst_expr (type, expr)) + return error_mark_node; + /* There is no way to disable standard conversions in resolve_address_of_overloaded_function (called by instantiate_type). It is possible that the call succeeded by @@ -4623,6 +4644,11 @@ convert_nontype_argument (tree type, tree expr) qualification conversions (_conv.qual_) are applied. */ else if (TYPE_PTRMEM_P (type)) { + /* [temp.arg.nontype] bullet 1 says the pointer to member + expression must be a pointer-to-member constant. */ + if (!check_valid_ptrmem_cst_expr (type, expr)) + return error_mark_node; + expr = perform_qualification_conversions (type, expr); if (expr == error_mark_node) return expr; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 78e571557dc2..58136a56efe5 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2009-11-03 Dodji Seketeli + + PR c++/37093 + * g++.dg/other/ptrmem10.C: New test. + * g++.dg/other/ptrmem11.C: Likewise. + 2009-10-14 Hans-Peter Nilsson PR target/38948 diff --git a/gcc/testsuite/g++.dg/other/ptrmem10.C b/gcc/testsuite/g++.dg/other/ptrmem10.C new file mode 100644 index 000000000000..4b8c40ac8ecb --- /dev/null +++ b/gcc/testsuite/g++.dg/other/ptrmem10.C @@ -0,0 +1,29 @@ +// Contributed by Dodji Seketeli +// Origin PR c++/37093 + +template +static +void foo(void *obj) +{ + C *p = static_cast(obj); + (p->*M)(); +} + +template +static void +bar(C *c, void (C::*m) ()) +{ + foo((void *)c);// { dg-error "(not a valid template arg|pointer-to-member|no matching fun)" } +} + +struct S +{ + void baz () {} +}; + +int +main () +{ + S a; + bar(&a, &S::baz); +} diff --git a/gcc/testsuite/g++.dg/other/ptrmem11.C b/gcc/testsuite/g++.dg/other/ptrmem11.C new file mode 100644 index 000000000000..a850c55c40a1 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/ptrmem11.C @@ -0,0 +1,21 @@ +// Contributed by Dodji Seketeli +// Origin PR c++/37093 + +struct A {}; + +template +int +foo(A* q) +{ + return q->*p; +} + +template +int +bar(int T::* p) +{ + return foo

(0);// { dg-error "(not a valid template arg|no matching func|pointer-to-member)" } +} + +int i = bar(0); +