diff mbox

Fix PR c++/79360

Message ID CAKheXZ9j=43HZtRhWb1Crk+uVRbbrX_UEr_kt61F8V6m3iWHAw@mail.gmail.com
State New
Headers show

Commit Message

Patrick Palka Feb. 6, 2017, 4:52 a.m. UTC
This patch fixes PR c++/79360, a regression from PR c++/70347.

The TYPE_FIELDS of a type may contain TYPE_DECLs and CONST_DECLs as well
as FIELD_DECLs, but when looking for an NSDMI we are only interested in
the FIELD_DECLs.  Otherwise we may try to initialize the union with the
DECL_INITIAL of a nested CONST_DECL.  Does this look OK to commit after
bootstrap + regtest?

gcc/cp/ChangeLog:

    PR c++/79360
    * typeck2.c (process_init_constructor_union): Consider only
    FIELD_DECLs when looking for an NSDMI.

gcc/testsuite/ChangeLog:

    PR c++/79360
    * g++.dg/cpp1y/nsdmi-union2.C: New test.
---
 gcc/cp/typeck2.c                          |  3 ++-
 gcc/testsuite/g++.dg/cpp1y/nsdmi-union2.C | 12 ++++++++++++
 2 files changed, 14 insertions(+), 1 deletion(-)
 create mode 100644 gcc/testsuite/g++.dg/cpp1y/nsdmi-union2.C

Comments

Jason Merrill Feb. 6, 2017, 1:55 p.m. UTC | #1
OK.

On Sun, Feb 5, 2017 at 11:52 PM, Patrick Palka <ppalka007@gmail.com> wrote:
> This patch fixes PR c++/79360, a regression from PR c++/70347.
>
> The TYPE_FIELDS of a type may contain TYPE_DECLs and CONST_DECLs as well
> as FIELD_DECLs, but when looking for an NSDMI we are only interested in
> the FIELD_DECLs.  Otherwise we may try to initialize the union with the
> DECL_INITIAL of a nested CONST_DECL.  Does this look OK to commit after
> bootstrap + regtest?
>
> gcc/cp/ChangeLog:
>
>     PR c++/79360
>     * typeck2.c (process_init_constructor_union): Consider only
>     FIELD_DECLs when looking for an NSDMI.
>
> gcc/testsuite/ChangeLog:
>
>     PR c++/79360
>     * g++.dg/cpp1y/nsdmi-union2.C: New test.
> ---
>  gcc/cp/typeck2.c                          |  3 ++-
>  gcc/testsuite/g++.dg/cpp1y/nsdmi-union2.C | 12 ++++++++++++
>  2 files changed, 14 insertions(+), 1 deletion(-)
>  create mode 100644 gcc/testsuite/g++.dg/cpp1y/nsdmi-union2.C
>
> diff --git a/gcc/cp/typeck2.c b/gcc/cp/typeck2.c
> index 014de5c..1e0354d 100644
> --- a/gcc/cp/typeck2.c
> +++ b/gcc/cp/typeck2.c
> @@ -1510,7 +1510,8 @@ process_init_constructor_union (tree type, tree init,
>      {
>        for (tree field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field))
>      {
> -      if (DECL_INITIAL (field))
> +      if (TREE_CODE (field) == FIELD_DECL
> +          && DECL_INITIAL (field) != NULL_TREE)
>          {
>            CONSTRUCTOR_APPEND_ELT (CONSTRUCTOR_ELTS (init),
>                        field,
> diff --git a/gcc/testsuite/g++.dg/cpp1y/nsdmi-union2.C
> b/gcc/testsuite/g++.dg/cpp1y/nsdmi-union2.C
> new file mode 100644
> index 0000000..08217d7
> --- /dev/null
> +++ b/gcc/testsuite/g++.dg/cpp1y/nsdmi-union2.C
> @@ -0,0 +1,12 @@
> +// PR c++/79360
> +// { dg-do compile { target c++14 } }
> +
> +union U
> +{
> +  enum E { e };
> +};
> +
> +struct A
> +{
> +  U u{};
> +};
> --
> 2.10.1.456.g9cf5127
diff mbox

Patch

diff --git a/gcc/cp/typeck2.c b/gcc/cp/typeck2.c
index 014de5c..1e0354d 100644
--- a/gcc/cp/typeck2.c
+++ b/gcc/cp/typeck2.c
@@ -1510,7 +1510,8 @@  process_init_constructor_union (tree type, tree init,
     {
       for (tree field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field))
     {
-      if (DECL_INITIAL (field))
+      if (TREE_CODE (field) == FIELD_DECL
+          && DECL_INITIAL (field) != NULL_TREE)
         {
           CONSTRUCTOR_APPEND_ELT (CONSTRUCTOR_ELTS (init),
                       field,
diff --git a/gcc/testsuite/g++.dg/cpp1y/nsdmi-union2.C
b/gcc/testsuite/g++.dg/cpp1y/nsdmi-union2.C
new file mode 100644
index 0000000..08217d7
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp1y/nsdmi-union2.C
@@ -0,0 +1,12 @@ 
+// PR c++/79360
+// { dg-do compile { target c++14 } }
+
+union U
+{
+  enum E { e };
+};
+
+struct A
+{
+  U u{};
+};