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