https://gcc.gnu.org/bugzilla/show_bug.cgi?id=114372

            Bug ID: 114372
           Summary: Confusing ODR warning with different typedefs
           Product: gcc
           Version: 14.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: ---

a.cxx:
```
#define X265_DEPTH 10
#include "c.h"

struct x265_analysis_distortion_data a;
```

b.cxx:
```
#define X265_DEPTH 1
#include "c.h"

struct x265_analysis_distortion_data b;

int main() {}
```

c.h:
```
#include <stdint.h>

#if X265_DEPTH < 10
        typedef uint32_t sse_t;
#else
        typedef uint64_t sse_t;
#endif

struct x265_analysis_distortion_data {
        sse_t*  ctuDistortion;
};
```

```
$ g++ a.cxx b.cxx -flto -Werror=odr -Werror=lto-type-mismatch
c.h:9:8: error: type ‘struct x265_analysis_distortion_data’ violates the C++
One Definition Rule [-Werror=odr]
    9 | struct x265_analysis_distortion_data {
      |        ^
c.h:9:8: note: a different type is defined in another translation unit
    9 | struct x265_analysis_distortion_data {
      |        ^
c.h:10:17: note: the first difference of corresponding definitions is field
‘ctuDistortion’
   10 |         sse_t*  ctuDistortion;
      |                 ^
c.h:10:17: note: a field of same name but different type is defined in another
translation unit
   10 |         sse_t*  ctuDistortion;
      |                 ^
lto1: some warnings being treated as errors
lto-wrapper: fatal error: g++ returned 1 exit status
compilation terminated.
/usr/lib/gcc/x86_64-pc-linux-gnu/14/../../../../x86_64-pc-linux-gnu/bin/ld:
error: lto-wrapper failed
collect2: error: ld returned 1 exit status
```

It would be nice if we included the sse_t typedef in the output.

Reply via email to