- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Dear Intel C++ compiler users and support, I recently tried to compile a code which uses the Boost.ScopeExit facility.
Unfortunately, a simple code using BOOST v1.66 (reported in the details section) does not compile with Intel 2017, nor with Intel 2018. Using the compiler flag -std=g++98 all works correctly, but not with -std=gnu++11 (details follow). The problem seems to be related with the C++ standard, and not from the GNU extensions.
Is there any rationale for this behavior? What do you think is going on? Is it correct to assume icpc uses C++03 as default standard?
Thank you in advance for any help or clarification.
DETAILS:
Here follows the simple code used to test the BOOST_SCOPE_EXIT facility from BOOST 1.66. I assume boost header are installed in the BOOST_INC directory.
#include <boost/scope_exit.hpp> #include <iostream> int *foo() { int *i = new int{10}; BOOST_SCOPE_EXIT(&i) { delete i; i = 0; } BOOST_SCOPE_EXIT_END std::cout << *i << '\n'; return i; } int main() { int *j = foo(); std::cout << j << '\n'; }
Compiling this code with Intel 2017 results in the following compiling errors:
$> icpc --version icpc (ICC) 17.0.6 20171215 Copyright (C) 1985-2018 Intel Corporation. All rights reserved. $> icpc test_boost_scope_exit.cpp -I$BOOST_INC -o test_boost_scope_exit test_boost_scope_exit.cpp(7): error: overloaded function "boost::scope_exit::detail::deref" is not a type name BOOST_SCOPE_EXIT(&i) ^ test_boost_scope_exit.cpp(7): error: expected a ")" BOOST_SCOPE_EXIT(&i) ^ test_boost_scope_exit.cpp(7): error: expected a type specifier BOOST_SCOPE_EXIT(&i) ^ test_boost_scope_exit.cpp(7): error #303: explicit type is missing ("int" assumed) BOOST_SCOPE_EXIT(&i) ^ test_boost_scope_exit.cpp(7): error: expected a ";" BOOST_SCOPE_EXIT(&i) ^ test_boost_scope_exit.cpp(7): error: identifier "boost_se_capture_t_0_7" is undefined BOOST_SCOPE_EXIT(&i) ^ compilation aborted for test_boost_scope_exit.cpp (code 2)
Similar behavior is obtained for Intel 2018 (18.0.1) . I'm using GNU 6.3. The code compile only if using the -std=g++98 compiler flag, but not with -std=g++11.
Inspecting the preprocessed source using default behaviour (-std=c++11) and altering the standard with -std=gnu++98, I found that the BOOST_TYPEOF_KEYWORD is not resolved using the c++11 standard:
$> icpc -E -std=c++11 test_boost_scope_exit.cpp -I $BOOST_INC |grep -A4 "foo()" int *foo() { int *i = new int{10}; typedef void (*boost_se_tag_0_7)(int &i); typedef BOOST_TYPEOF_KEYWORD(::boost::scope_exit::detail::deref(&i, static_cast<boost_se_tag_0_7>(0))) boost_se_capture_t_0_7 ; struct boost_se_params_t_7 { typedef boost_se_capture_t_0_7 boost_se_param_t_0_7 ; ::boost::scope_exit::detail::member< boost_se_param_t_0_7, boost_se_tag_0_7 > boost_se_param_0_7; boost_se_params_t_7( boost_se_param_t_0_7 & a0 ) : boost_se_param_0_7 ( a0 ) {} } boost_se_params_7 ( ::boost::scope_exit::detail::deref(&i, static_cast<boost_se_tag_0_7>(0)) ) ; ::boost::scope_exit::detail::declared< ::boost::scope_exit::detail::resolve< sizeof(boost_scope_exit_aux_args) > ::cmp1<0> ::cmp2 > boost_scope_exit_aux_args; boost_scope_exit_aux_args . value = &boost_se_params_7; struct boost_se_guard_t_7 { boost_se_params_t_7* boost_se_params_; boost_se_guard_t_7 (void* boost_se_params) : boost_se_params_( (boost_se_params_t_7*)boost_se_params) {} ~boost_se_guard_t_7() { boost_se_body( boost_se_params_->boost_se_param_0_7 . value ); } static void boost_se_body( boost_se_params_t_7:: boost_se_param_t_0_7 &i ) { -- int *j = foo(); std::cout << j << '\n'; } $> icpc -E -std=gnu++98 test_boost_scope_exit.cpp -I $BOOST_INC |grep -A4 "foo()" int *foo() { int *i = new int{10}; typedef void (*boost_se_tag_0_7)(int &i); typedef __typeof__(::boost::scope_exit::detail::deref(&i, static_cast<boost_se_tag_0_7>(0))) boost_se_capture_t_0_7 ; struct boost_se_params_t_7 { typedef boost_se_capture_t_0_7 boost_se_param_t_0_7 ; ::boost::scope_exit::detail::member< boost_se_param_t_0_7, boost_se_tag_0_7 > boost_se_param_0_7; boost_se_params_t_7( boost_se_param_t_0_7 & a0 ) : boost_se_param_0_7 ( a0 ) {} } boost_se_params_7 ( ::boost::scope_exit::detail::deref(&i, static_cast<boost_se_tag_0_7>(0)) ) ; ::boost::scope_exit::detail::declared< ::boost::scope_exit::detail::resolve< sizeof(boost_scope_exit_aux_args) > ::cmp1<0> ::cmp2 > boost_scope_exit_aux_args; boost_scope_exit_aux_args . value = &boost_se_params_7; struct boost_se_guard_t_7 { boost_se_params_t_7* boost_se_params_; boost_se_guard_t_7 (void* boost_se_params) : boost_se_params_( (boost_se_params_t_7*)boost_se_params) {} ~boost_se_guard_t_7() { boost_se_body( boost_se_params_->boost_se_param_0_7 . value ); } static void boost_se_body( boost_se_params_t_7:: boost_se_param_t_0_7 &i ) { -- int *j = foo(); std::cout << j << '\n'; }
- Tags:
- CC++
- Development Tools
- Intel® C++ Compiler
- Intel® Parallel Studio XE
- Intel® System Studio
- Optimization
- Parallel Computing
- Vectorization
Link Copied
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Same problem here with Boost 1.65.1 and c++11.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
I am affected by the same problem and have reported it with boost developers here: https://svn.boost.org/trac10/ticket/13499

- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page