PR c++/60223 - ICE with T{} in non-deduced context.
authorMarek Polacek <polacek@redhat.com>
Fri, 21 Jun 2019 20:32:06 +0000 (20:32 +0000)
committerMarek Polacek <mpolacek@gcc.gnu.org>
Fri, 21 Jun 2019 20:32:06 +0000 (20:32 +0000)
* pt.c (unify): Allow COMPOUND_LITERAL_P in a non-deduced context.

* g++.dg/cpp0x/nondeduced1.C: New test.
* g++.dg/cpp0x/nondeduced2.C: New test.
* g++.dg/cpp0x/nondeduced3.C: New test.
* g++.dg/cpp0x/nondeduced4.C: New test.

From-SVN: r272571

gcc/cp/ChangeLog
gcc/cp/pt.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/cpp0x/nondeduced1.C [new file with mode: 0644]
gcc/testsuite/g++.dg/cpp0x/nondeduced2.C [new file with mode: 0644]
gcc/testsuite/g++.dg/cpp0x/nondeduced3.C [new file with mode: 0644]
gcc/testsuite/g++.dg/cpp0x/nondeduced4.C [new file with mode: 0644]

index bc4fda7462d76b11fc270a6677bd263005b1022e..12da65ee955b5ac75c2c0559f0e19c73152a03e3 100644 (file)
@@ -1,5 +1,8 @@
 2019-06-21  Marek Polacek  <polacek@redhat.com>
 
+       PR c++/60223 - ICE with T{} in non-deduced context.
+       * pt.c (unify): Allow COMPOUND_LITERAL_P in a non-deduced context.
+
        PR c++/64235 - missing syntax error with invalid alignas.
        * parser.c (cp_parser_std_attribute_spec): Commit to tentative parse
        if there's a missing close paren.
index 2a626526c6f8dda56d17d8eb9c9c8899bf71c9f0..69de55369dd081bfc48eb6c1f0c648b22e1f9415 100644 (file)
@@ -22786,7 +22786,9 @@ unify (tree tparms, tree targs, tree parm, tree arg, int strict,
       /* An unresolved overload is a nondeduced context.  */
       if (is_overloaded_fn (parm) || type_unknown_p (parm))
        return unify_success (explain_p);
-      gcc_assert (EXPR_P (parm) || TREE_CODE (parm) == TRAIT_EXPR);
+      gcc_assert (EXPR_P (parm)
+                 || COMPOUND_LITERAL_P (parm)
+                 || TREE_CODE (parm) == TRAIT_EXPR);
     expr:
       /* We must be looking at an expression.  This can happen with
         something like:
@@ -22794,15 +22796,19 @@ unify (tree tparms, tree targs, tree parm, tree arg, int strict,
           template <int I>
           void foo(S<I>, S<I + 2>);
 
-        This is a "nondeduced context":
+        or
+
+          template<typename T>
+          void foo(A<T, T{}>);
+
+        This is a "non-deduced context":
 
           [deduct.type]
 
-          The nondeduced contexts are:
+          The non-deduced contexts are:
 
-          --A type that is a template-id in which one or more of
-            the template-arguments is an expression that references
-            a template-parameter.
+          --A non-type template argument or an array bound in which
+            a subexpression references a template parameter.
 
         In these cases, we assume deduction succeeded, but don't
         actually infer any unifications.  */
index 44350ee0683c97f788480859bdae35c823ac8b46..e80c4228031cc560618179866383feb52571bd70 100644 (file)
@@ -1,4 +1,10 @@
-2019-06-19  Marek Polacek  <polacek@redhat.com>
+2019-06-21  Marek Polacek  <polacek@redhat.com>
+
+       PR c++/60223 - ICE with T{} in non-deduced context.
+       * g++.dg/cpp0x/nondeduced1.C: New test.
+       * g++.dg/cpp0x/nondeduced2.C: New test.
+       * g++.dg/cpp0x/nondeduced3.C: New test.
+       * g++.dg/cpp0x/nondeduced4.C: New test.
 
        PR c++/64235 - missing syntax error with invalid alignas.
        * g++.dg/parse/alignas1.C: New test.
diff --git a/gcc/testsuite/g++.dg/cpp0x/nondeduced1.C b/gcc/testsuite/g++.dg/cpp0x/nondeduced1.C
new file mode 100644 (file)
index 0000000..067079e
--- /dev/null
@@ -0,0 +1,16 @@
+// PR c++/60223
+// { dg-do compile { target c++11 } }
+
+template<typename T, T = T{}>
+struct A { };
+
+template<typename T>
+void foo(A<T> a);
+
+void bar()
+{
+  foo(A<char, char{}>());
+  foo(A<char>());
+  foo<>(A<char>());
+  foo<>(A<char, char{}>());
+}
diff --git a/gcc/testsuite/g++.dg/cpp0x/nondeduced2.C b/gcc/testsuite/g++.dg/cpp0x/nondeduced2.C
new file mode 100644 (file)
index 0000000..3f96fe4
--- /dev/null
@@ -0,0 +1,14 @@
+// PR c++/60223
+// { dg-do compile { target c++11 } }
+
+template<typename T, T>
+struct A { };
+
+template<typename T>
+void foo(A<T, T{}>);
+
+void bar()
+{
+  foo(A<char, char{}>());
+  foo<>(A<char, char{}>());
+}
diff --git a/gcc/testsuite/g++.dg/cpp0x/nondeduced3.C b/gcc/testsuite/g++.dg/cpp0x/nondeduced3.C
new file mode 100644 (file)
index 0000000..d943dce
--- /dev/null
@@ -0,0 +1,16 @@
+// PR c++/60223
+// { dg-do compile { target c++11 } }
+
+template<typename T, T = T{1}>
+struct A { };
+
+template<typename T>
+void foo(A<T> a);
+
+void bar()
+{
+  foo(A<char>());
+  foo(A<char, char{1}>());
+  foo<>(A<char>());
+  foo<>(A<char, char{1}>());
+}
diff --git a/gcc/testsuite/g++.dg/cpp0x/nondeduced4.C b/gcc/testsuite/g++.dg/cpp0x/nondeduced4.C
new file mode 100644 (file)
index 0000000..818034c
--- /dev/null
@@ -0,0 +1,13 @@
+// PR c++/60223
+// { dg-do compile { target c++11 } }
+
+template<typename T>
+struct A { };
+
+template<typename T>
+void foo(A<T>, T = T{});
+
+void bar()
+{
+  foo(A<int>());
+}