That would be a bug.
If h1 and h2 were marked __restrict__ then using memcpy to make the
assignment is valid, but without that marking h1 may be == h2 so memmove
is required.
paul
> -----Original Message-----
> From: Joakim Tjernlund [mailto:[email protected]]
> Sent: Friday, April 30, 2010 10:15 AM
> To: Jan-Benedict Glaw
> Cc: [email protected]
> Subject: Re: memcpy(p,p,len)
>
> Jan-Benedict Glaw <[email protected]> wrote on 2010/04/30 16:10:42:
> >
> > On Fri, 2010-04-30 16:08:15 +0200, Joakim Tjernlund
> > <[email protected]> wrote:
> > > Is memcpy supposed to work when the src and dest are the same:
> > > memcpy(p, p, 100);
> >
> > It may work, but you cannot rely on it. Use memmove() alternatively.
>
> My view too, but gcc 3.4.6 on gcc does this:
> struct my_struct {
> long a100[100];
> };
> static inline
> func(struct my_struct *h1, struct my_struct *h2)
> {
> *h1 = *h2;
> }
> mytest(struct my_struct *my_h1)
> {
> func(my_h1, my_h1);
> }
>
> -------------
> .file "tst.c"
> .section ".text"
> .align 2
> .globl mytest
> .type mytest, @function
> mytest:
> mflr 0
> stwu 1,-16(1)
> mr 4,3
> li 5,400
> stw 0,20(1)
> bl memcpy
> lwz 0,20(1)
> addi 1,1,16
> mtlr 0
> blr
> .size mytest, .-mytest
> .section .note.GNU-stack,"",@progbits
> .ident "GCC: (GNU) 3.4.6 (Gentoo 3.4.6-r2, ssp-3.4.6-1.0,
> pie-8.7.9)"