On Wed, Nov 23, 2016 at 10:42:57AM -0500, Jason Merrill wrote:
> OK, but I wonder why we don't do constant initialization of that variable...

Dunno either, check_initializer simply returns the call to the constructor
for the var.  I've tried something like:

--- gcc/cp/decl.c.jj    2016-11-21 19:47:06.000000000 +0100
+++ gcc/cp/decl.c       2016-11-23 17:31:15.963594787 +0100
@@ -6339,7 +6339,27 @@ check_initializer (tree decl, tree init,
              init_code = NULL_TREE;
            }
          else
-           init = NULL_TREE;
+           {
+             init = NULL_TREE;
+             if (TREE_CODE (init_code) == CALL_EXPR)
+               {
+                 tree callee = get_callee_fndecl (init_code);
+                 /* If INIT_CODE is a call to constexpr ctor,
+                    see if we can optimize it into a constant
+                    initialization.  */
+                 if (callee
+                     && DECL_DECLARED_CONSTEXPR_P (callee)
+                     && DECL_CONSTRUCTOR_P (callee)
+                     && !flag_no_inline)
+                   {
+                     init = maybe_constant_value (init_code);
+                     if (TREE_CODE (init) == CALL_EXPR)
+                       init = NULL_TREE;
+                     else
+                       init_code = NULL_TREE;
+                   }
+               }
+           }
        }
 
       if (init && TREE_CODE (init) != TREE_VEC)

but store_init_value still doesn't like that and turns it into a runtime
initialization.

So, shall I check the patch in and defer the rest to you, or just defer it?

        Jakub

Reply via email to