Anant
Anant

Reputation: 222

GCC gives confusing warning message when using pointer to struct <typedef>

On compiling the following C program, GCC emits a warning message which is somewhat confusing.

Program Source

#include <stdio.h>

typedef struct {
    int x;
} dummy_t;

void myfunc (dummy_t   *pointer)
{
    printf("x = %d\n", pointer->x);
}

int main ()
{
    dummy_t    d = { 10 };

    /* INCORRECT. */
    myfunc((struct dummy_t *)&d);

    /* Correct. */
    // myfunc((dummy_t *)&d);

    return 0;
}

Compilation

bash$ gcc c.c
c.c: In function ‘main’:
c.c:17:20: warning: passing argument 1 of ‘myfunc’ from incompatible pointer type
 myfunc((struct dummy_t *)&d);
                ^
c.c:7:6: note: expected ‘struct dummy_t *’ but argument is of type ‘struct dummy_t *’
void myfunc (dummy_t   *pointer)

Notice how both the expected type and the argument type are reported to have the same value struct dummy_t *. This is confusing.

Shouldn't the expected type be dummy_t *?

The above program is a simplified version of the actual code where I faced this problem.

GCC Version

bash$ gcc --version
gcc (Ubuntu 4.8.4-2ubuntu1~14.04) 4.8.4

Upvotes: 1

Views: 6084

Answers (1)

user5419887
user5419887

Reputation: 41

You're right that the error message is confusing. A newer version gives a much better error message:

note: expected 'dummy_t * {aka struct <anonymous> *}' but argument is 
of type 'struct dummy_t *'

As you can see, dummy_t and struct dummy_t are different types. With this declaration:

typedef struct {
    int x;
} dummy_t;

You are typedef'ing an anonymous struct. However, later when you do struct dummy_t, you are forward declaring a new struct named dummy_t. Clearly, these are two different types, hence the error.

Upvotes: 3

Related Questions