Hi doug.gregor, gribozavr, cbergstrom, hfinkel, wwwwpan,

http://llvm-reviews.chandlerc.com/D1847

CHANGE SINCE LAST DIFF
  http://llvm-reviews.chandlerc.com/D1847?vs=5346&id=5796#toc

Files:
  test/OpenMP/parallel_messages.cpp
  test/OpenMP/threadprivate_messages.cpp
  runtime/compiler-rt/Makefile
  include/clang/Parse/Parser.h
  lib/Parse/RAIIObjectsForParser.h
  lib/Parse/ParseOpenMP.cpp
  lib/Parse/Parser.cpp
Index: test/OpenMP/parallel_messages.cpp
===================================================================
--- test/OpenMP/parallel_messages.cpp
+++ test/OpenMP/parallel_messages.cpp
@@ -6,6 +6,18 @@
 #pragma omp parallel // expected-error {{unexpected OpenMP directive '#pragma omp parallel'}}
 
 int main(int argc, char **argv) {
+  #pragma omp parallel { // expected-warning {{extra tokens at the end of '#pragma omp parallel' are ignored}}
+  foo();
+  #pragma omp parallel ( // expected-warning {{extra tokens at the end of '#pragma omp parallel' are ignored}}
+  foo();
+  #pragma omp parallel [ // expected-warning {{extra tokens at the end of '#pragma omp parallel' are ignored}}
+  foo();
+  #pragma omp parallel ] // expected-warning {{extra tokens at the end of '#pragma omp parallel' are ignored}}
+  foo();
+  #pragma omp parallel ) // expected-warning {{extra tokens at the end of '#pragma omp parallel' are ignored}}
+  foo();
+  #pragma omp parallel } // expected-warning {{extra tokens at the end of '#pragma omp parallel' are ignored}}
+  foo();
   #pragma omp parallel
   #pragma omp parallel unknown() // expected-warning {{extra tokens at the end of '#pragma omp parallel' are ignored}}
   foo();
Index: test/OpenMP/threadprivate_messages.cpp
===================================================================
--- test/OpenMP/threadprivate_messages.cpp
+++ test/OpenMP/threadprivate_messages.cpp
@@ -24,6 +24,12 @@
   return (a);
 }
 
+#pragma omp threadprivate (a) ( // expected-error {{'#pragma omp threadprivate' must precede all references to variable 'a'}} expected-warning {{extra tokens at the end of '#pragma omp threadprivate' are ignored}}
+#pragma omp threadprivate (a) [ // expected-error {{'#pragma omp threadprivate' must precede all references to variable 'a'}} expected-warning {{extra tokens at the end of '#pragma omp threadprivate' are ignored}}
+#pragma omp threadprivate (a) { // expected-error {{'#pragma omp threadprivate' must precede all references to variable 'a'}} expected-warning {{extra tokens at the end of '#pragma omp threadprivate' are ignored}}
+#pragma omp threadprivate (a) ) // expected-error {{'#pragma omp threadprivate' must precede all references to variable 'a'}} expected-warning {{extra tokens at the end of '#pragma omp threadprivate' are ignored}}
+#pragma omp threadprivate (a) ] // expected-error {{'#pragma omp threadprivate' must precede all references to variable 'a'}} expected-warning {{extra tokens at the end of '#pragma omp threadprivate' are ignored}}
+#pragma omp threadprivate (a) } // expected-error {{'#pragma omp threadprivate' must precede all references to variable 'a'}} expected-warning {{extra tokens at the end of '#pragma omp threadprivate' are ignored}}
 #pragma omp threadprivate a // expected-error {{expected '(' after 'threadprivate'}}
 #pragma omp threadprivate(d // expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error {{'#pragma omp threadprivate' must precede all references to variable 'd'}}
 #pragma omp threadprivate(d)) // expected-error {{'#pragma omp threadprivate' must precede all references to variable 'd'}} expected-warning {{extra tokens at the end of '#pragma omp threadprivate' are ignored}}
