A '<' with a trigraph '#' is not a valid editor placeholder
authorAlex Lorenz <arphaman@gmail.com>
Wed, 11 Oct 2017 00:41:20 +0000 (00:41 +0000)
committerAlex Lorenz <arphaman@gmail.com>
Wed, 11 Oct 2017 00:41:20 +0000 (00:41 +0000)
Credit to OSS-Fuzz for discovery:
https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=3137#c5

rdar://34923985

llvm-svn: 315398

clang/lib/Lex/Lexer.cpp
clang/test/Parser/editor-placeholder-recovery.cpp

index 9885ab9d3e29f61d6fb5d3ff9e653e22c5cc287b..0c179c0fb875a29965ff6923ff6a73635affa9b1 100644 (file)
@@ -3542,7 +3542,8 @@ LexNextToken:
     } else if (LangOpts.Digraphs && Char == '%') {     // '<%' -> '{'
       CurPtr = ConsumeChar(CurPtr, SizeTmp, Result);
       Kind = tok::l_brace;
-    } else if (Char == '#' && lexEditorPlaceholder(Result, CurPtr)) {
+    } else if (Char == '#' && /*Not a trigraph*/ SizeTmp == 1 &&
+               lexEditorPlaceholder(Result, CurPtr)) {
       return true;
     } else {
       Kind = tok::less;
index 48c290ee9a1404544b62a365dd858387eeb06652..d68e087d6fbace5f0c648e6499ad5759946ee7e0 100644 (file)
@@ -69,3 +69,7 @@ void Struct::method(<#Struct &x#>, noSupressionHere) { // expected-error {{unkno
   // expected-error@-2 {{editor placeholder in source file}}
 #endif
 }
+
+void handleTrigraph() {
+  <??=placeholder#> // expected-error {{expected expression}} expected-error {{expected expression}} expected-warning {{trigraph converted to '#' character}}
+}