The following code gives me this error when compiled with avr-g++ compiler
ignoring packed attribute because of unpacked non-POD field 'float& foo::BAR'
what is the reason?
class foo {
public:
foo(float &bar);
private:
float &BAR;
};
foo::foo(float &bar):BAR(bar)
{
}
int main()
{
float something;
foo fooobject(something);
}
It appears to be a compiler bug : https://gcc.gnu.org/bugzilla/show_bug.cgi?id=58798.
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.