aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTed Kremenek <kremenek@apple.com>2011-12-02 00:35:46 +0000
committerTed Kremenek <kremenek@apple.com>2011-12-02 00:35:46 +0000
commit7f422287a2ee7e515beb715f1f8915e9331469ee (patch)
treeddf182eb74d17de2394727bda64790d0dc553184
parent4bb6686274c292669bac9e658b3c210a317ee61a (diff)
Diagnose use of wide string literal in 'asm' instead of crashing. Fixes <rdar://problem/10465079>.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@145656 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--include/clang/Basic/DiagnosticParseKinds.td2
-rw-r--r--lib/Parse/Parser.cpp17
-rw-r--r--test/Parser/asm.c3
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'}}
+// <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'}}
+