Opened 11 years ago

Closed 11 years ago

#6396 closed Bugs (fixed)

Implicit instanciation of boost::rv for non-cass types generates an error

Reported by: danivy.mail@… Owned by: Ion Gaztañaga
Milestone: To Be Determined Component: move
Version: Boost 1.48.0 Severity: Problem
Keywords: Cc:

Description

boost::rv<T> unconditionally inherits from T. During overload-resolution, the compiler is allowed to instanciate parameter types even if not strictly necessary, which can lead to instanciation of rv for non-class types, causing an error.

For example:

#include <boost/move/move.hpp>

template <typename T>
struct vector {
	void push_back(const T&) {}
	void push_back(BOOST_RV_REF(T)) {}
};

int main()
{
	vector<int> v;
	v.push_back(123);
}

Fails on Sun 5.12 with:

"/usr/include/boost/move/move.hpp", line 231: Error: The base "boost::T" must be a previously defined class or struct.
"main.cpp", line 12:     Where: While specializing "boost::rv<int>".
"main.cpp", line 12:     Where: Specialized in non-template code.

And

#include <boost/move/move.hpp>

template <typename T>
class wrapper {
	BOOST_COPYABLE_AND_MOVABLE_ALT(wrapper)

public:
	wrapper(const T&) {}
	wrapper(BOOST_RV_REF(T)) {}
	wrapper(const wrapper&) {}
	wrapper(BOOST_RV_REF(wrapper)) {}
};

int main()
{
	wrapper<int> w1(123);
	wrapper<int> w2(boost::move(w1));
}

fails on GCC 4.4.3 with:

/usr/include/boost/move/move.hpp: In instantiation of ‘boost::rv<int>’:
main.cpp:17:   instantiated from here
/usr/include/boost/move/move.hpp:231: error: base type ‘int’ fails to be a struct or class type

Change History (2)

comment:1 by danivy.gmail@…, 11 years ago

The fix would be to specialize boost::rv for non-class types, avoiding inheritance. This specialization will never be used, but it will shush the compilers.

comment:2 by Ion Gaztañaga, 11 years ago

Resolution: fixed
Status: newclosed

Avoided inheritance from T when type is not a class or union. Revision: 76509

Note: See TracTickets for help on using tickets.