On Mon, Apr 16, 2018, 3:20 PM Alexandre Oliva <aol...@redhat.com> wrote:

> On Apr 16, 2018, Jason Merrill <ja...@redhat.com> wrote:
>
> > On Fri, Apr 13, 2018, 5:19 PM Alexandre Oliva <aol...@redhat.com> wrote:
> >> +  tree get_node () const {
> >> +    if (!split_list_p ()) return tldcl;
> >> +    else return const_cast <tinst_level *>(this)->to_list ();
> >> +  }
>
> > This looks like a dangerous violation of const correctness, since it does
> > in fact modify the object.
>
> Well...  We know the object's actual type is not const, since we
> allocate all objects of this type from GCable memory.  Conceptually, the
> object is not modified, we're just lazily performing an expensive
> rearrangement of the internal representation that we would have done
> upfront if we weren't trying to save that expense.  This would be a
> perfect case for mutable, if only gengtype didn't get confused by it.
>
>
> OTOH, we could drop a tiny amount of constification in error.c and avoid
> the problem altogether, as in the following incremental patch:
>
>  gcc/cp/cp-tree.h |    4 ++--
>  gcc/cp/error.c   |    2 +-
>  2 files changed, 3 insertions(+), 3 deletions(-)
>
> diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h
> index e9d9bab879bc..26a50ac136dd 100644
> --- a/gcc/cp/cp-tree.h
> +++ b/gcc/cp/cp-tree.h
> @@ -5909,9 +5909,9 @@ struct GTY((chain_next ("%h.next"))) tinst_level {
>    /* Return the original node; if it's a split list, make it a
>       TREE_LIST first, so that it can be returned as a single tree
>       object.  */
> -  tree get_node () const {
> +  tree get_node () {
>      if (!split_list_p ()) return tldcl;
> -    else return const_cast <tinst_level *>(this)->to_list ();
> +    else return to_list ();
>    }
>
>    /* Return the original node if it's a DECL or a TREE_LIST, but do
> diff --git a/gcc/cp/error.c b/gcc/cp/error.c
> index 983ffdfedbb2..95b8b84f34ab 100644
> --- a/gcc/cp/error.c
> +++ b/gcc/cp/error.c
> @@ -3475,7 +3475,7 @@ print_instantiation_full_context (diagnostic_context
> *context)
>
>  static void
>  print_instantiation_partial_context_line (diagnostic_context *context,
> -                                         const struct tinst_level *t,
> +                                         struct tinst_level *t,
>                                           location_t loc, bool recursive_p)
>  {
>    if (loc == UNKNOWN_LOCATION)
>
>
> Does this incremental change make it ok (pending retesting), or should I
> look into adding mutable support to gengtype, or something else?
>

This change looks good. One other nit: get_decl_maybe can also return a
list, so the name seems wrong. And this line

+      if (obj->list_p () && obj->get_decl_maybe ())

could be

  if (tree_list_p ())

I think, and then get_decl_maybe wouldn't need to return a list anymore?

Jason

-- 
> Alexandre Oliva, freedom fighter    http://FSFLA.org/~lxoliva/
> You must be the change you wish to see in the world. -- Gandhi
> Be Free! -- http://FSFLA.org/   FSF Latin America board member
> Free Software Evangelist|Red Hat Brasil GNU Toolchain Engineer
>

Reply via email to