diff --git a/python/src/com/jetbrains/python/parsing/ExpressionParsing.java b/python/src/com/jetbrains/python/parsing/ExpressionParsing.java
index 2de400cd57b6..e597bf45096e 100644
--- a/python/src/com/jetbrains/python/parsing/ExpressionParsing.java
+++ b/python/src/com/jetbrains/python/parsing/ExpressionParsing.java
@@ -325,7 +325,7 @@ public class ExpressionParsing extends Parsing {
parseSliceEnd(expr, sliceItemStart);
}
else {
- parseSingleExpression(false, true);
+ boolean hadExpression = parseSingleExpression(false, true);
if (atToken(PyTokenTypes.COLON)) {
sliceOrTupleStart.drop();
parseSliceEnd(expr, sliceItemStart);
@@ -342,6 +342,9 @@ public class ExpressionParsing extends Parsing {
}
}
else {
+ if (!hadExpression) {
+ myBuilder.error("expression expected");
+ }
sliceOrTupleStart.drop();
sliceItemStart.drop();
checkMatches(PyTokenTypes.RBRACKET, message("PARSE.expected.rbracket"));
diff --git a/python/testData/inspections/PyTypeCheckerInspection/BadSubscriptExpression.py b/python/testData/inspections/PyTypeCheckerInspection/BadSubscriptExpression.py
index c46bf665b27c..c332be9f7d66 100644
--- a/python/testData/inspections/PyTypeCheckerInspection/BadSubscriptExpression.py
+++ b/python/testData/inspections/PyTypeCheckerInspection/BadSubscriptExpression.py
@@ -1,4 +1,4 @@
def test():
x = r"""\x""
- r"""[\t\r\v]"""
+ r"""[\t\r\v]"""
"""
diff --git a/python/testData/psi/EmptySubscription.py b/python/testData/psi/EmptySubscription.py
new file mode 100644
index 000000000000..6da5f0e99040
--- /dev/null
+++ b/python/testData/psi/EmptySubscription.py
@@ -0,0 +1 @@
+s = ''[]
diff --git a/python/testData/psi/EmptySubscription.txt b/python/testData/psi/EmptySubscription.txt
new file mode 100644
index 000000000000..8cdffcb9a216
--- /dev/null
+++ b/python/testData/psi/EmptySubscription.txt
@@ -0,0 +1,14 @@
+PyFile:EmptySubscription.py
+ PyAssignmentStatement
+ PyTargetExpression: s
+ PsiElement(Py:IDENTIFIER)('s')
+ PsiWhiteSpace(' ')
+ PsiElement(Py:EQ)('=')
+ PsiWhiteSpace(' ')
+ PySubscriptionExpression
+ PyStringLiteralExpression:
+ PsiElement(Py:SINGLE_QUOTED_STRING)('''')
+ PsiElement(Py:LBRACKET)('[')
+ PsiErrorElement:expression expected
+
+ PsiElement(Py:RBRACKET)(']')
\ No newline at end of file
diff --git a/python/testSrc/com/jetbrains/python/PythonParsingTest.java b/python/testSrc/com/jetbrains/python/PythonParsingTest.java
index 2b6f511eb655..4cdd61188e8f 100644
--- a/python/testSrc/com/jetbrains/python/PythonParsingTest.java
+++ b/python/testSrc/com/jetbrains/python/PythonParsingTest.java
@@ -370,6 +370,10 @@ public class PythonParsingTest extends ParsingTestCase {
doTest();
}
+ public void testEmptySubscription() { // PY-8652
+ doTest();
+ }
+
public void doTest(LanguageLevel languageLevel) {
LanguageLevel prev = myLanguageLevel;
myLanguageLevel = languageLevel;