I'm trying to get started with boost xpressive, but have problems with this simple attempt... #pragma warning(disable:4180) // MSVC: qualifier applied to function type has no meaning; ignored #pragma warning(disable:4224) // MSVC: nonstandard extension used : formal parameter 'value' was previously defined as a type #pragma warning(disable:4996) // MSVC: 'std::transform' was declared deprecated #include <boost/xpressive/xpressive_static.hpp> void f() { using namespace boost::xpressive; sregex rex = as_xpr('k'); } ...which gives these errors... ------ Build started: Project: miscTest, Configuration: Debug Win32 ------ Compiling... main.cpp c:\boost_1_45_0\boost\xpressive\detail\static\transforms\as_matcher.hpp(27) : error C2146: syntax error : missing ';' before identifier 'data_type' c:\boost_1_45_0\boost\xpressive\detail\static\transforms\as_sequence.hpp(31) : see reference to class template instantiation 'boost::xpressive::grammar_detail::as_matcher::impl<Expr,State,Data>' being compiled with [ Expr=const boost::proto::exprns_::expr<boost::proto::tag::terminal,boost::proto::argsns_::term<char>,0> &, State=boost::xpressive::detail::end_xpression, Data=boost::xpressive::detail::xpression_visitor<std::_String_const_iterator<char,std::char_traits<char>,std::allocator<char>>,boost::mpl::false_,traits_type> ] c:\boost_1_45_0\boost\proto\matches.hpp(828) : see reference to class template instantiation 'boost::xpressive::grammar_detail::in_sequence<Grammar>::impl<Expr,State,Data>' being compiled with [ Grammar=boost::xpressive::grammar_detail::as_matcher, Expr=const boost::proto::exprns_::expr<boost::proto::tag::terminal,boost::proto::argsns_::term<char>,0> &, State=boost::xpressive::detail::end_xpression, Data=boost::xpressive::detail::xpression_visitor<std::_String_const_iterator<char,std::char_traits<char>,std::allocator<char>>,boost::mpl::false_,traits_type> ] c:\boost_1_45_0\boost\xpressive\detail\static\compile.hpp(45) : see reference to class template instantiation 'boost::proto::switch_<Cases>::impl<Expr,State,Data>' being compiled with [ Cases=boost::xpressive::grammar_detail::Cases<char,boost::xpressive::Grammar<char>>, Expr=const boost::proto::exprns_::expr<boost::proto::tag::terminal,boost::proto::argsns_::term<char>,0> &, State=boost::xpressive::detail::end_xpression, Data=visitor_type & ] c:\boost_1_45_0\boost\xpressive\detail\static\compile.hpp(79) : see reference to function template instantiation 'void boost::xpressive::detail::static_compile_impl2<Xpr,BidiIter,traits_type>(const Xpr &,const boost::shared_ptr<T> &,const Traits &)' being compiled with [ Xpr=boost::proto::exprns_::expr<boost::proto::tag::terminal,boost::proto::argsns_::term<char>,0>, BidiIter=std::_String_const_iterator<char,std::char_traits<char>,std::allocator<char>>, T=boost::xpressive::detail::regex_impl<std::_String_const_iterator<char,std::char_traits<char>,std::allocator<char>>>, Traits=traits_type ] c:\boost_1_45_0\boost\xpressive\detail\static\compile.hpp(99) : see reference to function template instantiation 'void boost::xpressive::detail::static_compile_impl1<Xpr,BidiIter>(const Xpr &,const boost::shared_ptr<T> &)' being compiled with [ Xpr=boost::proto::exprns_::expr<boost::proto::tag::terminal,boost::proto::argsns_::term<char>,0>, BidiIter=std::_String_const_iterator<char,std::char_traits<char>,std::allocator<char>>, T=boost::xpressive::detail::regex_impl<std::_String_const_iterator<char,std::char_traits<char>,std::allocator<char>>> ] c:\boost_1_45_0\boost\xpressive\basic_regex.hpp(252) : see reference to function template instantiation 'void boost::xpressive::detail::static_compile<Expr,BidiIter>(const Xpr &,const boost::shared_ptr<T> &)' being compiled with [ Expr=boost::proto::exprns_::expr<boost::proto::tag::terminal,boost::proto::argsns_::term<char>,0>, BidiIter=std::_String_const_iterator<char,std::char_traits<char>,std::allocator<char>>, Xpr=boost::proto::exprns_::expr<boost::proto::tag::terminal,boost::proto::argsns_::term<char>,0>, T=boost::xpressive::detail::regex_impl<std::_String_const_iterator<char,std::char_traits<char>,std::allocator<char>>> ] c:\boost_1_45_0\boost\xpressive\basic_regex.hpp(118) : see reference to function template instantiation 'void boost::xpressive::basic_regex<BidiIter>::compile_<Expr>(const Expr &,boost::mpl::true_)' being compiled with [ BidiIter=std::_String_const_iterator<char,std::char_traits<char>,std::allocator<char>>, Expr=boost::proto::exprns_::expr<boost::proto::tag::terminal,boost::proto::argsns_::term<char>,0> ] c:\othertrunk\other\misc\src\main.cpp(12) : see reference to function template instantiation 'boost::xpressive::basic_regex<BidiIter>::basic_regex<boost::proto::exprns_::expr<Tag,Args,Arity>>(const Expr &)' being compiled with [ BidiIter=std::_String_const_iterator<char,std::char_traits<char>,std::allocator<char>>, Tag=boost::proto::tag::terminal, Args=boost::proto::argsns_::term<char>, Arity=0, Expr=boost::proto::exprns_::expr<boost::proto::tag::terminal,boost::proto::argsns_::term<char>,0> ] c:\boost_1_45_0\boost\xpressive\detail\static\transforms\as_matcher.hpp(27) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int c:\boost_1_45_0\boost\xpressive\detail\static\transforms\as_matcher.hpp(27) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int c:\boost_1_45_0\boost\xpressive\detail\static\transforms\as_matcher.hpp(30) : error C2653: 'data_type' : is not a class or namespace name c:\boost_1_45_0\boost\xpressive\detail\static\transforms\as_matcher.hpp(30) : fatal error C1903: unable to recover from previous error(s); stopping compilation Build log was saved at "file://c:\otherTrunk\libs\misc\test\vc\Debug\BuildLog.htm" miscTest - 5 error(s), 0 warning(s) ========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ========== tia, Louis.
On 5/5/2011 8:59 PM, Louis Lavery wrote:
I'm trying to get started with boost xpressive, but have problems with this simple attempt...
#pragma warning(disable:4180) // MSVC: qualifier applied to function type has no meaning; ignored #pragma warning(disable:4224) // MSVC: nonstandard extension used : formal parameter 'value' was previously defined as a type #pragma warning(disable:4996) // MSVC: 'std::transform' was declared deprecated
Do you really need these pragmas? 'std::transform' was declared deprecated? If you're really seeing this warning, something might be wrong with your setup.
#include <boost/xpressive/xpressive_static.hpp>
void f() { using namespace boost::xpressive;
sregex rex = as_xpr('k'); }
...which gives these errors...
------ Build started: Project: miscTest, Configuration: Debug Win32 ------ Compiling... main.cpp c:\boost_1_45_0\boost\xpressive\detail\static\transforms\as_matcher.hpp(27) : error C2146: syntax error : missing ';' before identifier 'data_type'
<snip> What version of MSVC is this? I'm sorry, I can't reproduce this error on trunk. Are you really using Boost 1.45.0 like the error message suggests? I'm attempting to download it now, but I'm on a slow, unreliable connection. It could be a while. Can you try this regex: sregex rex = as_xpr("foo"); That's xpressive's very first test case. I guarantee when 1.45.0 went out the door, this regex worked with every version of MSVC above 7.0. -- Eric Niebler BoostPro Computing http://www.boostpro.com
On 06/05/2011 04:03, Eric Niebler wrote:
On 5/5/2011 8:59 PM, Louis Lavery wrote: [snip]
What version of MSVC is this?
Visual C++ 2008 express
I'm sorry, I can't reproduce this error on trunk. Are you really using Boost 1.45.0 like the error message suggests? I'm attempting to download it now, but I'm on a slow, unreliable connection. It could be a while.
Can you try this regex:
sregex rex = as_xpr("foo");
That's xpressive's very first test case. I guarantee when 1.45.0 went out the door, this regex worked with every version of MSVC above 7.0.
I've tried this... #pragma warning(disable:4996) #include <boost/xpressive/xpressive.hpp> int main() { using namespace boost::xpressive; sregex rex = as_xpr("foo"); return 0; } ...which, with langauge extensions enabled, gives one warning... c:\boost_1_45_0\boost\proto\expr.hpp(98) : warning C4701: potentially uninitialized local variable 'that' used ...which refers to this function... template<typename T, typename Expr, typename Arg0, std::size_t N> Expr make_terminal(T const(&t)[N], Expr *, proto::term<Arg0[N]> *) { Expr that; for(std::size_t i = 0; i < N; ++i) { that.child0[i] = t[i]; } return that; } ...at the top of the file contain that function is... /////////////////////////////////////////////////////////////////////////////// /// \file expr.hpp /// Contains definition of expr\<\> class template. // // Copyright 2008 Eric Niebler. Distributed under the Boost // Software License, Version 1.0. (See accompanying file // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) #ifndef BOOST_PROTO_EXPR_HPP_EAN_04_01_2005 #define BOOST_PROTO_EXPR_HPP_EAN_04_01_2005 ...I don't know if that gives you a clue as to what version I have. But the boost I have is in directory boost_1_45_0 (I don't remember if I created that directory or the install script) and the documentation is for release 1.45.0. Apart from the C4701 warning (which I can suppress for now) it seems happy compiling stuff like this... sregex rex = as_xpr("foo") >> _d >> "xyz"; ...so long as I enable language extensions and use the pragma. I'm happy with this for now as I expect to move on to vc++ 2010 in the near future. Although I'd like to know if it's necessary to enable language extensions with later versions of the compiler, do you know? Thanks for you help, and for xpressive. Louis.
On 5/7/2011 1:56 AM, Louis Lavery wrote:
Apart from the C4701 warning (which I can suppress for now) it seems happy compiling stuff like this...
sregex rex = as_xpr("foo") >> _d >> "xyz";
...so long as I enable language extensions and use the pragma.
Oh, you were using /Za? This switch is useless. Even Microsoft's own headers don't compiler with language extensions disabled. I used to work in the MSVC group at Microsoft. Every time a customer complained about /Za, they were told to simply stop using it. -- Eric Niebler BoostPro Computing http://www.boostpro.com
On 07/05/2011 11:27, Eric Niebler wrote:
On 5/7/2011 1:56 AM, Louis Lavery wrote:
Apart from the C4701 warning (which I can suppress for now) it seems happy compiling stuff like this...
sregex rex = as_xpr("foo")>> _d>> "xyz";
...so long as I enable language extensions and use the pragma.
Oh, you were using /Za? This switch is useless.
It changes the compiler's behaviour so is surely not completely useless? Even Microsoft's own
headers don't compiler with language extensions disabled.
As far as I remember I've always used /Za with out any problems, maybe I've been lucky and never needed to #include the MS headers that require no /Za. I tend to use just the std containers, algorithm, iostream, string and such, just std C++ stuff. Maybe by "Microsoft's own headers" you mean those specific to Microsoft, in which case case I can see that /Za should be off. But then I don't use MS not standard code/headers as I need my code to compile under other compilers - so I want to stick to pure C++. I used to work
in the MSVC group at Microsoft. Every time a customer complained about /Za, they were told to simply stop using it.
Well, yeah, they would say that wouldn't they. I would be a lot happier using xpressive if I didn't have to enable language extensions. I'm not sure exactly how I'm going to use it. It might be that I build a static lib, using xpressive, that I can link to and so still use /Za in my main code. If that restricts the power of xpressive and I need to use the templates directly, and so have to enable MS language extensions, I'll have to have a rethink. Please don't take this as criticism of xpressive (it's meant to be constructive criticism at worst), I'm keen on it. From what I've seen so far it's intuitive and easy to use. Louis.
Louis Lavery wrote:
On 07/05/2011 11:27, Eric Niebler wrote:
On 5/7/2011 1:56 AM, Louis Lavery wrote:
Apart from the C4701 warning (which I can suppress for now) it seems happy compiling stuff like this...
sregex rex = as_xpr("foo")>> _d>> "xyz";
...so long as I enable language extensions and use the pragma.
Oh, you were using /Za? This switch is useless.
It changes the compiler's behaviour so is surely not completely useless?
Even Microsoft's own
headers don't compiler with language extensions disabled.
As far as I remember I've always used /Za with out any problems, maybe I've been lucky and never needed to #include the MS headers that require no /Za. I tend to use just the std containers, algorithm, iostream, string and such, just std C++ stuff.
Maybe by "Microsoft's own headers" you mean those specific to Microsoft, in which case case I can see that /Za should be off. But then I don't use MS not standard code/headers as I need my code to compile under other compilers - so I want to stick to pure C++.
Unless you are using STLPort, you are using Microsoft headers already, albeit probably less sensitive to /Za. Jeff
On 5/7/2011 7:42 PM, Louis Lavery wrote:
On 07/05/2011 11:27, Eric Niebler wrote:
On 5/7/2011 1:56 AM, Louis Lavery wrote:
Apart from the C4701 warning (which I can suppress for now) it seems happy compiling stuff like this...
sregex rex = as_xpr("foo")>> _d>> "xyz";
...so long as I enable language extensions and use the pragma.
Oh, you were using /Za? This switch is useless.
It changes the compiler's behaviour so is surely not completely useless?
It's worse than useless. See below.
Even Microsoft's own headers don't compiler with language extensions disabled.
As far as I remember I've always used /Za with out any problems, maybe I've been lucky and never needed to #include the MS headers that require no /Za. I tend to use just the std containers, algorithm, iostream, string and such, just std C++ stuff.
Maybe by "Microsoft's own headers" you mean those specific to Microsoft, in which case case I can see that /Za should be off. But then I don't use MS not standard code/headers as I need my code to compile under other compilers - so I want to stick to pure C++.
I used to work in the MSVC group at Microsoft. Every time a customer complained about /Za, they were told to simply stop using it.
Well, yeah, they would say that wouldn't they.
I would be a lot happier using xpressive if I didn't have to enable language extensions. I'm not sure exactly how I'm going to use it. It might be that I build a static lib, using xpressive, that I can link to and so still use /Za in my main code. If that restricts the power of xpressive and I need to use the templates directly, and so have to enable MS language extensions, I'll have to have a rethink.
Please don't take this as criticism of xpressive (it's meant to be constructive criticism at worst), I'm keen on it. From what I've seen so far it's intuitive and easy to use.
The /Za switch breaks standard-conforming code. I even filed a bug about it: https://connect.microsoft.com/VisualStudio/feedback/details/486253/name-look... This is exactly the problem in xpressive that you're running into. (I just confirmed it.) As you can see, that bug was closed "won't fix." I'll say it again: don't use /Za for ANYTHING. It's broken. -- Eric Niebler BoostPro Computing http://www.boostpro.com
-----Original Message----- From: boost-users-bounces@lists.boost.org [mailto:boost-users-bounces@lists.boost.org] On Behalf Of Eric Niebler Sent: Saturday, May 07, 2011 2:57 PM To: boost-users@lists.boost.org Subject: Re: [Boost-users] xpressive
On 5/7/2011 7:42 PM, Louis Lavery wrote:
On 07/05/2011 11:27, Eric Niebler wrote:
On 5/7/2011 1:56 AM, Louis Lavery wrote:
Apart from the C4701 warning (which I can suppress for now) it seems happy compiling stuff like this...
sregex rex = as_xpr("foo")>> _d>> "xyz";
...so long as I enable language extensions and use the pragma.
Oh, you were using /Za? This switch is useless.
It changes the compiler's behaviour so is surely not completely useless?
It's worse than useless. See below.
Even Microsoft's own headers don't compiler with language extensions disabled.
As far as I remember I've always used /Za with out any problems, maybe I've been lucky and never needed to #include the MS headers that require no /Za. I tend to use just the std containers, algorithm, iostream, string and such, just std C++ stuff.
Maybe by "Microsoft's own headers" you mean those specific to Microsoft, in which case case I can see that /Za should be off. But then I don't use MS not standard code/headers as I need my code to compile under other compilers - so I want to stick to pure C++.
I used to work in the MSVC group at Microsoft. Every time a customer complained about /Za, they were told to simply stop using it.
Well, yeah, they would say that wouldn't they.
I would be a lot happier using xpressive if I didn't have to enable language extensions. I'm not sure exactly how I'm going to use it. It might be that I build a static lib, using xpressive, that I can link to and so still use /Za in my main code. If that restricts the power of xpressive and I need to use the templates directly, and so have to enable MS language extensions, I'll have to have a rethink.
Please don't take this as criticism of xpressive (it's meant to be constructive criticism at worst), I'm keen on it. From what I've seen so far it's intuitive and easy to use.
The /Za switch breaks standard-conforming code. I even filed a bug about it:
https://connect.microsoft.com/VisualStudio/feedback/details/486253/name-look...
This is exactly the problem in xpressive that you're running into. (I just confirmed it.) As you can see, that bug was closed "won't fix."
I'll say it again: don't use /Za for ANYTHING. It's broken.
I second this (from recent bad experience), and have updated and strengthened the recommendations at https://svn.boost.org/trac/boost/wiki/Guidelines/WarningsGuidelines to say loudly "Don't use /Za for ANYTHING. It's BROKEN - and won't be fixed." Paul --- Paul A. Bristow, Prizet Farmhouse, Kendal LA8 8AB UK +44 1539 561830 07714330204 pbristow@hetp.u-net.com
On Thu, May 5, 2011 at 8:03 PM, Eric Niebler <eric@boostpro.com> wrote:
On 5/5/2011 8:59 PM, Louis Lavery wrote:
I'm trying to get started with boost xpressive, but have problems with this simple attempt...
#pragma warning(disable:4180) // MSVC: qualifier applied to function type has no meaning; ignored #pragma warning(disable:4224) // MSVC: nonstandard extension used : formal parameter 'value' was previously defined as a type #pragma warning(disable:4996) // MSVC: 'std::transform' was declared deprecated
Do you really need these pragmas? 'std::transform' was declared deprecated? If you're really seeing this warning, something might be wrong with your setup.
The deprecated std::transform is likely due to VC++ pushing you to use their non-standard "safe" functions that perform bounds checking. You can disable that with a #define _SCL_SECURE_NO_WARNINGS before you include any headers. That doesn't account for the other errors, though. -- Cory Nelson http://int64.org
On 07/05/2011 00:08, Cory Nelson wrote:
On Thu, May 5, 2011 at 8:03 PM, Eric Niebler<eric@boostpro.com> wrote:
On 5/5/2011 8:59 PM, Louis Lavery wrote:
I'm trying to get started with boost xpressive, but have problems with this simple attempt...
#pragma warning(disable:4180) // MSVC: qualifier applied to function type has no meaning; ignored #pragma warning(disable:4224) // MSVC: nonstandard extension used : formal parameter 'value' was previously defined as a type #pragma warning(disable:4996) // MSVC: 'std::transform' was declared deprecated
Do you really need these pragmas? 'std::transform' was declared deprecated? If you're really seeing this warning, something might be wrong with your setup.
The deprecated std::transform is likely due to VC++ pushing you to use their non-standard "safe" functions that perform bounds checking. You can disable that with a #define _SCL_SECURE_NO_WARNINGS before you include any headers. That doesn't account for the other errors, though.
Yes, I have now got VC++ to compile it with _SCL_SECURE_NO_WARNINGS on the command line to suppress the warnings, I don't want it in the code itself as I'm also compiling using gcc (4.4.1) (that doesn't seem to have any trouble with xpressive). The only thing that really bothers me is that I'm compiling under VC++ with language extensions enabled, I would prefer to have them turned off. BTW, I'm compiling with warnings at level 4. thanks, Louis.
participants (5)
-
Cory Nelson
-
Eric Niebler
-
Jeff Flinn
-
Louis Lavery
-
Paul A. Bristow