ICE #191 on egcs-1998-05-25
Petter Urkedal
petter@matfys.lth.se
Wed May 27 05:40:00 GMT 1998
The attached file ice191.pp.cc is a preprocessed file which produces
an internal compiler error as shown below. In case of any questions
you reach me fastest by e-mail, or at least using a `CC:' to my
address when posting on the e-mail list.
> g++ ice191.pp.cc
/mini/petter/src/typealgo/typealgo.hh: In instantiation of
`IS_A<implem,dynamic_base>::size':
ice191.cc:27: instantiated from `IS_A<implem,dynamic_base>'
ice191.cc:27: instantiated from
`SELECT_INSTANCE<implem,_instance_default_typearg>'
ice191.cc:27: instantiated from
`instance<implem,_instance_default_typearg>'
ice191.cc:27: instantiated from here
/mini/petter/src/typealgo/typealgo.hh:432: Internal compiler error 191.
/mini/petter/src/typealgo/typealgo.hh:432: Please submit a full bug
report to `egcs-bugs@cygnus.com'.
> g++
Reading specs from
/usr/local/lib/gcc-lib/i586-pc-linux-gnu/egcs-2.91.33/specs
gcc version egcs-2.91.33 19980525 (gcc2 ss-980502 experimental)
--
[- http://matfys.lth.se/~petter/ -]
# 1 "ice191.cc"
# 1 "/mini/petter/include/instance" 1
# 1 "/mini/petter/src/mmt/instance.hh" 1
# 1 "/mini/petter/include/typealgo" 1
# 1 "/mini/petter/src/typealgo/typealgo.hh" 1
struct nulltype {
typedef nulltype first_type;
typedef nulltype second_type;
operator bool() { return false; }
operator int() { return 0; }
};
struct truetype {
operator bool() { return true; }
operator int() { return 1; }
};
template <class T, class U>
struct typepair { typedef T first_type; typedef U second_type; };
template <class Cond, class Positive, class Negative = nulltype>
struct IF { typedef Positive EVAL; };
template <class Positive, class Negative>
struct IF<nulltype, Positive, Negative> { typedef Negative EVAL; };
template <class T>
struct NOT { typedef nulltype EVAL; };
struct NOT<nulltype> { typedef truetype EVAL; };
template <class T, class U> struct EQUAL { typedef nulltype EVAL; };
template <class T> struct EQUAL<T, T> { typedef T EVAL; };
struct EQUAL<nulltype, nulltype> { typedef truetype EVAL; };
template <class T, class U> struct EQUIV { typedef truetype EVAL; };
template <class T> struct EQUIV<T, nulltype> { typedef nulltype EVAL; };
template <class U> struct EQUIV<nulltype, U> { typedef nulltype EVAL; };
struct EQUIV<nulltype, nulltype> { typedef truetype EVAL; };
template <class T1, class T2, class T3 = nulltype, class T4 = nulltype,
class T5 = nulltype, class T6 = nulltype>
struct OR { typedef T1 EVAL; };
template <class T2, class T3, class T4, class T5, class T6>
struct OR<nulltype, T2, T3, T4, T5, T6> { typedef T2 EVAL; };
template <class T3, class T4, class T5, class T6>
struct OR<nulltype, nulltype, T3, T4, T5, T6> { typedef T3 EVAL; };
template <class T4, class T5, class T6>
struct OR<nulltype, nulltype, nulltype, T4, T5, T6> { typedef T4 EVAL; };
template <class T5, class T6>
struct OR<nulltype, nulltype, nulltype, nulltype, T5, T6> { typedef T5 EVAL; };
template <class T6>
struct OR<nulltype, nulltype, nulltype, nulltype, nulltype, T6>
{ typedef T6, EVAL; };
template <class T, class U> struct AND { typedef U EVAL; };
template <class T> struct AND<T, nulltype> { typedef nulltype EVAL; };
template <class U> struct AND<nulltype, U> { typedef nulltype EVAL; };
template <class T, class U> struct XOR { typedef nulltype EVAL; };
template <class T> struct XOR<T, nulltype> { typedef T EVAL; };
template <class U> struct XOR<nulltype, U> { typedef U EVAL; };
template <class List, class Value>
struct APPEND { typedef typename List ::ERROR_APPEND_TO_NONLIST EVAL ; };
template <class V>
struct APPEND<nulltype, V> { typedef typepair<V, nulltype> EVAL; };
template <class E, class Tail, class V>
struct APPEND<typepair<E, Tail>, V>
{ typedef typepair<E, typename APPEND<Tail, V>::EVAL> EVAL; };
template <class List, class List1>
struct CONCAT { typedef typename List ::ERROR_CONCAT_OF_NONLIST EVAL ; };
template <class List1>
struct CONCAT<nulltype, List1> { typedef List1 EVAL; };
template <class E, class Tail, class List1>
struct CONCAT<typepair<E, Tail>, List1>
{ typedef typepair<E, typename CONCAT<Tail, List1>::EVAL> EVAL; };
template <class List>
struct TREE_TO_LIST { typedef typepair<List, nulltype> EVAL; };
template <class List, class List1>
struct TREE_TO_LIST< typepair<List, List1> > {
typedef typename CONCAT
< typename TREE_TO_LIST<List>::EVAL,
typename TREE_TO_LIST<List1>::EVAL
>::EVAL EVAL;
};
template <class T, class List>
struct IS_IN { typedef typename List ::ERROR_NOT_A_LIST EVAL ; };
template <class T, class U, class Tail>
struct IS_IN< T, typepair<U, Tail> >
{ typedef IS_IN<T, Tail>::EVAL EVAL; };
template <class T, class Tail>
struct IS_IN< T, typepair<T, Tail> > { typedef truetype EVAL; };
template <class T>
struct IS_IN<T, nulltype> { typedef nulltype EVAL; };
template <class T>
struct TYPEASSERT {
typedef typename IF
< typename NOT< typename T::EVAL >::EVAL,
typename T::ASSERTION_FAILED,
T >::EVAL EVAL;
};
template <class T1 = nulltype, class T2 = nulltype, class T3 = nulltype,
class T4 = nulltype, class T5 = nulltype, class T6 = nulltype,
class T7 = nulltype, class T8 = nulltype, class T9 = nulltype,
class T10= nulltype, class T11= nulltype, class T12= nulltype>
struct LIST {
typedef typepair
< T1, typepair< T2, typepair< T3, typepair
< T4, typepair< T5, typepair< T6, typepair
< T7, typepair< T8, typepair< T9, typepair
<T10, typepair<T11, typepair<T12, nulltype > > > > > > > > > > > >
EVAL;
};
template <class T1, class T2, class T3, class T4, class T5, class T6,
class T7, class T8, class T9, class T10, class T11>
struct LIST<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> {
typedef typepair
< T1, typepair< T2, typepair< T3, typepair
< T4, typepair< T5, typepair< T6, typepair
< T7, typepair< T8, typepair< T9, typepair
<T10, typepair<T11, nulltype > > > > > > > > > > >
EVAL;
};
template <class T1, class T2, class T3, class T4, class T5, class T6,
class T7, class T8, class T9, class T10>
struct LIST<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> {
typedef typepair
< T1, typepair< T2, typepair< T3, typepair
< T4, typepair< T5, typepair< T6, typepair
< T7, typepair< T8, typepair< T9, typepair
<T10, nulltype > > > > > > > > > >
EVAL;
};
template <class T1, class T2, class T3, class T4, class T5, class T6,
class T7, class T8, class T9>
struct LIST<T1, T2, T3, T4, T5, T6, T7, T8, T9> {
typedef typepair
< T1, typepair< T2, typepair< T3, typepair
< T4, typepair< T5, typepair< T6, typepair
< T7, typepair< T8, typepair< T9, nulltype > > > > > > > > >
EVAL;
};
template <class T1, class T2, class T3, class T4, class T5, class T6,
class T7, class T8>
struct LIST<T1, T2, T3, T4, T5, T6, T7, T8> {
typedef typepair
< T1, typepair< T2, typepair< T3, typepair
< T4, typepair< T5, typepair< T6, typepair
< T7, typepair< T8, nulltype > > > > > > > >
EVAL;
};
template <class T1, class T2, class T3, class T4, class T5, class T6,
class T7>
struct LIST<T1, T2, T3, T4, T5, T6, T7> {
typedef typepair
< T1, typepair< T2, typepair< T3, typepair
< T4, typepair< T5, typepair< T6, typepair
< T7, nulltype > > > > > > >
EVAL;
};
template <class T1, class T2, class T3, class T4, class T5, class T6>
struct LIST<T1, T2, T3, T4, T5, T6> {
typedef typepair
< T1, typepair< T2, typepair< T3, typepair
< T4, typepair< T5, typepair< T6, nulltype > > > > > > EVAL;
};
template <class T1, class T2, class T3, class T4, class T5>
struct LIST<T1, T2, T3, T4, T5> {
typedef typepair
< T1, typepair< T2, typepair< T3, typepair
< T4, typepair< T5, nulltype > > > > > EVAL;
};
template <class T1, class T2, class T3, class T4>
struct LIST<T1, T2, T3, T4> {
typedef typepair
< T1, typepair< T2, typepair< T3, typepair< T4, nulltype > > > >
EVAL;
};
template <class T1, class T2, class T3> struct LIST<T1, T2, T3>
{ typedef typepair< T1, typepair< T2, typepair< T3, nulltype > > > EVAL; };
template <class T1, class T2> struct LIST<T1, T2>
{ typedef typepair< T1, typepair< T2, nulltype > > EVAL; };
template <class T1> struct LIST<T1>
{ typedef typepair< T1, nulltype > EVAL; };
struct LIST<> { typedef nulltype EVAL; };
template <class T1, class T2, class Ordering>
class ORDER { typedef typename Ordering ::ERROR_NOT_A_LIST EVAL ; };
template <class T1, class T2, class T3, class Tail>
struct ORDER< T1, T2, typepair<T3, Tail> >
{ typedef ORDER<T1, T2, Tail>::EVAL EVAL; };
template <class T1, class T2, class Tail>
struct ORDER< T1, T2, typepair<T1, Tail> >
{ typedef typepair<T1, T2> EVAL; };
template <class T1, class T2, class Tail>
struct ORDER< T1, T2, typepair<T2, Tail> >
{ typedef typepair<T2, T1> EVAL; };
template <class T1, class T2>
struct ORDER<T1, T2, nulltype>
{ typedef nulltype EVAL; };
typedef LIST< char, short, int, long, float, double, long double >::EVAL
balanced_type_order;
template <class T1, class T2>
class COMMUTATIVE_BALANCED_TYPE { typedef nulltype EVAL; };
template <class T1, class T2>
class BALANCED_TYPE {
typedef typename ORDER<T1, T2, balanced_type_order>::EVAL order;
public:
typedef typename OR
< typename COMMUTATIVE_BALANCED_TYPE<T1, T2>::EVAL,
typename COMMUTATIVE_BALANCED_TYPE<T2, T1>::EVAL,
typename order::second_type,
typename IF
< typename IS_IN<T1, balanced_type_order>::EVAL, T2
> ::EVAL,
typename IF
< typename IS_IN<T2, balanced_type_order>::EVAL, T1
> ::EVAL
> ::EVAL EVAL;
};
template <class T1, class T2>
struct COMMUTATIVE_PLUS_TYPE { typedef nulltype EVAL; };
template <class T1, class T2>
struct PLUS_TYPE {
typedef typename OR
< typename COMMUTATIVE_PLUS_TYPE<T1, T2>::EVAL,
typename COMMUTATIVE_PLUS_TYPE<T2, T1>::EVAL,
typename BALANCED_TYPE<T1, T2>::EVAL >::EVAL EVAL;
};
template <class T1, class T2>
struct COMMUTATIVE_MINUS_TYPE { typedef nulltype EVAL; };
template <class T1, class T2>
struct MINUS_TYPE {
typedef typename OR
< typename COMMUTATIVE_MINUS_TYPE<T1, T2>::EVAL,
typename COMMUTATIVE_MINUS_TYPE<T2, T1>::EVAL,
typename BALANCED_TYPE<T1, T2>::EVAL >::EVAL EVAL;
};
template <class T1, class T2>
struct COMMUTATIVE_TIMES_TYPE { typedef nulltype EVAL; };
template <class T1, class T2>
struct TIMES_TYPE {
typedef typename OR
< typename COMMUTATIVE_TIMES_TYPE<T1, T2>::EVAL,
typename COMMUTATIVE_TIMES_TYPE<T2, T1>::EVAL,
typename BALANCED_TYPE<T1, T2>::EVAL >::EVAL EVAL;
};
template <class T1, class T2>
struct COMMUTATIVE_DIVIDES_TYPE { typedef nulltype EVAL; };
template <class T1, class T2>
struct DIVIDES_TYPE {
typedef typename OR
< typename COMMUTATIVE_DIVIDES_TYPE<T1, T2>::EVAL,
typename COMMUTATIVE_DIVIDES_TYPE<T2, T1>::EVAL,
typename BALANCED_TYPE<T1, T2>::EVAL >::EVAL EVAL;
};
template <class T1, class T2>
struct COMMUTATIVE_REMAINDER_TYPE { typedef nulltype EVAL; };
template <class T1, class T2>
struct REMAINDER_TYPE {
typedef typename OR
< typename COMMUTATIVE_REMAINDER_TYPE<T1, T2>::EVAL,
typename COMMUTATIVE_REMAINDER_TYPE<T2, T1>::EVAL,
typename BALANCED_TYPE<T1, T2>::EVAL >::EVAL EVAL;
};
template <class T> inline char _typealgo__is_a_1(const void*) {}
template <class T> inline long _typealgo__is_a_1(const T*) {}
template <int N> struct _LONGSIZE {};
struct _LONGSIZE<sizeof(char)> { typedef nulltype EVAL; };
struct _LONGSIZE<sizeof(long)> { typedef truetype EVAL; };
template <class T, class U> class IS_A {
private:
static const int size = sizeof(_typealgo__is_a_1<U>(static_cast<T*>(0)));
public:
typedef typename _LONGSIZE<size>::EVAL EVAL;
};
template <class T, class U> const int IS_A<T, U>::size;
template <class T> struct IS_POINTER { typedef nulltype EVAL; };
template <class T> struct IS_POINTER<T*> { typedef truetype EVAL; };
template <class T> struct IS_CLASS { typedef truetype EVAL; };
template <class T> struct IS_CLASS<T*> { typedef nulltype EVAL; };
struct IS_CLASS<bool> { typedef nulltype EVAL; };
struct IS_CLASS<char> { typedef nulltype EVAL; };
struct IS_CLASS<signed char> { typedef nulltype EVAL; };
struct IS_CLASS<unsigned char> { typedef nulltype EVAL; };
struct IS_CLASS<short> { typedef nulltype EVAL; };
struct IS_CLASS<unsigned short> { typedef nulltype EVAL; };
struct IS_CLASS<int> { typedef nulltype EVAL; };
struct IS_CLASS<unsigned int> { typedef nulltype EVAL; };
struct IS_CLASS<long> { typedef nulltype EVAL; };
struct IS_CLASS<unsigned long> { typedef nulltype EVAL; };
struct IS_CLASS<float> { typedef nulltype EVAL; };
struct IS_CLASS<double> { typedef nulltype EVAL; };
struct IS_CLASS<long double> { typedef nulltype EVAL; };
# 3 "/mini/petter/include/typealgo" 2
# 14 "/mini/petter/src/mmt/instance.hh" 2
# 1 "/usr/local/include/g++/cassert" 1 3
# 1 "/usr/include/assert.h" 1 3
# 32 "/usr/include/assert.h" 3
# 1 "/usr/include/features.h" 1 3
# 117 "/usr/include/features.h" 3
# 1 "/usr/include/sys/cdefs.h" 1 3
# 1 "/usr/include/features.h" 1 3
# 222 "/usr/include/features.h" 3
# 22 "/usr/include/sys/cdefs.h" 2 3
# 54 "/usr/include/sys/cdefs.h" 3
# 86 "/usr/include/sys/cdefs.h" 3
# 205 "/usr/include/features.h" 2 3
# 1 "/usr/include/gnu/stubs.h" 1 3
# 219 "/usr/include/features.h" 2 3
# 35 "/usr/include/assert.h" 2 3
# 99 "/usr/include/assert.h" 3
# 6 "/usr/local/include/g++/cassert" 2 3
# 15 "/mini/petter/src/mmt/instance.hh" 2
# 1 "/mini/petter/src/mmt/mmtalloc.hh" 1
# 19 "/mini/petter/src/mmt/mmtalloc.hh"
typedef long size_t;
typedef long ptrdiff_t;
struct _mmt_head { int _instance_counter; size_t _size; };
template <class T> struct _mmt_container : public _mmt_head, public T {
typedef _mmt_head* head_pointer_type;
typedef T* pointer_type;
protected:
_mmt_container() {}
};
template <class T>
class instance_allocator {
typedef T* pointer;
typedef const T* const_pointer;
typedef T& reference;
typedef const T& const_reference;
typedef size_t size_type;
typedef ptrdiff_t difference_type;
private:
_mmt_head* head(pointer p)
{ return static_cast<_mmt_head*>(static_cast<_mmt_container<T>*>(p)); }
const _mmt_head* head(const_pointer p)
{ return static_cast<const _mmt_head*>
(static_cast<const _mmt_container<T>*>(p)); }
int& ic(pointer p) { return head(p)->_instance_counter; }
int ic(const_pointer p) { return head(p)->_instance_counter; }
public:
pointer allocate(size_type n) {
_mmt_container<T>* p =
(_mmt_container<T>*)::operator new((unsigned long)
(sizeof(_mmt_container<T>)+(n-1)*sizeof(T)));
;
p->_instance_counter = 0;
p->_size = n;
return static_cast<pointer>(p);
}
pointer reuse(pointer p) {
;
if(p) ic(p)++;
return p;
}
void deallocate(pointer p) {
;
;
if(p) ::operator delete(head(p));
}
void unuse(pointer p) {
;
;
if(p) --ic(p);
}
size_type size(const_pointer p) { return head(p)->_size; }
bool is_const(const_pointer p) { return !p || ic(p) > 0; }
pointer address(reference x) { return &x; }
const_pointer const_address(const_reference x) { return &x; }
pointer to_mutable(const_pointer p) {
;
return (pointer)p;
}
reference to_mutable(const_reference x) {
;
return (reference)x;
}
size_type init_page_size() {
return max(size_type(1), size_type(4096/sizeof(T)));
}
size_type max_size() const {
return max(size_type(1), size_type(UINT_MAX/sizeof(T)));
}
};
# 22 "/mini/petter/src/mmt/instance.hh" 2
class dimension {
int n;
public:
explicit dimension(int i) : n(i) {}
operator int() { return n; }
};
template <class T> class _by_reference {
T& r;
public:
_by_reference(T& r_) : r(r_) {}
operator T&() { return r; }
};
template <class T> inline _by_reference<T>
pass_by_reference(T& x) { return _by_reference<T>(x); };
class dynamic_base {
mutable int ic;
public:
dynamic_base() : ic(0) {}
virtual ~dynamic_base() {}
virtual void reuse() const { ++ic; }
virtual bool unuse() const { return --ic < 0; }
virtual bool is_const() const { return ic > 0; }
};
template <class Complete>
struct _instance__container
: public Complete, virtual public dynamic_base {};
template <class Complete, class T>
dynamic_base* _instance__base_of(T* x) {
return static_cast<_instance__container<Complete>*>(x);
}
struct _explicit_tag {};
struct _implicit_tag {};
template <class T> struct encaps { T o; };
template <class T> T& uncaps(T& x) { return x; }
template <class T> T& uncaps(encaps<T>& x) { return x.o; }
template <class T>
struct _instance_alloc {
static instance_allocator<T> a;
};
template <class T>
instance_allocator<T> _instance_alloc<T>::a;
template <class T>
struct SELECT_ENCAPS {
typedef typename IF
< typename IS_CLASS<T>::EVAL,
T, encaps<T>
> ::EVAL EVAL;
};
template <class T, class U>
struct released_instance {
typedef typename SELECT_ENCAPS<T>::EVAL value_type;
mutable value_type* p;
released_instance(value_type* p1) : p(p1) {}
};
template<class T, class U> class static_instance;
template <class T, class U>
class static_instance_base {
public:
typedef size_t size_type;
typedef typename SELECT_ENCAPS<T>::EVAL value_type;
typedef typename SELECT_ENCAPS<U>::EVAL full_type;
mutable value_type *p;
static full_type* allocate()
{ return _instance_alloc<full_type>().a.allocate(1); }
static full_type* allocate(int i)
{ return _instance_alloc<full_type>().a.allocate(i); }
static full_type* reuse(value_type* q) {
((void) 0) ;
return _instance_alloc<full_type>().a.reuse(static_cast<full_type*>(q));
}
static void unuse(value_type* q) {
((void) 0) ;
_instance_alloc<full_type>().a.unuse(static_cast<full_type*>(q));
}
static void deallocate(value_type* q) {
((void) 0) ;
_instance_alloc<full_type>().a.deallocate(static_cast<full_type*>(q));
}
static bool is_const_stic(value_type* q) {
return !q || _instance_alloc<full_type>().a.
is_const(static_cast<full_type*>(q));
}
public:
bool is_defined() const { return p; }
bool is_const() const { return is_const_stic(p); }
bool is_mutable() const { return !is_const(); }
size_type size() const {
((void) 0) ;
return _instance_alloc<full_type>().a.
size(static_cast<full_type*>(p));
}
released_instance<T, U> release()
{ value_type* tmp = p; p = 0; return tmp; }
protected:
static_instance_base() : p(0) {}
static_instance_base(value_type* p_)
: p(p_? reuse(static_cast<full_type*>(p_)) : 0) {}
static_instance_base(value_type* p_, int)
: p(p_) {}
static_instance_base(int i) : p(allocate(i)) {}
public:
const T& to_const() const {
return uncaps(*p);
}
const T& to_const(int i) const {
return uncaps(p[i]);
}
T& to_mutable() {
return uncaps(*p);
}
T& to_mutable(int i) {
return uncaps(*(p+i));
}
T& modify(int i = 0) {
if(!p) throw logic_error(string(typeid(*this).name()) +
string(": Dereferencing null-pointer.\n"));
if(is_const()) {
const int n = size();
full_type* tmp = static_cast<full_type*>(p);
p = allocate(size());
for(int i = 0; i < n; i++)
new(static_cast<full_type*>(p)+i) full_type(tmp[i]);
unuse(tmp);
}
return uncaps(p[i]);
}
~static_instance_base() {
if(is_defined()) {
if(is_const()) unuse(static_cast<full_type*>(p));
else {
int count = size();
while(--count >= 0)
static_cast<full_type*>(p)[count].full_type::~full_type();
deallocate(static_cast<full_type*>(p));
}
}
}
static_instance_base<T, U>&
operator=(const static_instance_base<T, U>& r) {
this->~static_instance_base();
if(r.p) p = reuse(static_cast<full_type*>(r.p));
else p = 0;
return *this;
}
};
template <class T, class U = T>
class static_instance : public static_instance_base<T, U> {
public:
static_instance() {}
static_instance(const static_instance& r)
: static_instance_base<T, U>(const_cast<static_instance&>(r).p) {}
template <class V>
static_instance(const static_instance<V, U>& r)
: static_instance_base<T, U>(static_cast<value_type*>(r.p)) {}
template <class V, class W>
explicit static_instance(const static_instance<V, W>& r) {
if(r.is_defined()) {
p = allocate(1);
new(static_cast<W*>(p)) U(r.to_const());
} else p = 0;
}
static_instance(released_instance<T, U> tmp)
: static_instance_base(tmp.p, 0) {}
template<class V>
static_instance(released_instance<V, U> tmp)
: static_instance_base<T, U>
(static_cast<value_type*>(tmp.p), 0) {}
template<class V, class W>
static_instance(released_instance<V, W> tmp) {
if(tmp.p) {
p = allocate(1);
new(uncaps(p)) U(static_cast<W&>(uncaps(*tmp.p)));
if(static_instance<V, W>::is_const_stic(tmp.p))
static_instance<V, W>::unuse(tmp.p);
else {
static_cast<W&>(uncaps(*tmp.p)).W::~W();
static_instance<V, W>::deallocate(tmp.p);
}
} else p = 0;
}
template<class V, class W>
static_instance(released_instance<V, W> tmp, _explicit_tag) {
if(tmp.p) {
p = allocate(1);
new(&static_cast<U&>(uncaps(*p)))
U(static_cast<U>
(static_cast<const W&>(uncaps(*tmp.p))));
if(static_instance<V, W>::is_const_stic(tmp.p))
static_instance<V, W>::unuse(tmp.p);
else {
static_cast<W&>(uncaps(*tmp.p)).W::~W();
static_instance<V, W>::deallocate(tmp.p);
}
} else p = 0;
}
template <class Arg1>
explicit static_instance(Arg1 x1) : static_instance_base<T, T>(1) {
new(p) T(x1);
}
template <class Arg1, class Arg2>
static_instance(Arg1 x1, Arg2 x2) : static_instance_base<T, T>(1) {
new(p) T(x1, x2);
}
template <class Arg1, class Arg2, class Arg3>
static_instance(Arg1 x1, Arg2 x2, Arg3 x3)
: static_instance_base<T, T>(1) {
new(p) T(x1, x2, x3);
}
template <class Arg1, class Arg2, class Arg3, class Arg4>
static_instance(Arg1 x1, Arg2 x2, Arg3 x3, Arg4 x4)
: static_instance_base<T, T>(1) {
new(p) T(x1, x2, x3, x4);
}
explicit static_instance(dimension i) : static_instance_base<T, T>(i) {
for(int j = 0; j < i; j++)
new(&uncaps(p[j])) T();
}
template <class Arg1>
static_instance(dimension i, Arg1 x1) : static_instance_base<T, T>(i) {
for(int j = 0; j < i; j++)
new(&uncaps(p[j])) T(x1);
}
template <class Arg1, class Arg2>
static_instance(dimension i, Arg1 x1, Arg2 x2) : static_instance_base<T, T>(i) {
for(int j = 0; j < i; j++)
new(&uncaps(p[j])) T(x1, x2);
}
template <class Arg1, class Arg2, class Arg3>
static_instance(dimension i, Arg1 x1, Arg2 x2, Arg3 x3)
: static_instance_base<T, T>(i) {
for(int j = 0; j < i; j++)
new(&uncaps(p[j])) T(x1, x2, x3);
}
template <class Arg1, class Arg2, class Arg3, class Arg4>
static_instance(dimension i, Arg1 x1, Arg2 x2, Arg3 x3, Arg4)
: static_instance_base<T, T>(i) {
for(int j = 0; j < i; j++)
new(&uncaps(p[j])) T(x1, x2, x3, x4);
}
};
template <class T>
class dynamic_instance {
private:
T* p;
protected:
struct _conversion {};
public:
bool is_defined() const { return p; }
bool is_const() const { return !p || p->is_const(); }
bool is_mutable() { return !is_const(); }
T& to_mutable() {
return const_cast<T&>(*p);
}
const T& to_const() const {
return *p;
}
T& modify() {
if(is_const()) {
const T* old;
p = new T(*old);
old->unuse();
}
return *p;
}
dynamic_instance(const dynamic_instance<T>& x) {
p = x.p;
if(p) p->reuse();
}
template <class U>
dynamic_instance(const dynamic_instance<U>& x) {
if(x.is_defined()) {
p = const_cast<T*>(dynamic_cast<const T*>(&x.to_const()));
p->reuse();
} else p = 0;
}
template <class U, class V>
dynamic_instance(const static_instance<U, V>& x) {
if(x.is_defined()) {
p = static_cast<const T*>(&x.to_const());
p->reuse();
} else p = 0;
}
dynamic_instance() : p(0) {}
dynamic_instance(dimension i) : p(new T) {
}
template <class T1>
explicit dynamic_instance(T1 x1) : p(new T(x1)) {}
template <class T1, class T2>
dynamic_instance(T1 x1, T2 x2) : p(new T(x1, x2)) {}
template <class T1, class T2, class T3>
dynamic_instance(T1 x1, T2 x2, T3 x3) : p(new T(x1, x2, x3)) {}
template <class T1, class T2, class T3, class T4>
dynamic_instance(T1 x1, T2 x2, T3 x3, T4 x4) : p(new T(x1,x2,x3,x4)) {}
~dynamic_instance() { if(p && p->unuse()) delete p; }
dynamic_instance<T>& operator=(const dynamic_instance<T>& x) {
if(is_defined())
if(p->unuse()) delete p;
p = x.p;
p->reuse();
return *this;
}
};
struct _instance_default_typearg {};
template <typename T, typename U>
class SELECT_INSTANCE {
typedef typename IF
< typename EQUAL<U, _instance_default_typearg>::EVAL,
typename IF
< typename IS_A<T, dynamic_base>::EVAL,
dynamic_instance<T>,
static_instance<T, T>
> ::EVAL,
static_instance<T, U>
> ::EVAL EVAL;
};
template <class T, class U = _instance_default_typearg>
struct instance : public SELECT_INSTANCE<T, U>::EVAL {
typedef typename SELECT_INSTANCE<T, U>::EVAL reduced_type;
instance() {}
instance(const instance& x)
: reduced_type(static_cast<const reduced_type&>(x)) {}
template <class V, class W> explicit instance(instance<V, W> x)
: reduced_type(x.release(), _explicit_tag()) {}
template <class V, class W>
operator instance<V, W>()
{ return instance<V, W>(*this, _implicit_tag()); }
template <class V> instance(V x, _implicit_tag)
: reduced_type(x.release()) {}
template <class T1>
explicit instance(T1 x1) : reduced_type(x1) {}
template <class T1, class T2>
instance(T1 x1, T2 x2) : reduced_type(x1, x2) {}
template <class T1, class T2, class T3>
instance(T1 x1, T2 x2, T3 x3) : reduced_type(x1, x2, x3) {}
template <class T1, class T2, class T3, class T4>
instance(T1 x1, T2 x2, T3 x3, T4 x4) : reduced_type(x1, x2, x3, x4) {}
template <class T1, class T2, class T3, class T4, class T5>
instance(T1 x1, T2 x2, T3 x3, T4 x4, T5 x5)
: reduced_type(x1, x2, x3, x4, x5) {}
};
template <class T1, class U1, class T2, class U2>
inline bool operator==(const instance<T1, U1>& x,
const instance<T2, U2>& y)
{ return x.to_const() == y.to_const(); }
template <class T1, class U1, class T2, class U2>
inline bool operator<(const instance<T1, U1>& x,
const instance<T2, U2>& y)
{ return x.to_const() < y.to_const(); }
# 524 "/mini/petter/src/mmt/instance.hh"
# 538 "/mini/petter/src/mmt/instance.hh"
# 548 "/mini/petter/src/mmt/instance.hh"
# 3 "/mini/petter/include/instance" 2
# 2 "ice191.cc" 2
struct abase1 : virtual public dynamic_base {
long i1;
abase1() : i1(1000) {}
~abase1() {}
virtual void mf1() = 0;
};
struct abase2 : virtual public dynamic_base {
int i2;
abase2() : i2(2000) {}
virtual void mf2() = 0;
};
struct implem : public abase1, public abase2, virtual public dynamic_base {
void mf1() {}
void mf2() {}
};
main() {
instance<abase2, implem> b2;
instance<implem> imp3;
{
instance<implem> imp(dimension(1));
instance<implem> imp2(dimension(1));
imp.to_mutable().mf1();
imp.to_mutable().mf2();
((void) 0) ;
instance<abase1, implem> b1(imp);
b2 = imp;
}
}
More information about the Gcc-bugs
mailing list