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([[