Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

ignoring packed attribute because of unpacked non-POD field

Tags:

c++

types

oop

g++

avr

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);  
}
like image 514
mic Avatar asked Feb 02 '16 11:02

mic


2 Answers

It appears to be a compiler bug : https://gcc.gnu.org/bugzilla/show_bug.cgi?id=58798.

like image 81
matovitch Avatar answered Nov 08 '22 04:11

matovitch


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.