reshape_init only wants to work on BRACE_ENCLOSED_INITIALIZER_P, i.e. raw
initializer lists, and here was getting a CONSTRUCTOR that had already been
processed for type A<int>.  maybe_aggr_guide should also use that test.

Tested x86_64-pc-linux-gnu, applying to trunk.

gcc/cp/ChangeLog
2020-03-10  Jason Merrill  <ja...@redhat.com>

        PR c++/93956
        * pt.c (maybe_aggr_guide): Check BRACE_ENCLOSED_INITIALIZER_P.
---
 gcc/cp/pt.c                                    | 2 +-
 gcc/testsuite/g++.dg/cpp1z/class-deduction70.C | 7 +++++++
 2 files changed, 8 insertions(+), 1 deletion(-)
 create mode 100644 gcc/testsuite/g++.dg/cpp1z/class-deduction70.C

diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index 49ee3920049..179716b5680 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -28182,7 +28182,7 @@ maybe_aggr_guide (tree tmpl, tree init, vec<tree,va_gc> 
*args)
   tsubst_flags_t complain = tf_none;
 
   tree parms = NULL_TREE;
-  if (TREE_CODE (init) == CONSTRUCTOR)
+  if (BRACE_ENCLOSED_INITIALIZER_P (init))
     {
       init = reshape_init (type, init, complain);
       if (init == error_mark_node)
diff --git a/gcc/testsuite/g++.dg/cpp1z/class-deduction70.C 
b/gcc/testsuite/g++.dg/cpp1z/class-deduction70.C
new file mode 100644
index 00000000000..f14bdf0b8ec
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp1z/class-deduction70.C
@@ -0,0 +1,7 @@
+// PR c++/93596
+
+template <typename> struct A {};
+template <typename> struct B {};
+template <typename> struct C {
+  void foo () { B a = A<int> { foo }; } // { dg-error "" }
+};

base-commit: b269a014771776f860730874095dffb34839a466
-- 
2.18.1

Reply via email to