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
This commit is contained in:
Douglas Gregor 2007-11-05 12:50:21 +00:00 committed by Doug Gregor
parent f139f5faa7
commit 2afad0f6bb
4 changed files with 52 additions and 2 deletions

View File

@ -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

View File

@ -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)

View File

@ -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.

View File

@ -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>'
}