[clang] bad error message on incorrect string literal #18079 (PR #81670)

via cfe-commits cfe-commits at lists.llvm.org
Wed May 1 06:54:05 PDT 2024


ldrumm wrote:

Should we be looking for `\r` as well?

If the testcase is checked out with DOS line endings (e.g. on a windows machine), then the test clang/test/Lexer/raw-string-dlim-invalid.cpp fails

I don't know what the C++ spec says, but I think this diagnostic should work for both common end of line styles.

Something like this:

```diff
diff --git a/clang/lib/Lex/Lexer.cpp b/clang/lib/Lex/Lexer.cpp
index c98645993abe..80495e0677a0 100644
--- a/clang/lib/Lex/Lexer.cpp
+++ b/clang/lib/Lex/Lexer.cpp
@@ -2258,7 +2258,7 @@ bool Lexer::LexRawStringLiteral(Token &Result, const char *CurPtr,
 
   if (!isLexingRawMode())
     Diag(BufferPtr, diag::warn_cxx98_compat_raw_string_literal);
-
+i
   unsigned PrefixLen = 0;
 
   while (PrefixLen != 16 && isRawStringDelimBody(CurPtr[PrefixLen]))
@@ -2270,7 +2270,7 @@ bool Lexer::LexRawStringLiteral(Token &Result, const char *CurPtr,
       const char *PrefixEnd = &CurPtr[PrefixLen];
       if (PrefixLen == 16) {
         Diag(PrefixEnd, diag::err_raw_delim_too_long);
-      } else if (*PrefixEnd == '\n') {
+      } else if ((*PrefixEnd == '\r' && PrefixEnd[1] == '\n') || *PrefixEnd == '\n') {
         Diag(PrefixEnd, diag::err_invalid_newline_raw_delim);
       } else {
         Diag(PrefixEnd, diag::err_invalid_char_raw_delim)
```
?

https://github.com/llvm/llvm-project/pull/81670


More information about the cfe-commits mailing list