re PR c++/84536 (ICE with non-type template parameter)
authorPaolo Carlini <paolo.carlini@oracle.com>
Wed, 20 Feb 2019 10:47:02 +0000 (10:47 +0000)
committerPaolo Carlini <paolo@gcc.gnu.org>
Wed, 20 Feb 2019 10:47:02 +0000 (10:47 +0000)
/cp
2019-02-20  Paolo Carlini  <paolo.carlini@oracle.com>

PR c++/84536
* pt.c (tsubst_init): Diagnose an initializer expanding to an
empty list of expressions; tweak wrt dependent types.
(regenerate_decl_from_template): For VAR_DECLs call tsubst_init
instead of tsubst_expr.

/testsuite
2019-02-20  Paolo Carlini  <paolo.carlini@oracle.com>

PR c++/84536
* g++.dg/cpp1y/var-templ60.C: New.

From-SVN: r269037

gcc/cp/ChangeLog
gcc/cp/pt.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/cpp1y/var-templ60.C [new file with mode: 0644]

index 3fe0cedb0e321987d1b3a7bd5ebeed92cb0ab66c..bdbbf841275f97521b3f4103a975265f522608bb 100644 (file)
@@ -1,3 +1,11 @@
+2019-02-20  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       PR c++/84536
+       * pt.c (tsubst_init): Diagnose an initializer expanding to an
+       empty list of expressions; tweak wrt dependent types.
+       (regenerate_decl_from_template): For VAR_DECLs call tsubst_init
+       instead of tsubst_expr.
+
 2019-02-19  Jason Merrill  <jason@redhat.com>
 
        PR c++/88368 - wrong 'use of deleted function'
index a69a17ad3b2b24fd00bc4a2f7903207081f981ba..8c5a1b312fc89046bb9f985a2258dd267a234ea1 100644 (file)
@@ -15422,21 +15422,35 @@ tsubst_init (tree init, tree decl, tree args,
 
   init = tsubst_expr (init, args, complain, in_decl, false);
 
-  if (!init && TREE_TYPE (decl) != error_mark_node)
-    {
-      /* If we had an initializer but it
-        instantiated to nothing,
-        value-initialize the object.  This will
-        only occur when the initializer was a
-        pack expansion where the parameter packs
-        used in that expansion were of length
-        zero.  */
-      init = build_value_init (TREE_TYPE (decl),
-                              complain);
-      if (TREE_CODE (init) == AGGR_INIT_EXPR)
-       init = get_target_expr_sfinae (init, complain);
-      if (TREE_CODE (init) == TARGET_EXPR)
-       TARGET_EXPR_DIRECT_INIT_P (init) = true;
+  tree type = TREE_TYPE (decl);
+
+  if (!init && type != error_mark_node)
+    {
+      if (tree auto_node = type_uses_auto (type))
+       {
+         if (!CLASS_PLACEHOLDER_TEMPLATE (auto_node))
+           {
+             if (complain & tf_error)
+               error ("initializer for %q#D expands to an empty list "
+                      "of expressions", decl);
+             return error_mark_node;
+           }
+       }
+      else if (!dependent_type_p (type))
+       {
+         /* If we had an initializer but it
+            instantiated to nothing,
+            value-initialize the object.  This will
+            only occur when the initializer was a
+            pack expansion where the parameter packs
+            used in that expansion were of length
+            zero.  */
+         init = build_value_init (type, complain);
+         if (TREE_CODE (init) == AGGR_INIT_EXPR)
+           init = get_target_expr_sfinae (init, complain);
+         if (TREE_CODE (init) == TARGET_EXPR)
+           TARGET_EXPR_DIRECT_INIT_P (init) = true;
+       }
     }
 
   return init;
@@ -24053,9 +24067,8 @@ regenerate_decl_from_template (tree decl, tree tmpl, tree args)
     {
       start_lambda_scope (decl);
       DECL_INITIAL (decl) =
-       tsubst_expr (DECL_INITIAL (code_pattern), args,
-                    tf_error, DECL_TI_TEMPLATE (decl),
-                    /*integral_constant_expression_p=*/false);
+       tsubst_init (DECL_INITIAL (code_pattern), decl, args,
+                    tf_error, DECL_TI_TEMPLATE (decl));
       finish_lambda_scope ();
       if (VAR_HAD_UNKNOWN_BOUND (decl))
        TREE_TYPE (decl) = tsubst (TREE_TYPE (code_pattern), args,
index 231a6f3bc6fb48eb77bfe1d362bbd8a2bc25e8bb..cd45bc56c7fd20c3f2ad7da8e7eb401eb1ecb239 100644 (file)
@@ -1,3 +1,8 @@
+2019-02-20  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       PR c++/84536
+       * g++.dg/cpp1y/var-templ60.C: New.
+
 2019-02-20  Li Jia He  <helijia@linux.ibm.com>
 
        PR target/88100
diff --git a/gcc/testsuite/g++.dg/cpp1y/var-templ60.C b/gcc/testsuite/g++.dg/cpp1y/var-templ60.C
new file mode 100644 (file)
index 0000000..029e65a
--- /dev/null
@@ -0,0 +1,9 @@
+// PR c++/84536
+// { dg-do compile { target c++14 } }
+
+template<int... N> auto foo(N...);  // { dg-error "initializer" }
+
+void bar()
+{
+  foo<>();
+}