c-typeck.c (build_c_cast): In ObjC...
authorZiemowit Laski <zlaski@apple.com>
Wed, 25 Aug 2004 20:38:53 +0000 (20:38 +0000)
committerZiemowit Laski <zlaski@gcc.gnu.org>
Wed, 25 Aug 2004 20:38:53 +0000 (20:38 +0000)
[gcc/ChangeLog]
2004-08-25  Ziemowit Laski  <zlaski@apple.com>

       * c-typeck.c (build_c_cast): In ObjC, always preserve (and silently
       accept) a cast from one Objective-C pointer type to another.

[gcc/testsuite/ChangeLog]
2004-08-25  Ziemowit Laski  <zlaski@apple.com>

       * objc.dg/proto-lossage-4.m: New test.

From-SVN: r86574

gcc/ChangeLog
gcc/c-typeck.c
gcc/testsuite/ChangeLog
gcc/testsuite/objc.dg/proto-lossage-4.m [new file with mode: 0644]

index 56ab52c8c12a4e8e4bca78841a22ca1272dcddcd..3ce3e7b1a1dfff35b6c5f50f95b6c6dcee400e19 100644 (file)
@@ -1,3 +1,8 @@
+2004-08-25  Ziemowit Laski  <zlaski@apple.com>
+
+       * c-typeck.c (build_c_cast): In ObjC, always preserve (and silently
+       accept) a cast from one Objective-C pointer type to another.
+
 2004-08-25  Paolo Carlini  <pcarlini@suse.de>
 
        * doc/install.texi: Document that libstdc++-v3 requires
index d71b99080acc39e49fbfc8f73ecb2f564dca6659..ca6e9f372a733ea2b2748d1059d7c409c25dbc41 100644 (file)
@@ -2922,8 +2922,10 @@ build_c_cast (tree type, tree expr)
   /* The ObjC front-end uses TYPE_MAIN_VARIANT to tie together types differing
      only in <protocol> qualifications.  But when constructing cast expressions,
      the protocols do matter and must be kept around.  */
-  if (!c_dialect_objc () || !objc_is_object_ptr (type))
-    type = TYPE_MAIN_VARIANT (type);
+  if (objc_is_object_ptr (type) && objc_is_object_ptr (TREE_TYPE (expr)))
+    return build1 (NOP_EXPR, type, expr);
+
+  type = TYPE_MAIN_VARIANT (type);
 
   if (TREE_CODE (type) == ARRAY_TYPE)
     {
index 0b6efa8dd15fb39577dd28056d06b18b0946f28c..ec0349e33e7d97904369b86e59c4e8781b2fe93d 100644 (file)
@@ -1,3 +1,7 @@
+2004-08-25  Ziemowit Laski  <zlaski@apple.com>
+
+       * objc.dg/proto-lossage-4.m: New test.
+
 2004-08-25  Mark Mitchell  <mark@codesourcery.com>
 
        PR c++/17155
diff --git a/gcc/testsuite/objc.dg/proto-lossage-4.m b/gcc/testsuite/objc.dg/proto-lossage-4.m
new file mode 100644 (file)
index 0000000..5bd25a4
--- /dev/null
@@ -0,0 +1,51 @@
+/* Test for situations in which protocol conformance information
+   may be lost while casting.  */
+/* Author: Ziemowit Laski <zlaski@apple.com>.  */
+/* { dg-do compile } */
+
+/* One-line substitute for objc/objc.h */
+typedef struct objc_object { struct objc_class *class_pointer; } *id;
+
+@protocol Proto
+- (int)someValue;
+@end
+
+@interface Obj
+- (int)anotherValue;
+@end
+
+int foo(void) {
+  int receiver = 2;
+  Obj *objrcvr;
+  Obj <Proto> *objrcvr2;
+
+  receiver += [receiver someValue]; /* { dg-warning "invalid receiver type .int( )?." } */
+/* { dg-warning "Messages without a matching method signature" "" { target *-*-* } 22 } */
+/* { dg-warning "will be assumed to return .id. and accept" "" { target *-*-* } 22 } */
+/* { dg-warning ".\.\.\.. as arguments" "" { target *-*-* } 22 } */
+/* { dg-warning "assignment makes integer from pointer without a cast" "" { target *-*-* } 22 } */
+
+  receiver += [receiver anotherValue]; /* { dg-warning "invalid receiver type .int( )?." } */
+/* { dg-warning "assignment makes integer from pointer without a cast" "" { target *-*-* } 28 } */
+  
+  receiver += [(Obj *)receiver someValue]; /* { dg-warning ".Obj. may not respond to .\\-someValue." } */
+/* { dg-warning "assignment makes integer from pointer without a cast" "" { target *-*-* } 31 } */
+
+  receiver += [(Obj *)receiver anotherValue];
+  receiver += [(Obj <Proto> *)receiver someValue];
+  receiver += [(Obj <Proto> *)receiver anotherValue];
+  receiver += [objrcvr someValue]; /* { dg-warning ".Obj. may not respond to .\\-someValue." } */
+/* { dg-warning "assignment makes integer from pointer without a cast" "" { target *-*-* } 37 } */
+
+  receiver += [objrcvr anotherValue];
+  receiver += [(Obj <Proto> *)objrcvr someValue];
+  receiver += [(Obj <Proto> *)objrcvr anotherValue];
+  receiver += [objrcvr2 someValue];
+  receiver += [objrcvr2 anotherValue];
+  receiver += [(Obj *)objrcvr2 someValue]; /* { dg-warning ".Obj. may not respond to .\\-someValue." } */
+/* { dg-warning "assignment makes integer from pointer without a cast" "" { target *-*-* } 45 } */
+
+  receiver += [(Obj *)objrcvr2 anotherValue];
+
+  return receiver;
+}