r239846 - parser: diagnose empty attribute blocks

Saleem Abdulrasool compnerd at compnerd.org
Tue Jun 16 13:03:47 PDT 2015


Author: compnerd
Date: Tue Jun 16 15:03:47 2015
New Revision: 239846

URL: http://llvm.org/viewvc/llvm-project?rev=239846&view=rev
Log:
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.

Modified:
    cfe/trunk/include/clang/Basic/DiagnosticParseKinds.td
    cfe/trunk/lib/Parse/ParseDeclCXX.cpp
    cfe/trunk/test/Parser/MicrosoftExtensions.c

Modified: cfe/trunk/include/clang/Basic/DiagnosticParseKinds.td
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticParseKinds.td?rev=239846&r1=239845&r2=239846&view=diff
==============================================================================
--- cfe/trunk/include/clang/Basic/DiagnosticParseKinds.td (original)
+++ cfe/trunk/include/clang/Basic/DiagnosticParseKinds.td Tue Jun 16 15:03:47 2015
@@ -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 {

Modified: cfe/trunk/lib/Parse/ParseDeclCXX.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/ParseDeclCXX.cpp?rev=239846&r1=239845&r2=239846&view=diff
==============================================================================
--- cfe/trunk/lib/Parse/ParseDeclCXX.cpp (original)
+++ cfe/trunk/lib/Parse/ParseDeclCXX.cpp Tue Jun 16 15:03:47 2015
@@ -3780,7 +3780,7 @@ SourceLocation Parser::SkipCXX11Attribut
   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(Pa
     // 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)

Modified: cfe/trunk/test/Parser/MicrosoftExtensions.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Parser/MicrosoftExtensions.c?rev=239846&r1=239845&r2=239846&view=diff
==============================================================================
--- cfe/trunk/test/Parser/MicrosoftExtensions.c (original)
+++ cfe/trunk/test/Parser/MicrosoftExtensions.c Tue Jun 16 15:03:47 2015
@@ -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);





More information about the cfe-commits mailing list