From e53ebec609e17994fa6702cfdc0bfa7f0cb8d4ea Mon Sep 17 00:00:00 2001 From: Mark Mitchell Date: Mon, 16 Apr 2007 23:28:21 +0000 Subject: [PATCH] re PR c++/31513 (Miscompilation of Function Passing Bit Field Value to Function) PR c++/31513 * call.c (convert_for_arg_passing): Convert bitfields to their declared types. PR c++/31513 * g++.dg/expr/bitfield8.C: New test. From-SVN: r123902 --- gcc/cp/ChangeLog | 6 ++++++ gcc/cp/call.c | 1 + gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/expr/bitfield8.C | 24 ++++++++++++++++++++++++ 4 files changed, 36 insertions(+) create mode 100644 gcc/testsuite/g++.dg/expr/bitfield8.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 45883e440b07..d80be936c525 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2007-04-16 Mark Mitchell + + PR c++/31513 + * call.c (convert_for_arg_passing): Convert bitfields to their + declared types. + 2007-04-13 Jason Merrill PR c++/31074 diff --git a/gcc/cp/call.c b/gcc/cp/call.c index 37c91922c98a..6d6740a44fec 100644 --- a/gcc/cp/call.c +++ b/gcc/cp/call.c @@ -4658,6 +4658,7 @@ type_passed_as (tree type) tree convert_for_arg_passing (tree type, tree val) { + val = convert_bitfield_to_declared_type (val); if (val == error_mark_node) ; /* Pass classes with copy ctors by invisible reference. */ diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index e5efe8b9ac28..107c96470333 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2007-04-16 Mark Mitchell + + PR c++/31513 + * g++.dg/expr/bitfield8.C: New test. + 2007-04-14 Andrew Pinski PR testsuite/31578 diff --git a/gcc/testsuite/g++.dg/expr/bitfield8.C b/gcc/testsuite/g++.dg/expr/bitfield8.C new file mode 100644 index 000000000000..566109cdd3dc --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/bitfield8.C @@ -0,0 +1,24 @@ +// PR c++/31513 +// { dg-do run } + +extern "C" void abort(); + +struct tree_type { + unsigned int precision : 9; +}; + +void bork(unsigned int i) { + if (i != 7) + abort(); +} + +void foo(struct tree_type *t) +{ + bork(t->precision); +} + +int main() { + tree_type t; + t.precision = 7; + foo(&t); +}