Skip to content

Commit 0dae416

Browse files
chestnykhyuxuanchen1997
authored andcommitted
[MC,ELF] Emit warning if a string constant contains newline char (#98060)
Summary: GAS emits warning about newline in the string constant so make the same behaviour. Test Plan: Reviewers: Subscribers: Tasks: Tags: Differential Revision: https://phabricator.intern.facebook.com/D60250926
1 parent 5d93660 commit 0dae416

File tree

3 files changed

+60
-1
lines changed

3 files changed

+60
-1
lines changed

llvm/lib/MC/MCParser/AsmLexer.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -646,7 +646,6 @@ AsmToken AsmLexer::LexQuote() {
646646
return AsmToken(AsmToken::String, StringRef(TokStart, CurPtr - TokStart));
647647
}
648648

649-
// TODO: does gas allow multiline string constants?
650649
while (CurChar != '"') {
651650
if (CurChar == '\\') {
652651
// Allow \", etc.

llvm/lib/MC/MCParser/AsmParser.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3033,6 +3033,11 @@ bool AsmParser::parseEscapedString(std::string &Data) {
30333033
StringRef Str = getTok().getStringContents();
30343034
for (unsigned i = 0, e = Str.size(); i != e; ++i) {
30353035
if (Str[i] != '\\') {
3036+
if (Str[i] == '\n') {
3037+
SMLoc NewlineLoc = SMLoc::getFromPointer(Str.data() + i);
3038+
if (Warning(NewlineLoc, "unterminated string; newline inserted"))
3039+
return true;
3040+
}
30363041
Data += Str[i];
30373042
continue;
30383043
}
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
// RUN: llvm-mc -filetype=obj -triple x86_64 %s 2>&1 -o /dev/null \
2+
// RUN: | FileCheck %s --implicit-check-not=warning:
3+
4+
.string "abcd\xFFefg
5+
12345678"
6+
7+
// CHECK: [[#@LINE-3]]:21: warning: unterminated string; newline inserted
8+
// CHECK-NEXT: .string "abcd\xFFefg
9+
10+
.ascii "some test ascii
11+
12+
sequence
13+
with
14+
newlines\x0A
15+
"
16+
17+
// CHECK: [[#@LINE-7]]:24: warning: unterminated string; newline inserted
18+
// CHECK-NEXT: .ascii "some test ascii
19+
// CHECK: [[#@LINE-8]]:1: warning: unterminated string; newline inserted
20+
// CHECK: [[#@LINE-8]]:9: warning: unterminated string; newline inserted
21+
// CHECK-NEXT: sequence
22+
// CHECK: [[#@LINE-9]]:5: warning: unterminated string; newline inserted
23+
// CHECK-NEXT: with
24+
// CHECK: [[#@LINE-10]]:13: warning: unterminated string; newline inserted
25+
// CHECK-NEXT: newlines\x0A
26+
27+
.asciz "another test string
28+
29+
with
30+
newline characters
31+
32+
33+
"
34+
35+
// CHECK: [[#@LINE-8]]:28: warning: unterminated string; newline inserted
36+
// CHECK-NEXT: .asciz "another test string
37+
// CHECK: [[#@LINE-9]]:1: warning: unterminated string; newline inserted
38+
// CHECK: [[#@LINE-9]]:5: warning: unterminated string; newline inserted
39+
// CHECK-NEXT: with
40+
// CHECK: [[#@LINE-10]]:19: warning: unterminated string; newline inserted
41+
// CHECK-NEXT: newline characters
42+
// CHECK: [[#@LINE-11]]:1: warning: unterminated string; newline inserted
43+
// CHECK: [[#@LINE-11]]:1: warning: unterminated string; newline inserted
44+
45+
.file "warn-newline
46+
.s"
47+
// CHECK: [[#@LINE-2]]:20: warning: unterminated string; newline inserted
48+
49+
.cv_file 1 "some_an
50+
other_file.s"
51+
// CHECK: [[#@LINE-2]]:20: warning: unterminated string; newline inserted
52+
53+
.ascii "test\nvalid1_string\xFF\n\n\xFF"
54+
.asciz "\n\n\nvalid2_string\x0A"
55+
.string "1234\nvalid3_string\xFF\n\xFF\n"

0 commit comments

Comments
 (0)