8269354: javac crashes when processing parenthesized pattern in instanceof

Reviewed-by: vromero
This commit is contained in:
Jan Lahoda 2021-07-01 10:10:03 +00:00
parent c16d1fc981
commit a8385feb30
2 changed files with 14 additions and 7 deletions
src/jdk.compiler/share/classes/com/sun/tools/javac/comp
test/langtools/tools/javac/patterns

@ -190,6 +190,7 @@ public class TransPatterns extends TreeTranslator {
syms.objectType
: tree.expr.type;
VarSymbol prevCurrentValue = currentValue;
bindingContext = new BasicBindingContext();
try {
JCExpression translatedExpr = translate(tree.expr);
Symbol exprSym = TreeInfo.symbol(translatedExpr);
@ -206,16 +207,20 @@ public class TransPatterns extends TreeTranslator {
}
Type principalType = principalType((JCPattern) tree.pattern);
result = makeBinary(Tag.AND,
makeTypeTest(make.Ident(currentValue), make.Type(principalType)),
(JCExpression) this.<JCTree>translate(tree.pattern));
JCExpression resultExpression=
makeBinary(Tag.AND,
makeTypeTest(make.Ident(currentValue), make.Type(principalType)),
(JCExpression) this.<JCTree>translate(tree.pattern));
if (currentValue != exprSym) {
result = make.at(tree.pos).LetExpr(make.VarDef(currentValue, translatedExpr),
(JCExpression)result).setType(syms.booleanType);
((LetExpr) result).needsCond = true;
resultExpression =
make.at(tree.pos).LetExpr(make.VarDef(currentValue, translatedExpr),
resultExpression).setType(syms.booleanType);
((LetExpr) resultExpression).needsCond = true;
}
result = bindingContext.decorateExpression(resultExpression);
} finally {
currentValue = prevCurrentValue;
bindingContext.pop();
}
} else {
super.visitTypeTest(tree);

@ -23,7 +23,7 @@
/*
* @test
* @bug 8262891
* @bug 8262891 8269354
* @summary Test parenthesized pattern
* @compile --enable-preview -source ${jdk.version} Parenthesized.java
* @run main/othervm --enable-preview Parenthesized
@ -46,6 +46,8 @@ public class Parenthesized {
if (o instanceof (String s && s.isEmpty())) {
System.err.println("OK: " + s);
}
boolean b1 = o instanceof (String s && s.isEmpty());
boolean b2 = o instanceof String s && s.isEmpty();
}
}