split_nonconstant_init_1 was confused by a CONSTRUCTOR with non-aggregate
type, which (with COMPOUND_LITERAL_P set) we use in a template to represent
a braced functional cast.  It seems to me that there's no good reason to do
split_nonconstant_init at all in a template.

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

gcc/cp/ChangeLog:

        PR c++/97899
        * typeck2.c (store_init_value): Don't split_nonconstant_init in a
        template.

gcc/testsuite/ChangeLog:

        PR c++/97899
        * g++.dg/cpp0x/initlist-template3.C: New test.
---
 gcc/cp/typeck2.c                                |  1 +
 gcc/testsuite/g++.dg/cpp0x/initlist-template3.C | 13 +++++++++++++
 2 files changed, 14 insertions(+)
 create mode 100644 gcc/testsuite/g++.dg/cpp0x/initlist-template3.C

diff --git a/gcc/cp/typeck2.c b/gcc/cp/typeck2.c
index 412869946a5..721987e8502 100644
--- a/gcc/cp/typeck2.c
+++ b/gcc/cp/typeck2.c
@@ -806,6 +806,7 @@ store_init_value (tree decl, tree init, vec<tree, va_gc>** 
cleanups, int flags)
      the bits that are constant, and then return an expression that
      will perform the dynamic initialization.  */
   if (value != error_mark_node
+      && !processing_template_decl
       && (TREE_SIDE_EFFECTS (value)
          || vla_type_p (type)
          || ! reduced_constant_expression_p (value)))
diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist-template3.C 
b/gcc/testsuite/g++.dg/cpp0x/initlist-template3.C
new file mode 100644
index 00000000000..b65a8473a09
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp0x/initlist-template3.C
@@ -0,0 +1,13 @@
+// PR c++/97899
+// { dg-do compile { target c++11 } }
+
+template <typename T = int>
+int fn()
+{
+  return 1;
+}
+
+template <typename T>
+void bar() {
+  const int i = int{fn()};
+}

base-commit: 1805dbc58bac78a823e9cff075b9dc993f29c360
-- 
2.18.4

Reply via email to