src/share/classes/com/sun/tools/javac/comp/Resolve.java

changeset 2788
f08330fad341
parent 2611
9e80ab1dad9e
child 2794
7c25c29a7544
equal deleted inserted replaced
2785:84eb51777733 2788:f08330fad341
834 DeferredAttrContext deferredAttrContext, 834 DeferredAttrContext deferredAttrContext,
835 List<Type> argtypes, 835 List<Type> argtypes,
836 List<Type> formals, 836 List<Type> formals,
837 Warner warn) { 837 Warner warn) {
838 super.argumentsAcceptable(env, deferredAttrContext, argtypes, formals, warn); 838 super.argumentsAcceptable(env, deferredAttrContext, argtypes, formals, warn);
839 //should we expand formals? 839 // should we check varargs element type accessibility?
840 if (deferredAttrContext.phase.isVarargsRequired()) { 840 if (deferredAttrContext.phase.isVarargsRequired()) {
841 Type typeToCheck = null; 841 if (deferredAttrContext.mode == AttrMode.CHECK || !checkVarargsAccessAfterResolution) {
842 if (!checkVarargsAccessAfterResolution) { 842 varargsAccessible(env, types.elemtype(formals.last()), deferredAttrContext.inferenceContext);
843 typeToCheck = types.elemtype(formals.last()); 843 }
844 } else if (deferredAttrContext.mode == AttrMode.CHECK) { 844 }
845 typeToCheck = types.erasure(types.elemtype(formals.last())); 845 }
846 } 846
847 if (typeToCheck != null) { 847 /**
848 varargsAccessible(env, typeToCheck, deferredAttrContext.inferenceContext); 848 * Test that the runtime array element type corresponding to 't' is accessible. 't' should be the
849 } 849 * varargs element type of either the method invocation type signature (after inference completes)
850 } 850 * or the method declaration signature (before inference completes).
851 } 851 */
852
853 private void varargsAccessible(final Env<AttrContext> env, final Type t, final InferenceContext inferenceContext) { 852 private void varargsAccessible(final Env<AttrContext> env, final Type t, final InferenceContext inferenceContext) {
854 if (inferenceContext.free(t)) { 853 if (inferenceContext.free(t)) {
855 inferenceContext.addFreeTypeListener(List.of(t), new FreeTypeListener() { 854 inferenceContext.addFreeTypeListener(List.of(t), new FreeTypeListener() {
856 @Override 855 @Override
857 public void typesInferred(InferenceContext inferenceContext) { 856 public void typesInferred(InferenceContext inferenceContext) {
858 varargsAccessible(env, inferenceContext.asInstType(t), inferenceContext); 857 varargsAccessible(env, inferenceContext.asInstType(t), inferenceContext);
859 } 858 }
860 }); 859 });
861 } else { 860 } else {
862 if (!isAccessible(env, t)) { 861 if (!isAccessible(env, types.erasure(t))) {
863 Symbol location = env.enclClass.sym; 862 Symbol location = env.enclClass.sym;
864 reportMC(env.tree, MethodCheckDiag.INACCESSIBLE_VARARGS, inferenceContext, t, Kinds.kindName(location), location); 863 reportMC(env.tree, MethodCheckDiag.INACCESSIBLE_VARARGS, inferenceContext, t, Kinds.kindName(location), location);
865 } 864 }
866 } 865 }
867 } 866 }

mercurial