C ++ ODR Warning с включенным lto с использованием вложенных структур - PullRequest
0 голосов
/ 08 сентября 2018

После включения lto в одном из моих проектов компилятор начал выдавать мне предупреждения за нарушения lto. После небольшого тестирования все сводится к этой конструкции.

typedef struct {
    typedef struct {
    } test_t;
    std::vector<test_t> t;
} test2_t;

Как только я изменю его на

struct test2_t {
    typedef struct {
    } test_t;
    std::vector<test_t> t;
};

или

typedef struct {
    typedef struct {
    } test_t;
    test_t t;
} test2_t;

предупреждение уходит, но я не совсем понимаю, почему. Я предполагаю, что он рассматривает анонимную структуру как разные типы в разных файлах, но я не ожидал бы предупреждения, так как это общий случай использования. Обратите внимание, что не имеет значения, если я изменю внутренний typedef, но оставлю внешний на месте. Также не имеет значения, содержит ли test_t элементы или нет.

  • В чем причина этого предупреждения?
  • Ожидается ли такое поведение?
  • Может ли это быть ошибкой STL, поскольку она отлично работает без вектора?
...