diff options
author | Jan Hubicka <hubicka@ucw.cz> | 2015-05-10 23:03:15 +0200 |
---|---|---|
committer | Jan Hubicka <hubicka@gcc.gnu.org> | 2015-05-10 21:03:15 +0000 |
commit | 15296d46dec964f4f2fea572c183462dbd96e576 (patch) | |
tree | eff4cc7d99e6fb6b5bb97e85911269f526cc1081 /gcc | |
parent | e587377d38dc7aa230f103008851147021bcb624 (diff) | |
download | gcc-15296d46dec964f4f2fea572c183462dbd96e576.zip gcc-15296d46dec964f4f2fea572c183462dbd96e576.tar.gz gcc-15296d46dec964f4f2fea572c183462dbd96e576.tar.bz2 |
tree.c (free_lang_data_in_type): Free TREE_PURPOSE of TYPE_ARG_TYPES list.
* 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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/tree.c | 36 | ||||
-rw-r--r-- | gcc/tree.def | 2 |
3 files changed, 39 insertions, 6 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 4304730..2a43fe95 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,12 @@ 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. * tree.h (is_lang_specific): Constify. @@ -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); diff --git a/gcc/tree.def b/gcc/tree.def index b4b4164..ea7bea0 100644 --- a/gcc/tree.def +++ b/gcc/tree.def @@ -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) |