summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSaleem Abdulrasool <compnerd@compnerd.org>2015-06-16 20:03:47 +0000
committerSaleem Abdulrasool <compnerd@compnerd.org>2015-06-16 20:03:47 +0000
commitf7ffec3b5fd9ee95ce19d7d11e648d8cb2b2c65c (patch)
tree34e7ae3110aee69ba1ff74ca1bc8df6611084275
parentc6afe0d4e9e0da1398a71c50bd88fbd2c700c025 (diff)
downloadbcm5719-llvm-f7ffec3b5fd9ee95ce19d7d11e648d8cb2b2c65c.tar.gz
bcm5719-llvm-f7ffec3b5fd9ee95ce19d7d11e648d8cb2b2c65c.zip
parser: diagnose empty attribute blocks
MS attributes do not permit empty attribute blocks. Correctly diagnose those. We continue to parse to ensure that we recover correctly. Because the block is empty, we do not need to skip any tokens. Bonus: tweak the comment that I updated but forgot to remove the function name in a previous commit. llvm-svn: 239846
-rw-r--r--clang/include/clang/Basic/DiagnosticParseKinds.td3
-rw-r--r--clang/lib/Parse/ParseDeclCXX.cpp4
-rw-r--r--clang/test/Parser/MicrosoftExtensions.c2
3 files changed, 8 insertions, 1 deletions
diff --git a/clang/include/clang/Basic/DiagnosticParseKinds.td b/clang/include/clang/Basic/DiagnosticParseKinds.td
index c119c4a7d12..39a0ec825ae 100644
--- a/clang/include/clang/Basic/DiagnosticParseKinds.td
+++ b/clang/include/clang/Basic/DiagnosticParseKinds.td
@@ -1000,6 +1000,9 @@ def err_pragma_invalid_keyword : Error<
def warn_pragma_unroll_cuda_value_in_parens : Warning<
"argument to '#pragma unroll' should not be in parentheses in CUDA C/C++">,
InGroup<CudaCompat>;
+
+def err_empty_attribute_block : Error<"empty attribute block is not allowed">;
+
} // end of Parse Issue category.
let CategoryName = "Modules Issue" in {
diff --git a/clang/lib/Parse/ParseDeclCXX.cpp b/clang/lib/Parse/ParseDeclCXX.cpp
index 9ed797f881d..f8992e8ed92 100644
--- a/clang/lib/Parse/ParseDeclCXX.cpp
+++ b/clang/lib/Parse/ParseDeclCXX.cpp
@@ -3780,7 +3780,7 @@ SourceLocation Parser::SkipCXX11Attributes() {
return EndLoc;
}
-/// ParseMicrosoftAttributes - Parse Microsoft attributes [Attr]
+/// Parse one or more Microsoft-style attributes [Attr]
///
/// [MS] ms-attribute:
/// '[' token-seq ']'
@@ -3796,6 +3796,8 @@ void Parser::ParseMicrosoftAttributes(ParsedAttributes &attrs,
// FIXME: If this is actually a C++11 attribute, parse it as one.
BalancedDelimiterTracker T(*this, tok::l_square);
T.consumeOpen();
+ if (Tok.is(tok::r_square))
+ Diag(T.getOpenLocation(), diag::err_empty_attribute_block);
SkipUntil(tok::r_square, StopAtSemi | StopBeforeMatch);
T.consumeClose();
if (endLoc)
diff --git a/clang/test/Parser/MicrosoftExtensions.c b/clang/test/Parser/MicrosoftExtensions.c
index a29f6c0b549..be46159f43a 100644
--- a/clang/test/Parser/MicrosoftExtensions.c
+++ b/clang/test/Parser/MicrosoftExtensions.c
@@ -55,6 +55,8 @@ int foo1([SA_Post(attr=1)] void *param);
[unbalanced(attribute) /* expected-note {{to match this '['}} */
void f(void); /* expected-error {{expected ']'}} */
+[] __interface I {}; /* expected-error {{empty attribute block is not allowed}} */
+
void ms_intrinsics(int a) {
__noop();
__assume(a);
OpenPOWER on IntegriCloud