From 7f422287a2ee7e515beb715f1f8915e9331469ee Mon Sep 17 00:00:00 2001 From: Ted Kremenek Date: Fri, 2 Dec 2011 00:35:46 +0000 Subject: [PATCH] Diagnose use of wide string literal in 'asm' instead of crashing. Fixes . git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@145656 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/clang/Basic/DiagnosticParseKinds.td | 2 ++ lib/Parse/Parser.cpp | 17 ++++++++++++----- test/Parser/asm.c | 3 +++ 3 files changed, 17 insertions(+), 5 deletions(-) diff --git a/include/clang/Basic/DiagnosticParseKinds.td b/include/clang/Basic/DiagnosticParseKinds.td index e0b10fa87c..7d8f21394c 100644 --- a/include/clang/Basic/DiagnosticParseKinds.td +++ b/include/clang/Basic/DiagnosticParseKinds.td @@ -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< diff --git a/lib/Parse/Parser.cpp b/lib/Parse/Parser.cpp index eb6dc443c9..e74c46e2fd 100644 --- a/lib/Parse/Parser.cpp +++ b/lib/Parse/Parser.cpp @@ -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); } diff --git a/test/Parser/asm.c b/test/Parser/asm.c index 9081826151..23052c389e 100644 --- a/test/Parser/asm.c +++ b/test/Parser/asm.c @@ -14,3 +14,6 @@ void f2() { // rdar://5952468 __asm ; // expected-error {{expected '(' after 'asm'}} +// - Don't crash on wide string literals in 'asm'. +int foo asm (L"bar"); // expected-error {{cannot use wide string literal in 'asm'}} +