diff options
author | Jakub Jelinek <jakub@redhat.com> | 2008-12-18 21:51:07 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2008-12-18 21:51:07 +0100 |
commit | 0f737a30c0b260e0d7caa6534be2971b8cc6d547 (patch) | |
tree | cc69343a221506d7f3828911b988fcb4b66250e7 /gcc | |
parent | baafc53472e47f361532150e016f451efd856cca (diff) | |
download | gcc-0f737a30c0b260e0d7caa6534be2971b8cc6d547.zip gcc-0f737a30c0b260e0d7caa6534be2971b8cc6d547.tar.gz gcc-0f737a30c0b260e0d7caa6534be2971b8cc6d547.tar.bz2 |
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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/cp/init.c | 24 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/init/ctor9.C | 8 |
4 files changed, 35 insertions, 9 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 00415ec..0a84812 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,10 @@ +2008-12-18 Jakub Jelinek <jakub@redhat.com> + + 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 <jason@redhat.com> PR c++/38485 diff --git a/gcc/cp/init.c b/gcc/cp/init.c index abcf858..1285f16 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 4756cd1..0ac822c 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2008-12-18 Jakub Jelinek <jakub@redhat.com> + + PR c++/38427 + * g++.dg/init/ctor9.C: New test. + 2008-12-18 Jason Merrill <jason@redhat.com> 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 0000000..02bb570 --- /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" } +}; |