GPUOpen-Archive / Anvil

Anvil is a cross-platform framework for Vulkan
MIT License
594 stars 62 forks source link

GCC 8+ does not compile successfully. (-Werror=class-memaccess) #139

Closed thesmallcreeper closed 5 years ago

thesmallcreeper commented 5 years ago

Looks like GCC 8 has some restrictions in the use of memset function. Latest GCC 7 (and Clang) compile just fine. Bellow I paste the error message. By the way my Anvil fork has been modified but only on the window-I/O part of it (so has nothing to do).

/home/snoopy/Desktop/inMyRoom_vulkan/Anvil/src/misc/types_struct.cpp: In static member function ‘static Anvil::MipmapRawData Anvil::MipmapRawData::create_1D(Anvil::ImageAspectFlagBits, uint32_t, uint32_t)’:
/home/snoopy/Desktop/inMyRoom_vulkan/Anvil/src/misc/types_struct.cpp:1462:28: error: ‘void* memset(void*, int, size_t)’ clearing an object of type ‘struct Anvil::MipmapRawData’ with no trivial copy-assignment; use assignment or value-initialization instead [-Werror=class-memaccess]
             sizeof(result) );
                            ^
In file included from /home/snoopy/Desktop/inMyRoom_vulkan/Anvil/include/misc/types_classes.h:25,
                 from /home/snoopy/Desktop/inMyRoom_vulkan/Anvil/include/misc/types.h:276,
                 from /home/snoopy/Desktop/inMyRoom_vulkan/Anvil/include/misc/descriptor_set_create_info.h:26,
                 from /home/snoopy/Desktop/inMyRoom_vulkan/Anvil/src/misc/types_struct.cpp:22:
/home/snoopy/Desktop/inMyRoom_vulkan/Anvil/include/misc/types_struct.h:1640:20: note: ‘struct Anvil::MipmapRawData’ declared here
     typedef struct MipmapRawData
                    ^~~~~~~~~~~~~
/home/snoopy/Desktop/inMyRoom_vulkan/Anvil/src/misc/types_struct.cpp: In static member function ‘static Anvil::MipmapRawData Anvil::MipmapRawData::create_1D_array(Anvil::ImageAspectFlagBits, uint32_t, uint32_t, uint32_t, uint32_t, uint32_t)’:
/home/snoopy/Desktop/inMyRoom_vulkan/Anvil/src/misc/types_struct.cpp:1489:28: error: ‘void* memset(void*, int, size_t)’ clearing an object of type ‘struct Anvil::MipmapRawData’ with no trivial copy-assignment; use assignment or value-initialization instead [-Werror=class-memaccess]
             sizeof(result) );
                            ^
In file included from /home/snoopy/Desktop/inMyRoom_vulkan/Anvil/include/misc/types_classes.h:25,
                 from /home/snoopy/Desktop/inMyRoom_vulkan/Anvil/include/misc/types.h:276,
                 from /home/snoopy/Desktop/inMyRoom_vulkan/Anvil/include/misc/descriptor_set_create_info.h:26,
                 from /home/snoopy/Desktop/inMyRoom_vulkan/Anvil/src/misc/types_struct.cpp:22:
/home/snoopy/Desktop/inMyRoom_vulkan/Anvil/include/misc/types_struct.h:1640:20: note: ‘struct Anvil::MipmapRawData’ declared here
     typedef struct MipmapRawData
                    ^~~~~~~~~~~~~
/home/snoopy/Desktop/inMyRoom_vulkan/Anvil/src/misc/types_struct.cpp: In static member function ‘static Anvil::MipmapRawData Anvil::MipmapRawData::create_2D(Anvil::ImageAspectFlagBits, uint32_t, uint32_t, uint32_t)’:
/home/snoopy/Desktop/inMyRoom_vulkan/Anvil/src/misc/types_struct.cpp:1515:28: error: ‘void* memset(void*, int, size_t)’ clearing an object of type ‘struct Anvil::MipmapRawData’ with no trivial copy-assignment; use assignment or value-initialization instead [-Werror=class-memaccess]
             sizeof(result) );
                            ^
In file included from /home/snoopy/Desktop/inMyRoom_vulkan/Anvil/include/misc/types_classes.h:25,
                 from /home/snoopy/Desktop/inMyRoom_vulkan/Anvil/include/misc/types.h:276,
                 from /home/snoopy/Desktop/inMyRoom_vulkan/Anvil/include/misc/descriptor_set_create_info.h:26,
                 from /home/snoopy/Desktop/inMyRoom_vulkan/Anvil/src/misc/types_struct.cpp:22:
