diff options
author | shankha | 2015-03-20 08:14:11 +0000 |
---|---|---|
committer | shankha | 2015-04-13 14:45:21 +0000 |
commit | a0b3d36cbab89591c7bbefcf57ecd7091e3dd7a6 (patch) | |
tree | cf134dc018c4fae6b734a7c3140da8e5db54d50a | |
parent | 0ad09336754551fa665fa4c38447a25fd2dacf4e (diff) | |
download | eclipse.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>
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); } } /* |