https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85432
Bug ID: 85432
Summary: Wodr can be more verbose for C code
Product: gcc
Version: unknown
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: lto
Assignee: unassigned at gcc dot gnu.org
Reporter: marxin at gcc dot gnu.org
CC: hubicka at gcc dot gnu.org, marxin at gcc dot gnu.org
Target Milestone: ---
Let's consider:
$ cat 1.c
struct A
{
int a;
double b;
};
extern void foo (struct A *);
int main()
{
struct A a;
foo (&a);
return a.a;
}
$ cat 2.c
struct A
{
int a;
};
void foo (struct A *a)
{
a->a = 123;
}
$ gcc *.c -flto
1.c:7:13: warning: type of ‘foo’ does not match original declaration
[-Wlto-type-mismatch]
extern void foo (struct A *);
^
2.c:7:6: note: ‘foo’ was previously declared here
void foo (struct A *a)
^
2.c:7:6: note: code may be misoptimized unless -fno-strict-aliasing is used
C++ FE is more verbose:
g++ *.c -flto
1.c:1:8: warning: type ‘struct A’ violates the C++ One Definition Rule [-Wodr]
struct A
^
2.c:1:8: note: a different type is defined in another translation unit
struct A
^
1.c:4:10: note: the first difference of corresponding definitions is field ‘b’
double b;
^
2.c:1:8: note: a type with different number of fields is defined in another
translation unit
struct A
^
1.c:7:13: warning: ‘foo’ violates the C++ One Definition Rule [-Wodr]
extern void foo (struct A *);
^
2.c:7:6: note: type mismatch in parameter 1
void foo (struct A *a)
^
2.c:1:8: note: type ‘struct A’ itself violates the C++ One Definition Rule
struct A
^
1.c:1:8: note: the incompatible type is defined here
struct A
^
2.c:7:6: note: ‘foo’ was previously declared here
void foo (struct A *a)
^
2.c:7:6: note: code may be misoptimized unless -fno-strict-aliasing is used