# HG changeset patch # User kizune # Date 1379946567 -14400 # Node ID 64e79d38bd0791010679dd03f41252e923056b42 # Parent 809a50f24d6f2a91ef522eebb2f61e0fb4d72b27 4881267: improve diagnostic for "instanceof T" for type parameter T Reviewed-by: vromero, jjg diff -r 809a50f24d6f -r 64e79d38bd07 src/share/classes/com/sun/tools/javac/comp/Attr.java --- a/src/share/classes/com/sun/tools/javac/comp/Attr.java Mon Sep 23 17:27:38 2013 +0400 +++ b/src/share/classes/com/sun/tools/javac/comp/Attr.java Mon Sep 23 18:29:27 2013 +0400 @@ -3102,8 +3102,14 @@ public void visitTypeTest(JCInstanceOf tree) { Type exprtype = chk.checkNullOrRefType( tree.expr.pos(), attribExpr(tree.expr, env)); - Type clazztype = chk.checkReifiableReferenceType( - tree.clazz.pos(), attribType(tree.clazz, env)); + Type clazztype = attribType(tree.clazz, env); + if (!clazztype.hasTag(TYPEVAR)) { + clazztype = chk.checkClassOrArrayType(tree.clazz.pos(), clazztype); + } + if (!clazztype.isErroneous() && !types.isReifiable(clazztype)) { + log.error(tree.clazz.pos(), "illegal.generic.type.for.instof"); + clazztype = types.createErrorType(clazztype); + } chk.validate(tree.clazz, env, false); chk.checkCastable(tree.expr.pos(), exprtype, clazztype); result = check(tree, syms.booleanType, VAL, resultInfo); diff -r 809a50f24d6f -r 64e79d38bd07 src/share/classes/com/sun/tools/javac/comp/Check.java --- a/src/share/classes/com/sun/tools/javac/comp/Check.java Mon Sep 23 17:27:38 2013 +0400 +++ b/src/share/classes/com/sun/tools/javac/comp/Check.java Mon Sep 23 18:29:27 2013 +0400 @@ -706,20 +706,6 @@ return t; } - /** Check that type is a reifiable class, interface or array type. - * @param pos Position to be used for error reporting. - * @param t The type to be checked. - */ - Type checkReifiableReferenceType(DiagnosticPosition pos, Type t) { - t = checkClassOrArrayType(pos, t); - if (!t.isErroneous() && !types.isReifiable(t)) { - log.error(pos, "illegal.generic.type.for.instof"); - return types.createErrorType(t); - } else { - return t; - } - } - /** Check that type is a reference type, i.e. a class, interface or array type * or a type variable. * @param pos Position to be used for error reporting. diff -r 809a50f24d6f -r 64e79d38bd07 test/tools/javac/T4881267.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/tools/javac/T4881267.java Mon Sep 23 18:29:27 2013 +0400 @@ -0,0 +1,12 @@ +/* + * @test /nodynamiccopyright/ + * @bug 4881267 + * @summary improve diagnostic for "instanceof T" for type parameter T + * @compile/fail/ref=T4881267.out -XDrawDiagnostics T4881267.java + */ + +class T4881267 { + void m(Object o) { + boolean b = o instanceof T; + } +} diff -r 809a50f24d6f -r 64e79d38bd07 test/tools/javac/T4881267.out --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/tools/javac/T4881267.out Mon Sep 23 18:29:27 2013 +0400 @@ -0,0 +1,2 @@ +T4881267.java:10:34: compiler.err.illegal.generic.type.for.instof +1 error