Boost logo

Boost Users :

Subject: [Boost-users] Bug in mingw with gcc 4.3.0: boost_concept_check.h
From: Eloi Du Bois (eloi.du.bois_at_[hidden])
Date: 2009-12-09 12:17:00


Hi all,

I found a probable bug in mingw.
Here is the minimal code that can not compile:

#include <boost/ptr_container/ptr_list.hpp>
>
> #include <iostream>
>
> class A
> {
> public:
> A(const int id):_id(id){}
> virtual ~A()=0;
> bool operator==(const A& other) const { return _id == other._id; }
> int _id;
> };
>
> A::~A(){}
>
> class B : public A
> {
> public:
> B(const int id):A(id){}
> virtual ~B() {}
> };
>
> class C : public A
> {
> public:
> C(const int id):A(id){}
> virtual ~C() {}
> };
>
> int main() {
> typedef boost::ptr_list<A> AList;
> AList a,b;
> a.push_back( new B(0) );
> a.push_back( new C(1) );
> b.push_back( new B(0) );
> b.push_back( new C(1) );
>
> return a == b;
> }
>

And the compilation error:

gcc.compile.c++
> T:\Analyse1\dist\lib\bin\gcc-mingw-4.3.0\debug\threading-multi\src\main.o
> c:\qt\mingw\bin\../lib/gcc/mingw32/4.3.0/include/c++/bits/boost_concept_check.h:
> In instantiation of '__gnu_cxx::_EqualOpConcept<A, A>':
> c:\qt\mingw\bin\../lib/gcc/mingw32/4.3.0/include/c++/bits/boost_concept_check.h:62:
> instantiated from 'void __gnu_cxx::__function_requires() [with _Concept =
> __gnu_cxx::_EqualOpCon
> cept<A, A>]'
> c:\qt\mingw\bin\../lib/gcc/mingw32/4.3.0/include/c++/bits/stl_algobase.h:943:
> instantiated from 'bool std::equal(_II1, _II1, _II2) [with _II1 =
> boost::void_ptr_iterator<std::_List_
> const_iterator<void*>, const A>, _II2 =
> boost::void_ptr_iterator<std::_List_const_iterator<void*>, const A>]'
> T:\Analyse1\3rdParty\boost/boost/ptr_container/detail/reversible_ptr_container.hpp:531:
> instantiated from 'bool
> boost::ptr_container_detail::reversible_ptr_container<Config, CloneA
> llocator>::operator==(const
> boost::ptr_container_detail::reversible_ptr_container<Config,
> CloneAllocator>&) const [with Config =
> boost::ptr_container_detail::sequence_config<A, std::
> list<void*, std::allocator<void*> > >, CloneAllocator =
> boost::heap_clone_allocator]'
> tests\src\main.cpp:38: instantiated from here
> c:\qt\mingw\bin\../lib/gcc/mingw32/4.3.0/include/c++/bits/boost_concept_check.h:296:
> error: cannot declare field '__gnu_cxx::_EqualOpConcept<A, A>::__a' to be of
> abstract type 'A'
> tests\src\main.cpp:6: note: because the following virtual functions are
> pure within 'A':
> tests\src\main.cpp:14: note: virtual A::~A()
> c:\qt\mingw\bin\../lib/gcc/mingw32/4.3.0/include/c++/bits/boost_concept_check.h:296:
> error: cannot declare field '__gnu_cxx::_EqualOpConcept<A, A>::__b' to be of
> abstract type 'A'
> tests\src\main.cpp:6: note: since type 'A' has pure virtual functions
>
> "g++" -ftemplate-depth-128 -O0 -fno-inline -Wall -g -mthreads
> -DBOOST_SYSTEM_DYN_LINK=1 -I"T:\Analyse1\3rdParty\boost" -I"tests\src" -c
> -o "T:\Analyse1\dist\lib\bin\gcc-mingw-
> 4.3.0\debug\threading-multi\src\main.o" "tests\src\main.cpp"
>

The problem might come from this:

#define _GLIBCXX_DEFINE_BINARY_OPERATOR_CONSTRAINT(_OP,_NAME) \
  template <class _Ret, class _First, class _Second> \
  struct _NAME { \
    void __constraints() { (void)__constraints_(); } \
    _Ret __constraints_() { \
      return __a _OP __b; \
    } \
    _First __a; \
    _Second __b; \
  }

I hope it comes from me and not from boost...
If anyone have an idea of what I can do to solve this, It would be great :)

Regards,
Eloi.



Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net