diff options
author | Jason Merrill <jason@redhat.com> | 2016-03-16 15:37:22 -0400 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2016-03-16 15:37:22 -0400 |
commit | c5e003cfe45c37f8170c12b4037e8dda70dbfb94 (patch) | |
tree | 511ac2e9bf961297ec53530805f624824e2c1367 /gcc | |
parent | da0ad2630087aaaf62078123d554ffb722ca46c7 (diff) | |
download | gcc-c5e003cfe45c37f8170c12b4037e8dda70dbfb94.zip gcc-c5e003cfe45c37f8170c12b4037e8dda70dbfb94.tar.gz gcc-c5e003cfe45c37f8170c12b4037e8dda70dbfb94.tar.bz2 |
re PR c++/70259 (-flifetime-dse=2 bug with empty bases)
PR c++/70259
* decl.c (start_preparsed_function): Don't clobber an empty base.
From-SVN: r234267
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/cp/decl.c | 2 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/opt/flifetime-dse5.C | 13 |
3 files changed, 20 insertions, 0 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index b142413..ac73878 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2016-03-16 Jason Merrill <jason@redhat.com> + + PR c++/70259 + * decl.c (start_preparsed_function): Don't clobber an empty base. + 2016-03-16 Jakub Jelinek <jakub@redhat.com> PR c++/70147 diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 27c3597..216d726 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -14121,6 +14121,8 @@ start_preparsed_function (tree decl1, tree attrs, int flags) && (flag_lifetime_dse > 1) && DECL_CONSTRUCTOR_P (decl1) && !DECL_CLONED_FUNCTION_P (decl1) + /* Clobbering an empty base is harmful if it overlays real data. */ + && !is_empty_class (current_class_type) /* We can't clobber safely for an implicitly-defined default constructor because part of the initialization might happen before we enter the constructor, via AGGR_INIT_ZERO_FIRST (c++/68006). */ diff --git a/gcc/testsuite/g++.dg/opt/flifetime-dse5.C b/gcc/testsuite/g++.dg/opt/flifetime-dse5.C new file mode 100644 index 0000000..2c49021 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/flifetime-dse5.C @@ -0,0 +1,13 @@ +// PR c++/70259 +// { dg-options -O2 } +// { dg-do run } + +struct Empty { }; +struct A { A() : a(true) { } bool a; }; +struct B : Empty { B() : Empty() { } }; +struct C : A, B { C() : A(), B() { } }; +int main() { + C c; + if ( c.a == false ) + __builtin_abort(); +}; |