From 5c37f5994d82fdf9b1f1400eb88a4fe05cc1bf9c Mon Sep 17 00:00:00 2001 From: Akim Demaille Date: Sun, 13 Sep 2020 13:37:05 +0200 Subject: [PATCH] glr2.cc: avoid type-punning issues On the CI, tests fail with GCC 4.6 to GCC 6 as follows: tests/synclines.at:440: COLUMNS=1000; export COLUMNS; NO_TERM_HYPERLINKS=1; export NO_TERM_HYPERLINKS; bison --color=no -fno-caret -o \"\\\"\".cc \"\\\"\".y tests/synclines.at:440: $CXX $CXXFLAGS $CPPFLAGS $LDFLAGS -o \"\\\"\" \"\\\"\".cc $LIBS stderr: "\"".cc: In member function 'glr_state& glr_stack_item::getState()': "\"".cc:1404:47: error: dereferencing type-punned pointer will break strict-aliasing rules [-Werror=strict-aliasing] return *reinterpret_cast(&raw_); ^ "\"".cc: In member function 'const glr_state& glr_stack_item::getState() const': "\"".cc:1408:53: error: dereferencing type-punned pointer will break strict-aliasing rules [-Werror=strict-aliasing] return *reinterpret_cast(&raw_); ^ "\"".cc: In member function 'semantic_option& glr_stack_item::getOption()': "\"".cc:1413:53: error: dereferencing type-punned pointer will break strict-aliasing rules [-Werror=strict-aliasing] return *reinterpret_cast(&raw_); ^ "\"".cc: In member function 'const semantic_option& glr_stack_item::getOption() const': "\"".cc:1417:59: error: dereferencing type-punned pointer will break strict-aliasing rules [-Werror=strict-aliasing] return *reinterpret_cast(&raw_); ^ See also be6fa942acae21a4a025bac5e339451be6ad136d. * data/skeletons/glr2.cc (glr_stack_item): Use a temporary void* variable to avoid type-punning issues with reinterpret_cast. --- data/skeletons/glr2.cc | 35 ++++++++++++++++++++++------------- 1 file changed, 22 insertions(+), 13 deletions(-) diff --git a/data/skeletons/glr2.cc b/data/skeletons/glr2.cc index 5f6a5c95..f15ab96d 100644 --- a/data/skeletons/glr2.cc +++ b/data/skeletons/glr2.cc @@ -1241,24 +1241,33 @@ public: getOption().~semantic_option(); } - glr_state& getState() { - YYDASSERT(is_state()); - return *reinterpret_cast(&raw_); + glr_state& getState () + { + YYDASSERT (is_state ()); + void *yyp = raw_; + return *static_cast (yyp); } - const glr_state& getState() const { - YYDASSERT(is_state()); - return *reinterpret_cast(&raw_); + const glr_state& getState () const + { + YYDASSERT (is_state()); + const void *yyp = raw_; + return *static_cast (yyp); } - semantic_option& getOption() { - YYDASSERT(!is_state()); - return *reinterpret_cast(&raw_); + semantic_option& getOption () + { + YYDASSERT (!is_state ()); + void *yyp = raw_; + return *static_cast (yyp); } - const semantic_option& getOption() const { - YYDASSERT(!is_state()); - return *reinterpret_cast(&raw_); + const semantic_option& getOption () const + { + YYDASSERT (!is_state ()); + const void *yyp = raw_; + return *static_cast (yyp); } - bool is_state() const { + bool is_state () const + { return is_state_; } private: