From bc1d2eac9abd5fb38402113c7f0805c21ef7787f Mon Sep 17 00:00:00 2001 From: Jim Laskey Date: Wed, 2 Aug 2023 21:01:44 +0000 Subject: [PATCH] 8312821: Javac accepts char literal as template Reviewed-by: jlahoda --- .../sun/tools/javac/parser/JavaTokenizer.java | 32 +++++++++++++------ .../tools/javac/lexer/JavaLexerTest.java | 3 +- .../tools/javac/unicode/TripleQuote.out | 6 ++-- 3 files changed, 26 insertions(+), 15 deletions(-) diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/parser/JavaTokenizer.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/parser/JavaTokenizer.java index 6f6c3a192e8..4e0754869cd 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/parser/JavaTokenizer.java +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/parser/JavaTokenizer.java @@ -425,9 +425,10 @@ public class JavaTokenizer extends UnicodeReader { * escape character. Actual conversion of escape sequences takes place * during at the end of readToken. * - * @param pos position of the first character in literal. + * @param pos position of the first character in literal. + * @param isString true if is a string literal */ - private void scanLitChar(int pos) { + private void scanLitChar(int pos, boolean isString) { int backslash = position(); if (acceptThenPut('\\')) { hasEscapeSequences = true; @@ -480,9 +481,13 @@ public class JavaTokenizer extends UnicodeReader { break; case '{': - scanEmbeddedExpression(pos, backslash); - if (hasStringTemplateErrors) { - return; + if (isString) { + scanEmbeddedExpression(pos, backslash); + if (hasStringTemplateErrors) { + return; + } + } else { + lexError(position(), Errors.IllegalEscChar); } break; @@ -546,7 +551,7 @@ public class JavaTokenizer extends UnicodeReader { } } else { // Add character to string buffer. - scanLitChar(pos); + scanLitChar(pos, true); } } } else { @@ -570,7 +575,7 @@ public class JavaTokenizer extends UnicodeReader { break; } else { // Add character to string buffer. - scanLitChar(pos); + scanLitChar(pos, true); } } } @@ -1115,10 +1120,17 @@ public class JavaTokenizer extends UnicodeReader { lexError(pos, Errors.IllegalLineEndInCharLit); } - int errorPos = position(); - scanLitChar(pos); + scanLitChar(pos, false); - if (accept('\'')) { + if (tk == TokenKind.ERROR) { + while (isAvailable() && !is('\'')) { + if (is('\\')) { + next(); + } + next(); + } + accept('\''); + } else if (accept('\'')) { tk = TokenKind.CHARLITERAL; } else { lexError(pos, Errors.UnclosedCharLit); diff --git a/test/langtools/tools/javac/lexer/JavaLexerTest.java b/test/langtools/tools/javac/lexer/JavaLexerTest.java index 52d76b0b552..cdb6049c823 100644 --- a/test/langtools/tools/javac/lexer/JavaLexerTest.java +++ b/test/langtools/tools/javac/lexer/JavaLexerTest.java @@ -102,7 +102,8 @@ public class JavaLexerTest { new TestTuple(EOF, "\\u", ""), new TestTuple(ERROR, "\'\'"), - new TestTuple(ERROR, "\'\\q\'", "\'\\"), + new TestTuple(ERROR, "\'\\q\'", "\'\\q\'"), + new TestTuple(ERROR, "\'\\{1+2}\'", "\'\\{1+2}\'"), }; static class TestTuple { diff --git a/test/langtools/tools/javac/unicode/TripleQuote.out b/test/langtools/tools/javac/unicode/TripleQuote.out index 5fed31c0860..4f82ee78ad6 100644 --- a/test/langtools/tools/javac/unicode/TripleQuote.out +++ b/test/langtools/tools/javac/unicode/TripleQuote.out @@ -1,5 +1,3 @@ TripleQuote.java:12:14: compiler.err.empty.char.lit -TripleQuote.java:12:21: compiler.err.unclosed.char.lit -TripleQuote.java:13:14: compiler.err.empty.char.lit -TripleQuote.java:13:16: compiler.err.unclosed.char.lit -4 errors +TripleQuote.java:13:15: compiler.err.empty.char.lit +2 errors