diff options
author | Jan Hubicka <hubicka@ucw.cz> | 2015-05-04 02:14:47 +0200 |
---|---|---|
committer | Jan Hubicka <hubicka@gcc.gnu.org> | 2015-05-04 00:14:47 +0000 |
commit | 30a9f69b59d900d9de42b678f5b32cce376ac952 (patch) | |
tree | 15d2430a21047548a2e7e0b8fdeedbbd20495b46 /gcc/tree.c | |
parent | 90c19438a26683180babe6fd8007b5567cf914d3 (diff) | |
download | gcc-30a9f69b59d900d9de42b678f5b32cce376ac952.zip gcc-30a9f69b59d900d9de42b678f5b32cce376ac952.tar.gz gcc-30a9f69b59d900d9de42b678f5b32cce376ac952.tar.bz2 |
* tree.c (verify_type): Check various uses of TYPE_MINVAL.
From-SVN: r222753
Diffstat (limited to 'gcc/tree.c')
-rw-r--r-- | gcc/tree.c | 59 |
1 files changed, 52 insertions, 7 deletions
@@ -12584,15 +12584,60 @@ verify_type (const_tree t) } else if (t != mv && !verify_type_variant (t, mv)) error_found = true; - /* FIXME: C FE uses TYPE_VFIELD to record C_TYPE_INCOMPLETE_VARS - and danagle the pointer from time to time. */ - if (RECORD_OR_UNION_TYPE_P (t) && TYPE_VFIELD (t) - && TREE_CODE (TYPE_VFIELD (t)) != FIELD_DECL - && TREE_CODE (TYPE_VFIELD (t)) != TREE_LIST) + + /* Check various uses of TYPE_MINVAL. */ + if (RECORD_OR_UNION_TYPE_P (t)) + { + /* FIXME: C FE uses TYPE_VFIELD to record C_TYPE_INCOMPLETE_VARS + and danagle the pointer from time to time. */ + if (TYPE_VFIELD (t) + && TREE_CODE (TYPE_VFIELD (t)) != FIELD_DECL + && TREE_CODE (TYPE_VFIELD (t)) != TREE_LIST) + { + error ("TYPE_VFIELD is not FIELD_DECL nor TREE_LIST"); + debug_tree (TYPE_VFIELD (t)); + error_found = true; + } + } + else if (TREE_CODE (t) == POINTER_TYPE) + { + if (TYPE_NEXT_PTR_TO (t) + && TREE_CODE (TYPE_NEXT_PTR_TO (t)) != POINTER_TYPE) + { + error ("TYPE_NEXT_PTR_TO is not POINTER_TYPE"); + debug_tree (TYPE_NEXT_PTR_TO (t)); + error_found = true; + } + } + else if (TREE_CODE (t) == REFERENCE_TYPE) { - error ("TYPE_VFIELD is not FIELD_DECL nor TREE_LIST"); - debug_tree (TYPE_VFIELD (t)); + if (TYPE_NEXT_REF_TO (t) + && TREE_CODE (TYPE_NEXT_REF_TO (t)) != REFERENCE_TYPE) + { + error ("TYPE_NEXT_REF_TO is not REFERENCE_TYPE"); + debug_tree (TYPE_NEXT_REF_TO (t)); + error_found = true; + } + } + else if (INTEGRAL_TYPE_P (t) || TREE_CODE (t) == REAL_TYPE || TREE_CODE (t) == FIXED_POINT_TYPE) + { + if (!TYPE_MIN_VALUE (t)) + ; + else if (!TREE_CONSTANT (TYPE_MIN_VALUE (t))) + { + error ("TYPE_MIN_VALUE is not constant"); + debug_tree (TYPE_MIN_VALUE (t)); + error_found = true; + } + } + else if (TYPE_MINVAL (t)) + { + error ("TYPE_MINVAL non-NULL"); + debug_tree (TYPE_MINVAL (t)); + error_found = true; } + + if (error_found) { debug_tree (const_cast <tree> (t)); |