Re: [PR c++/84593] ice on braced init with uninit ref field

2018-03-06 Thread Jason Merrill
On Tue, Mar 6, 2018 at 12:42 AM, Alexandre Oliva  wrote:
> On Mar  2, 2018, Jason Merrill  wrote:
>
>> On Fri, Mar 2, 2018 at 2:57 AM, Alexandre Oliva  wrote:
>>> +  gcc_assert (TREE_CODE (type) == REFERENCE_TYPE);
>>> +  init = fold (convert (type, integer_zero_node));
>
>> Maybe build_zero_cst?
>
> Sure.
>
>
> I wonder, is there any reason to not change any of these to use
> build_zero_cst, too?
>
>   else if (TYPE_PTR_OR_PTRMEM_P (type))
> init = fold (convert (type, nullptr_node));
>   else if (SCALAR_TYPE_P (type))
> init = fold (convert (type, integer_zero_node));
>
> I suppose pointers to members might need an explicit conversion, which
> build_zero_cst might fallback to if it doesn't consider them aggregate
> types.  As for scalar types, are there any C++-specific scalar types
> that build_zero_cst wouldn't know how to deal with?  Anyway, it's
> probably not the time to change these, if it doesn't fix a regression.
> Just curious.

Indeed, build_zero_cst is wrong for pointers to members, but it should
be right for other scalars, including regular pointers.

Jason


Re: [PR c++/84593] ice on braced init with uninit ref field

2018-03-05 Thread Alexandre Oliva
On Mar  2, 2018, Jason Merrill  wrote:

>> +  gcc_assert (TREE_CODE (type) == REFERENCE_TYPE);
>> +  init = fold (convert (type, integer_zero_node));

> Maybe build_zero_cst?

> OK either way.

Here's what I'm installing:

[PR c++/84593] ice on braced init with uninit ref field

If an initializer expr is to be NULL in a ctor initializer list, we
ICE in picflag_from_initializer and elsewhere.

If we're missing an initializer for a reference field, we report the
error, but then build a zero initializer to avoid the ICE.

for  gcc/cp/ChangeLog

PR c++/84593
* init.c (build_zero_init_1): Zero-initialize references.

for  gcc/testsuite/ChangeLog

PR c++/84593
* g++.dg/cpp1y/pr84593.C: New.
---
 gcc/cp/init.c|5 -
 gcc/testsuite/g++.dg/cpp1y/pr84593.C |8 
 2 files changed, 12 insertions(+), 1 deletion(-)
 create mode 100644 gcc/testsuite/g++.dg/cpp1y/pr84593.C

