[committed] Add testcase for already fixed PR (PR c++/84496)

Message ID 20180222095659.GU5867@tucnak
State New
Headers show
Series
  • [committed] Add testcase for already fixed PR (PR c++/84496)
Related show

Commit Message

Jakub Jelinek Feb. 22, 2018, 9:56 a.m.
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.


	Jakub

Patch

--- 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++; });
+  };
+}