Commit 2afad0f6 by Douglas Gregor Committed by Doug Gregor

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
parent f139f5fa
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> 2007-11-05 Manuel Lopez-Ibanez <manu@gcc.gnu.org>
* typeck.c (build_binary_op): Use pedwarn instead of error for * typeck.c (build_binary_op): Use pedwarn instead of error for
......
...@@ -12280,6 +12280,7 @@ unify_pack_expansion (tree tparms, tree targs, tree packed_parms, ...@@ -12280,6 +12280,7 @@ unify_pack_expansion (tree tparms, tree targs, tree packed_parms,
/* Unify the pattern with the current argument. */ /* Unify the pattern with the current argument. */
{ {
tree arg = TREE_VEC_ELT (packed_args, i); tree arg = TREE_VEC_ELT (packed_args, i);
tree arg_expr = NULL_TREE;
int arg_strict = strict; int arg_strict = strict;
bool skip_arg_p = false; bool skip_arg_p = false;
...@@ -12330,7 +12331,8 @@ unify_pack_expansion (tree tparms, tree targs, tree packed_parms, ...@@ -12330,7 +12331,8 @@ unify_pack_expansion (tree tparms, tree targs, tree packed_parms,
if (!skip_arg_p) if (!skip_arg_p)
{ {
arg = TREE_TYPE (arg); arg_expr = arg;
arg = unlowered_expr_type (arg);
if (arg == error_mark_node) if (arg == error_mark_node)
return 1; return 1;
} }
...@@ -12340,7 +12342,8 @@ unify_pack_expansion (tree tparms, tree targs, tree packed_parms, ...@@ -12340,7 +12342,8 @@ unify_pack_expansion (tree tparms, tree targs, tree packed_parms,
if (!subr) if (!subr)
arg_strict |= 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) if (!skip_arg_p)
......
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> 2007-11-05 Manuel Lopez-Ibanez <manu@gcc.gnu.org>
* g++dg/warn/pointer-integer-comparison.C: New. * g++dg/warn/pointer-integer-comparison.C: New.
// { 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>'
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment