diff options
author | rupp <rupp@138bc75d-0d04-0410-961f-82ee72b054a4> | 2009-07-27 17:40:57 +0000 |
---|---|---|
committer | rupp <rupp@138bc75d-0d04-0410-961f-82ee72b054a4> | 2009-07-27 17:40:57 +0000 |
commit | ada30930a12b07dac1ea7e5d76fab3f184823243 (patch) | |
tree | 81c4ef5de4cb28ea7e21c57ebc69d82ebbf4a588 /gcc/convert.c | |
parent | f75af213e99cd7d815d4d4d0817856124632c5e4 (diff) | |
download | gcc-ada30930a12b07dac1ea7e5d76fab3f184823243.tar.gz |
* convert.c (convert_to_pointer): Don't assume the target
pointer type is POINTER_SIZE long. Fetch its precision instead.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@150133 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/convert.c')
-rw-r--r-- | gcc/convert.c | 19 |
1 files changed, 14 insertions, 5 deletions
diff --git a/gcc/convert.c b/gcc/convert.c index a1ac3300cac..f7ddfc956fc 100644 --- a/gcc/convert.c +++ b/gcc/convert.c @@ -59,12 +59,21 @@ convert_to_pointer (tree type, tree expr) case INTEGER_TYPE: case ENUMERAL_TYPE: case BOOLEAN_TYPE: - if (TYPE_PRECISION (TREE_TYPE (expr)) != POINTER_SIZE) - expr = fold_build1_loc (loc, NOP_EXPR, - lang_hooks.types.type_for_size (POINTER_SIZE, 0), - expr); - return fold_build1_loc (loc, CONVERT_EXPR, type, expr); + { + /* If the input precision differs from the target pointer type + precision, first convert the input expression to an integer type of + the target precision. Some targets, e.g. VMS, need several pointer + sizes to coexist so the latter isn't necessarily POINTER_SIZE. */ + unsigned int pprec = TYPE_PRECISION (type); + unsigned int eprec = TYPE_PRECISION (TREE_TYPE (expr)); + + if (eprec != pprec) + expr = fold_build1_loc (loc, NOP_EXPR, + lang_hooks.types.type_for_size (pprec, 0), + expr); + } + return fold_build1_loc (loc, CONVERT_EXPR, type, expr); default: error ("cannot convert to a pointer type"); |