Diagnose use of wide string literal in 'asm' instead of crashing. Fixes <rdar://problem/10465079>.

llvm-svn: 145656
This commit is contained in:
Ted Kremenek 2011-12-02 00:35:46 +00:00
parent 04945c42c6
commit 65cdbf58a7
3 changed files with 17 additions and 5 deletions

View File

@ -191,6 +191,8 @@ def err_label_end_of_compound_statement : Error<
def err_address_of_label_outside_fn : Error<
"use of address-of-label extension outside of a function body">;
def err_expected_string_literal : Error<"expected string literal">;
def err_asm_operand_wide_string_literal : Error<
"cannot use wide string literal in 'asm'">;
def err_expected_asm_operand : Error<
"expected string literal or '[' for asm operand">, CatInlineAsm;
def err_expected_selector_for_method : Error<

View File

@ -1104,16 +1104,23 @@ void Parser::ParseKNRParamDeclarations(Declarator &D) {
/// string-literal
///
Parser::ExprResult Parser::ParseAsmStringLiteral() {
if (!isTokenStringLiteral()) {
Diag(Tok, diag::err_expected_string_literal);
return ExprError();
switch (Tok.getKind()) {
case tok::string_literal:
break;
case tok::wide_string_literal: {
SourceLocation L = Tok.getLocation();
Diag(Tok, diag::err_asm_operand_wide_string_literal)
<< SourceRange(L, L);
return ExprError();
}
default:
Diag(Tok, diag::err_expected_string_literal);
return ExprError();
}
ExprResult Res(ParseStringLiteralExpression());
if (Res.isInvalid()) return move(Res);
// TODO: Diagnose: wide string literal in 'asm'
return move(Res);
}

View File

@ -14,3 +14,6 @@ void f2() {
// rdar://5952468
__asm ; // expected-error {{expected '(' after 'asm'}}
// <rdar://problem/10465079> - Don't crash on wide string literals in 'asm'.
int foo asm (L"bar"); // expected-error {{cannot use wide string literal in 'asm'}}