SourceForge.net Logo

[Release a]
<t4m_bug_templincompl>

The compilation of the file templincompl.C,

    template <int N>
    class A {
      int a[N];
    public:
      void operator << (int b) { a[0] = b; }
    };

    extern A<1> a;

    int main(void) { a << 1; return 0; }

makes TenDRA complain like this

line 10: Error:
  [ISO 5.8]: Operands of '<<' should be integral, not 'A < 1 >' and 'int'.

This also happens when ::a is a pointer to A<1>, and ceases when an object of
type A<1> is constructed before the call to operator <<. It is obvious that the
template class is not completely instantiated at the point where the compiler
is going to resolve the overload for operator <<.

The critical place seems to be inside the function overload_candidates (line
1083, operator.c). The call to the function search_field at line 1116 fails
because the CLASS_TYPE ct is neither defined (cinfo_defined is off) nor
complete (cinfo_complete is off). The way of completing a template class
instantiation is by calling complete_class (see instance.c, line 1354). Thus,
to fix this bug, one can change lines 1114 - 1116 of operator.c,

	CLASS_TYPE ct = DEREF_ctype ( type_compound_defn ( t ) ) ;
	NAMESPACE ns = DEREF_nspace ( ctype_member ( ct ) ) ;
	IDENTIFIER id = search_field ( ns, nm, 0, 0 ) ;

for

	CLASS_TYPE ct = DEREF_ctype ( type_compound_defn ( t ) ) ;
	NAMESPACE ns ;
	IDENTIFIER id ;
	complete_class (ct, 1 ) ;
	ns = DEREF_nspace ( ctype_member ( ct ) ) ;
	id = search_field ( ns, nm, 0, 0 ) ;

and it works.