tree.c (free_lang_data_in_type): Free TREE_PURPOSE of TYPE_ARG_TYPES list.
authorJan Hubicka <hubicka@ucw.cz>
Sun, 10 May 2015 21:03:15 +0000 (23:03 +0200)
committerJan Hubicka <hubicka@gcc.gnu.org>
Sun, 10 May 2015 21:03:15 +0000 (21:03 +0000)
* 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

From-SVN: r222984

gcc/ChangeLog
gcc/tree.c
gcc/tree.def

index 43047300fa710ed2abf90c9a3e41f0460271ccf5..2a43fe952aefd15f0d3cc379da0afe665058ecf6 100644 (file)
@@ -1,3 +1,10 @@
+2015-05-09  Jan Hubicka  <hubicka@ucw.cz>
+
+       * 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
+
 2015-05-09  Jan Hubicka  <hubicka@ucw.cz>
 
        * tree.c (verify_type): Verify TYPE_BINFO and TYPE_VALUES_RAW.
index fbedc1d52e35aaed96dbc2e7c730e5fe44982da9..b4dceed31dc227f426feab96fb40b30efbcadcd4 100644 (file)
@@ -5041,7 +5041,23 @@ 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;
        }
+      /* Java uses TYPE_MINVAL for TYPE_ARGUMENT_SIGNATURE.  */
+      TYPE_MINVAL (type) = NULL;
+    }
+  if (TREE_CODE (type) == METHOD_TYPE)
+    {
+      tree p;
+
+      for (p = TYPE_ARG_TYPES (type); p; p = TREE_CHAIN (p))
+       {
+         /* C++ FE uses TREE_PURPOSE to store initial values.  */
+         TREE_PURPOSE (p) = NULL;
+       }
+      /* Java uses TYPE_MINVAL for TYPE_ARGUMENT_SIGNATURE.  */
+      TYPE_MINVAL (type) = NULL;
     }
 
   /* Remove members that are not actually FIELD_DECLs from the field
@@ -12619,13 +12635,18 @@ verify_type (const_tree t)
          error_found = true;
        }
     }
-  else if (INTEGRAL_TYPE_P (t) || TREE_CODE (t) == REAL_TYPE || TREE_CODE (t) == FIXED_POINT_TYPE)
+  else if (INTEGRAL_TYPE_P (t) || TREE_CODE (t) == REAL_TYPE
+          || TREE_CODE (t) == FIXED_POINT_TYPE)
     {
       /* FIXME: The following check should pass:
-         useless_type_conversion_p (const_cast <tree> (t), TREE_TYPE (TYPE_MIN_VALUE (t))
+         useless_type_conversion_p (const_cast <tree> (t),
+                                    TREE_TYPE (TYPE_MIN_VALUE (t))
         but does not for C sizetypes in LTO.  */
     }
-  else if (TYPE_MINVAL (t))
+  /* Java uses TYPE_MINVAL for TYPE_ARGUMENT_SIGNATURE.  */
+  else if (TYPE_MINVAL (t)
+          && ((TREE_CODE (t) != METHOD_TYPE && TREE_CODE (t) != FUNCTION_TYPE)
+              || in_lto_p))
     {
       error ("TYPE_MINVAL non-NULL");
       debug_tree (TYPE_MINVAL (t));
@@ -12665,10 +12686,12 @@ verify_type (const_tree t)
          error_found = true;
        }
     }
-  else if (INTEGRAL_TYPE_P (t) || TREE_CODE (t) == REAL_TYPE || TREE_CODE (t) == FIXED_POINT_TYPE)
+  else if (INTEGRAL_TYPE_P (t) || TREE_CODE (t) == REAL_TYPE
+          || TREE_CODE (t) == FIXED_POINT_TYPE)
     {
       /* FIXME: The following check should pass:
-         useless_type_conversion_p (const_cast <tree> (t), TREE_TYPE (TYPE_MAX_VALUE (t))
+         useless_type_conversion_p (const_cast <tree> (t),
+                                    TREE_TYPE (TYPE_MAX_VALUE (t))
         but does not for C sizetypes in LTO.  */
     }
   else if (TREE_CODE (t) == ARRAY_TYPE)
@@ -12817,7 +12840,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 b4b41642a6d6b65fd78e487e30fe54787b8ccef4..ea7bea046d62ed6c04356cfc742a9892b6b067f3 100644 (file)
@@ -245,6 +245,8 @@ DEFTREECODE (POINTER_BOUNDS_TYPE, "pointer_bounds_type", tcc_type, 0)
    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)