This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

Patch for c++/4574


Hello,

This is a patch to solve GNATS error c++/4574.
<http://gcc.gnu.org/ml/gcc-bugs/2001-10/msg00415.html>
<http://gcc.gnu.org/ml/gcc-bugs/2001-10/msg00643.html>
When using the value of an assignment to a bitfield, gcc 'and's a mask on
the value to the right. When this value is a long long constant, it used to run
into an abort.
My fix solves this special problem, although the place suggests a better
solution, allowing folding of any constants.
The patch was made relative to the official 3.0.2 source.

	Erwin

Testcase:

struct C76 {
    unsigned long long f1 : 8;
    unsigned long long c1 : 16;
};

int main() {
    struct C76 s;
    long long l;

    l = (s.c1 = 0xca9653c6396a5c63LL );

}

The patch:

        * expmed.c (expand_and): Handle 'long long constant' & 'long constant' 

Index: expmed.c
===================================================================
RCS file: /usr/local/cvscpp/archive/gcc/gcc/expmed.c,v
retrieving revision 1.1.1.2
diff -c -3 -p -r1.1.1.2 expmed.c
*** expmed.c    2001/06/19 12:21:35     1.1.1.2
--- expmed.c    2001/11/06 08:50:21
*************** expand_and (op0, op1, target)
*** 4163,4168 ****
--- 4163,4170 ----
      tem = expand_binop (mode, and_optab, op0, op1, target, 0, OPTAB_LIB_WIDEN)>;
    else if (GET_CODE (op0) == CONST_INT && GET_CODE (op1) == CONST_INT)
      tem = GEN_INT (INTVAL (op0) & INTVAL (op1));
+   else if (GET_CODE (op0) == CONST_DOUBLE && GET_CODE (op1) == CONST_INT)
+     tem = GEN_INT ( CONST_DOUBLE_LOW (op0) & INTVAL (op1));
    else
      abort ();



Erwin Unruh, Fujitsu Siemens Computers, C/C++ compiler group


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]