diff options
author | Douglas Gregor <doug.gregor@gmail.com> | 2007-11-05 12:50:21 +0000 |
---|---|---|
committer | Doug Gregor <dgregor@gcc.gnu.org> | 2007-11-05 12:50:21 +0000 |
commit | 2afad0f6bbf0a98ac7189ca9dbcaef13594e674e (patch) | |
tree | f913fbca909f5445d4d4fb618053ce82b8c78adf | |
parent | f139f5faa7063323dd3b00a0f6515e0e0683edb6 (diff) | |
download | gcc-2afad0f6bbf0a98ac7189ca9dbcaef13594e674e.zip gcc-2afad0f6bbf0a98ac7189ca9dbcaef13594e674e.tar.gz gcc-2afad0f6bbf0a98ac7189ca9dbcaef13594e674e.tar.bz2 |
re PR c++/33939 (Rvalue references not deduced correctly in vararg function templates)
2007-11-05 Douglas Gregor <doug.gregor@gmail.com>
PR c++/33939
* pt.c (unify_pack_expansion): bring handling of function call
arguments into line with type_unification_real.
2007-11-05 Douglas Gregor <doug.gregor@gmail.com>
PR c++/33939
* g++.dg/cpp0x/variadic-rref.C: New.
From-SVN: r129900
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/pt.c | 7 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/variadic-rref.C | 36 |
4 files changed, 52 insertions, 2 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 78ff8f8..8923b24 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2007-11-05 Douglas Gregor <doug.gregor@gmail.com> + + PR c++/33939 + * pt.c (unify_pack_expansion): bring handling of function call + arguments into line with type_unification_real. + 2007-11-05 Manuel Lopez-Ibanez <manu@gcc.gnu.org> * typeck.c (build_binary_op): Use pedwarn instead of error for diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index e9e7789..9c29f81 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -12280,6 +12280,7 @@ unify_pack_expansion (tree tparms, tree targs, tree packed_parms, /* Unify the pattern with the current argument. */ { tree arg = TREE_VEC_ELT (packed_args, i); + tree arg_expr = NULL_TREE; int arg_strict = strict; bool skip_arg_p = false; @@ -12330,7 +12331,8 @@ unify_pack_expansion (tree tparms, tree targs, tree packed_parms, if (!skip_arg_p) { - arg = TREE_TYPE (arg); + arg_expr = arg; + arg = unlowered_expr_type (arg); if (arg == error_mark_node) return 1; } @@ -12340,7 +12342,8 @@ unify_pack_expansion (tree tparms, tree targs, tree packed_parms, if (!subr) arg_strict |= - maybe_adjust_types_for_deduction (strict, &parm, &arg, NULL); + maybe_adjust_types_for_deduction (strict, &parm, &arg, + arg_expr); } if (!skip_arg_p) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 6817e83..12dd350 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2007-11-05 Douglas Gregor <doug.gregor@gmail.com> + + PR c++/33939 + * g++.dg/cpp0x/variadic-rref.C: New. + 2007-11-05 Manuel Lopez-Ibanez <manu@gcc.gnu.org> * g++dg/warn/pointer-integer-comparison.C: New. diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic-rref.C b/gcc/testsuite/g++.dg/cpp0x/variadic-rref.C new file mode 100644 index 0000000..08221b4 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic-rref.C @@ -0,0 +1,36 @@ +// { dg-options "-std=c++0x" } +// PR c++/33939 +template<typename T> +struct refs_only; + +template<typename T> +struct refs_only<T &> +{}; + +template<typename T> +refs_only<T> foo( T && t) +{ + return refs_only<T>(); +} + +template<typename... T> +struct va_refs_only; + +template<typename T> +struct va_refs_only<T> + : refs_only<T> +{}; + +template<typename... T> +va_refs_only<T...> bar( T &&... t) +{ + return va_refs_only<T...>(); +} + +int main() +{ + int j = 0; + foo(j); + bar(j); // error: invalid use of incomplete type 'struct refs_only<int>' +} + |