[clang] [clang] Fix incorrect line numbers with -E and raw string (#47577) (PR #77021)

via cfe-commits cfe-commits at lists.llvm.org
Thu Jan 4 15:02:16 PST 2024


llvmbot wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-clang

Author: Steve Cornett (stevecor)

<details>
<summary>Changes</summary>

When printing preprocessed tokens, handle newlines in string literals because raw string literals may contain newlines.

---
Full diff: https://github.com/llvm/llvm-project/pull/77021.diff


2 Files Affected:

- (modified) clang/lib/Frontend/PrintPreprocessedOutput.cpp (+4) 
- (added) clang/test/Frontend/raw_string_line_number.cpp (+6) 


``````````diff
diff --git a/clang/lib/Frontend/PrintPreprocessedOutput.cpp b/clang/lib/Frontend/PrintPreprocessedOutput.cpp
index 7f5f6690682300..6ac8379e07d90f 100644
--- a/clang/lib/Frontend/PrintPreprocessedOutput.cpp
+++ b/clang/lib/Frontend/PrintPreprocessedOutput.cpp
@@ -886,6 +886,10 @@ static void PrintPreprocessedTokens(Preprocessor &PP, Token &Tok,
       *Callbacks->OS << II->getName();
     } else if (Tok.isLiteral() && !Tok.needsCleaning() &&
                Tok.getLiteralData()) {
+      if (tok::isStringLiteral(Tok.getKind())) {
+        // Raw string literal may contain newlines
+        Callbacks->HandleNewlinesInToken(Tok.getLiteralData(), Tok.getLength());
+      }
       Callbacks->OS->write(Tok.getLiteralData(), Tok.getLength());
     } else if (Tok.getLength() < std::size(Buffer)) {
       const char *TokPtr = Buffer;
diff --git a/clang/test/Frontend/raw_string_line_number.cpp b/clang/test/Frontend/raw_string_line_number.cpp
new file mode 100644
index 00000000000000..0aaaec2906bede
--- /dev/null
+++ b/clang/test/Frontend/raw_string_line_number.cpp
@@ -0,0 +1,6 @@
+// RUN: %clang_cc1 -E %s | FileCheck %s
+// CHECK: AAA
+// CHECK-NEXT: BBB
+R"(
+AAA)"
+BBB

``````````

</details>


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


More information about the cfe-commits mailing list