Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorshankha2015-03-20 08:14:11 +0000
committershankha2015-04-13 14:45:21 +0000
commita0b3d36cbab89591c7bbefcf57ecd7091e3dd7a6 (patch)
treecf134dc018c4fae6b734a7c3140da8e5db54d50a
parent0ad09336754551fa665fa4c38447a25fd2dacf4e (diff)
downloadeclipse.jdt.core-a0b3d36cbab89591c7bbefcf57ecd7091e3dd7a6.tar.gz
eclipse.jdt.core-a0b3d36cbab89591c7bbefcf57ecd7091e3dd7a6.tar.xz
eclipse.jdt.core-a0b3d36cbab89591c7bbefcf57ecd7091e3dd7a6.zip
Bug 445231 - [compiler] IllegalAccessError running Eclipse-compiled class
Change-Id: I66998740d1d3d4d0fb71c8a1351773545538cd50 Signed-off-by: shankha banerjee <shankhba@in.ibm.com>
-rw-r--r--org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/GenericsRegressionTest_1_8.java121
-rw-r--r--org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/util/Util.java11
2 files changed, 130 insertions, 2 deletions
diff --git a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/GenericsRegressionTest_1_8.java b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/GenericsRegressionTest_1_8.java
index 699683fdc9..ac1c66a607 100644
--- a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/GenericsRegressionTest_1_8.java
+++ b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/GenericsRegressionTest_1_8.java
@@ -5106,4 +5106,125 @@ public void testBug455945() {
"}\n"
});
}
+// https://bugs.eclipse.org/bugs/show_bug.cgi?id=445231, [compiler] IllegalAccessError running Eclipse-compiled class
+public void testBug445231() {
+ runConformTest(
+ true,
+ new String[] {
+ "com/n/Bug.java",
+ "package com.n;\n" +
+ "public class Bug {\n" +
+ " public static void main(String[] args) {\n" +
+ " try {\n" +
+ " new Bug().go();\n" +
+ " System.err.println(\"Ok\");\n" +
+ " } catch (IllegalAccessError e) {\n" +
+ " System.err.println(\"Error\");\n" +
+ " e.printStackTrace();\n" +
+ " }\n" +
+ " }\n" +
+ " public void go() {\n" +
+ " Class<?> clazz = Buggered.Foo.class;\n" +
+ " System.err.println(\"Here we go\");\n" +
+ " if (clazz.isAnonymousClass()) {\n" +
+ " System.err.println(\"is anon\");\n" +
+ " } else {\n" +
+ " System.err.println(\"not anon\");\n" +
+ " }\n" +
+ " }\n" +
+ "}\n",
+ "com/g/Base.java",
+ "package com.g;\n" +
+ "class Base2{}\n" +
+ "class Base {\n" +
+ " class A {}\n" +
+ " static class Builder<B extends Builder<B>> {\n" +
+ " public B setJobName() {\n" +
+ " return null;\n" +
+ " }\n" +
+ " public Base2 setJobName2(B b) {\n" +
+ " return null;\n" +
+ " }\n" +
+
+ // Wildcard
+ " public void foo(H<? super H<Base3.A>> h) {\n" +
+ " return;\n" +
+ " }\n" +
+ " private class H<T> {}\n" +
+ " }\n" +
+ " static class Builder2 {\n" +
+ " public <B extends Builder<B>> B setJobName3() {\n" +
+ " return null;\n" +
+ " }\n" +
+ " }\n" +
+ " static class R {}\n" +
+ " public static class Builder3<B extends R> {\n" +
+ " public B setJobName() {\n" +
+ " return null;\n" +
+ " }\n" +
+ " }\n" +
+ " public static class Builder4<B extends R> {\n" +
+ " public <Q extends R> Builder3<Q> setJobName() {\n" +
+ " return null;\n" +
+ " }\n" +
+ " }\n" +
+
+ // Testing Parameters
+ " static class Builder5 {\n" +
+ " public <B extends Builder<B>> void foo(B b) {}\n" +
+ " }\n" +
+
+ "}\n" +
+
+ "class Base3 {\n" +
+ " static class A{}\n" +
+ "}\n"
+ ,
+
+ "com/g/Child.java",
+ "package com.g;\n" +
+ "import com.g.Base.R;\n" +
+ "public final class Child {\n" +
+ " public static class Builder<I> extends Base.Builder<Builder<I>> {\n" +
+ " public void setDummyName(){}\n" +
+ " }\n" +
+ " public static class Builder2 extends Base.Builder2 {}\n" +
+ " public static class Builder3<I> extends Base.Builder3<R> {}\n" +
+ " public static class Builder4<I> extends Base.Builder4<R> {}\n" +
+
+ " public static class Builder5 extends Base.Builder5 {} \n" +
+ "}\n",
+ "com/n/Buggered.java",
+ "package com.n;\n" +
+ "import com.g.Child;\n" +
+ "class Z{}\n" +
+ "public final class Buggered {\n" +
+ " public static final class Foo {}\n" +
+ " void unused() {\n" +
+ " Child.Builder<Void> c = new Child.Builder<Void>();\n" +
+ " c.setJobName();\n" +
+ " c.setJobName2(new Child.Builder<Void>());\n" +
+ " Child.Builder<Z> cb = new Child.Builder<Z>();\n" +
+ " cb.setJobName();\n" +
+ " cb.setJobName2(new Child.Builder<Z>());\n" +
+ " Child.Builder2 cb2 = new Child.Builder2();\n" +
+ " cb2.setJobName3();\n" +
+ " Child.Builder3<Void> cb3 = new Child.Builder3<Void>();\n" +
+ " cb3.setJobName();\n" +
+ " Child.Builder4<Void> cb4 = new Child.Builder4<Void>();\n" +
+ " cb4.setJobName();\n" +
+
+ " Child.Builder5 cb5 = new Child.Builder5();\n" +
+ " cb5.foo(null);\n" +
+
+ // Wildcard
+ " c.foo(null);\n" +
+ " }\n" +
+ "}\n"
+ },
+ null, null,
+ "Here we go\n" +
+ "not anon\n" +
+ "Ok", null);
+}
}
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/util/Util.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/util/Util.java
index 65f55edc52..597a070ae9 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/util/Util.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/util/Util.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2000, 2014 IBM Corporation and others.
+ * Copyright (c) 2000, 2015 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@@ -1069,7 +1069,14 @@ public class Util implements SuffixConstants {
}
}
} else if (typeBinding.isNestedType()) {
- classFile.recordInnerClasses(typeBinding);
+ TypeBinding enclosingType = typeBinding;
+ do {
+ if (!enclosingType.canBeSeenBy(classFile.referenceBinding.scope))
+ break;
+ enclosingType = enclosingType.enclosingType();
+ } while (enclosingType != null);
+ if (enclosingType == null)
+ classFile.recordInnerClasses(typeBinding);
}
}
/*

Back to the top