Index: runtime/compiler-rt/Makefile
===================================================================
--- runtime/compiler-rt/Makefile
+++ runtime/compiler-rt/Makefile
@@ -78,7 +78,6 @@
 # support.
 RuntimeDirs :=
 ifeq ($(OS),Darwin)
-RuntimeDirs += darwin darwin_embedded
 RuntimeLibrary.darwin.Configs := \
 	eprintf.a 10.4.a osx.a ios.a cc_kext.a cc_kext_ios5.a \
 	asan_osx_dynamic.dylib \
Index: include/clang/Parse/Parser.h
===================================================================
--- include/clang/Parse/Parser.h
+++ include/clang/Parse/Parser.h
@@ -645,9 +645,12 @@
   /// If the input is malformed, this emits the specified diagnostic.  Next, if
   /// SkipToTok is specified, it calls SkipUntil(SkipToTok).  Finally, true is
   /// returned.
+  /// If NoCount is true, it ignores parens/brackets/braces as regular tokens
+  /// and does not count them.
   bool ExpectAndConsume(tok::TokenKind ExpectedTok, unsigned Diag,
                         const char *DiagMsg = "",
-                        tok::TokenKind SkipToTok = tok::unknown);
+                        tok::TokenKind SkipToTok = tok::unknown,
+                        bool NoCount = false);
 
   /// \brief The parser expects a semicolon and, if present, will consume it.
   ///
@@ -750,7 +753,8 @@
     StopAtSemi = 1 << 0,  ///< Stop skipping at semicolon
     /// \brief Stop skipping at specified token, but don't skip the token itself
     StopBeforeMatch = 1 << 1,
