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/tree.c | |
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/tree.c')
-rw-r--r-- | gcc/tree.c | 36 |
1 files changed, 30 insertions, 6 deletions
@@ -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); |