diff options
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 3 | ||||
-rw-r--r-- | gcc/cp/pt.c | 13 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/rv-targ1.C | 10 |
3 files changed, 23 insertions, 3 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 6e2958b..23079f0 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,8 @@ 2018-03-13 Jason Merrill <jason@redhat.com> + PR c++/84720 - ICE with rvalue ref non-type argument. + * pt.c (convert_nontype_argument): Handle rvalue references. + PR c++/84839 - ICE with decltype of parameter pack. * pt.c (tsubst_pack_expansion): Set cp_unevaluated_operand while instantiating dummy parms. diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index fdc1c9a..a16aef6 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -6932,11 +6932,18 @@ convert_nontype_argument (tree type, tree expr, tsubst_flags_t complain) return NULL_TREE; } - if (!lvalue_p (expr)) + if (!glvalue_p (expr) + || TYPE_REF_IS_RVALUE (type) != xvalue_p (expr)) { if (complain & tf_error) - error ("%qE is not a valid template argument for type %qT " - "because it is not an lvalue", expr, type); + { + if (TYPE_REF_IS_RVALUE (type)) + error ("%qE is not a valid template argument for type %qT " + "because it is not an xvalue", expr, type); + else + error ("%qE is not a valid template argument for type %qT " + "because it is not an lvalue", expr, type); + } return NULL_TREE; } diff --git a/gcc/testsuite/g++.dg/cpp0x/rv-targ1.C b/gcc/testsuite/g++.dg/cpp0x/rv-targ1.C new file mode 100644 index 0000000..b8e0dab --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/rv-targ1.C @@ -0,0 +1,10 @@ +// PR c++/84720 +// { dg-do compile { target c++11 } } + +template<int &&> +struct a { + template<typename...> + static void b() { + b(); + } +}; |