-    StopAtCodeCompletion = 1 << 2 ///< Stop at code completion
+    StopAtCodeCompletion = 1 << 2, ///< Stop at code completion
+    NoBracketsCount = 1 << 3 /// \brief Don't count braces/brackets/parens
   };
 
   friend LLVM_CONSTEXPR SkipUntilFlags operator|(SkipUntilFlags L,
Index: lib/Parse/RAIIObjectsForParser.h
===================================================================
--- lib/Parse/RAIIObjectsForParser.h
+++ lib/Parse/RAIIObjectsForParser.h
@@ -361,6 +361,7 @@
     tok::TokenKind Kind, Close, FinalToken;
     SourceLocation (Parser::*Consumer)();
     SourceLocation LOpen, LClose;
+    bool NoCount;
     
     unsigned short &getDepth() {
       switch (Kind) {
@@ -378,9 +379,10 @@
     
   public:
     BalancedDelimiterTracker(Parser& p, tok::TokenKind k,
-                             tok::TokenKind FinalToken = tok::semi)
+                             tok::TokenKind FinalToken = tok::semi,
+                             bool NoCount = false)
       : GreaterThanIsOperatorScope(p.GreaterThanIsOperator, true),
-        P(p), Kind(k), FinalToken(FinalToken)
+        P(p), Kind(k), FinalToken(FinalToken), NoCount(NoCount)
     {
       switch (Kind) {
         default: llvm_unreachable("Unexpected balanced token");
Index: lib/Parse/ParseOpenMP.cpp
===================================================================
--- lib/Parse/ParseOpenMP.cpp
+++ lib/Parse/ParseOpenMP.cpp
@@ -48,7 +48,7 @@
       if (Tok.isNot(tok::annot_pragma_openmp_end)) {
         Diag(Tok, diag::warn_omp_extra_tokens_at_eol)
           << getOpenMPDirectiveName(OMPD_threadprivate);
-        SkipUntil(tok::annot_pragma_openmp_end, StopBeforeMatch);
+        SkipUntil(tok::annot_pragma_openmp_end, StopBeforeMatch | NoBracketsCount);
       }
       // Skip the last annot_pragma_openmp_end.
       ConsumeToken();
@@ -66,7 +66,7 @@
       << getOpenMPDirectiveName(DKind);
     break;
   }
-  SkipUntil(tok::annot_pragma_openmp_end);
+  SkipUntil(tok::annot_pragma_openmp_end, NoBracketsCount);
   return DeclGroupPtrTy();
 }
 
@@ -105,14 +105,14 @@
       if (Tok.isNot(tok::annot_pragma_openmp_end)) {
         Diag(Tok, diag::warn_omp_extra_tokens_at_eol)
           << getOpenMPDirectiveName(OMPD_threadprivate);
-        SkipUntil(tok::annot_pragma_openmp_end, StopBeforeMatch);
+        SkipUntil(tok::annot_pragma_openmp_end, StopBeforeMatch | NoBracketsCount);
       }
       DeclGroupPtrTy Res =
         Actions.ActOnOpenMPThreadprivateDirective(Loc,
                                                   Identifiers);
       Directive = Actions.ActOnDeclStmt(Res, Loc, Tok.getLocation());
     }
-    SkipUntil(tok::annot_pragma_openmp_end);
+    SkipUntil(tok::annot_pragma_openmp_end, NoBracketsCount);
     break;
   case OMPD_parallel: {
     ConsumeToken();
@@ -171,13 +171,13 @@
     break;
   case OMPD_unknown:
     Diag(Tok, diag::err_omp_unknown_directive);
-    SkipUntil(tok::annot_pragma_openmp_end);
+    SkipUntil(tok::annot_pragma_openmp_end, NoBracketsCount);
     break;
   case OMPD_task:
   case NUM_OPENMP_DIRECTIVES:
     Diag(Tok, diag::err_omp_unexpected_directive)
       << getOpenMPDirectiveName(DKind);
-    SkipUntil(tok::annot_pragma_openmp_end);
+    SkipUntil(tok::annot_pragma_openmp_end, NoBracketsCount);
     break;
   }
   return Directive;
@@ -194,7 +194,8 @@
                                       bool AllowScopeSpecifier) {
   VarList.clear();
   // Parse '('.
-  BalancedDelimiterTracker T(*this, tok::l_paren, tok::annot_pragma_openmp_end);
+  BalancedDelimiterTracker T(*this, tok::l_paren, tok::annot_pragma_openmp_end,
+                             true);
   if (T.expectAndConsume(diag::err_expected_lparen_after,
                          getOpenMPDirectiveName(Kind)))
     return true;
@@ -214,17 +215,17 @@
         ParseOptionalCXXScopeSpecifier(SS, ParsedType(), false)) {
       IsCorrect = false;
       SkipUntil(tok::comma, tok::r_paren, tok::annot_pragma_openmp_end,
-                StopBeforeMatch);
+                StopBeforeMatch | NoBracketsCount);
     } else if (ParseUnqualifiedId(SS, false, false, false, ParsedType(),
                                   TemplateKWLoc, Name)) {
       IsCorrect = false;
       SkipUntil(tok::comma, tok::r_paren, tok::annot_pragma_openmp_end,
-                StopBeforeMatch);
+                StopBeforeMatch | NoBracketsCount);
     } else if (Tok.isNot(tok::comma) && Tok.isNot(tok::r_paren) &&
                Tok.isNot(tok::annot_pragma_openmp_end)) {
       IsCorrect = false;
       SkipUntil(tok::comma, tok::r_paren, tok::annot_pragma_openmp_end,
-                StopBeforeMatch);
+                StopBeforeMatch | NoBracketsCount);
       Diag(PrevTok.getLocation(), diag::err_expected_ident)
         << SourceRange(PrevTok.getLocation(), PrevTokLocation);
     } else {
@@ -287,13 +288,13 @@
   case OMPC_unknown:
     Diag(Tok, diag::warn_omp_extra_tokens_at_eol)
       << getOpenMPDirectiveName(DKind);
-    SkipUntil(tok::annot_pragma_openmp_end, StopBeforeMatch);
+    SkipUntil(tok::annot_pragma_openmp_end, StopBeforeMatch | NoBracketsCount);
     break;
   case OMPC_threadprivate:
   case NUM_OPENMP_CLAUSES:
     Diag(Tok, diag::err_omp_unexpected_clause)
       << getOpenMPClauseName(CKind) << getOpenMPDirectiveName(DKind);
-    SkipUntil(tok::comma, tok::annot_pragma_openmp_end, StopBeforeMatch);
+    SkipUntil(tok::comma, tok::annot_pragma_openmp_end, StopBeforeMatch | NoBracketsCount);
     break;
   }
   return ErrorFound ? 0 : Clause;
