Hi,
in my tree I run the type chekcer from dwarf2out and tree streamer and it
reports non-NULL TREE_PURPOSE in TYPE_ARG_TYPES during bootstrap.
This is because C++ FE uses it to store the initial value.

This patch updates verifier to permit this case and free_lang_data_in_type to
clear it.  I am going to commit this as obvious (The checks will trigger often
on LTO builds even in mainline)

I also added documentation. I think dwarf2out may be interested to output this
so one don't need to specify the value from debugger.

Bootstrapped/regtested x86_64-linux

Honza
        * tree.c (free_lang_data_in_type): Free TREE_PURPOSE of
        TYPE_ARG_TYPES list.
        (verify_type): Permit non-NULL TREE_PURPOSE in non-LTO builds.
        * tree.def (FUNCTION_TYPE): Document TREE_PURPOSE in TYPE_ARG_TYPES
Index: tree.c
===================================================================
--- tree.c      (revision 222981)
+++ tree.c      (working copy)
@@ -5041,6 +5041,8 @@ free_lang_data_in_type (tree type)
              TREE_VALUE (p) = build_qualified_type (arg_type, quals);
              free_lang_data_in_type (TREE_VALUE (p));
            }
+         /* C++ FE uses TREE_PURPOSE to store initial values.  */
+         TREE_PURPOSE (p) = NULL;
        }
     }
 
@@ -12817,7 +12831,8 @@ verify_type (const_tree t)
   else if (TREE_CODE (t) == FUNCTION_TYPE || TREE_CODE (t) == METHOD_TYPE)
     for (tree l = TYPE_ARG_TYPES (t); l; l = TREE_CHAIN (l))
       {
-       if (TREE_PURPOSE (l))
+       /* C++ FE uses TREE_PURPOSE to store initial values.  */
+       if (TREE_PURPOSE (l) && in_lto_p)
          {
            error ("TREE_PURPOSE is non-NULL in TYPE_ARG_TYPES list");
            debug_tree (l);
Index: tree.def
===================================================================
--- tree.def    (revision 222981)
+++ tree.def    (working copy)
@@ -245,6 +245,8 @@ DEFTREECODE (POINTER_BOUNDS_TYPE, "point
    TREE_TYPE               type of value returned.
    TYPE_ARG_TYPES      list of types of arguments expected.
        this list is made of TREE_LIST nodes.
+       In this list TREE_PURPOSE can be used to indicate the default
+       value of parameter (used by C++ frontend).
    Types of "Procedures" in languages where they are different from functions
    have code FUNCTION_TYPE also, but then TREE_TYPE is zero or void type.  */
 DEFTREECODE (FUNCTION_TYPE, "function_type", tcc_type, 0)

Reply via email to