From: David Ayers Date: Thu, 2 Apr 2009 12:40:48 +0000 (+0000) Subject: re PR objc/27377 (false compiler warnings generated in Objective-C code) X-Git-Tag: releases/gcc-4.3.4~247 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=af6087c2f10c57efceb3a9278252fcbaa2f59030;p=thirdparty%2Fgcc.git re PR objc/27377 (false compiler warnings generated in Objective-C code) gcc/ 2009-03-29 David Ayers PR objc/27377 * c-typeck.c (build_conditional_expr): Emit ObjC warnings by calling objc_compare_types and surpress warnings about incompatible C pointers that are compatible ObjC pointers. gcc/testsuite/ 2009-03-29 David Ayers PR objc/27377 * objc.dg/conditional-1.m: New tests. From-SVN: r145446 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 7adac9c10519..f9e5fb95b320 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2009-04-02 David Ayers + + PR objc/27377 + * c-typeck.c (build_conditional_expr): Emit ObjC warnings + by calling objc_compare_types and surpress warnings about + incompatible C pointers that are compatible ObjC pointers. + 2009-04-01 Eric Botcazou PR rtl-optimization/39588 diff --git a/gcc/c-typeck.c b/gcc/c-typeck.c index 877918437b00..c96f738ee3a7 100644 --- a/gcc/c-typeck.c +++ b/gcc/c-typeck.c @@ -3393,6 +3393,7 @@ build_conditional_expr (tree ifexp, tree op1, tree op2) enum tree_code code2; tree result_type = NULL; tree orig_op1 = op1, orig_op2 = op2; + bool objc_ok; /* Promote both alternatives. */ @@ -3419,6 +3420,8 @@ build_conditional_expr (tree ifexp, tree op1, tree op2) return error_mark_node; } + objc_ok = objc_compare_types (type1, type2, -3, NULL_TREE); + /* Quickly detect the usual case where op1 and op2 have the same type after promotion. */ if (TYPE_MAIN_VARIANT (type1) == TYPE_MAIN_VARIANT (type2)) @@ -3499,7 +3502,8 @@ build_conditional_expr (tree ifexp, tree op1, tree op2) } else { - pedwarn ("pointer type mismatch in conditional expression"); + if (!objc_ok) + pedwarn ("pointer type mismatch in conditional expression"); result_type = build_pointer_type (void_type_node); } } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 1ab4b0eb58e4..e104e88781a8 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2009-04-02 David Ayers + + PR objc/27377 + * objc.dg/conditional-1.m: New tests. + 2009-04-01 Eric Botcazou * gcc.c-torture/compile/20090401-1.c: New test. diff --git a/gcc/testsuite/objc.dg/conditional-1.m b/gcc/testsuite/objc.dg/conditional-1.m new file mode 100644 index 000000000000..0aad62c55f18 --- /dev/null +++ b/gcc/testsuite/objc.dg/conditional-1.m @@ -0,0 +1,45 @@ +/* Testing conditional warnings (without headers). */ +/* Author: David Ayers */ + +/* { dg-do compile } */ + +#define nil ((id)0) +@interface MyObject +@end + +@protocol MyProtocol +@end + +@interface MyProtoObject +@end + + +int +main (int argc, char *argv[]) +{ + id var_id = nil; + id var_id_p = nil; + MyObject *var_obj = nil; + MyProtoObject *var_obj_p = nil; + + var_id = (var_id == var_obj) ? var_id : var_obj; + var_id = (var_id == var_obj) ? var_id : var_obj_p; + + /* Ayers: Currently, the following test case passes for + technically the wrong reason (see below). + */ + var_obj_p = (var_id == var_obj) ? var_obj_p : var_obj; /* { dg-warning "distinct Objective-C types" } */ + var_obj_p = (var_id == var_obj) ? var_obj_p : var_id_p; + + /* Ayers: The first of the following test cases + should probably warn for var_obj_p = var_obj, + yet that would require extensive changes to + build_conditional_expr to create a tree with + multiple types that the assignment would have + to evaluate both versions for correct diagnostics. + */ + var_obj_p = (var_id == var_obj) ? var_id : var_obj; + var_obj_p = (var_id == var_obj) ? var_id : var_obj_p; + + return 0; +}