diff options
author | Jason Merrill <merrill@gnu.org> | 1995-04-06 21:31:01 +0000 |
---|---|---|
committer | Jason Merrill <merrill@gnu.org> | 1995-04-06 21:31:01 +0000 |
commit | 605a99f6be7cd0d2c31d382b0aea37cae9aa03bc (patch) | |
tree | 2f548b059ebe13d8f4aa677bd8e596aee9eab653 /gcc | |
parent | b3ca463cdad1c4d09304baf3841906be92681d0a (diff) | |
download | gcc-605a99f6be7cd0d2c31d382b0aea37cae9aa03bc.zip gcc-605a99f6be7cd0d2c31d382b0aea37cae9aa03bc.tar.gz gcc-605a99f6be7cd0d2c31d382b0aea37cae9aa03bc.tar.bz2 |
(build_binary_op): Don't call common_type for uncommon pointer types.
From-SVN: r9317
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/c-typeck.c | 48 |
1 files changed, 31 insertions, 17 deletions
diff --git a/gcc/c-typeck.c b/gcc/c-typeck.c index b6e9a6b..6cfc777 100644 --- a/gcc/c-typeck.c +++ b/gcc/c-typeck.c @@ -2187,7 +2187,7 @@ build_binary_op (code, orig_op0, orig_op1, convert_p) Otherwise, the targets must be compatible and both must be object or both incomplete. */ if (comp_target_types (type0, type1)) - ; + result_type = common_type (type0, type1); else if (TYPE_MAIN_VARIANT (tt0) == void_type_node) { /* op0 != orig_op0 detects the case of something @@ -2204,7 +2204,9 @@ build_binary_op (code, orig_op0, orig_op1, convert_p) } else pedwarn ("comparison of distinct pointer types lacks a cast"); - result_type = common_type (type0, type1); + + if (result_type == NULL_TREE) + result_type = ptr_type_node; } else if (code0 == POINTER_TYPE && TREE_CODE (op1) == INTEGER_CST && integer_zerop (op1)) @@ -2233,12 +2235,18 @@ build_binary_op (code, orig_op0, orig_op1, convert_p) shorten = 1; else if (code0 == POINTER_TYPE && code1 == POINTER_TYPE) { - if (! comp_target_types (type0, type1)) - pedwarn ("comparison of distinct pointer types lacks a cast"); - else if (pedantic - && TREE_CODE (TREE_TYPE (type0)) == FUNCTION_TYPE) - pedwarn ("ANSI C forbids ordered comparisons of pointers to functions"); - result_type = common_type (type0, type1); + if (comp_target_types (type0, type1)) + { + result_type = common_type (type0, type1); + if (pedantic + && TREE_CODE (TREE_TYPE (type0)) == FUNCTION_TYPE) + pedwarn ("ANSI C forbids ordered comparisons of pointers to functions"); + } + else + { + result_type = ptr_type_node; + pedwarn ("comparison of distinct pointer types lacks a cast"); + } } break; @@ -2252,15 +2260,21 @@ build_binary_op (code, orig_op0, orig_op1, convert_p) short_compare = 1; else if (code0 == POINTER_TYPE && code1 == POINTER_TYPE) { - if (! comp_target_types (type0, type1)) - pedwarn ("comparison of distinct pointer types lacks a cast"); - else if ((TYPE_SIZE (TREE_TYPE (type0)) != 0) - != (TYPE_SIZE (TREE_TYPE (type1)) != 0)) - pedwarn ("comparison of complete and incomplete pointers"); - else if (pedantic - && TREE_CODE (TREE_TYPE (type0)) == FUNCTION_TYPE) - pedwarn ("ANSI C forbids ordered comparisons of pointers to functions"); - result_type = common_type (type0, type1); + if (comp_target_types (type0, type1)) + { + result_type = common_type (type0, type1); + if ((TYPE_SIZE (TREE_TYPE (type0)) != 0) + != (TYPE_SIZE (TREE_TYPE (type1)) != 0)) + pedwarn ("comparison of complete and incomplete pointers"); + else if (pedantic + && TREE_CODE (TREE_TYPE (type0)) == FUNCTION_TYPE) + pedwarn ("ANSI C forbids ordered comparisons of pointers to functions"); + } + else + { + result_type = ptr_type_node; + pedwarn ("comparison of distinct pointer types lacks a cast"); + } } else if (code0 == POINTER_TYPE && TREE_CODE (op1) == INTEGER_CST && integer_zerop (op1)) |