The upcasting bug has also been known to cause an exception to be thrown. This occured in the following piece of code:
template <class Qtype> ostream& operator<< (ostream &os, const Quantum<Qtype> &ku) { os << ku.qVal; return os; }where ku.qVal could be a Double or a Vector<Double> (but the operator<< function is defined for Arrays not Vectors). The compiler did not detect that there was an upcasting problem and examination with a debugger revealed it was getting into an infinite constructor loop! Further investigation revealed that the compiler did not find a function match using an upcast but was able to find another unintended match, that was further resolved to the original function!