On Tue, Mar 2, 2010 at 12:00 PM, Pjotr Kourzanov
<peter.kourza...@xs4all.nl> wrote:
> On Tue, 2010-03-02 at 10:47 +0000, Andrew Haley wrote:
>> On 03/02/2010 10:34 AM, Pjotr Kourzanov wrote:
>>
>> >> int duff4_fails(char * dst,const char * src,const size_t n)
>> >> {
>> >>   const size_t rem=n % 4, a=rem + (!rem)*4;
>> >>   char * d=dst+=a;
>> >>   const char * s=src+=a;
>> >>   /* gcc bug? dst+=n; */
>> >>
>> >>     switch (rem) {
>> >>     case 0:  for(dst+=n;d<dst;d+=4,s+=4) {
>> >>     /*case 0:*/    d[-4]=s[-4];
>> >>     case 3:        d[-3]=s[-3];
>> >>     case 2:        d[-2]=s[-2];
>> >>     case 1:        d[-1]=s[-1];
>> >>          }
>> >>     }
>> >>    return 0;
>> >> }
>> >> The first time around the loop the initializer (d+=n) is jumped around, so
>> >> d == dst.  At the end of the loop, d+=4, so d > dst.  Therefore the loop
>> >> exits.
>> >
>> >   And its wrong since it shouldn't jump around the initializer.
>>
>> Sure it should.  On entry to that loop, rem == 3.
>
>  I agree, this is one of the places where referential transparency
> breaks in C. I wouldn't have expected that the compiler could or
> would put the first expression before the switch in this case:
>
> switch (rem) {
>  for(dst+=n;d<dst;d+=4,s+=4) {
> case 0: d[-4]=s[-4]; ...
> }}
>
> However, the warning is still due, since a combination of a switch with a
> for loop results in code that is completely ignored, i.e., is inaccessible.
> As I said, gcc-3.x used to issue a warning for this one...

Neither 2.95 nor 3.3.6 or 3.4.6 warn for me.

Richard.

>>
>> Andrew.
>>
>
>
>

Reply via email to