Hi All,
This post is regarding the issue we saw on IBM compiler using BOOST 1.48 version.
Here is the sample code .
*********************************Example Code*************************************
#include <boost/config/warning_disable.hpp>
#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/phoenix_operator.hpp>
#include <boost/spirit/home/phoenix/statement/if.hpp>
#include <boost/spirit/home/phoenix/bind/bind_function.hpp>
#include <iostream>
#include <string>
namespace client
{
namespace qi = boost::spirit::qi;
namespace ascii = boost::spirit::ascii;
namespace phx = boost::phoenix;
struct vars_ : qi::symbols<char, double> {
vars_() {
add("ans" , 0);
}
} vars;
template <typename Iterator>
struct parser : qi::grammar<Iterator, double()>
{
parser() : parser::base_type(function)
{
using qi::eps;
using qi::lit;
using qi::_val;
using qi::_1;
using ascii::char_;
using qi::double_;
using qi::string;
using qi::lexeme;
using boost::phoenix::if_;
using qi::alpha;
using qi::alnum;
MAX = lexeme[string("max") | string("MAX")]; //define max symbol
MIN = lexeme[string("min") | string("MIN")]; //define min symbol
D = lexeme[string("d") | string("D")]; //define distance symbol
function =
expression [_val = _1]
| declaration
| assignment
| ( MAX >> "(" >> function [_val = _1] >>
+(',' >> function [if_(_1 > _val)[_val = _1]]) >> ')') // call : max(function,...)
| ( MIN >> "(" >> function [_val = _1] >>
+(',' >> function [if_(_1 < _val)[_val = _1]]) >> ')') // call : min(function,...)
| ( D >> "(" >> (function >> ',' >> function) >> ')'); // call : d(point1,point2) not implemented yet
expression =
term [_val = _1]
>> *( ('+' >> term [_val += _1])
| ('-' >> term [_val -= _1]));
term =
factor [_val = _1]
>> *( ('*' >> factor [_val *= _1])
| ('/' >> factor [_val /= _1]));
factor =
double_ [_val = _1]
| (vars [_val += _1] )
| '(' >> expression [_val = _1] >> ')'
| ('-' >> factor [_val = -_1])
| ('+' >> factor [_val = _1])
| declaration;
;
assignment =
vars >> '=' >> function;
var_decl =
lexeme [ qi::raw [ ( alpha >> *( alnum | '_' ) ) - vars ] ] //[ phx::bind(vars.add, _1) ]
;
declaration =
"var " >> var_decl >> *( ',' >> var_decl );
}
qi::rule<Iterator, double()> MAX, MIN, D,expression, term, factor,
function, assignment, var_decl, declaration;
};
}
int main()
{
typedef std::string::const_iterator iterator_type;
typedef client::parser<iterator_type> parser;
parser _parser; // Our grammar
std::string str;
double result;
while (std::getline(std::cin, str))
{
if (str.empty() || str[0] == 'q' || str[0] == 'Q')
break;
std::string::const_iterator iter = str.begin();
std::string::const_iterator end = str.end();
bool r = parse(iter, end, _parser, result);
if (r && iter == end)
{
std::cout << "Parsing succeeded\n";
std::cout << "result = " << result << std::endl;
}
else
{
std::string rest(iter, end);
std::cout << "Parsing failed\n";
}
}
return 0;
}
*********************************END**************************************************
When we compile this code on IBM with the compiler :
IBM XL C/C++ for AIX, V11.1 (5724-X13).Version: 11.01.0000.0009
we end up with below error:
xlC -I/usr/include/common/boost -o test2.o -O -c -qnoansialias -qnoro -qchars=signed -q64 -qrtti=all test2.cpp
"/usr/include/common/boost/boost/integer_traits.hpp", line 83.56: 1540-0724 (W) The non-type template argument "-1" of type "T" has wrapped.
"/usr/include/common/boost/boost/spirit/home/support/terminal.hpp", line 231.13: 1540-0407 (S) The base class "to_nonlazy_arg<const char [4]>" contains a circular reference back to "to_nonlazy_arg<const char [4]>".
"/usr/include/boost/boost/spirit/home/support/terminal.hpp", line 288.46: 1540-0700 (I) The previous message was produced while processing "struct boost_1_48_0::spirit::detail::to_nonlazy_arg<const char [4]>".
"/usr/include/common/boost/boost/spirit/home/support/terminal.hpp", line 281.16: 1540-0700 (I) The previous message was produced while processing "struct boost_1_48_0::spirit::terminal<struct boost_1_48_0::spirit::tag::char_code<boost_1_48_0::spirit::tag::string,boost_1_48_0::spirit::char_encoding::standard> >::result_helper<0,const char [4],boost_1_48_0::spirit::unused_type,boost_1_48_0::spirit::unused_type>".
"/usr/include/common/boost/boost/spirit/home/support/terminal.hpp", line 316.16: 1540-0700 (I) The previous message was produced while processing "struct boost_1_48_0::spirit::terminal<struct boost_1_48_0::spirit::tag::char_code<boost_1_48_0::spirit::tag::string,boost_1_48_0::spirit::char_encoding::standard> >::result<const char [4],boost_1_48_0::spirit::unused_type,boost_1_48_0::spirit::unused_type>".
"/usr/include/common/boost/boost/spirit/home/support/terminal.hpp", line 248.12: 1540-0700 (I) The previous message was produced while processing "struct boost_1_48_0::spirit::terminal<boost_1_48_0::spirit::tag::char_code<boost_1_48_0::spirit::tag::string,boost_1_48_0::spirit::char_encoding::standard> >".
"/usr/include/common/boost/boost/spirit/home/support/common_terminals.hpp", line 230.1: 1540-0700 (I) The previous message was produced while processing "boost_1_48_0::spirit::standard::string".
But this code works absolutely fine on g++ Linux.
Is this is a known bug on IBM ?Is any patch available ?
Thanks in advance,
Abc