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.

Reply via email to