defs.m: New.
authorZiemowit Laski <zlaski@apple.com>
Tue, 1 Apr 2003 22:11:01 +0000 (22:11 +0000)
committerZiemowit Laski <zlaski@gcc.gnu.org>
Tue, 1 Apr 2003 22:11:01 +0000 (22:11 +0000)
2003-04-01  Ziemowit Laski <zlaski@apple.com>

        * objc.dg/defs.m: New.

From-SVN: r65147

gcc/testsuite/ChangeLog
gcc/testsuite/objc.dg/defs.m [new file with mode: 0644]

index f8cb3bad4b0cf56cc7d1e502086ee96b7cac62fa..c66386e9b1d545f763afb83272940d55d90c2e60 100644 (file)
@@ -1,7 +1,10 @@
+2003-04-01  Ziemowit Laski <zlaski@apple.com>
+
+       * objc.dg/defs.m: New.
+
 2003-04-01  Aldy Hernandez  <aldyh@redhat.com>
 
         * g++.dg/eh/simd-1.C: New.
-
         * g++.dg/eh/simd-2.C: New.
 
 2003-03-01  Aldy Hernandez  <aldyh@redhat.com>
diff --git a/gcc/testsuite/objc.dg/defs.m b/gcc/testsuite/objc.dg/defs.m
new file mode 100644 (file)
index 0000000..e8d8c2c
--- /dev/null
@@ -0,0 +1,67 @@
+/* Check if the @defs() construct preserves the correct
+   offsets of ivars.  */
+/* Contributed by Ziemowit Laski <zlaski@apple.com>.  */
+/* { dg-options "-lobjc" } */
+/* { dg-do run } */
+
+#include <objc/objc.h>
+#include <objc/Object.h>
+
+extern void abort(void);
+
+#define CHECK_IF(expr) if(!(expr)) abort();
+
+@interface Base: Object {
+@public
+  int a;
+  float b;
+  char c;
+}
+@end
+
+@interface Derived: Base {
+@public
+  double d;
+  unsigned e;
+  id f;
+} 
+- init;
+@end
+
+struct Derived_defs {
+  @defs(Derived);
+};
+
+@implementation Base
+@end
+@implementation Derived
+- init {
+  [super init];
+  a = 123;
+  b = 1.23;
+  c = 'c';
+  d = 123.456;
+  e = 456;
+  f = isa;
+  return self;
+}
+@end
+
+int main(void) {
+  Derived *derived = [[Derived alloc] init];
+  struct Derived_defs *derived_defs = (struct Derived_defs *)derived;
+
+  CHECK_IF(derived->a == derived_defs->a && derived_defs->a == 123);
+  CHECK_IF(derived->b == derived_defs->b && derived_defs->b == (float)1.23);  
+  CHECK_IF(derived->c == derived_defs->c && derived_defs->c == 'c');  
+  CHECK_IF(derived->d == derived_defs->d && derived_defs->d == (double)123.456);  
+  CHECK_IF(derived->e == derived_defs->e && derived_defs->e == 456);  
+  CHECK_IF(derived->f == derived_defs->f && derived_defs->f == derived_defs->isa);
+
+  /* Try out the "inline" notation as well.  */
+  CHECK_IF(((struct { @defs(Derived); } *)derived)->a == 123);
+  CHECK_IF(((struct { @defs(Derived); } *)derived)->c == 'c');
+  CHECK_IF(((struct { @defs(Derived); } *)derived)->e == 456);
+
+  return 0;
+}