diff options
author | Richard Kenner <kenner@gcc.gnu.org> | 1994-05-16 15:48:07 -0400 |
---|---|---|
committer | Richard Kenner <kenner@gcc.gnu.org> | 1994-05-16 15:48:07 -0400 |
commit | 9c4dcbc7d34f79065433f49e4dc0649dab00d676 (patch) | |
tree | 17aef83a56df47f601cd558febaeeaeb50e69f89 /gcc | |
parent | c96ea4a5f47df4fe14754209ddbdde06e9d5fd5e (diff) | |
download | gcc-9c4dcbc7d34f79065433f49e4dc0649dab00d676.zip gcc-9c4dcbc7d34f79065433f49e4dc0649dab00d676.tar.gz gcc-9c4dcbc7d34f79065433f49e4dc0649dab00d676.tar.bz2 |
(initializer_constant_valid_p): Rework to use precision, not size.
Allow conversions from integer to pointer if int is wide enough.
From-SVN: r7305
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/c-typeck.c | 24 |
1 files changed, 19 insertions, 5 deletions
diff --git a/gcc/c-typeck.c b/gcc/c-typeck.c index ba25306..7742e35 100644 --- a/gcc/c-typeck.c +++ b/gcc/c-typeck.c @@ -4131,17 +4131,21 @@ initializer_constant_valid_p (value, endtype) if (TREE_CODE (TREE_TYPE (value)) == POINTER_TYPE && TREE_CODE (TREE_TYPE (TREE_OPERAND (value, 0))) == POINTER_TYPE) return initializer_constant_valid_p (TREE_OPERAND (value, 0), endtype); + /* Allow conversions between real types. */ if (TREE_CODE (TREE_TYPE (value)) == REAL_TYPE && TREE_CODE (TREE_TYPE (TREE_OPERAND (value, 0))) == REAL_TYPE) return initializer_constant_valid_p (TREE_OPERAND (value, 0), endtype); + /* Allow length-preserving conversions between integer types. */ if (TREE_CODE (TREE_TYPE (value)) == INTEGER_TYPE && TREE_CODE (TREE_TYPE (TREE_OPERAND (value, 0))) == INTEGER_TYPE - && tree_int_cst_equal (TYPE_SIZE (TREE_TYPE (value)), - TYPE_SIZE (TREE_TYPE (TREE_OPERAND (value, 0))))) + && (TYPE_PRECISION (TREE_TYPE (value)) + == TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (value, 0))))) return initializer_constant_valid_p (TREE_OPERAND (value, 0), endtype); - /* Allow conversions between integer types only if explicit value. */ + + /* Allow conversions between other integer types only if + explicit value. */ if (TREE_CODE (TREE_TYPE (value)) == INTEGER_TYPE && TREE_CODE (TREE_TYPE (TREE_OPERAND (value, 0))) == INTEGER_TYPE) { @@ -4151,13 +4155,23 @@ initializer_constant_valid_p (value, endtype) return null_pointer_node; return 0; } + /* Allow (int) &foo provided int is as wide as a pointer. */ if (TREE_CODE (TREE_TYPE (value)) == INTEGER_TYPE && TREE_CODE (TREE_TYPE (TREE_OPERAND (value, 0))) == POINTER_TYPE - && ! tree_int_cst_lt (TYPE_SIZE (TREE_TYPE (value)), - TYPE_SIZE (TREE_TYPE (TREE_OPERAND (value, 0))))) + && (TYPE_PRECISION (TREE_TYPE (value)) + >= TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (value, 0))))) + return initializer_constant_valid_p (TREE_OPERAND (value, 0), + endtype); + + /* Likewise conversions from int to pointers. */ + if (TREE_CODE (TREE_TYPE (value)) == POINTER_TYPE + && TREE_CODE (TREE_TYPE (TREE_OPERAND (value, 0))) == INTEGER_TYPE + && (TYPE_PRECISION (TREE_TYPE (value)) + <= TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (value, 0))))) return initializer_constant_valid_p (TREE_OPERAND (value, 0), endtype); + /* Allow conversions to union types if the value inside is okay. */ if (TREE_CODE (TREE_TYPE (value)) == UNION_TYPE) return initializer_constant_valid_p (TREE_OPERAND (value, 0), |