On Wed, Jun 27, 2012 at 2:35 PM, Chiheng Xu <chiheng...@gmail.com> wrote:
> On Wed, Jun 27, 2012 at 2:19 AM, Lawrence Crowl <cr...@google.com> wrote:
>> On 6/26/12, Jason Merrill <ja...@redhat.com> wrote:
>>> On 06/25/2012 06:26 PM, Lawrence Crowl wrote:
>>> > +or<code>gcc_unreachable</code>.  If the checks are expensive or the
>>> > +compiler can reasonably carry on after the error, they may be
>>> > +conditioned on<code>--enable-checking</code>.</p>
>>>
>>> by using <code>gcc_checking_assert</code>
>>
>> I inserted that suggestion, but note that I did not create that text,
>> only moved it.
>>
>>> [Rationale]
>>> > +FIXME: Discussion of deleting inappropraite special members.
>>>
>>> Is this FIXME still needed?  The text following it seems to cover the
>>> issue well enough.
>>
>> No longer needed.
>>
>>> > +However, by default, RTTI is not permitted
>>> > +and the compiler must build cleanly with <code>-fno-rtti</code>.
>>>
>>> This seems like an unnecessary restriction to me.
>>>
>>> > +Disabling RTTI will save space in the compiler.
>>>
>>> This is a fine reason to disable RTTI if it isn't used, but doesn't
>>> seem like a strong reason to prohibit using it.  The information is
>>> only emitted for classes with virtual functions, isn't very large,
>>> is typically emitted in only one object file, and since it lives
>>> in .rodata it can be shared between multiple compiler processes.
>>>
>>> > +Checking the type of a class at runtime usually indicates a design 
>>> > problem.
>>>
>>> The tree_contains_struct machinery recently added to GCC maps
>>> directly onto dynamic_cast;
>>>
>>> if (CODE_CONTAINS_STRUCT(TREE_CODE(t),TS_DECL_WRTL))
>>>   /* do something with t->decl_with_rtl */
>>>
>>> translates roughly to to
>>>
>>> if (decl_with_rtl *p = dynamic_cast <decl_with_rtl *>(t))
>>>   /* do something with p */
>>>
>>> When new interfaces are added partway down an inheritance tree,
>>> dynamic_cast is the right way to access them.  This isn't checking
>>> what the type is, it's checking whether the object supports a
>>> particular method.
>>>
>>> The fact that we've gone to the trouble to implement this
>>> functionality in C suggests to me that using it isn't always
>>> indicative of a design problem.  :)
>>
>> Personally, I am fine with using dynamic_cast.  I was writing up what
>> I thought was a consensus on the wiki.  I can live without it, or I
>> can use it profitably.  Whatever you all decide, I will write up.
>>
>
> dynamic_cast use RTTI, while TREE_CODE are poor man's type info. RTTI
> is better than TREE_CODE.

RTTI requires more space than TREE_CODE, so it's not universally better.

> But, If you decide to use RTTI,  TREE_CODE
> become redundant, that means all use of TREE_CODE should be removed,
> sooner or later. Are you prepared for that ?
>
> If every types in the type hierarchy, not just the root type and
> leaves types,  has a TREE_CODE,  and you maintain a database of
> inheritance relationship and other info of types of different
> TREE_CODEs,  then,  for a object of a given TREE_CODE,  you know its
> TREE_CODE and type info,   you know whether or not the object can be
> cast to another type,  and,  you can know other info about the type,
> like the size of object of the type, string name of the type.
>
> This can be implemented as below. For every type in the type
> hierarchy, static define a object of meta type( meta class, or class
> class) to describe the type info of the specific type for a given
> TREE_CODE. All of the meta type objects of different TREE_CODEs are
> organized as an array, which is indexed by the value of TREE_CODE. And
> you provide a set of C functions , that judge whether a object that
> has a given TREE_CODE can be cast to a type that has another TREE_CODE
> and retrieve the type info of a object that has a given TREE_CODE.

We already have all (or most) of this.

>>> > +If you need to know the type of a class for some other reason,
>>> > +use an enum or a virtual member function
>>> > +that coverts a pointer to the more derived class.
>>> > +For example,
>>> > +</p>
>>> > +
>>> > +<blockquote><pre><code>
>>> > +common_type *p = ....;
>>> > +if (specific_type *q = p-&gt;to_specific ()) {
>>> > +  // We have and can use a specific_type pointed to by q.
>>> > +}
>>> > +</code></pre></blockquote>
>>>
>>> This is basically equivalent to dynamic_cast except that you need
>>> to clutter up your root base class with one virtual function for
>>> each derived class you want to be able to convert to.
>>
>> Note quite equivalent, as you can implement to_specific with
>> non-virtual classes using the TREE_CODE.  Thus would could implement
>> a type-save dynamic pointer converter before converting to virtual
>> classes.
>>
>> OTOH, we could probably work up a template function that looks like
>> dynamic_cast but uses the TREE_CODE instead, achieving the same
>> intermediate step.
>>
>> I agree that it does clutter up the base class.
>>
>
> Template function may be not necessary.
> And, virtual method is not necessary.
> Just normal C functions can work if you have the type info of a given 
> TREE_CODE.
>
>> Shall we enable RTTI?
> Are you prepared to remove all use of TREE_CODE ?

To answer, no - we should not enable RTTI (nor exceptions).

Richard.

Reply via email to