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<glr_state*>(&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<const glr_state*>(&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<semantic_option*>(&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<const semantic_option*>(&raw_);
                                                           ^

See also be6fa942ac.

* data/skeletons/glr2.cc (glr_stack_item): Use a temporary void*
variable to avoid type-punning issues with reinterpret_cast.
This commit is contained in:
Akim Demaille
2020-09-13 13:37:05 +02:00
parent 952a61b62e
commit 5c37f5994d

View File

@@ -1241,24 +1241,33 @@ public:
getOption().~semantic_option(); getOption().~semantic_option();
} }
glr_state& getState() { glr_state& getState ()
YYDASSERT(is_state()); {
return *reinterpret_cast<glr_state*>(&raw_); YYDASSERT (is_state ());
void *yyp = raw_;
return *static_cast<glr_state*> (yyp);
} }
const glr_state& getState() const { const glr_state& getState () const
YYDASSERT(is_state()); {
return *reinterpret_cast<const glr_state*>(&raw_); YYDASSERT (is_state());
const void *yyp = raw_;
return *static_cast<const glr_state*> (yyp);
} }
semantic_option& getOption() { semantic_option& getOption ()
YYDASSERT(!is_state()); {
return *reinterpret_cast<semantic_option*>(&raw_); YYDASSERT (!is_state ());
void *yyp = raw_;
return *static_cast<semantic_option*> (yyp);
} }
const semantic_option& getOption() const { const semantic_option& getOption () const
YYDASSERT(!is_state()); {
return *reinterpret_cast<const semantic_option*>(&raw_); YYDASSERT (!is_state ());
const void *yyp = raw_;
return *static_cast<const semantic_option*> (yyp);
} }
bool is_state() const { bool is_state () const
{
return is_state_; return is_state_;
} }
private: private: