diff --git a/python/src/com/jetbrains/python/validation/FStringsAnnotator.java b/python/src/com/jetbrains/python/validation/FStringsAnnotator.java
index fe30e47388ad..3a4484493736 100644
--- a/python/src/com/jetbrains/python/validation/FStringsAnnotator.java
+++ b/python/src/com/jetbrains/python/validation/FStringsAnnotator.java
@@ -49,6 +49,15 @@ public class FStringsAnnotator extends PyAnnotator {
if (fragment.getRightBraceOffset() == -1) {
hasUnclosedBrace = true;
}
+ for (int i = fragment.getLeftBraceOffset() + 1; i < fragment.getContentEndOffset(); i++) {
+ final char c = nodeText.charAt(i);
+ if (c == '\\') {
+ reportCharacter(nodeOffset + i, "Expression fragments inside f-strings cannot include backslashes");
+ }
+ else if (c == '#') {
+ reportCharacter(nodeOffset + i, "Expressions fragments inside f-strings cannot include '#'");
+ }
+ }
// Do not warn about illegal conversion character if '!' is right before closing quotes
if (fragContentEnd < nodeContentEnd && nodeText.charAt(fragContentEnd) == '!' && fragContentEnd + 1 < nodeContentEnd) {
final char conversionChar = nodeText.charAt(fragContentEnd + 1);
diff --git a/python/testData/highlighting/fStringBackslashes.py b/python/testData/highlighting/fStringBackslashes.py
new file mode 100644
index 000000000000..3713a5ec9543
--- /dev/null
+++ b/python/testData/highlighting/fStringBackslashes.py
@@ -0,0 +1,5 @@
+f'{\t}'
+f'{\t'
+f'{\N{GREEK SMALL LETTER ALPHA}}'
+f'{Formatable():\n\t}'
+f'{42:{\t}}'
\ No newline at end of file
diff --git a/python/testData/highlighting/fStringHashSigns.py b/python/testData/highlighting/fStringHashSigns.py
new file mode 100644
index 000000000000..6201d3648a8d
--- /dev/null
+++ b/python/testData/highlighting/fStringHashSigns.py
@@ -0,0 +1,5 @@
+f'{#'
+f'{#
+f'{#foo#}'
+f'{42:#}'
+f'{42:{#}}'
\ No newline at end of file
diff --git a/python/testSrc/com/jetbrains/python/PythonHighlightingTest.java b/python/testSrc/com/jetbrains/python/PythonHighlightingTest.java
index d6d5e88c11db..1c5f58aa50a5 100644
--- a/python/testSrc/com/jetbrains/python/PythonHighlightingTest.java
+++ b/python/testSrc/com/jetbrains/python/PythonHighlightingTest.java
@@ -320,6 +320,16 @@ public class PythonHighlightingTest extends PyTestCase {
runWithLanguageLevel(LanguageLevel.PYTHON36, () -> doTest(true, false));
}
+ // PY-20773
+ public void testFStringHashSigns() {
+ runWithLanguageLevel(LanguageLevel.PYTHON36, () -> doTest(true, false));
+ }
+
+ // PY-20844
+ public void testFStringBackslashes() {
+ runWithLanguageLevel(LanguageLevel.PYTHON36, () -> doTest(true, false));
+ }
+
// ---
private void doTest(final LanguageLevel languageLevel, final boolean checkWarnings, final boolean checkInfos) {
PythonLanguageLevelPusher.setForcedLanguageLevel(myFixture.getProject(), languageLevel);