diff mbox

[C++] Fix wrong-code on var construction in static init (PR c++/77907)

Message ID 20161123163601.GQ3541@tucnak.redhat.com
State New
Headers show

Commit Message

Jakub Jelinek Nov. 23, 2016, 4:36 p.m. UTC
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:


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

Comments

Jason Merrill Nov. 23, 2016, 6:17 p.m. UTC | #1
On Wed, Nov 23, 2016 at 11:36 AM, Jakub Jelinek <jakub@redhat.com> wrote:
> 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?

Go ahead and check it in.

Jason
diff mbox

Patch

--- 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)