summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Majnemer <david.majnemer@gmail.com>2014-07-18 05:43:12 +0000
committerDavid Majnemer <david.majnemer@gmail.com>2014-07-18 05:43:12 +0000
commit2e49830b3dc01f679ac21c4059b26257c42f22f8 (patch)
tree6d80e9f7f79d7b79fc465cf33f9b24194d3af576
parenta5d2a49c342b82fe706bd05f931c48dee0f69420 (diff)
downloadbcm5719-llvm-2e49830b3dc01f679ac21c4059b26257c42f22f8.tar.gz
bcm5719-llvm-2e49830b3dc01f679ac21c4059b26257c42f22f8.zip
Parse: Diagnose malformed 'message' arguments for 'availability' attr
The parsing code for 'availability' wasn't prepared for string literals like "a" L"b" showing up. Error if this occurs. llvm-svn: 213350
-rw-r--r--clang/lib/Parse/ParseDecl.cpp13
-rw-r--r--clang/test/Parser/attr-availability.c2
2 files changed, 14 insertions, 1 deletions
diff --git a/clang/lib/Parse/ParseDecl.cpp b/clang/lib/Parse/ParseDecl.cpp
index 71b37527fd2..74df162b0b3 100644
--- a/clang/lib/Parse/ParseDecl.cpp
+++ b/clang/lib/Parse/ParseDecl.cpp
@@ -825,13 +825,24 @@ void Parser::ParseAvailabilityAttribute(IdentifierInfo &Availability,
}
ConsumeToken();
if (Keyword == Ident_message) {
- if (Tok.isNot(tok::string_literal)) { // Also reject wide string literals.
+ if (Tok.isNot(tok::string_literal)) {
Diag(Tok, diag::err_expected_string_literal)
<< /*Source='availability attribute'*/2;
SkipUntil(tok::r_paren, StopAtSemi);
return;
}
MessageExpr = ParseStringLiteralExpression();
+ // Also reject wide string literals.
+ if (StringLiteral *MessageStringLiteral =
+ cast_or_null<StringLiteral>(MessageExpr.get())) {
+ if (MessageStringLiteral->getCharByteWidth() != 1) {
+ Diag(MessageStringLiteral->getSourceRange().getBegin(),
+ diag::err_expected_string_literal)
+ << /*Source='availability attribute'*/ 2;
+ SkipUntil(tok::r_paren, StopAtSemi);
+ return;
+ }
+ }
break;
}
diff --git a/clang/test/Parser/attr-availability.c b/clang/test/Parser/attr-availability.c
index 06bebbad5c5..d812296d935 100644
--- a/clang/test/Parser/attr-availability.c
+++ b/clang/test/Parser/attr-availability.c
@@ -20,6 +20,8 @@ void f6() __attribute__((availability(macosx,unavailable,introduced=10.5))); //
void f7() __attribute__((availability(macosx,message=L"wide"))); // expected-error {{expected string literal for optional message in 'availability' attribute}}
+void f8() __attribute__((availability(macosx,message="a" L"b"))); // expected-error {{expected string literal for optional message in 'availability' attribute}}
+
// rdar://10095131
enum E{
gorf __attribute__((availability(macosx,introduced=8.5, message = 10.0))), // expected-error {{expected string literal for optional message in 'availability' attribute}}
OpenPOWER on IntegriCloud