I don't know about your case in particular, but just to clarify for other Googlers, the warning makes sense when you actually __attribute__((packed))
as in:
#include <type_traits>
struct C {
int i;
};
struct D : C {
int j;
};
struct E {
D d;
} __attribute__((packed));
static_assert(std::is_pod<C>());
static_assert(!std::is_pod<D>());
static_assert(!std::is_pod<E>());
then with GCC 8.1.0:
g++-8 -std=c++17 -c a.cpp
it warns:
a.cpp:12:7: warning: ignoring packed attribute because of unpacked non-POD field āD E::dā
D d;
^
because as explained at: What are POD types in C++? the data contained inside PODs is not well defined by the standard, and therefore intuitively __attribute__((packed))
won't give you much in that case.
In particular, the reference member in your example makes foo
non-POD as of C++17, although of course you are not using __attribute__((packed))
so the warning does not make sense.
I cannot reproduce the warning with your code on Ubuntu 16.04 AMD64.