OSDN Git Service

Added new test from Nicola Pero.
authorovidiu <ovidiu@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 28 Feb 2001 17:05:10 +0000 (17:05 +0000)
committerovidiu <ovidiu@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 28 Feb 2001 17:05:10 +0000 (17:05 +0000)
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@40123 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/testsuite/objc/execute/bycopy-3.m [new file with mode: 0644]

diff --git a/gcc/testsuite/objc/execute/bycopy-3.m b/gcc/testsuite/objc/execute/bycopy-3.m
new file mode 100644 (file)
index 0000000..9c7c0ac
--- /dev/null
@@ -0,0 +1,69 @@
+/*
+ * Contributed by Nicola Pero <nicola@brainstorm.co.uk>
+ * Wed Feb 28 12:27:03 CET 2001
+ */
+
+/*
+ * This test contains some no-op code which is needed to keep it
+ * compile on broken gcc 3.x.  Anyway, the no-op code does not
+ * interfere with what we are testing, which is that the `bycopy'
+ * keyword generates the _F_BYCOPY qualifier for the return type.  */
+
+#include <objc/objc.h>
+#include <objc/Object.h>
+#include <objc/Protocol.h>
+#include <objc/encoding.h>
+
+@protocol MyProtocol
++ (bycopy id<MyProtocol>) bycopyMethod;
+@end
+
+/* This no-op class to keep it compile under broken gcc 3.x */
+@interface MyObject : Object <MyProtocol> 
+@end
+
+@implementation MyObject
++ (bycopy id<MyProtocol>) bycopyMethod
+{
+  return [MyObject alloc];
+}
+@end
+
+int main (void)
+{
+  struct objc_method_description *method;
+  const char *method_types;
+  unsigned qualifiers;
+  Protocol *protocol;
+  /* This no-op command is needed to keep the test compile on broken
+     gcc 3.x */
+  MyObject *object = [MyObject bycopyMethod];
+
+  /* Get the protocol object */
+  protocol = @protocol (MyProtocol);
+
+  /* Ask to the protocol for the description of the method bycopyMethod */
+  method = [protocol descriptionForClassMethod: @selector (bycopyMethod)];
+  if (method == NULL)
+    {
+      printf ("Could not find method bycopyMethod in protocol!\n");
+      exit (1);
+    }
+
+  /* Get the method types for the method - which encode return type,
+     arguments etc. */
+  method_types = method->types;
+
+  /* Get the qualifiers for the return type */
+  qualifiers = objc_get_type_qualifiers (method_types);
+
+  /* If _F_BYCOPY is not there, the compiler is broken */
+  if (! (qualifiers & _F_BYCOPY))
+    {
+      printf ("Failed - selector does not contain _F_BYCOPY qualifier!\n");
+      exit (1);
+    }
+
+  /* Else, happy end */
+  return 0;
+}