После включения 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, поскольку она отлично работает без вектора?