On Wed, May 20, 2020 at 04:34:53PM +0100, Ramsay Jones wrote: > On 20/05/2020 01:33, Ramsay Jones wrote: > > On 19/05/2020 01:57, Luc Van Oostenryck wrote: > >> + int __safe var3 = obj; > >> + int *ptr4 = &obj; > >> + int *ptr4 = ptr; // KO > > > > ptr4 declared twice - and sparse didn't complain? Yes, I was surprised by this too. > Heh, I had a slightly different example in the test case > for my '{0}' initializer patch (but involving different > types as well). > > I had a quick look at this and tried to use 'git-bisect' to > isolate the change which broke this. However, I couldn't find > a version of sparse that worked correctly! :D (I went all the > way back to v0.4.2 before giving up - several tagged releases > didn't even compile without some fix-ups, including v0.4.2). Yes, it's quite annoying when bisecting, but well ... > Just FYI, this was my test-case: > > $ cat -n test-dup-decl.c > 1 #ifdef WORKS_OK > 2 static int sobj; > 3 static int *sptr4 = &sobj; > 4 static int *sptr4 = 0; > 5 #endif > 6 > 7 static void func(void) > 8 { > 9 int obj, *ptr; > 10 int *ptr4 = &obj; > 11 int *ptr4 = ptr; > 12 int a; > 13 float a; > 14 } > $ > > $ gcc -c test-dup-decl.c > test-dup-decl.c: In function ‘func’: > test-dup-decl.c:11:7: error: redefinition of ‘ptr4’ > int *ptr4 = ptr; > ^~~~ > test-dup-decl.c:10:7: note: previous definition of ‘ptr4’ was here > int *ptr4 = &obj; > ^~~~ > test-dup-decl.c:13:8: error: conflicting types for ‘a’ > float a; > ^ > test-dup-decl.c:12:6: note: previous declaration of ‘a’ was here > int a; > ^ > $ > > $ ./sparse test-dup-decl.c > $ It seems that sparse detect the redefinition when the symbols are global but not when they're local. Thanks for noticing this. -- Luc