diff --git a/llvm/include/llvm/MC/MCParser/MCAsmParser.h b/llvm/include/llvm/MC/MCParser/MCAsmParser.h --- a/llvm/include/llvm/MC/MCParser/MCAsmParser.h +++ b/llvm/include/llvm/MC/MCParser/MCAsmParser.h @@ -260,6 +260,8 @@ bool parseMany(function_ref parseOne, bool hasComma = true); + bool parseManyWithOptionalComma(function_ref parseOne); + bool parseIntToken(int64_t &V, const Twine &ErrMsg); bool check(bool P, const Twine &Msg); 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,7 @@ return false; }; - if (parseMany(parseOp)) + if (parseManyWithOptionalComma(parseOp)) return addErrorSuffix(" in '" + Twine(IDVal) + "' directive"); return false; } diff --git a/llvm/lib/MC/MCParser/MCAsmParser.cpp b/llvm/lib/MC/MCParser/MCAsmParser.cpp --- a/llvm/lib/MC/MCParser/MCAsmParser.cpp +++ b/llvm/lib/MC/MCParser/MCAsmParser.cpp @@ -128,6 +128,21 @@ return false; } +bool MCAsmParser::parseManyWithOptionalComma(function_ref parseOne) { + if (parseOptionalToken(AsmToken::EndOfStatement)) + return false; + while (true) { + if (parseOne()) + return true; + if (parseOptionalToken(AsmToken::EndOfStatement)) + return false; + if (parseOptionalToken(AsmToken::Comma) && + check(getTok().isNot(AsmToken::String), "expected string")) + return true; + } + return false; +} + bool MCAsmParser::parseExpression(const MCExpr *&Res) { SMLoc L; return parseExpression(Res, L); 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,15 +13,15 @@ .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 - // CHECK: [[@LINE+1]]:20: error: unexpected token in '.asciz' directive + // CHECK: [[@LINE+1]]:20: error: expected string in '.asciz' directive .asciz "string2" $ // CHECK-NOT: [[@LINE+1]]:{{[0-9]+}}: error: .asciz "string2" // EOL COMMENT - // CHECK: [[@LINE+1]]:20: error: unexpected token in '.string' directive + // CHECK: [[@LINE+1]]:20: error: expected string in '.string' directive .string "string3" $ // CHECK-NOT: [[@LINE+1]]:{{[0-9]+}}: error: .string "string3" // 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,11 @@ TEST7: .ascii "\x64\Xa6B" .ascii "\xface\x0Fe" + +# CHECK: TEST8: +# CHECK: .byte 66 +# CHECK: .byte 0 +# CHECK: .byte 67 +# CHECK: .byte 0 +TEST8: + .string "B" "C" diff --git a/llvm/test/MC/Mips/asciiz-directive-bad.s b/llvm/test/MC/Mips/asciiz-directive-bad.s --- a/llvm/test/MC/Mips/asciiz-directive-bad.s +++ b/llvm/test/MC/Mips/asciiz-directive-bad.s @@ -3,6 +3,6 @@ .asciiz 12 # CHECK: :[[@LINE-1]]:11: error: expected string in '.asciiz' directive .asciiz "a"3 -# CHECK: :[[@LINE-1]]:14: error: unexpected token in '.asciiz' directive +# CHECK: :[[@LINE-1]]:14: error: expected string in '.asciiz' directive .asciiz "a", # CHECK: :[[@LINE-1]]:15: error: expected string in '.asciiz' directive