diff --git a/src/docode.c b/src/docode.c
index 627cd81c354bcc5800717ccae802763871c82aee..80b397cfb00e0ac4ffc579b5afc9c3c0c028e377 100644
--- a/src/docode.c
+++ b/src/docode.c
@@ -4,7 +4,7 @@
 ||| See the files COPYING and DISCLAIMER for more information.
 \*/
 #include "global.h"
-RCSID("$Id: docode.c,v 1.39 1998/07/31 06:51:41 hubbe Exp $");
+RCSID("$Id: docode.c,v 1.40 1998/10/09 23:30:21 hubbe Exp $");
 #include "las.h"
 #include "program.h"
 #include "language.h"
@@ -993,7 +993,11 @@ static int do_docode2(node *n,int flags)
       return 2;
     }else{
       tmp1=do_docode(CAR(n), DO_NOT_COPY);
+
       code_expression(CDR(n), DO_NOT_COPY, "index");
+      if(CDR(n)->token != F_CONSTANT &&
+	match_types(CDR(n)->type, string_type_string))
+	emit2(F_CLEAR_STRING_SUBTYPE);
 
       emit2(F_INDEX);
 
diff --git a/src/peep.in b/src/peep.in
index 3f5f173d0dd94ab7d9243480177f58d1ed44c691..bbe854d811630509ae13ee2c2a3d81f5aa1a3a8c 100644
--- a/src/peep.in
+++ b/src/peep.in
@@ -1,5 +1,5 @@
 //
-// $Id: peep.in,v 1.22 1998/09/01 20:25:10 hubbe Exp $
+// $Id: peep.in,v 1.23 1998/10/09 23:30:22 hubbe Exp $
 //
 
 NOP :
@@ -130,8 +130,20 @@ MARK LOCAL [ $3o != F_SIZEOF && $3o != F_INDEX ]: MARK_AND_LOCAL ($2a)
 MARK STRING : MARK_AND_STRING($2a)
 LOCAL SIZEOF: SIZEOF_LOCAL ($1a)
 STRING INDEX: STRING_INDEX ($1a)
+
+STRING CLEAR_STRING_SUBTYPE: STRING ($1a)
+CONST0 CLEAR_STRING_SUBTYPE: CONST0
+CONST1 CLEAR_STRING_SUBTYPE: CONST1
+CONST_1 CLEAR_STRING_SUBTYPE: CONST_1
+NUMBER CLEAR_STRING_SUBTYPE: NUMBER($1a)
+NEG_NUMBER CLEAR_STRING_SUBTYPE: NEG_NUMBER($1a)
+
 LOCAL INDEX: LOCAL_INDEX ($1a)
+LOCAL CLEAR_STRING_SUBTYPE INDEX: LOCAL_INDEX ($1a)
+
 LOCAL LOCAL INDEX: LOCAL_LOCAL_INDEX($2a) BYTE($1a)
+LOCAL LOCAL CLEAR_STRING_SUBTYPE INDEX: LOCAL_LOCAL_INDEX($2a) BYTE($1a)
+
 CONST0 INDEX: POS_INT_INDEX (0)
 CONST_1 INDEX: NEG_INT_INDEX (1)
 CONST1 INDEX: POS_INT_INDEX (1)
diff --git a/src/testsuite.in b/src/testsuite.in
index e18e0a0904c63c38605711fbe97e849641c14d72..c083dc7d449a2fb29c758d66b18fcc624aa3a1f3 100644
--- a/src/testsuite.in
+++ b/src/testsuite.in
@@ -1,4 +1,4 @@
-stest_true([["$Id: testsuite.in,v 1.122 1998/09/01 17:05:24 grubba Exp $"]])
+stest_true([["$Id: testsuite.in,v 1.123 1998/10/09 23:30:23 hubbe Exp $"]])
 cond([[all_constants()->_verify_internals]],
 [[
   test_do(_verify_internals())
@@ -1257,6 +1257,8 @@ test_eq((<'f','o','o'>)['f'],1)
 test_eq((<'f','o','o'>)['b'],0)
 test_eq((<'f','o','o'>)[-1],0)
 
+test_eq([[class Z { mixed `->(mixed x) { return this_object()[x]; } int foo() { return 1; }}()->foo()]],1)
+
 // index assigning
 test_any(mixed a=({1}); a[0]=2; return equal(a,({2})),1)
 test_any(mixed a=(<1>); a[1]=2; return equal(a,(<1>)),1)