diff --git a/core/src/main/java/org/jruby/RubyModule.java b/core/src/main/java/org/jruby/RubyModule.java index fa6970e2b6b..8369d6b43bf 100644 --- a/core/src/main/java/org/jruby/RubyModule.java +++ b/core/src/main/java/org/jruby/RubyModule.java @@ -4610,13 +4610,27 @@ public IRubyObject getClassVarQuiet(String name) { assert IdUtil.isClassVariable(name); RubyModule module = this; RubyModule highest = null; + RubyModule lowest = null; do { if (module.hasClassVariable(name)) { highest = module; + if (lowest == null) lowest = module; } } while ((module = module.getSuperClass()) != null); + if (lowest != highest) { + if (!highest.isPrepended()) { + if (lowest.getOrigin().getRealModule() != highest.getOrigin().getRealModule()) { + throw getRuntime().newRuntimeError(str(getRuntime(), "class variable " + name + " of ", + lowest.getOrigin(), " is overtaken by ", highest.getOrigin())); + } + + if (lowest.isClass()) lowest.removeClassVariable(name); + } + + } + if (highest != null) return highest.fetchClassVariable(name); return null; diff --git a/spec/tags/ruby/language/class_variable_tags.txt b/spec/tags/ruby/language/class_variable_tags.txt deleted file mode 100644 index 8960545d44f..00000000000 --- a/spec/tags/ruby/language/class_variable_tags.txt +++ /dev/null @@ -1 +0,0 @@ -fails:Accessing a class variable raises a RuntimeError when a class variable is overtaken in an ancestor class