[gecode-users] Installation with Intel Compiler 64 bits

Guido Tack tack at ps.uni-sb.de
Fri Jul 20 10:20:55 CEST 2007


Simon Boivin wrote:

> We had some problems to install Gecode on our new parallel computer  
> with  Intel Compiler 64 bits which crash when compiling  the  
> library  :
>
> icpc -I. -I. -DNDEBUG -fPIC -ggdb -O3 -fno-strict-aliasing  - 
> DNDEBUG -fPIC -ggdb
> -O3 -fno-strict-aliasing   \
> -c -o gecode/int/var/imp.o  gecode/int/var/imp.cc
> ../gecode/kernel/core.icc(1605): error #1556: conversion from  
> inaccessible
> base class "Gecode::ActorLink" is not allowed
>       t[0] = static_cast<Propagator*>(f[0]->prev());;
> which is an internal error of the compiler.

Actually, this is not an internal error, but a proper error in the  
code (at least icpc thinks it is).

> According to the c++ expert from Intel the program is not c++  
> standard conforming.
> So, to install the library we must modified the class Space as :
[...]
> -  class Actor : public ActorDeleteLink {
> +  class Actor : private ActorDeleteLink {

Yes, I also noticed that recently. However, we are quite sure that  
our code is legal C++ and Intel does not implement that correctly.  
All the classes down the hierarchy (Propagator, Actor,  
ActorDeleteLink, and ActorLink) have friend declarations with the  
Variable class, where the error occurs - so the base class ActorLink  
really shouldn't be inaccessible here. Both gcc and the Microsoft C++  
compiler handle this without problems.

The minimal example that shows this problem is:

template <class X> class C;
class A {};
class B : private A { template <class X> friend class C; };
template <class X> class C { public: C(A* a) { B* b = static_cast<B*> 
(a); } };
class D { D() { C<int> c(0); } };

If you make class C a non-template class, everything works. If you  
have contact to the icpc developers, please forward this example to  
them, maybe they can explain whether we misinterpreted the C++  
standard or it's a bug in their compiler. I'm really interested what  
they say.

A slightly cleaner workaround would be to add a private function
Propagator* fromActorLink(ActorLink* a) { return  
static_cast<Propagator*>(a); }
to the Propagator class, which just does the static_cast. That way,  
you could stick with private inheritance.

Cheers,
	Guido

-- 
Guido Tack
Programming Systems Lab, Saarland University, Germany
http://www.ps.uni-sb.de/~tack







More information about the gecode-users mailing list