diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index c849daaa6b87ef5f234eaf5f81f297652b0c5169..d9a5e5342164c3469a47c1f4fd8a83a425d83120 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,9 @@
+2005-09-04  Andrew Pinski  <pinskia@physics.uc.edu>
+            Rasmus Hahn  <rassahah@neofonie.de>
+
+	PR libobjc/23108
+	* objc.dg/type-stream-1.m: New test.
+
 2005-09-04  Tobias Schl"uter  <tobias.shclueter@physik.uni-muenchen.de>
 
 	PR fortran/23661
diff --git a/gcc/testsuite/objc.dg/type-stream-1.m b/gcc/testsuite/objc.dg/type-stream-1.m
new file mode 100644
index 0000000000000000000000000000000000000000..edc04e6467bddddc346831c748f9e9f9a7cf5bba
--- /dev/null
+++ b/gcc/testsuite/objc.dg/type-stream-1.m
@@ -0,0 +1,25 @@
+/* { dg-options "-fgnu-runtime" } */
+/* { dg-do run } */
+#include <objc/typedstream.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+int main (void)
+{
+  FILE *f; TypedStream *ts;
+  struct T { int a, b; } x = { 1, 2 };
+  f = fopen ("foo", "w"); ts = objc_open_typed_stream (f, OBJC_WRITEONLY);
+  objc_write_type (ts, @encode(struct T), &x);
+  objc_close_typed_stream (ts); fclose (f);
+  f = fopen ("foo", "r"); ts = objc_open_typed_stream (f, OBJC_READONLY);
+  struct T y;
+  objc_read_type (ts, @encode(struct T), &y);
+  if (y.a != 1)
+   abort ();
+  if (y.b != 2)
+   abort ();
+  objc_close_typed_stream (ts); fclose (f);
+  remove ("foo");
+  return 0;
+}
+
diff --git a/libobjc/ChangeLog b/libobjc/ChangeLog
index 0161254ac5a8e2dad85d090fd03140df0a3a18a1..81e11ccbd5a47e3144c8e044e4d808bca33f3b74 100644
--- a/libobjc/ChangeLog
+++ b/libobjc/ChangeLog
@@ -1,3 +1,10 @@
+2005-09-04  Andrew Pinski  <pinskia@physics.uc.edu>
+            Rasmus Hahn  <rassahah@neofonie.de>
+
+	PR libobjc/23108
+	* archive.c (objc_write_type): Correct the element offset.
+	(objc_read_type): Likewise.
+
 2005-08-17  Kelley Cook  <kcook@gcc.gnu.org>
 
 	* All files: Update FSF address.
diff --git a/libobjc/archive.c b/libobjc/archive.c
index eeaf29c62f34c70ec3fa2694763835d435760f8c..992a69600d4a3295cddd0438cbf4f1a298c9b006 100644
--- a/libobjc/archive.c
+++ b/libobjc/archive.c
@@ -1069,7 +1069,7 @@ objc_write_type (TypedStream *stream, const char *type, const void *data)
       while (*type != _C_STRUCT_E)
 	{
 	  align = objc_alignof_type (type);       /* padd to alignment */
-	  acc_size += ROUND (acc_size, align);
+	  acc_size = ROUND (acc_size, align);
 	  objc_write_type (stream, type, ((char *) data) + acc_size);
 	  acc_size += objc_sizeof_type (type);   /* add component size */
 	  type = objc_skip_typespec (type);	 /* skip component */
@@ -1165,7 +1165,7 @@ objc_read_type(TypedStream *stream, const char *type, void *data)
       while (*type != _C_STRUCT_E)
 	{
 	  align = objc_alignof_type (type);       /* padd to alignment */
-	  acc_size += ROUND (acc_size, align);
+	  acc_size = ROUND (acc_size, align);
 	  objc_read_type (stream, type, ((char*)data)+acc_size);
 	  acc_size += objc_sizeof_type (type);   /* add component size */
 	  type = objc_skip_typespec (type);	 /* skip component */