mirror of
https://github.com/pybind/pybind11.git
synced 2024-11-22 05:05:11 +00:00
Enable -Wstrict-aliasing warning (#2816)
* Enable -Wstrict-aliasing warning * Narrow down the scope of -Wstrict-aliasing * Go home, MSVC, you're drunk * Make sure "pragma GCC" is not executed on ICC Co-authored-by: Yannick Jadoul <yannick.jadoul@belgacom.net>
This commit is contained in:
parent
c4b0dc7cdd
commit
5cd3750757
@ -35,7 +35,6 @@
|
||||
# pragma GCC diagnostic ignored "-Wunused-but-set-parameter"
|
||||
# pragma GCC diagnostic ignored "-Wunused-but-set-variable"
|
||||
# pragma GCC diagnostic ignored "-Wmissing-field-initializers"
|
||||
# pragma GCC diagnostic ignored "-Wstrict-aliasing"
|
||||
# pragma GCC diagnostic ignored "-Wattributes"
|
||||
# if __GNUC__ >= 7
|
||||
# pragma GCC diagnostic ignored "-Wnoexcept-type"
|
||||
@ -49,10 +48,18 @@
|
||||
#include "detail/init.h"
|
||||
|
||||
#include <memory>
|
||||
#include <new>
|
||||
#include <vector>
|
||||
#include <string>
|
||||
#include <utility>
|
||||
|
||||
#if defined(__cpp_lib_launder) && !(defined(_MSC_VER) && (_MSC_VER < 1914))
|
||||
# define PYBIND11_STD_LAUNDER std::launder
|
||||
# define PYBIND11_HAS_STD_LAUNDER 1
|
||||
#else
|
||||
# define PYBIND11_STD_LAUNDER
|
||||
# define PYBIND11_HAS_STD_LAUNDER 0
|
||||
#endif
|
||||
#if defined(__GNUG__) && !defined(__clang__)
|
||||
# include <cxxabi.h>
|
||||
#endif
|
||||
@ -151,8 +158,21 @@ protected:
|
||||
#if defined(__GNUG__) && __GNUC__ >= 6 && !defined(__clang__) && !defined(__INTEL_COMPILER)
|
||||
# pragma GCC diagnostic pop
|
||||
#endif
|
||||
#if defined(__GNUG__) && !PYBIND11_HAS_STD_LAUNDER && !defined(__INTEL_COMPILER)
|
||||
# pragma GCC diagnostic push
|
||||
# pragma GCC diagnostic ignored "-Wstrict-aliasing"
|
||||
#endif
|
||||
// UB without std::launder, but without breaking ABI and/or
|
||||
// a significant refactoring it's "impossible" to solve.
|
||||
if (!std::is_trivially_destructible<Func>::value)
|
||||
rec->free_data = [](function_record *r) { ((capture *) &r->data)->~capture(); };
|
||||
rec->free_data = [](function_record *r) {
|
||||
auto data = PYBIND11_STD_LAUNDER((capture *) &r->data);
|
||||
(void) data;
|
||||
data->~capture();
|
||||
};
|
||||
#if defined(__GNUG__) && !PYBIND11_HAS_STD_LAUNDER && !defined(__INTEL_COMPILER)
|
||||
# pragma GCC diagnostic pop
|
||||
#endif
|
||||
} else {
|
||||
rec->data[0] = new capture { std::forward<Func>(f) };
|
||||
rec->free_data = [](function_record *r) { delete ((capture *) r->data[0]); };
|
||||
|
Loading…
Reference in New Issue
Block a user