From 6c98ca273df23f43842684297485e213f60ef66c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Henrik=20Grubbstr=C3=B6m=20=28Grubba=29?=
 <grubba@grubba.org>
Date: Mon, 5 Sep 2011 19:21:00 +0200
Subject: [PATCH] Compiler: Fixed resolving of external symbols in deep
 inherits. Fixes [bug 6063].
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Thanks to 郭雪松 <zenothing@hotmail.com> for the bugreport.
---
 src/program.c    | 10 ++++++++++
 src/testsuite.in |  9 +++++++++
 2 files changed, 19 insertions(+)

diff --git a/src/program.c b/src/program.c
index c0c5ae7be2..6a3689674b 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 aa20178bf9..e4c6957fbd 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([[
-- 
GitLab