[GiNaC-devel] [BUG] clifford::op() versus
tensor::replace_contr_index
Sheplyakov Alexei
varg at theor.jinr.ru
Wed Oct 18 16:40:22 CEST 2006
Dear all,
I've tried making ex_to<T> functions [more] type-safe, like this:
diff --git a/ginac/ex.h b/ginac/ex.h
index 3070b7a..79f872b 100644
--- a/ginac/ex.h
+++ b/ginac/ex.h
@@ -949,7 +949,8 @@ inline bool is_exactly_a(const ex &obj)
template <class T>
inline const T &ex_to(const ex &e)
{
- GINAC_ASSERT(is_a<T>(e));
+ if (__builtin_expect(! is_a<T>(e), 0))
+ throw std::bad_cast();
return static_cast<const T &>(*e.bp);
}
and got failure in exam_clifford (to be more specific, last expression
in clifford_check4 triggered bad_cast). I've found a simple[r] example
which fails in the same way:
#include <iostream>
#include <stdexcept>
#include "ginac.h"
using namespace GiNaC;
int main(int argc, char** argv)
{
symbol d("D");
varidx mu(symbol("mu"), d),
nu(symbol("nu"), d);
ex e = lorentz_g(mu, nu)*dirac_gamma(nu.toggle_variance());
e = e.simplify_indexed();
return 0;
}
The reason of this error seems to be inconsistency between clifford::op
and tensor::replace_contr_index. tensor::replace_contr_index expects
any subexpression of `indexed' referenced via op() to be `idx' (see
tensor.cpp:398). On the other hand, `clifford' objects make their
representation label accessible via op(), so this assumption is incorrect.
So, the questions are:
1) Any ideas how to fix this?
2) In general, is it OK for class derived from indexed return something
which is *not* idx (or derived from it) via op()?
Best regards,
Alexei
--
All science is either physics or stamp collecting.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 827 bytes
Desc: Digital signature
Url : http://www.cebix.net/pipermail/ginac-devel/attachments/20061018/92ce178e/attachment.pgp
More information about the GiNaC-devel
mailing list