diff options
author | Jason Merrill <jason@redhat.com> | 2009-10-08 12:09:31 -0400 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2009-10-08 12:09:31 -0400 |
commit | f7d5a7cd6bc51675373bcc4ae16a79e77782d510 (patch) | |
tree | c78f263f40e579ba20481d1405a9872356e70d8e | |
parent | ccb05613cfd1d37ce6473244e28c56e75d1d0e66 (diff) | |
download | gcc-f7d5a7cd6bc51675373bcc4ae16a79e77782d510.zip gcc-f7d5a7cd6bc51675373bcc4ae16a79e77782d510.tar.gz gcc-f7d5a7cd6bc51675373bcc4ae16a79e77782d510.tar.bz2 |
re PR c++/36816 ([c++0x] error deducing template argument taking the address of rvalue reference template)
PR c++/36816
* pt.c (maybe_adjust_types_for_deduction): Do rvalue ref adjustment
even when DEDUCE_EXACT.
From-SVN: r152565
-rw-r--r-- | gcc/cp/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/cp/pt.c | 12 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 2 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/rv-deduce.C | 8 |
4 files changed, 25 insertions, 1 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 5f67204..063db18 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,9 @@ 2009-10-08 Jason Merrill <jason@redhat.com> + PR c++/36816 + * pt.c (maybe_adjust_types_for_deduction): Do rvalue ref adjustment + even when DEDUCE_EXACT. + PR c++/37177 * pt.c (resolve_nondeduced_context): New. * cvt.c (convert_to_void): Call it. diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 19d8c9a..148adab 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -12906,7 +12906,17 @@ maybe_adjust_types_for_deduction (unification_kind_t strict, } case DEDUCE_EXACT: - /* There is nothing to do in this case. */ + /* Core issue #873: Do the DR606 thing (see below) for these cases, + too, but here handle it by stripping the reference from PARM + rather than by adding it to ARG. */ + if (TREE_CODE (*parm) == REFERENCE_TYPE + && TYPE_REF_IS_RVALUE (*parm) + && TREE_CODE (TREE_TYPE (*parm)) == TEMPLATE_TYPE_PARM + && cp_type_quals (TREE_TYPE (*parm)) == TYPE_UNQUALIFIED + && TREE_CODE (*arg) == REFERENCE_TYPE + && !TYPE_REF_IS_RVALUE (*arg)) + *parm = TREE_TYPE (*parm); + /* Nothing else to do in this case. */ return 0; default: diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index edfbe1d..2e0e705 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,7 @@ 2009-10-08 Jason Merrill <jason@redhat.com> + * g++.dg/cpp0x/rv-deduce.C: New. + PR c++/37177 * g++.dg/cpp0x/variadic-throw.C: Adjust errors. * g++.dg/template/explicit-args2.C: New. diff --git a/gcc/testsuite/g++.dg/cpp0x/rv-deduce.C b/gcc/testsuite/g++.dg/cpp0x/rv-deduce.C new file mode 100644 index 0000000..0435436 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/rv-deduce.C @@ -0,0 +1,8 @@ +// PR c++/36816, core issue 873 +// { dg-options -std=c++0x } + +template <class T> void h (T&&) { } + +void (*pf)(int&) = &h; +template <> void h(char&); +template void h(double&); |