Re: [PR c++/84593] ice on braced init with uninit ref field
On Tue, Mar 6, 2018 at 12:42 AM, Alexandre Olivawrote: > 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
On Mar 2, 2018, Jason Merrillwrote: >> + 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
On Mar 2, 2018, Jason Merrillwrote: > 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
On Fri, Mar 2, 2018 at 2:57 AM, Alexandre Olivawrote: > 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
On Feb 28, 2018, Jason Merrillwrote: > 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
On Wed, Feb 28, 2018 at 7:08 AM, Alexandre Olivawrote: > 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