mirror of
https://git.savannah.gnu.org/git/bison.git
synced 2026-03-09 04:13:03 +00:00
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:
@@ -1241,24 +1241,33 @@ public:
|
||||
getOption().~semantic_option();
|
||||
}
|
||||
|
||||
glr_state& getState() {
|
||||
YYDASSERT(is_state());
|
||||
return *reinterpret_cast<glr_state*>(&raw_);
|
||||
glr_state& getState ()
|
||||
{
|
||||
YYDASSERT (is_state ());
|
||||
void *yyp = raw_;
|
||||
return *static_cast<glr_state*> (yyp);
|
||||
}
|
||||
const glr_state& getState() const {
|
||||
YYDASSERT(is_state());
|
||||
return *reinterpret_cast<const glr_state*>(&raw_);
|
||||
const glr_state& getState () const
|
||||
{
|
||||
YYDASSERT (is_state());
|
||||
const void *yyp = raw_;
|
||||
return *static_cast<const glr_state*> (yyp);
|
||||
}
|
||||
|
||||
semantic_option& getOption() {
|
||||
YYDASSERT(!is_state());
|
||||
return *reinterpret_cast<semantic_option*>(&raw_);
|
||||
semantic_option& getOption ()
|
||||
{
|
||||
YYDASSERT (!is_state ());
|
||||
void *yyp = raw_;
|
||||
return *static_cast<semantic_option*> (yyp);
|
||||
}
|
||||
const semantic_option& getOption() const {
|
||||
YYDASSERT(!is_state());
|
||||
return *reinterpret_cast<const semantic_option*>(&raw_);
|
||||
const semantic_option& getOption () const
|
||||
{
|
||||
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_;
|
||||
}
|
||||
private:
|
||||
|
||||
Reference in New Issue
Block a user