From 14c014b1a5d3353ecd1397ee4d6421b04fa59534 Mon Sep 17 00:00:00 2001 From: hubicka Date: Sun, 10 May 2015 21:03:15 +0000 Subject: [PATCH] * 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 git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@222984 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 7 +++++++ gcc/tree.c | 36 ++++++++++++++++++++++++++++++------ gcc/tree.def | 2 ++ 3 files changed, 39 insertions(+), 6 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 43047300fa7..2a43fe952ae 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,12 @@ 2015-05-09 Jan Hubicka + * 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 + * tree.c (verify_type): Verify TYPE_BINFO and TYPE_VALUES_RAW. * tree.h (is_lang_specific): Constify. diff --git a/gcc/tree.c b/gcc/tree.c index fbedc1d52e3..b4dceed31dc 100644 --- a/gcc/tree.c +++ b/gcc/tree.c @@ -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 (t), TREE_TYPE (TYPE_MIN_VALUE (t)) + useless_type_conversion_p (const_cast (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 (t), TREE_TYPE (TYPE_MAX_VALUE (t)) + useless_type_conversion_p (const_cast (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 b4b41642a6d..ea7bea046d6 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) -- 2.11.4.GIT