From 0f737a30c0b260e0d7caa6534be2971b8cc6d547 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Thu, 18 Dec 2008 21:51:07 +0100 Subject: [PATCH] re PR c++/38427 (crash for reference init code) PR c++/38427 * init.c (perform_member_init): For value-initialized references call permerror instead of warning and don't emit any INIT_EXPR. * g++.dg/init/ctor9.C: New test. From-SVN: r142818 --- gcc/cp/ChangeLog | 7 +++++++ gcc/cp/init.c | 24 +++++++++++++++--------- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/init/ctor9.C | 8 ++++++++ 4 files changed, 35 insertions(+), 9 deletions(-) create mode 100644 gcc/testsuite/g++.dg/init/ctor9.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 00415ecb92d..0a84812fa86 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,10 @@ +2008-12-18 Jakub Jelinek + + PR c++/38427 + * init.c (perform_member_init): For value-initialized + references call permerror instead of warning and don't emit any + INIT_EXPR. + 2008-12-18 Jason Merrill PR c++/38485 diff --git a/gcc/cp/init.c b/gcc/cp/init.c index abcf8586473..1285f160f00 100644 --- a/gcc/cp/init.c +++ b/gcc/cp/init.c @@ -435,19 +435,25 @@ perform_member_init (tree member, tree init) { /* mem() means value-initialization. */ if (TREE_CODE (type) == ARRAY_TYPE) - init = build_vec_init (decl, NULL_TREE, NULL_TREE, - /*explicit_value_init_p=*/true, - /* from_array=*/0, - tf_warning_or_error); + { + init = build_vec_init (decl, NULL_TREE, NULL_TREE, + /*explicit_value_init_p=*/true, + /* from_array=*/0, + tf_warning_or_error); + finish_expr_stmt (init); + } else { if (TREE_CODE (type) == REFERENCE_TYPE) - warning (0, "%Jdefault-initialization of %q#D, " - "which has reference type", - current_function_decl, member); - init = build2 (INIT_EXPR, type, decl, build_value_init (type)); + permerror (input_location, "%Jvalue-initialization of %q#D, " + "which has reference type", + current_function_decl, member); + else + { + init = build2 (INIT_EXPR, type, decl, build_value_init (type)); + finish_expr_stmt (init); + } } - finish_expr_stmt (init); } /* Deal with this here, as we will get confused if we try to call the assignment op for an anonymous union. This can happen in a diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 4756cd1792e..0ac822cf171 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2008-12-18 Jakub Jelinek + + PR c++/38427 + * g++.dg/init/ctor9.C: New test. + 2008-12-18 Jason Merrill PR c++/38485 diff --git a/gcc/testsuite/g++.dg/init/ctor9.C b/gcc/testsuite/g++.dg/init/ctor9.C new file mode 100644 index 00000000000..02bb5700f3b --- /dev/null +++ b/gcc/testsuite/g++.dg/init/ctor9.C @@ -0,0 +1,8 @@ +// PR c++/38427 +// { dg-do compile } + +struct S +{ + int &ref; + S() : ref() {}; // { dg-error "value-initialization of" } +};