diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 78ff8f8e48e..8923b24a21f 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2007-11-05 Douglas Gregor + + 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 * typeck.c (build_binary_op): Use pedwarn instead of error for diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index e9e77896881..9c29f81cc5d 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 6817e837aab..12dd3509259 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2007-11-05 Douglas Gregor + + PR c++/33939 + * g++.dg/cpp0x/variadic-rref.C: New. + 2007-11-05 Manuel Lopez-Ibanez * 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 00000000000..08221b460fe --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic-rref.C @@ -0,0 +1,36 @@ +// { dg-options "-std=c++0x" } +// PR c++/33939 +template +struct refs_only; + +template +struct refs_only +{}; + +template +refs_only foo( T && t) +{ + return refs_only(); +} + +template +struct va_refs_only; + +template +struct va_refs_only + : refs_only +{}; + +template +va_refs_only bar( T &&... t) +{ + return va_refs_only(); +} + +int main() +{ + int j = 0; + foo(j); + bar(j); // error: invalid use of incomplete type 'struct refs_only' +} +