[LLVMdev] MINGW Compiler error.
Kenneth Boyd
zaimoni at zaimoni.com
Wed Oct 15 07:45:49 PDT 2008
Mark Kromis wrote:
>> Ok...I would have expected that to suppress the following error:
>
> I must have been typed that, I misspelled assertions.
> --disable-assertions does get around that error, but I get
> a different one. I was hoping that fixing one error would fix the other.
I wish. The concept-checking classes are intended to catch fundamental
errors in STL invariants at a more readable stage, but they do bloat the
executable.
> Since there were no other comments on the mail list about
> that particular issue, I was hoping it was something easy to fix on
> the compiler, since it compiles fine on Leopard.
>
> When assertions are disabled I get this error:
> llvm[1]: Compiling IntrinsicInst.cpp for Release-Asserts build
> In file included from IntrinsicInst.cpp:32:
> c:\mingw\bin\../lib/gcc/mingw32/4.3.0/include/c++/bits/boost_concept_check.h:
> In
> instantiation of '__gnu_cxx::_SGIAssignableConcept<llvm::MachineMove>':
> c:\mingw\bin\../lib/gcc/mingw32/4.3.0/include/c++/bits/stl_vector.h:179:
> insta
> ntiated from 'std::vector<llvm::MachineMove,
> std::allocator<llvm::MachineMove> >
> '
> c:/Users/Greybird/Desktop/llvm/llvm-2.4/include/llvm/CodeGen/MachineModuleInfo.h
> :1007: instantiated from here
> c:\mingw\bin\../lib/gcc/mingw32/4.3.0/include/c++/bits/boost_concept_check.h:216
> : error: '__gnu_cxx::_SGIAssignableConcept<_Tp>::__a' has incomplete type
> c:/Users/Greybird/Desktop/llvm/llvm-2.4/include/llvm/CodeGen/MachineModuleInfo.h
> :53: error: forward declaration of 'struct llvm::MachineMove'
> c:\mingw\bin\../lib/gcc/mingw32/4.3.0/include/c++/bits/boost_concept_check.h:
> In
> member function 'void
> __gnu_cxx::_SGIAssignableConcept<_Tp>::__constraints() [w
> ith _Tp = llvm::MachineMove]':
> c:\mingw\bin\../lib/gcc/mingw32/4.3.0/include/c++/bits/stl_vector.h:179:
> insta
> ntiated from 'std::vector<llvm::MachineMove,
> std::allocator<llvm::MachineMove> >
> '
> c:/Users/Greybird/Desktop/llvm/llvm-2.4/include/llvm/CodeGen/MachineModuleInfo.h
> :1007: instantiated from here
> c:\mingw\bin\../lib/gcc/mingw32/4.3.0/include/c++/bits/boost_concept_check.h:208
> : error: using invalid field '__gnu_cxx::_SGIAssignableConcept<_Tp>::__a'
> c:\mingw\bin\../lib/gcc/mingw32/4.3.0/include/c++/bits/boost_concept_check.h:208
> : error: '__b' has incomplete type
> c:\mingw\bin\../lib/gcc/mingw32/4.3.0/include/c++/bits/boost_concept_check.h:209
> : error: using invalid field '__gnu_cxx::_SGIAssignableConcept<_Tp>::__a'
> c:\mingw\bin\../lib/gcc/mingw32/4.3.0/include/c++/bits/boost_concept_check.h:209
> : error: using invalid field '__gnu_cxx::_SGIAssignableConcept<_Tp>::__a'
> c:\mingw\bin\../lib/gcc/mingw32/4.3.0/include/c++/bits/stl_vector.h:179:
> insta
> ntiated from 'std::vector<llvm::MachineMove,
> std::allocator<llvm::MachineMove> >
> '
> c:/Users/Greybird/Desktop/llvm/llvm-2.4/include/llvm/CodeGen/MachineModuleInfo.h
> :1007: instantiated from here
> c:\mingw\bin\../lib/gcc/mingw32/4.3.0/include/c++/bits/boost_concept_check.h:210
> : error: using invalid field '__gnu_cxx::_SGIAssignableConcept<_Tp>::__a'
> c:\mingw\bin\../lib/gcc/mingw32/4.3.0/include/c++/bits/boost_concept_check.h:
> In
> member function 'void
> __gnu_cxx::_SGIAssignableConcept<_Tp>::__const_constraint
> s(const _Tp&) [with _Tp = llvm::MachineMove]':
> c:\mingw\bin\../lib/gcc/mingw32/4.3.0/include/c++/bits/boost_concept_check.h:210
> : instantiated from 'void
> __gnu_cxx::_SGIAssignableConcept<_Tp>::__constraints
> () [with _Tp = llvm::MachineMove]'
> c:\mingw\bin\../lib/gcc/mingw32/4.3.0/include/c++/bits/stl_vector.h:179:
> insta
> ntiated from 'std::vector<llvm::MachineMove,
> std::allocator<llvm::MachineMove> >
> '
> c:/Users/Greybird/Desktop/llvm/llvm-2.4/include/llvm/CodeGen/MachineModuleInfo.h
> :1007: instantiated from here
> c:\mingw\bin\../lib/gcc/mingw32/4.3.0/include/c++/bits/boost_concept_check.h:213
> : error: '__c' has incomplete type
> c:\mingw\bin\../lib/gcc/mingw32/4.3.0/include/c++/bits/boost_concept_check.h:214
> : error: using invalid field '__gnu_cxx::_SGIAssignableConcept<_Tp>::__a'
> make[1]: ***
> [/c/Users/Greybird/Desktop/llvm/llvm-2.4/lib/VMCore/Release-Asserts
> /IntrinsicInst.o] Error 1
> make[1]: Leaving directory
> `/c/Users/Greybird/Desktop/llvm/llvm-2.4/lib/VMCore'
> make: *** [all] Error 1
>> BasicBlock is failing the EqualityComparable concept check. This should
>> be breaking --enable-asserts and --enable-expensive-checks, not
>> --enable-optimized (concept checks should be disabled in release mode,
>> which is controlled by NDEBUG).
>
> I just tried with plain "./configure --enable-optimized" and was
> getting the same. But if I did " ./configure --enable-optimized
> --disable-assertions" I get the other error.
Ok.
>>
>>>> 1379: note: candidates are: bool llvm::operator==(uint64_t, const
>>>> llvm::APInt&)
>>>> make[1]: *** [/c/Users/Greybird/Desktop/llvm/llvm-2.4/lib/VMCore/
>>>> Release/BasicBlock.o] Error 1
>>>> make[1]: Leaving directory
>>>> `/c/Users/Greybird/Desktop/llvm/llvm-2.4/lib/VMCore'
>>>> make: *** [all] Error 1
>>>>
>> GCC 4.3.0 is not finding the equality operator suitable for comparing
>> these; the implied STL invocation would be buggy.
> So would that be a buggy STL, I'm assuming on the compiler? If so is
> there a MingW package I need to update or recompile? I downloaded
> 4.3.0 from the sourceforge page for mingw.
More like the STL catching a compiler bug. Inspecting llvm/ADT/APInt.h,
the following are defined:
bool APInt::operator==(const APInt& RHS) const;
bool APInt::operator==(uint64_t RHS) const;
bool operator==(uint64_t V1, const APInt& V2);
(This is true for both SVN and 2.4 prerelease). MingW32 4.3.0 is not
finding the member operator== implementations (they are public), only
the non-member operator== . While I don't think of myself as a language
lawyer, this casually appears to be a failure in Koenig lookup. This
would make MingW32 4.3.0 generally unusable in production.
A priori, bypassing the error could be done by moving
bool APInt::operator==(const APInt& RHS) const;
bool APInt::operator==(uint64_t RHS) const;
to
bool operator==(const APInt& LHS, const APInt& RHS) const;
bool operator==(const APInt& LHS, uint64_t RHS) const;
and adjusting other declarations so that the non-member functions could
get at the currently private data fields. However, I can't recommend
merging those changes into LLVM.
Kenneth
Kenneth
More information about the llvm-dev
mailing list