@@ -308,7 +309,8 @@
   SourceLocation Loc = Tok.getLocation();
   SourceLocation LOpen = ConsumeToken();
   // Parse '('.
-  BalancedDelimiterTracker T(*this, tok::l_paren, tok::annot_pragma_openmp_end);
+  BalancedDelimiterTracker T(*this, tok::l_paren, tok::annot_pragma_openmp_end,
+                             true);
   if (T.expectAndConsume(diag::err_expected_lparen_after,
                          getOpenMPClauseName(Kind)))
     return 0;
@@ -342,7 +344,8 @@
   SourceLocation Loc = Tok.getLocation();
   SourceLocation LOpen = ConsumeToken();
   // Parse '('.
-  BalancedDelimiterTracker T(*this, tok::l_paren, tok::annot_pragma_openmp_end);
+  BalancedDelimiterTracker T(*this, tok::l_paren, tok::annot_pragma_openmp_end,
+                             true);
   if (T.expectAndConsume(diag::err_expected_lparen_after,
                          getOpenMPClauseName(Kind)))
     return 0;
@@ -357,7 +360,7 @@
       Vars.push_back(VarExpr.take());
     } else {
       SkipUntil(tok::comma, tok::r_paren, tok::annot_pragma_openmp_end,
-                StopBeforeMatch);
+                StopBeforeMatch | NoBracketsCount);
     }
     // Skip ',' if any
     IsComma = Tok.is(tok::comma);
Index: lib/Parse/Parser.cpp
===================================================================
--- lib/Parse/Parser.cpp
+++ lib/Parse/Parser.cpp
@@ -159,7 +159,8 @@
 /// SkipToTok is specified, it calls SkipUntil(SkipToTok).  Finally, true is
 /// returned.
 bool Parser::ExpectAndConsume(tok::TokenKind ExpectedTok, unsigned DiagID,
-                              const char *Msg, tok::TokenKind SkipToTok) {
+                              const char *Msg, tok::TokenKind SkipToTok,
+                              bool NoCount) {
   if (Tok.is(ExpectedTok) || Tok.is(tok::code_completion)) {
     ConsumeAnyToken();
     return false;
@@ -189,8 +190,13 @@
   } else
     Diag(Tok, DiagID) << Msg;
 
-  if (SkipToTok != tok::unknown)
-    SkipUntil(SkipToTok, StopAtSemi);
+  if (SkipToTok != tok::unknown) {
+    if (NoCount) {
+      SkipUntil(SkipToTok, StopAtSemi | NoBracketsCount);
+    } else {
+      SkipUntil(SkipToTok, StopAtSemi);
+    }
+  }
   return true;
 }
 
@@ -314,45 +320,51 @@
     case tok::l_paren:
       // Recursively skip properly-nested parens.
       ConsumeParen();
-      if (HasFlagsSet(Flags, StopAtCodeCompletion))
-        SkipUntil(tok::r_paren, StopAtCodeCompletion);
-      else
-        SkipUntil(tok::r_paren);
+      if (!HasFlagsSet(Flags, NoBracketsCount)) {
+        if (HasFlagsSet(Flags, StopAtCodeCompletion))
+          SkipUntil(tok::r_paren, StopAtCodeCompletion);
+        else
+          SkipUntil(tok::r_paren);
+      }
       break;
     case tok::l_square:
       // Recursively skip properly-nested square brackets.
       ConsumeBracket();
