public void f2(B1 b) {
   // original is b.foo(0); this is the tagging:
   Class[] variants = {D.class, C.class, B1.class};
   ((B1) TLog.polycall(b, variants)).foo(0);
 }
 public void f1(A a) {
   // we just want to do a.foo(0); this gives the following tagging:
   Class[] variants = {D.class, C.class, B1.class, B2.class, A.class};
   ((A) TLog.polycall(a, variants)).foo(0);
 }