aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZiemowit Laski <zlaski@apple.com>2004-08-25 19:42:08 +0000
committerZiemowit Laski <zlaski@apple.com>2004-08-25 19:42:08 +0000
commit72480e091c8d9dc7d73cfe1836a92998637a19d6 (patch)
tree07d74065f3181955e8c06e9970e64a7c404dc603
parentb72ae107c96b1db37ac7bea3d12d2f220b6b35a2 (diff)
[gcc/ChangeLog.objc-improvements]
2004-08-25 Ziemowit Laski <zlaski@apple.com> * c-typeck.c: Sync ObjC changes with mainline. [gcc/testsuite/ChangeLog.objc-improvements] 2004-08-25 Ziemowit Laski <zlaski@apple.com> * objc.dg/proto-lossage-4.m: Brought over from mainline. git-svn-id: https://gcc.gnu.org/svn/gcc/branches/objc-improvements-branch@86569 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog.objc-improvements4
-rw-r--r--gcc/c-typeck.c4
-rw-r--r--gcc/testsuite/ChangeLog.objc-improvements4
-rw-r--r--gcc/testsuite/objc.dg/proto-lossage-4.m51
4 files changed, 61 insertions, 2 deletions
diff --git a/gcc/ChangeLog.objc-improvements b/gcc/ChangeLog.objc-improvements
index 1428a73b892..049226a9316 100644
--- a/gcc/ChangeLog.objc-improvements
+++ b/gcc/ChangeLog.objc-improvements
@@ -1,3 +1,7 @@
+2004-08-25 Ziemowit Laski <zlaski@apple.com>
+
+ * c-typeck.c: Sync ObjC changes with mainline.
+
2004-08-21 Ziemowit Laski <zlaski@apple.com>
* c-decl.c (build_cdtor) Move calls to objc_static_init_needed_p()
diff --git a/gcc/c-typeck.c b/gcc/c-typeck.c
index 76d3840cddf..7474a8de0c3 100644
--- a/gcc/c-typeck.c
+++ b/gcc/c-typeck.c
@@ -1440,7 +1440,7 @@ build_component_ref (tree datum, tree component)
tree field = NULL;
tree ref;
- if (c_dialect_objc () && !objc_is_public (datum, component))
+ if (!objc_is_public (datum, component))
return error_mark_node;
/* If DATUM is a COMPOUND_EXPR, move our reference inside it.
@@ -2917,7 +2917,7 @@ 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 != TREE_TYPE (expr))
+ if (objc_is_object_ptr (type) && objc_is_object_ptr (TREE_TYPE (expr)))
return build1 (NOP_EXPR, type, expr);
type = TYPE_MAIN_VARIANT (type);
diff --git a/gcc/testsuite/ChangeLog.objc-improvements b/gcc/testsuite/ChangeLog.objc-improvements
index fddcd2beb33..b86f0856352 100644
--- a/gcc/testsuite/ChangeLog.objc-improvements
+++ b/gcc/testsuite/ChangeLog.objc-improvements
@@ -1,3 +1,7 @@
+2004-08-25 Ziemowit Laski <zlaski@apple.com>
+
+ * objc.dg/proto-lossage-4.m: Brought over from mainline.
+
2004-08-21 Ziemowit Laski <zlaski@apple.com>
* objc/execute/IMP.m: Include <stdlib.h>.
diff --git a/gcc/testsuite/objc.dg/proto-lossage-4.m b/gcc/testsuite/objc.dg/proto-lossage-4.m
new file mode 100644
index 00000000000..a0a79840886
--- /dev/null
+++ b/gcc/testsuite/objc.dg/proto-lossage-4.m
@@ -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" } */
+
+ 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;
+}