Closed
Description
The problem is caused by not dumping names of anonymous structs in typedefs. Example:
Input for goto-cc:
#define UNUSED_PARAM __attribute__ ((__unused__))
# define mbstate_t bb_mbstate_t
# define wcrtomb bb_wcrtomb
typedef struct {
char bogus;
} mbstate_t;
int wcrtomb(char *s, char wc, mbstate_t *ps);
int wcrtomb(char *s, char wc, mbstate_t *ps UNUSED_PARAM)
{
return 1;
}
int main() {
wcrtomb("foo", 'Z', (void*)1);
return 0;
}
Output of goto-instrument:
typedef struct bb_mbstate_t;
// tag-#anon#ST[S8'bogus']
// file example_collisions1.c line 6
struct anonymous;
// bb_wcrtomb
// file example_collisions1.c line 12
signed int bb_wcrtomb(char *s, char wc, bb_mbstate_t *ps);
typedef struct anonymous
{
// bogus
char bogus;
} bb_mbstate_t;
// bb_wcrtomb
// file example_collisions1.c line 12
signed int bb_wcrtomb(char *s, char wc, bb_mbstate_t *ps)
{
return 1;
}
// main
// file example_collisions1.c line 17
signed int main()
{
bb_wcrtomb("foo", 'Z', (bb_mbstate_t *)(void *)1);
return 0;
}
GCC output:
error: unknown type name ‘bb_mbstate_t’
signed int bb_wcrtomb(char *s, char wc, bb_mbstate_t *ps);
clang output:
example_collisions1.i:1:1: warning: typedef requires a name [-Wmissing-declarations]
typedef struct bb_mbstate_t;
^~~~~~~
example_collisions1.i:10:41: error: must use 'struct' tag to refer to type 'bb_mbstate_t'
signed int bb_wcrtomb(char *s, char wc, bb_mbstate_t *ps);
^
struct
example_collisions1.i:21:12: error: conflicting types for 'bb_wcrtomb'
signed int bb_wcrtomb(char *s, char wc, bb_mbstate_t *ps)