Sorry,  'classof' shouldn't be virtual itself of course.<div>The problem is that <span class="Apple-style-span" style="font-family: monospace; font-size: medium; white-space: pre-wrap; ">B::classof(const A *)</span> always return true in your implementation, so <span class="Apple-style-span" style="font-family: monospace; font-size: medium; white-space: pre-wrap; ">llvm::isa<B>(a)</span>returns true as well.</div>
<div>To make it work as you expect you should return true only if an argument to <span class="Apple-style-span" style="font-family: monospace; font-size: medium; white-space: pre-wrap; ">B::classof(const A *)</span>is a pointer to class B or its subclass.</div>
<div>This can be done e.g. using a type field or a virtual function returning type identifier or dynamic_cast though if you use the latter you don't need llvm::isa. You can have a look at how classof is implemented in clang's AST.</div>
<div><br></div><div>Victor</div><meta http-equiv="content-type" content="text/html; charset=utf-8"><meta http-equiv="content-type" content="text/html; charset=utf-8"><meta http-equiv="content-type" content="text/html; charset=utf-8"><div>
<div><span class="Apple-style-span" style="font-family: 'Times New Roman'; font-size: medium; "><pre style="word-wrap: break-word; white-space: pre-wrap; "><span class="Apple-style-span" style="font-family: arial; white-space: normal; font-size: small; ">On Wed, Aug 25, 2010 at 5:10 PM, Victor Zverovich <span dir="ltr"><<a href="mailto:victor@zverovich.net">victor@zverovich.net</a>></span> wrote:</span></pre>
</span><div><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">Hi Jan,<div><br></div><div>I think 'classof' should be virtual for isa<> and friends to work. In addition you can provide a static 'classof' for the same class that will speed up the cases like isa<A>(a) and isa<A>(b).<br>

<br></div><div>Regards,</div><div>Victor</div><font color="#888888"><br></font><div class="gmail_quote"><div><div></div><div class="h5">On Wed, Aug 25, 2010 at 4:02 PM, Jan Bierbaum <span dir="ltr"><<a href="mailto:s3306700@inf.tu-dresden.de" target="_blank">s3306700@inf.tu-dresden.de</a>></span> wrote:<br>

</div></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div><div></div><div class="h5">Hi!<br>
<br>
I hope I'm not too OT with that question, but Clang makes extensive use<br>
of this mechanism so maybe somebody can help me.<br>
<br>
LLVM provides isa<>, cast<> and so on. Recently I tried to make use of<br>
this for my own class hierarchy, but failed.<br>
<br>
>From the documentation and examples in Clang's code I figured that the<br>
only thing to do was add a static method 'classof' to any involved class<br>
with a parameter that will match any parent class. Then inside this<br>
method do any checks necessary and return 'true' if the current instance<br>
is indeed of the type given.<br>
<br>
But when I do this I get 'true' for any 'isa<>' I try!?<br>
<br>
Attached is a small example that outputs the following:<br>
<br>
| $ ./a.out<br>
| isa<A>(a) = 1<br>
| isa<B>(a) = 1<br>
| isa<B>(b) = 1<br>
| isa<A>(b) = 1<br>
<br>
What I would expect instead is the second line to yield false/0, since a<br>
is an instance of class A which "is" no B.<br>
<br>
Can somebody please give me a hint on what I'm doing wrong?<br>
<br>
<br>
Regards, Jan.<br>
<br></div></div><div class="im">_______________________________________________<br>
cfe-dev mailing list<br>
<a href="mailto:cfe-dev@cs.uiuc.edu" target="_blank">cfe-dev@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev</a><br>
<br></div></blockquote></div><br>
</blockquote></div><br></div></div></div>