diff --git a/configure.ac b/configure.ac index f10dabc1..05a8d920 100644 --- a/configure.ac +++ b/configure.ac @@ -144,8 +144,6 @@ if test "$enable_gcc_warnings" = yes; then done # Clang++ 3.2+ reject C code generated by Flex. gl_WARN_ADD([-Wno-null-conversion], [WARN_NO_NULL_CONVERSION_CXXFLAGS]) - # Variants break strict aliasing analysis. - gl_WARN_ADD([-fno-strict-aliasing], [NO_STRICT_ALIAS_CXXFLAGS]) CXXFLAGS=$save_CXXFLAGS AC_LANG_POP([C++]) fi diff --git a/data/variant.hh b/data/variant.hh index 047e641b..e2a537ad 100644 --- a/data/variant.hh +++ b/data/variant.hh @@ -142,7 +142,10 @@ m4_define([b4_variant_define], {]b4_parse_assert_if([ YYASSERT (tname == typeid (T).name ()); YYASSERT (sizeof (T) <= S);])[ - return reinterpret_cast (buffer.raw); + { + void *dummy = buffer.raw; + return *static_cast (dummy); + } } /// Const accessor to a built \a T (for %printer). @@ -152,7 +155,10 @@ m4_define([b4_variant_define], {]b4_parse_assert_if([ YYASSERT (tname == typeid (T).name ()); YYASSERT (sizeof (T) <= S);])[ - return reinterpret_cast (buffer.raw); + { + const void *dummy = buffer.raw; + return *static_cast (dummy); + } } /// Swap the content with \a other, of same type. diff --git a/doc/bison.texi b/doc/bison.texi index 7a36f854..1218b583 100644 --- a/doc/bison.texi +++ b/doc/bison.texi @@ -10268,14 +10268,6 @@ therefore, since, as far as we know, @code{double} is the most demanding type on all platforms, alignments are enforced for @code{double} whatever types are actually used. This may waste space in some cases. -@item -Our implementation is not conforming with strict aliasing rules. Alias -analysis is a technique used in optimizing compilers to detect when two -pointers are disjoint (they cannot ``meet''). Our implementation breaks -some of the rules that G++ 4.4 uses in its alias analysis, so @emph{strict -alias analysis must be disabled}. Use the option -@option{-fno-strict-aliasing} to compile the generated parser. - @item There might be portability issues we are not aware of. @end itemize diff --git a/examples/local.mk b/examples/local.mk index 3185976a..05e28e1b 100644 --- a/examples/local.mk +++ b/examples/local.mk @@ -17,7 +17,6 @@ dist_noinst_SCRIPTS = examples/extexi examples/test TEST_LOG_COMPILER = $(top_srcdir)/examples/test AM_CXXFLAGS = \ - $(NO_STRICT_ALIAS_CXXFLAGS) \ $(WARN_CXXFLAGS) $(WARN_CXXFLAGS_TEST) $(WERROR_CXXFLAGS) ## ------------ ## diff --git a/tests/atlocal.in b/tests/atlocal.in index 439a2615..3a9f873b 100644 --- a/tests/atlocal.in +++ b/tests/atlocal.in @@ -47,9 +47,6 @@ NO_WERROR_CXXFLAGS='@CXXFLAGS@ @WARN_CXXFLAGS@ @WARN_CXXFLAGS_TEST@' CFLAGS="$NO_WERROR_CFLAGS @WERROR_CFLAGS@" CXXFLAGS="$NO_WERROR_CXXFLAGS @WERROR_CXXFLAGS@" -# C++ variants break strict aliasing analysis. -NO_STRICT_ALIAS_CXXFLAGS='@NO_STRICT_ALIAS_CXXFLAGS@' - # If 'exit 77'; skip all C++ tests; otherwise ':'. BISON_CXX_WORKS='@BISON_CXX_WORKS@' diff --git a/tests/c++.at b/tests/c++.at index a21fb4eb..d36e3225 100644 --- a/tests/c++.at +++ b/tests/c++.at @@ -93,7 +93,7 @@ int main() ]]) AT_BISON_CHECK([-o list.cc list.yy]) -AT_COMPILE_CXX([list], [$NO_STRICT_ALIAS_CXXFLAGS list.cc]) +AT_COMPILE_CXX([list], [list.cc]) AT_PARSER_CHECK([./list], 0, [], [12 123 @@ -251,7 +251,7 @@ namespace yy ]]) AT_BISON_CHECK([-o list.cc list.yy]) -AT_COMPILE_CXX([list], [$NO_STRICT_ALIAS_CXXFLAGS list.cc]) +AT_COMPILE_CXX([list], [list.cc]) AT_PARSER_CHECK([./list], 0, [(0, 1, 2, 4) ]) @@ -804,7 +804,7 @@ main (int argc, const char *argv[]) } ]]) AT_BISON_CHECK([[-o input.cc --report=all input.yy]]) -AT_COMPILE_CXX([input], [[$NO_STRICT_ALIAS_CXXFLAGS input.cc]]) +AT_COMPILE_CXX([[input]]) AT_PARSER_CHECK([[./input aaaas]], [[2]], [[]], [[exception caught: reduction