https://gcc.gnu.org/bugzilla/show_bug.cgi?id=116344
Bug ID: 116344
Summary: Wlto-type-mismatch and Wodr should show what TUs
mismatched
Product: gcc
Version: unknown
Status: UNCONFIRMED
Severity: enhancement
Priority: P3
Component: lto
Assignee: unassigned at gcc dot gnu.org
Reporter: arsen at gcc dot gnu.org
Target Milestone: ---
for instance, consider the following:
// test1.h
template<typename> struct A {};
// test1.c
#include "test1.h"
namespace { A<int> a; }
// test2.h
#include "test1.h"
template<> struct A<int>
{
int x;
};
// test2.c
#include "test2.h"
namespace { A<int> a; }
.. the compiler correctly tells us:
test1.h:1:27: warning: type ‘struct A’ violates the C++ One Definition Rule
[-Wodr]
1 | template<typename> struct A {};
| ^
test2.h:3:19: note: a different type is defined in another translation unit
3 | template<> struct A<int>
| ^
test2.h:5:7: note: the first difference of corresponding definitions is field
‘x’
5 | int x;
| ^
test2.h:3:19: note: a type with different number of fields is defined in
another translation unit
3 | template<> struct A<int>
| ^
... but all the locations are in header files. these header files could be
occurring many times, so it might be difficult to tell where they're included
from.
it'd be nice if GCC could say, for instance,
test1.h:1:27: warning: type ‘struct A’ violates the C++ One Definition Rule
[-Wodr]
1 | template<typename> struct A {};
|
test1.h:1:2: note: in the translation unit for test1.c //<-
test2.h:3:19: note: a different type is defined in another translation unit
3 | template<> struct A<int>
| ^
test2.h:5:7: note: the first difference of corresponding definitions is field
‘x’
5 | int x;
| ^
test2.h:3:19: note: a type with different number of fields is defined in
another translation unit
3 | template<> struct A<int>
| ^
|
test1.h:1:2: note: in the translation unit for test2.c //<-
... or the usual "included from" chain, or somesuch. unsure what the best
approach is, but in general it'd be handy to know at least a pair of mismatched
TUs to be able to debug further