From be2b548394a3d0998cf7fff5e9d85fcecd22d5f7 Mon Sep 17 00:00:00 2001 From: Richard Guenther Date: Wed, 16 Jan 2008 09:46:29 +0000 Subject: [PATCH] re PR c++/33819 (Miscompiled shift of C++ bitfield) 2008-01-16 Richard Guenther PR c++/33819 * typeck.c (is_bitfield_expr_with_lowered_type): Recurse for conversions to type variants. * g++.dg/torture/pr33819.C: New testcase. From-SVN: r131569 --- gcc/cp/ChangeLog | 6 ++++++ gcc/cp/typeck.c | 7 +++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/torture/pr33819.C | 22 ++++++++++++++++++++++ 4 files changed, 40 insertions(+) create mode 100644 gcc/testsuite/g++.dg/torture/pr33819.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 8582460..030232b 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2008-01-16 Richard Guenther + + PR c++/33819 + * typeck.c (is_bitfield_expr_with_lowered_type): Recurse + for conversions to type variants. + 2008-01-15 Andreas Tobler * parser.c (cp_parser_template_parameter): Fix C90 issue with mixing diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c index 50a844a..6557637 100644 --- a/gcc/cp/typeck.c +++ b/gcc/cp/typeck.c @@ -1445,6 +1445,13 @@ is_bitfield_expr_with_lowered_type (const_tree exp) return DECL_BIT_FIELD_TYPE (field); } + case NOP_EXPR: + case CONVERT_EXPR: + if (TYPE_MAIN_VARIANT (TREE_TYPE (TREE_OPERAND (exp, 0))) + == TYPE_MAIN_VARIANT (TREE_TYPE (exp))) + return is_bitfield_expr_with_lowered_type (TREE_OPERAND (exp, 0)); + /* Fallthrough. */ + default: return NULL_TREE; } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index b69ff98..e2748361 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,10 @@ 2008-01-16 Richard Guenther + PR c++/33819 + * g++.dg/torture/pr33819.C: New testcase. + +2008-01-16 Richard Guenther + PR c/34768 * gcc.c-torture/execute/pr34768-1.c: New testcase. * gcc.c-torture/execute/pr34768-2.c: Likewise. diff --git a/gcc/testsuite/g++.dg/torture/pr33819.C b/gcc/testsuite/g++.dg/torture/pr33819.C new file mode 100644 index 0000000..a2f868d --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr33819.C @@ -0,0 +1,22 @@ +/* { dg-do run } */ + +class s +{ +public: + s(long long aa) : a(aa), i1(0) { } + long long id() const { return (this->a << 16) >> 16; } + bool operator< (s sv) { return this->a < sv.id(); } +private: + long long a : 48; + int i1 : 16; +}; +s g(1); +extern "C" void abort (void); +int +main(int, char**) +{ + if (g < (1LL << 38) - 1) + return 0; + abort (); +} + -- 2.7.4