diff --git a/src/program.c b/src/program.c
index c0c5ae7be2a30754c40077559b78d55216dc1afe..6a3689674b1e88f9bb95bce2f5706c16b7811814 100644
--- a/src/program.c
+++ b/src/program.c
@@ -3732,6 +3732,16 @@ struct program *end_first_pass(int finish)
 	optimize_program(Pike_compiler->new_program);
 	Pike_compiler->new_program->flags |= PROGRAM_FINISHED;
       }
+    } else {
+      /* All references in prog are now known.
+       * Fixup identifier overrides, so that inherit is safe.
+       */
+      for (e = 0; e < prog->num_identifier_references; e++) {
+	struct reference *ref = prog->identifier_references + e;
+	if (ref->id_flags & ID_HIDDEN) continue;
+	if (ref->inherit_offset != 0) continue;
+	override_identifier (ref, ID_FROM_PTR (prog, ref)->name);
+      }
     }
 
 #ifdef PIKE_DEBUG
diff --git a/src/testsuite.in b/src/testsuite.in
index aa20178bf999da41e0b3897087b1161f30400d6f..e4c6957fbdb085e76e1bd1ddca265a96528f31f8 100644
--- a/src/testsuite.in
+++ b/src/testsuite.in
@@ -449,6 +449,15 @@ test_any([[
   return sizeof(c->options) == 1;
 ]], 1)
 
+test_any([[
+  // Bug 6063
+  class A { extern string s; string q() { return s; } };
+  class B { inherit A; string s = "s"; };
+  class C { inherit B; };
+  class D { inherit C; };
+  return ({ B(), C(), D() })->q() * "";
+]], "sss")
+
 dnl bug in for loop optimization in combination with +=
 
 test_any([[