From 8c014bceeca6a558519e86b16a8142accc41e94f Mon Sep 17 00:00:00 2001
From: jason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Date: Thu, 28 Jun 2018 00:25:21 +0000
Subject: [PATCH] 	PR c++/80290 - memory-hog with std::pair.

	* pt.c (type_unification_real): Skip non-dependent conversion
	check for a nested list argument.
	(braced_init_depth): New.

Upstream-Status: Backport
Signed-off-by: Joel Stanley <joel@jms.id.au>
---
 gcc/cp/pt.c      | 22 ++++++++++++++++++++++
 1 file changed, 22 insertions(+)

diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index 79cfd0129226..71077a3b0498 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -19242,6 +19242,24 @@ try_array_deduction (tree tparms, tree targs, tree parm)
 			  /*nondeduced*/false, array_deduction_r);
 }
 
+/* Returns how many levels of { } INIT contains.  */
+
+static int
+braced_init_depth (tree init)
+{
+  if (!init || !BRACE_ENCLOSED_INITIALIZER_P (init))
+    return 0;
+  unsigned i; tree val;
+  unsigned max = 0;
+  FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (init), i, val)
+    {
+      unsigned elt_d = braced_init_depth (val);
+      if (elt_d > max)
+	max = elt_d;
+    }
+  return max + 1;
+}
+
 /* Most parms like fn_type_unification.
 
    If SUBR is 1, we're being called recursively (to unify the
@@ -19478,6 +19496,10 @@ type_unification_real (tree tparms,
 
 	    if (uses_template_parms (parm))
 	      continue;
+	    /* Workaround for c++/80290: avoid combinatorial explosion on
+	       deeply nested braced init-lists.  */
+	    if (braced_init_depth (arg) > 2)
+	      continue;
 	    if (check_non_deducible_conversion (parm, arg, strict, flags,
 						explain_p))
 	      return 1;
-- 
2.17.1

