https://gcc.gnu.org/bugzilla/show_bug.cgi?id=116094
Bug ID: 116094 Summary: Missing -Wodr diagnostic Product: gcc Version: 15.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: lto Assignee: unassigned at gcc dot gnu.org Reporter: sjames at gcc dot gnu.org Target Milestone: --- This came up when reducing PR114790. I'm going to use pinskia's testcase from https://gcc.gnu.org/bugzilla/show_bug.cgi?id=114790#c8. t1.cc: ``` struct APITracerContext { virtual ~APITracerContext() = default; virtual void releaseActivetracersList() = 0; }; struct APITracerContextImp : APITracerContext { ~APITracerContextImp() override; void releaseActivetracersList() override; }; struct APITracerContextImp globalAPITracerContextImp; struct APITracerContextImp *pGlobalAPITracerContextImp = &globalAPITracerContextImp; APITracerContextImp::~APITracerContextImp() {} ``` t2.cc: ``` struct APITracerContext { virtual void releaseActivetracersList() = 0; }; extern struct APITracerContextImp *pGlobalAPITracerContextImp; struct APITracerContextImp : APITracerContext { void releaseActivetracersList();}; int g(); inline int apiTracerWrapperImp( ) { for (int i = 0; i < g(); i++) pGlobalAPITracerContextImp->releaseActivetracersList(); } __attribute__((visibility("default"))) int zeCommandListAppendMemoryCopyTracing() { return apiTracerWrapperImp( ); } ``` This testcase violates ODR because: 1) APITracerContext is defined differently; 2) APITracerContextImp is defined differently. with e.g. `gcc -Wfatal-errors -fvisibility=hidden -shared t1.cc t2.cc -o t.so -fPIC -O2 -flto -Wodr", we don't get an ODR diagnostic.