This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[committed] Add testcase for already fixed PR (PR c++/84496)
- From: Jakub Jelinek <jakub at redhat dot com>
- To: gcc-patches at gcc dot gnu dot org
- Cc: Jason Merrill <jason at redhat dot com>
- Date: Thu, 22 Feb 2018 10:56:59 +0100
- Subject: [committed] Add testcase for already fixed PR (PR c++/84496)
- Authentication-results: sourceware.org; auth=none
- Reply-to: Jakub Jelinek <jakub at redhat dot com>
Hi!
ICE on this testcase has been introduced in r236615 and got fixed on the trunk
with r253600. I've committed the testcase to trunk, so that we don't
regress in it as obvious.
2018-02-22 Jakub Jelinek <jakub@redhat.com>
PR c++/84496
* g++.dg/cpp1y/pr84496.C: New test.
--- gcc/testsuite/g++.dg/cpp1y/pr84496.C.jj 2018-02-22 10:53:30.311132498 +0100
+++ gcc/testsuite/g++.dg/cpp1y/pr84496.C 2018-02-22 10:45:29.102352811 +0100
@@ -0,0 +1,44 @@
+// PR c++/84496
+// { dg-do compile { target c++14 } }
+
+template <typename T, T n> struct C { static constexpr T D = n; };
+struct E : C<bool, false> {};
+template <typename> struct F : C<bool, false> {};
+template <typename T> T foo ();
+template <typename> struct H { typedef int G; };
+template <typename> class I;
+struct L;
+template <typename, typename> struct J;
+template <bool, bool, typename...> struct K;
+struct R {
+ template <typename M, typename... N>
+ static J<decltype (foo<M> () (foo<N>...)), L> o;
+};
+template <typename P, typename... Q> struct K<false, false, P, Q...> : R {
+ typedef decltype (o<P, Q...>) G;
+};
+template <typename P, typename... Q>
+struct D : K<E::D, F<typename H<P>::G>::D, P, Q...> {};
+template <typename P, typename... Q> struct I<P (Q...)> : D<P, Q...> {};
+template <typename> class function;
+template <typename S, typename... Q> struct function<S (Q...)> {
+ template <typename T, typename = typename I<T (Q...)>::G> struct C;
+ template <typename, typename> using U = int;
+ template <typename P, typename = U<int, void>, typename = U<C<P>, void>>
+ function (P);
+};
+template <typename S, typename... Q>
+template <typename P, typename, typename>
+function<S (Q...)>::function (P)
+{
+}
+void bar (function<void (int)>);
+
+void
+baz ()
+{
+ auto a = [] {
+ static int counter;
+ bar ([] (auto) { counter++; });
+ };
+}
Jakub