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 } |