-      if (HasFlagsSet(Flags, StopAtCodeCompletion))
-        SkipUntil(tok::r_square, StopAtCodeCompletion);
-      else
-        SkipUntil(tok::r_square);
+      if (!HasFlagsSet(Flags, NoBracketsCount)) {
+        if (HasFlagsSet(Flags, StopAtCodeCompletion))
+          SkipUntil(tok::r_square, StopAtCodeCompletion);
+        else
+          SkipUntil(tok::r_square);
+      }
       break;
     case tok::l_brace:
       // Recursively skip properly-nested braces.
       ConsumeBrace();
-      if (HasFlagsSet(Flags, StopAtCodeCompletion))
-        SkipUntil(tok::r_brace, StopAtCodeCompletion);
-      else
-        SkipUntil(tok::r_brace);
+      if (!HasFlagsSet(Flags, NoBracketsCount)) {
+        if (HasFlagsSet(Flags, StopAtCodeCompletion))
+          SkipUntil(tok::r_brace, StopAtCodeCompletion);
+        else
+          SkipUntil(tok::r_brace);
+      }
       break;
 
     // Okay, we found a ']' or '}' or ')', which we think should be balanced.
     // Since the user wasn't looking for this token (if they were, it would
     // already be handled), this isn't balanced.  If there is a LHS token at a
     // higher level, we will assume that this matches the unbalanced token
     // and return it.  Otherwise, this is a spurious RHS token, which we skip.
     case tok::r_paren:
-      if (ParenCount && !isFirstTokenSkipped)
+      if (!HasFlagsSet(Flags, NoBracketsCount) && ParenCount && !isFirstTokenSkipped)
         return false;  // Matches something.
       ConsumeParen();
       break;
     case tok::r_square:
-      if (BracketCount && !isFirstTokenSkipped)
+      if (!HasFlagsSet(Flags, NoBracketsCount) && BracketCount && !isFirstTokenSkipped)
         return false;  // Matches something.
       ConsumeBracket();
       break;
     case tok::r_brace:
-      if (BraceCount && !isFirstTokenSkipped)
+      if (!HasFlagsSet(Flags, NoBracketsCount) && BraceCount && !isFirstTokenSkipped)
         return false;  // Matches something.
       ConsumeBrace();
       break;
@@ -2003,7 +2015,7 @@
                                             const char *Msg,
                                             tok::TokenKind SkipToToc ) {
   LOpen = P.Tok.getLocation();
-  if (P.ExpectAndConsume(Kind, DiagID, Msg, SkipToToc))
+  if (P.ExpectAndConsume(Kind, DiagID, Msg, SkipToToc, NoCount))
     return true;
   
   if (getDepth() < MaxDepth)
@@ -2028,16 +2040,21 @@
 
   // If we're not already at some kind of closing bracket, skip to our closing
   // token.
+  Parser::SkipUntilFlags Flags = Parser::StopAtSemi | Parser::StopBeforeMatch;
+  if (NoCount)
+    Flags = Flags | Parser::NoBracketsCount;
   if (P.Tok.isNot(tok::r_paren) && P.Tok.isNot(tok::r_brace) &&
       P.Tok.isNot(tok::r_square) &&
-      P.SkipUntil(Close, FinalToken,
-                  Parser::StopAtSemi | Parser::StopBeforeMatch) &&
+      P.SkipUntil(Close, FinalToken, Flags) &&
       P.Tok.is(Close))
     LClose = P.ConsumeAnyToken();
   return true;
 }
 
 void BalancedDelimiterTracker::skipToEnd() {
-  P.SkipUntil(Close, Parser::StopBeforeMatch);
+  Parser::SkipUntilFlags Flags = Parser::StopBeforeMatch;
+  if (NoCount)
+    Flags = Flags | Parser::NoBracketsCount;
+  P.SkipUntil(Close, Flags);
   consumeClose();
 }
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to