diff mbox series

C++ PATCH for c++/91545 - ICE in constexpr store evaluation

Message ID 20190826133507.GU14737@redhat.com
State New
Headers show
Series C++ PATCH for c++/91545 - ICE in constexpr store evaluation | expand

Commit Message

Marek Polacek Aug. 26, 2019, 1:35 p.m. UTC
Now that DECL_MUTABLE_P checks that it got a FIELD_DECL node, One Does Not
Simply Check DECL_P.  For an ARRAY_REF, "elt" can be a VAR_DECL.

Bootstrapped/regtested on x86_64-linux, ok for trunk?

2019-08-26  Marek Polacek  <polacek@redhat.com>

	PR c++/91545 - ICE in constexpr store evaluation.
	* constexpr.c (cxx_eval_store_expression): Check FIELD_DECL instead
	of DECL_P.

	* g++.dg/cpp0x/pr91545.C: New test.

Comments

Jason Merrill Aug. 26, 2019, 2:34 p.m. UTC | #1
OK.

On Mon, Aug 26, 2019 at 9:35 AM Marek Polacek <polacek@redhat.com> wrote:

> Now that DECL_MUTABLE_P checks that it got a FIELD_DECL node, One Does Not
> Simply Check DECL_P.  For an ARRAY_REF, "elt" can be a VAR_DECL.
>
> Bootstrapped/regtested on x86_64-linux, ok for trunk?
>
> 2019-08-26  Marek Polacek  <polacek@redhat.com>
>
>         PR c++/91545 - ICE in constexpr store evaluation.
>         * constexpr.c (cxx_eval_store_expression): Check FIELD_DECL instead
>         of DECL_P.
>
>         * g++.dg/cpp0x/pr91545.C: New test.
>
> diff --git gcc/cp/constexpr.c gcc/cp/constexpr.c
> index dbd0dc3b445..6c547d6d179 100644
> --- gcc/cp/constexpr.c
> +++ gcc/cp/constexpr.c
> @@ -3849,7 +3849,7 @@ cxx_eval_store_expression (const constexpr_ctx *ctx,
> tree t,
>           {
>             tree ob = TREE_OPERAND (probe, 0);
>             tree elt = TREE_OPERAND (probe, 1);
> -           if (DECL_P (elt) && DECL_MUTABLE_P (elt))
> +           if (TREE_CODE (elt) == FIELD_DECL && DECL_MUTABLE_P (elt))
>               mutable_p = true;
>             if (evaluated
>                 && modifying_const_object_p (TREE_CODE (t), probe,
> mutable_p)
> diff --git gcc/testsuite/g++.dg/cpp0x/pr91545.C
> gcc/testsuite/g++.dg/cpp0x/pr91545.C
> new file mode 100644
> index 00000000000..2aa1fa18bd5
> --- /dev/null
> +++ gcc/testsuite/g++.dg/cpp0x/pr91545.C
> @@ -0,0 +1,5 @@
> +// PR c++/91545
> +// { dg-do compile { target c++11 } }
> +
> +long a[1];
> +int d, e { d && (a[d] = 0) };
>
diff mbox series

Patch

diff --git gcc/cp/constexpr.c gcc/cp/constexpr.c
index dbd0dc3b445..6c547d6d179 100644
--- gcc/cp/constexpr.c
+++ gcc/cp/constexpr.c
@@ -3849,7 +3849,7 @@  cxx_eval_store_expression (const constexpr_ctx *ctx, tree t,
 	  {
 	    tree ob = TREE_OPERAND (probe, 0);
 	    tree elt = TREE_OPERAND (probe, 1);
-	    if (DECL_P (elt) && DECL_MUTABLE_P (elt))
+	    if (TREE_CODE (elt) == FIELD_DECL && DECL_MUTABLE_P (elt))
 	      mutable_p = true;
 	    if (evaluated
 		&& modifying_const_object_p (TREE_CODE (t), probe, mutable_p)
diff --git gcc/testsuite/g++.dg/cpp0x/pr91545.C gcc/testsuite/g++.dg/cpp0x/pr91545.C
new file mode 100644
index 00000000000..2aa1fa18bd5
--- /dev/null
+++ gcc/testsuite/g++.dg/cpp0x/pr91545.C
@@ -0,0 +1,5 @@ 
+// PR c++/91545
+// { dg-do compile { target c++11 } }
+
+long a[1];
+int d, e { d && (a[d] = 0) };