diff --git a/gcc/cp/init.c b/gcc/cp/init.c
index d0d14abdc9fa..15cee17c780c 100644
--- a/gcc/cp/init.c
+++ b/gcc/cp/init.c
@@ -284,7 +284,10 @@ build_zero_init_1 (tree type, tree nelts, bool 
static_storage_p,
   else if (VECTOR_TYPE_P (type))
 init = build_zero_cst (type);
   else
-gcc_assert (TREE_CODE (type) == REFERENCE_TYPE);
+{
+  gcc_assert (TREE_CODE (type) == REFERENCE_TYPE);
+  init = build_zero_cst (type);
+}
 
   /* In all cases, the initializer is a constant.  */
   if (init)
diff --git a/gcc/testsuite/g++.dg/cpp1y/pr84593.C 
b/gcc/testsuite/g++.dg/cpp1y/pr84593.C
new file mode 100644
index ..8aa869f19193
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp1y/pr84593.C
@@ -0,0 +1,8 @@
+// PR c++/84593
+// { dg-do compile { target c++14 } }
+
+struct a {
+  int x;
+  int c = 0;
+  int 
+} c = {}; // { dg-error "uninitialized reference" }


-- 
Alexandre Oliva, freedom fighterhttp://FSFLA.org/~lxoliva/
You must be the change you wish to see in the world. -- Gandhi
Be Free! -- http://FSFLA.org/   FSF Latin America board member
Free Software Evangelist|Red Hat Brasil GNU Toolchain Engineer


Re: [PR c++/84593] ice on braced init with uninit ref field

2018-03-05 Thread Alexandre Oliva
On Mar  2, 2018, Jason Merrill  wrote:

> On Fri, Mar 2, 2018 at 2:57 AM, Alexandre Oliva  wrote:
>> +  gcc_assert (TREE_CODE (type) == REFERENCE_TYPE);
>> +  init = fold (convert (type, integer_zero_node));

> Maybe build_zero_cst?

Sure.


I wonder, is there any reason to not change any of these to use
build_zero_cst, too?

  else if (TYPE_PTR_OR_PTRMEM_P (type))
init = fold (convert (type, nullptr_node));
  else if (SCALAR_TYPE_P (type))
init = fold (convert (type, integer_zero_node));

I suppose pointers to members might need an explicit conversion, which
build_zero_cst might fallback to if it doesn't consider them aggregate
types.  As for scalar types, are there any C++-specific scalar types
that build_zero_cst wouldn't know how to deal with?  Anyway, it's
probably not the time to change these, if it doesn't fix a regression.
Just curious.

-- 
Alexandre Oliva, freedom fighterhttp://FSFLA.org/~lxoliva/
You must be the change you wish to see in the world. -- Gandhi
Be Free! -- http://FSFLA.org/   FSF Latin America board member
Free Software Evangelist|Red Hat Brasil GNU Toolchain Engineer


Re: [PR c++/84593] ice on braced init with uninit ref field

2018-03-02 Thread Jason Merrill
On Fri, Mar 2, 2018 at 2:57 AM, Alexandre Oliva  wrote:
> On Feb 28, 2018, Jason Merrill  wrote:
>
>> On Wed, Feb 28, 2018 at 7:08 AM, Alexandre Oliva  wrote:
>>> Don't allow the initializer expr to be NULL in a ctor initializer
>>> list, make it error_marker_node instead.
>
>> I don't want error_mark_nodes in a CONSTRUCTOR, either.  When there
>> isn't an NSDMI to worry about, we zero-initialize the reference, and
>> it seems reasonable to continue doing that, by fixing
>> build_zero_init_1 to return something non-null for a reference.
>
> Like this?  Regstrapped on i686- and x86_64-linux-gnu.
>
> [PR c++/84593] ice on braced init with uninit ref field
>
> If an initializer expr is to be NULL in a ctor initializer list, we
> ICE in picflag_from_initializer and elsewhere.
>
> If we're missing an initializer for a reference field, we report the
> error, but then build a zero initializer to avoid the ICE.
>
> for  gcc/cp/ChangeLog
>
> PR c++/84593
> * init.c (build_zero_init_1): Zero-initialize references.
>
> for  gcc/testsuite/ChangeLog
>
> PR c++/84593
> * g++.dg/cpp1y/pr84593.C: New.
> ---
>  gcc/cp/init.c|5 -
>  gcc/testsuite/g++.dg/cpp1y/pr84593.C |8 
>  2 files changed, 12 insertions(+), 1 deletion(-)
>  create mode 100644 gcc/testsuite/g++.dg/cpp1y/pr84593.C
>
> diff --git a/gcc/cp/init.c b/gcc/cp/init.c
> index d0d14abdc9fa..ed28e9a46dbc 100644
> --- a/gcc/cp/init.c
> +++ b/gcc/cp/init.c
> @@ -284,7 +284,10 @@ build_zero_init_1 (tree type, tree nelts, bool 
> static_storage_p,
>else if (VECTOR_TYPE_P (type))
>  init = build_zero_cst (type);
>else
> -gcc_assert (TREE_CODE (type) == REFERENCE_TYPE);
> +{
> +  gcc_assert (TREE_CODE (type) == REFERENCE_TYPE);
> +  init = fold (convert (type, integer_zero_node));

Maybe build_zero_cst?

OK either way.

Jason


Re: [PR c++/84593] ice on braced init with uninit ref field

2018-03-01 Thread Alexandre Oliva
On Feb 28, 2018, Jason Merrill  wrote:

> On Wed, Feb 28, 2018 at 7:08 AM, Alexandre Oliva  wrote:
>> Don't allow the initializer expr to be NULL in a ctor initializer
>> list, make it error_marker_node instead.

> I don't want error_mark_nodes in a CONSTRUCTOR, either.  When there
> isn't an NSDMI to worry about, we zero-initialize the reference, and
> it seems reasonable to continue doing that, by fixing
> build_zero_init_1 to return something non-null for a reference.

Like this?  Regstrapped on i686- and x86_64-linux-gnu.

[PR c++/84593] ice on braced init with uninit ref field

If an initializer expr is to be NULL in a ctor initializer list, we
ICE in picflag_from_initializer and elsewhere.

If we're missing an initializer for a reference field, we report the
error, but then build a zero initializer to avoid the ICE.

for  gcc/cp/ChangeLog

PR c++/84593
* init.c (build_zero_init_1): Zero-initialize references.

for  gcc/testsuite/ChangeLog

PR c++/84593
* g++.dg/cpp1y/pr84593.C: New.
---
 gcc/cp/init.c|5 -
 gcc/testsuite/g++.dg/cpp1y/pr84593.C |8 
 2 files changed, 12 insertions(+), 1 deletion(-)
 create mode 100644 gcc/testsuite/g++.dg/cpp1y/pr84593.C

diff --git a/gcc/cp/init.c b/gcc/cp/init.c
index d0d14abdc9fa..ed28e9a46dbc 100644
--- a/gcc/cp/init.c
+++ b/gcc/cp/init.c
@@ -284,7 +284,10 @@ build_zero_init_1 (tree type, tree nelts, bool 
static_storage_p,
   else if (VECTOR_TYPE_P (type))
 init = build_zero_cst (type);
   else
-gcc_assert (TREE_CODE (type) == REFERENCE_TYPE);
+{
+  gcc_assert (TREE_CODE (type) == REFERENCE_TYPE);
+  init = fold (convert (type, integer_zero_node));
+}
 
   /* In all cases, the initializer is a constant.  */
   if (init)
diff --git a/gcc/testsuite/g++.dg/cpp1y/pr84593.C 
b/gcc/testsuite/g++.dg/cpp1y/pr84593.C
new file mode 100644
index ..8aa869f19193
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp1y/pr84593.C
@@ -0,0 +1,8 @@
+// PR c++/84593
+// { dg-do compile { target c++14 } }
+
+struct a {
+  int x;
+  int c = 0;
+  int 
+} c = {}; // { dg-error "uninitialized reference" }


-- 
Alexandre Oliva, freedom fighterhttp://FSFLA.org/~lxoliva/
You must be the change you wish to see in the world. -- Gandhi
Be Free! -- http://FSFLA.org/   FSF Latin America board member
Free Software Evangelist|Red Hat Brasil GNU Toolchain Engineer


Re: [PR c++/84593] ice on braced init with uninit ref field

2018-02-28 Thread Jason Merrill
On Wed, Feb 28, 2018 at 7:08 AM, Alexandre Oliva  wrote:
> Don't allow the initializer expr to be NULL in a ctor initializer
> list, make it error_marker_node instead.

I don't want error_mark_nodes in a CONSTRUCTOR, either.  When there
isn't an NSDMI to worry about, we zero-initialize the reference, and
it seems reasonable to continue doing that, by fixing
build_zero_init_1 to return something non-null for a reference.

Jason