/home/snoopy/Desktop/inMyRoom_vulkan/Anvil/include/misc/types_struct.h:1640:20: note: ‘struct Anvil::MipmapRawData’ declared here
     typedef struct MipmapRawData
                    ^~~~~~~~~~~~~
/home/snoopy/Desktop/inMyRoom_vulkan/Anvil/src/misc/types_struct.cpp: In static member function ‘static Anvil::MipmapRawData Anvil::MipmapRawData::create_2D_array(Anvil::ImageAspectFlagBits, uint32_t, uint32_t, uint32_t, uint32_t, uint32_t)’:
/home/snoopy/Desktop/inMyRoom_vulkan/Anvil/src/misc/types_struct.cpp:1542:28: error: ‘void* memset(void*, int, size_t)’ clearing an object of type ‘struct Anvil::MipmapRawData’ with no trivial copy-assignment; use assignment or value-initialization instead [-Werror=class-memaccess]
             sizeof(result) );
                            ^
In file included from /home/snoopy/Desktop/inMyRoom_vulkan/Anvil/include/misc/types_classes.h:25,
                 from /home/snoopy/Desktop/inMyRoom_vulkan/Anvil/include/misc/types.h:276,
                 from /home/snoopy/Desktop/inMyRoom_vulkan/Anvil/include/misc/descriptor_set_create_info.h:26,
                 from /home/snoopy/Desktop/inMyRoom_vulkan/Anvil/src/misc/types_struct.cpp:22:
/home/snoopy/Desktop/inMyRoom_vulkan/Anvil/include/misc/types_struct.h:1640:20: note: ‘struct Anvil::MipmapRawData’ declared here
     typedef struct MipmapRawData
                    ^~~~~~~~~~~~~
/home/snoopy/Desktop/inMyRoom_vulkan/Anvil/src/misc/types_struct.cpp: In static member function ‘static Anvil::MipmapRawData Anvil::MipmapRawData::create_3D(Anvil::ImageAspectFlagBits, uint32_t, uint32_t, uint32_t, uint32_t, uint32_t)’:
/home/snoopy/Desktop/inMyRoom_vulkan/Anvil/src/misc/types_struct.cpp:1570:28: error: ‘void* memset(void*, int, size_t)’ clearing an object of type ‘struct Anvil::MipmapRawData’ with no trivial copy-assignment; use assignment or value-initialization instead [-Werror=class-memaccess]
             sizeof(result) );
                            ^
In file included from /home/snoopy/Desktop/inMyRoom_vulkan/Anvil/include/misc/types_classes.h:25,
                 from /home/snoopy/Desktop/inMyRoom_vulkan/Anvil/include/misc/types.h:276,
                 from /home/snoopy/Desktop/inMyRoom_vulkan/Anvil/include/misc/descriptor_set_create_info.h:26,
                 from /home/snoopy/Desktop/inMyRoom_vulkan/Anvil/src/misc/types_struct.cpp:22:
/home/snoopy/Desktop/inMyRoom_vulkan/Anvil/include/misc/types_struct.h:1640:20: note: ‘struct Anvil::MipmapRawData’ declared here
     typedef struct MipmapRawData
                    ^~~~~~~~~~~~~
cc1plus: all warnings being treated as errors
make[2]: *** [anvil/CMakeFiles/Anvil.dir/build.make:544: anvil/CMakeFiles/Anvil.dir/src/misc/types_struct.cpp.o] Error 1
make[1]: *** [CMakeFiles/Makefile2:137: anvil/CMakeFiles/Anvil.dir/all] Error 2
make: *** [Makefile:130: all] Error 2
DominikWitczakAMD commented 5 years ago

OK, I think these warnings are actually legit. MipmapRawData holds shared pointers and memsetting these to zero means trouble.

I've fixed this internally and will push out a patch next week.

thesmallcreeper commented 5 years ago

Dude, thank you. I will try compile with GCC 8.0 and close it if everything is fine. (wait till I reboot to ubuntu)

thesmallcreeper commented 5 years ago

Hey had a look at code and the fix is way easier than you might think. Just delete memsets at:

There is already a default constructor that set the values to zero. GCC 8+ looks like dislike memsets.

thesmallcreeper commented 5 years ago

Did a pull request. Now should be fine. Feel free to close this issue if you accept my pull request ;)

DominikWitczakAMD commented 5 years ago

Thanks for contributing the PR. we already had this patched up internally which is why I did not merge your changes. Still, appreciate your work on this.

Fixed in the latest version.