aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2018-05-19 18:57:53 -0400
committerJason Merrill <jason@gcc.gnu.org>2018-05-19 18:57:53 -0400
commit4b950a6d7c620834d77a63ffe2ee9704df0e4cdc (patch)
tree5e58842cca8a96c323c6f37909620a151299750b /gcc
parent7aed919c97e8c7593bd6c98c1038fbed1ed44055 (diff)
downloadgcc-4b950a6d7c620834d77a63ffe2ee9704df0e4cdc.zip
gcc-4b950a6d7c620834d77a63ffe2ee9704df0e4cdc.tar.gz
gcc-4b950a6d7c620834d77a63ffe2ee9704df0e4cdc.tar.bz2
Avoid ICE on unsupported use of __integer_pack.
* pt.c (tsubst_pack_expansion): Sorry rather than abort on __integer_pack as subexpression of pattern. From-SVN: r260404
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog5
-rw-r--r--gcc/cp/pt.c9
-rw-r--r--gcc/testsuite/g++.dg/ext/integer-pack4.C10
3 files changed, 22 insertions, 2 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index e4fcffc..92039fa 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,8 @@
+2018-05-19 Jason Merrill <jason@redhat.com>
+
+ * pt.c (tsubst_pack_expansion): Sorry rather than abort
+ on __integer_pack as subexpression of pattern.
+
2018-05-18 Jason Merrill <jason@redhat.com>
PR c++/58407 - deprecated implicit copy ops.
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index 1e42040..81de633 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -12067,8 +12067,13 @@ tsubst_pack_expansion (tree t, tree args, tsubst_flags_t complain,
}
else if (builtin_pack_call_p (parm_pack))
{
- /* ??? Support use in other patterns. */
- gcc_assert (parm_pack == pattern);
+ if (parm_pack != pattern)
+ {
+ if (complain & tf_error)
+ sorry ("%qE is not the entire pattern of the pack expansion",
+ parm_pack);
+ return error_mark_node;
+ }
return expand_builtin_pack_call (parm_pack, args,
complain, in_decl);
}
diff --git a/gcc/testsuite/g++.dg/ext/integer-pack4.C b/gcc/testsuite/g++.dg/ext/integer-pack4.C
new file mode 100644
index 0000000..6e5125b
--- /dev/null
+++ b/gcc/testsuite/g++.dg/ext/integer-pack4.C
@@ -0,0 +1,10 @@
+// { dg-additional-options -std=c++17 }
+
+template<int ... Ns> int f() { return (Ns + ...); }
+template<int N> int g() {
+ return f<__integer_pack(N)...>(); // Fine.
+}
+template<int N> int h() {
+ return f<(2*__integer_pack(N))...>(); // { dg-bogus "sorry" "" { xfail *-*-* } }
+}
+int main() { return g<3>()+h<3>(); }