
./boost/spirit/home/classic/core/scanner/scanner.hpp:132: warning: dereferencing pointer 'val' does break strict-aliasing rules
Again, this is normally a bug once optimizations are turned on.
It's the first time I'm seeing this problem in Spirit. We need to investigate this more closely as the warning comes from a template function (and 'val' is a template parameter), so I assume the issue is in the code using Spirit. What file produces this diagnostic?
It's from the serialization build: gcc.compile.c++ /home/john/bin/boost/bin.v2/libs/serialization/build/gcc-4.4.1/release/link-static/threading-multi/xml_wgrammar.o In file included from ./boost/archive/impl/basic_xml_grammar.hpp:59, from libs/serialization/src/xml_wgrammar.cpp:18: ./boost/spirit/core/non_terminal/rule.hpp:18:4: warning: #warning "This header is deprecated. Please use: boost/spirit/include/classic_rule.hpp" In file included from libs/serialization/src/basic_xml_grammar.ipp:20, from libs/serialization/src/xml_wgrammar.cpp:146: ./boost/spirit/core/composite/operators.hpp:18:4: warning: #warning "This header is deprecated. Please use: boost/spirit/include/classic_operators.hpp" In file included from libs/serialization/src/basic_xml_grammar.ipp:21, from libs/serialization/src/xml_wgrammar.cpp:146: ./boost/spirit/core/composite/actions.hpp:18:4: warning: #warning "This header is deprecated. Please use: boost/spirit/include/classic_actions.hpp" In file included from libs/serialization/src/basic_xml_grammar.ipp:22, from libs/serialization/src/xml_wgrammar.cpp:146: ./boost/spirit/core/primitives/numerics.hpp:18:4: warning: #warning "This header is deprecated. Please use: boost/spirit/include/classic_numerics.hpp" In file included from ./boost/spirit/home/classic/core/non_terminal/rule.hpp:33, from ./boost/spirit/include/classic_rule.hpp:11, from ./boost/spirit/core/non_terminal/rule.hpp:25, from ./boost/archive/impl/basic_xml_grammar.hpp:59, from libs/serialization/src/xml_wgrammar.cpp:18: ./boost/spirit/home/classic/core/scanner/scanner.hpp: In member function 'typename boost::spirit::match_result<ScannerT, AttrT>::type boost::spirit::impl::concrete_parser<ParserT, ScannerT, AttrT>::do_parse_virtual(const ScannerT&) const [with ParserT = boost::spirit::alternative<boost::spirit::alternative<boost::spirit::alternative<boost::spirit::rule<boost::spirit::scanner<__gnu_cxx::__normal_iterator<wchar_t*, std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > >, boost::spirit::scanner_policies<boost::spirit::iteration_policy, boost::spirit::match_policy, boost::spirit::action_policy> >, boost::spirit::nil_t, boost::spirit::nil_t>, boost::spirit::rule<boost::spirit::scanner<__gnu_cxx::__normal_iterator<wchar_t*, std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > >, boost::spirit::scanner_policies<boost::spirit::iteration_policy, boost::spirit::match_policy, boost::spirit::action_policy> >, boost::spirit::nil_t, boost::spirit::nil_t> >, boost::spirit::rule<boost::spirit::scanner<__gnu_cxx::__normal_iterator<wchar_t*, std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > >, boost::spirit::scanner_policies<boost::spirit::iteration_policy, boost::spirit::match_policy, boost::spirit::action_policy> >, boost::spirit::nil_t, boost::spirit::nil_t> >, boost::spirit::action<boost::spirit::chset<wchar_t>, boost::archive::xml::append_char<std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > > > >, ScannerT = boost::spirit::scanner<__gnu_cxx::__normal_iterator<wchar_t*, std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > >, boost::spirit::scanner_policies<boost::spirit::iteration_policy, boost::spirit::match_policy, boost::spirit::action_policy> >, AttrT = boost::spirit::nil_t]': ./boost/spirit/home/classic/core/scanner/scanner.hpp:132: warning: dereferencing pointer 'val' does break strict-aliasing rules ./boost/optional/optional.hpp:422: note: initialized from here Note that this warning only shows up in release mode. Harmut, while I have your attention, maybe the largest slew of warnings (in terms of lines of output) are coming from wave, the first one reads: gcc.compile.c++ /home/john/bin/boost/bin.v2/libs/wave/build/gcc-4.4.1/release/threading-multi/instantiate_cpp_exprgrammar.o In file included from ./boost/wave/wave_config.hpp:217, from libs/wave/src/instantiate_cpp_exprgrammar.cpp:11: ./boost/wave/util/flex_string.hpp: In member function 'Storage& boost::wave::util::CowString<Storage, Align>::Data() const [with Storage = boost::wave::util::AllocatorStringStorage<char, std::allocator<char> >, Align = char*]': ./boost/wave/util/flex_string.hpp:1312: instantiated from 'boost::wave::util::CowString<Storage, Align>::~CowString() [with Storage = boost::wave::util::AllocatorStringStorage<char, std::allocator<char> >, Align = char*]' ./boost/wave/util/flex_string.hpp:1519: instantiated from 'boost::wave::util::flex_string<E, T, A, Storage>::~flex_string() [with E = char, T = std::char_traits<char>, A = std::allocator<char>, Storage = boost::wave::util::CowString<boost::wave::util::AllocatorStringStorage<char, std::allocator<char> >, char*>]' ./boost/wave/grammars/cpp_expression_grammar.hpp:769: instantiated from 'static bool boost::wave::grammars::expression_grammar_gen<TokenT>::evaluate(const typename std::list<TokenT, boost::fast_pool_allocator<TokenT, boost::default_user_allocator_new_delete, boost::details::pool::pthread_mutex, 32u> >::const_iterator&, const typename std::list<TokenT, boost::fast_pool_allocator<TokenT, boost::default_user_allocator_new_delete, boost::details::pool::pthread_mutex, 32u> >::const_iterator&, const typename TokenT::position_type&, bool, boost::wave::grammars::value_error&) [with TokenT = boost::wave::cpplexer::lex_token<boost::wave::util::file_position<boost::wave::util::flex_string<char, std::char_traits<char>, std::allocator<char>, boost::wave::util::CowString<boost::wave::util::AllocatorStringStorage<char, std::allocator<char> >, char*> > > >]' libs/wave/src/instantiate_cpp_exprgrammar.cpp:41: instantiated from here ./boost/wave/util/flex_string.hpp:1214: warning: dereferencing type-punned pointer will break strict-aliasing rules ./boost/wave/util/flex_string.hpp: In member function 'void boost::wave::util::CowString<Storage, Align>::MakeUnique() const [with Storage = boost::wave::util::AllocatorStringStorage<char, std::allocator<char> >, Align = char*]': ./boost/wave/util/flex_string.hpp:653: warning: dereferencing pointer '<anonymous>' does break strict-aliasing rules ./boost/wave/util/flex_string.hpp:584: warning: dereferencing pointer '<anonymous>' does break strict-aliasing rules ./boost/wave/util/flex_string.hpp:583: warning: dereferencing pointer '<anonymous>' does break strict-aliasing rules ./boost/wave/util/flex_string.hpp:581: warning: dereferencing pointer '<anonymous>' does break strict-aliasing rules ./boost/wave/util/flex_string.hpp:576: warning: dereferencing pointer '<anonymous>' does break strict-aliasing rules ./boost/wave/util/flex_string.hpp:1243: note: initialized from here ./boost/wave/util/flex_string.hpp:611: warning: dereferencing pointer '<anonymous>' does break strict-aliasing rules ./boost/wave/util/flex_string.hpp:1243: note: initialized from here I'm not going to attempt to post the rest as there are 100's of K of them :-( HTH, John.