diff --git a/llvm/lib/MC/MCParser/AsmParser.cpp b/llvm/lib/MC/MCParser/AsmParser.cpp --- a/llvm/lib/MC/MCParser/AsmParser.cpp +++ b/llvm/lib/MC/MCParser/AsmParser.cpp @@ -3014,7 +3014,25 @@ return false; }; - if (parseMany(parseOp)) + auto parseManyWithOptionalComma = [&]() -> bool { + if (parseOptionalToken(AsmToken::EndOfStatement)) + return false; + while (true) { + if (parseOp()) + return true; + if (parseOptionalToken(AsmToken::EndOfStatement)) + return false; + if (parseOptionalToken(AsmToken::Comma) && + check(getTok().isNot(AsmToken::String), "expected string")) + return true; + } + return false; + }; + + // Support space as separtors for .ascii directive. See the discussion in + // https://reviews.llvm.org/D91460 for more details + if ((!ZeroTerminated && parseManyWithOptionalComma()) || + (ZeroTerminated && parseMany(parseOp))) return addErrorSuffix(" in '" + Twine(IDVal) + "' directive"); return false; } diff --git a/llvm/test/MC/AsmParser/AArch64/directive-parse-err.s b/llvm/test/MC/AsmParser/AArch64/directive-parse-err.s --- a/llvm/test/MC/AsmParser/AArch64/directive-parse-err.s +++ b/llvm/test/MC/AsmParser/AArch64/directive-parse-err.s @@ -13,7 +13,7 @@ .set ident3, 0 $ // CHECK-NOT: [[@LINE+1]]:{{[0-9]+}}: error: .set ident3, 0 // EOL COMMENT - // CHECK: [[@LINE+1]]:20: error: unexpected token in '.ascii' directive + // CHECK: [[@LINE+1]]:20: error: expected string in '.ascii' directive .ascii "string1" $ // CHECK-NOT: [[@LINE+1]]:{{[0-9]+}}: error: .ascii "string1" // EOL COMMENT diff --git a/llvm/test/MC/AsmParser/directive_ascii.s b/llvm/test/MC/AsmParser/directive_ascii.s --- a/llvm/test/MC/AsmParser/directive_ascii.s +++ b/llvm/test/MC/AsmParser/directive_ascii.s @@ -48,3 +48,10 @@ TEST7: .ascii "\x64\Xa6B" .ascii "\xface\x0Fe" + +# CHECK: TEST8: +# CHECK: .byte 65 +# CHECK: .byte 66 +# CHECK: .byte 67 +TEST8: + .ascii "A", "B" "C"