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