[PATCH] D103008: Handle multiple escaped newlines between */ correctly

2021-05-24 Thread Lode Willems via Phabricator via cfe-commits
lodewillems created this revision.
lodewillems requested review of this revision.
Herald added a project: clang.
Herald added a subscriber: cfe-commits.

Clang currently only recognizes a single escaped line between the end characters
of a block comment.

Fixes bug 15706


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D103008

Files:
  clang/lib/Lex/Lexer.cpp

Index: clang/lib/Lex/Lexer.cpp
===
--- clang/lib/Lex/Lexer.cpp
+++ clang/lib/Lex/Lexer.cpp
@@ -2446,44 +2446,69 @@
   // Back up off the newline.
   --CurPtr;
 
-  // If this is a two-character newline sequence, skip the other character.
-  if (CurPtr[0] == '\n' || CurPtr[0] == '\r') {
-// \n\n or \r\r -> not escaped newline.
-if (CurPtr[0] == CurPtr[1])
-  return false;
-// \n\r or \r\n -> skip the newline.
---CurPtr;
-  }
-
-  // If we have horizontal whitespace, skip over it.  We allow whitespace
-  // between the slash and newline.
   bool HasSpace = false;
-  while (isHorizontalWhitespace(*CurPtr) || *CurPtr == 0) {
---CurPtr;
-HasSpace = true;
-  }
+  while (true) {
+// If this is a two-character newline sequence, skip the other character.
+if (CurPtr[0] == '\n' || CurPtr[0] == '\r') {
+  // \n\n or \r\r -> not escaped newline.
+  if (CurPtr[0] == CurPtr[1])
+return false;
+  // \n\r or \r\n -> skip the newline.
+  --CurPtr;
+}
+
+// If we have horizontal whitespace, skip over it.  We allow whitespace
+// between the slash and newline.
+while (isHorizontalWhitespace(*CurPtr) || *CurPtr == 0) {
+  --CurPtr;
+  HasSpace = true;
+}
+
+// If we have a slash, we know this is an escaped newline.
+if (*CurPtr == '\\') {
+  // Found the *, we're done
+  if (CurPtr[-1] == '*') break;
+
+  // Found another possible escaped newline
+  if (CurPtr[-1] == '\n' || CurPtr[-1] == '\r') {
+--CurPtr;
+continue;
+  }
 
-  // If we have a slash, we know this is an escaped newline.
-  if (*CurPtr == '\\') {
-if (CurPtr[-1] != '*') return false;
-  } else {
-// It isn't a slash, is it the ?? / trigraph?
-if (CurPtr[0] != '/' || CurPtr[-1] != '?' || CurPtr[-2] != '?' ||
-CurPtr[-3] != '*')
   return false;
+} else {
+  // It isn't a slash, is it the ?? / trigraph?
+  if (CurPtr[0] != '/' || CurPtr[-1] != '?' || CurPtr[-2] != '?')
+return false;
+
+  // This is the trigraph ending the comment.  Emit a stern warning!
+  CurPtr -= 2;
+
+  if (CurPtr[-1] == '*') {
+// If no trigraphs are enabled, warn that we ignored this trigraph and
+// ignore this * character.
+if (!L->getLangOpts().Trigraphs) {
+  if (!L->isLexingRawMode())
+L->Diag(CurPtr, diag::trigraph_ignored_block_comment);
+  return false;
+}
+if (!L->isLexingRawMode())
+  L->Diag(CurPtr, diag::trigraph_ends_block_comment);
 
-// This is the trigraph ending the comment.  Emit a stern warning!
-CurPtr -= 2;
+break;
+  } else if (CurPtr[-1] == '\n' || CurPtr[-1] == '\r') {
+// If no trigraphs are enabled, warn that we ignored this trigraph
+if (!L->getLangOpts().Trigraphs) {
+  if (!L->isLexingRawMode())
+L->Diag(CurPtr, diag::trigraph_ignored);
+  return false;
+}
+--CurPtr;
+continue;
+  }
 
-// If no trigraphs are enabled, warn that we ignored this trigraph and
-// ignore this * character.
-if (!L->getLangOpts().Trigraphs) {
-  if (!L->isLexingRawMode())
-L->Diag(CurPtr, diag::trigraph_ignored_block_comment);
   return false;
 }
-if (!L->isLexingRawMode())
-  L->Diag(CurPtr, diag::trigraph_ends_block_comment);
   }
 
   // Warn about having an escaped newline between the */ characters.
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D103008: Handle multiple escaped newlines between */ correctly

2021-06-19 Thread Lode Willems via Phabricator via cfe-commits
lodewillems abandoned this revision.
lodewillems added a comment.

Made obsolete by commit de6164ec4da0cfea1b0d0e472c432ea1be4d9c29 



Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D103008/new/

https://reviews.llvm.org/D103008

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits