]> granicus.if.org Git - clang/commitdiff
Accept #pragma warning(push, 0) without warning
authorReid Kleckner <reid@kleckner.net>
Wed, 2 Oct 2013 15:19:23 +0000 (15:19 +0000)
committerReid Kleckner <reid@kleckner.net>
Wed, 2 Oct 2013 15:19:23 +0000 (15:19 +0000)
This partially addresses PR17435, but it doesn't actually implement the
pragma.  If we implement it, we should map levels 1-4 to something like
-Wall and level 0 to something like -w.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@191833 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Basic/DiagnosticLexKinds.td
lib/Frontend/PrintPreprocessedOutput.cpp
lib/Lex/Pragma.cpp
test/Preprocessor/pragma_microsoft.c
test/Preprocessor/pragma_microsoft.cpp

index eafe6c0da2f34a8a7e94b0c0fd9ff1b6d342dac2..2603307775adbc0a9e378bd52a9d711701c2ad19 100644 (file)
@@ -422,7 +422,7 @@ def warn_pragma_warning_spec_invalid :
           " 'error', 'once', 'suppress', 1, 2, 3, or 4">,
   InGroup<UnknownPragmas>;
 def warn_pragma_warning_push_level :
-  ExtWarn<"#pragma warning(push, level) requires a level between 1 and 4">,
+  ExtWarn<"#pragma warning(push, level) requires a level between 0 and 4">,
   InGroup<UnknownPragmas>;
 def warn_pragma_warning_expected_number :
   ExtWarn<"#pragma warning expected a warning number">,
index ecdfb095e6e0cce527a6f569d4517c54f97aaca6..3545d70744f05b6c3d2fb542d0c35e1dafade469 100644 (file)
@@ -528,7 +528,7 @@ void PrintPPOutputPPCallbacks::PragmaWarningPush(SourceLocation Loc,
   startNewLineIfNeeded();
   MoveToLine(Loc);
   OS << "#pragma warning(push";
-  if (Level)
+  if (Level >= 0)
     OS << ", " << Level;
   OS << ')';
   setEmittedDirectiveOnThisLine();
index 4c6d889bf3314a8a244600b739077bdcde608c37..f1d8fa1f7370998d1c78be40d883eb09fb4bb47b 100644 (file)
@@ -1007,22 +1007,22 @@ public:
   }
 };
 
-// Returns 0 on failure.
-static unsigned LexSimpleUint(Preprocessor &PP, Token &Tok) {
+// Returns -1 on failure.
+static int LexSimpleInt(Preprocessor &PP, Token &Tok) {
   assert(Tok.is(tok::numeric_constant));
   SmallString<8> IntegerBuffer;
   bool NumberInvalid = false;
   StringRef Spelling = PP.getSpelling(Tok, IntegerBuffer, &NumberInvalid);
   if (NumberInvalid)
-    return 0;
+    return -1;
   NumericLiteralParser Literal(Spelling, Tok.getLocation(), PP);
   if (Literal.hadError || !Literal.isIntegerLiteral() || Literal.hasUDSuffix())
-    return 0;
+    return -1;
   llvm::APInt APVal(32, 0);
   if (Literal.GetIntegerValue(APVal))
-    return 0;
+    return -1;
   PP.Lex(Tok);
-  return unsigned(APVal.getLimitedValue(UINT_MAX));
+  return int(APVal.getLimitedValue(INT_MAX));
 }
 
 /// "\#pragma warning(...)".  MSVC's diagnostics do not map cleanly to clang's
@@ -1055,13 +1055,13 @@ struct PragmaWarningHandler : public PragmaHandler {
 
     if (II->isStr("push")) {
       // #pragma warning( push[ ,n ] )
-      unsigned Level = 0;
+      int Level = -1;
       PP.Lex(Tok);
       if (Tok.is(tok::comma)) {
         PP.Lex(Tok);
         if (Tok.is(tok::numeric_constant))
-          Level = LexSimpleUint(PP, Tok);
-        if (Level < 1 || Level > 4) {
+          Level = LexSimpleInt(PP, Tok);
+        if (Level < 0 || Level > 4) {
           PP.Diag(Tok, diag::warn_pragma_warning_push_level);
           return;
         }
@@ -1104,8 +1104,8 @@ struct PragmaWarningHandler : public PragmaHandler {
         SmallVector<int, 4> Ids;
         PP.Lex(Tok);
         while (Tok.is(tok::numeric_constant)) {
-          unsigned Id = LexSimpleUint(PP, Tok);
-          if (Id == 0 || Id >= INT_MAX) {
+          int Id = LexSimpleInt(PP, Tok);
+          if (Id <= 0) {
             PP.Diag(Tok, diag::warn_pragma_warning_expected_number);
             return;
           }
index c7bf3c47be193923d42bfc57607c3d80a9084fcb..e30069c1c5e7a4fbff45a3e7fbe8c0fabd4f80c2 100644 (file)
@@ -98,15 +98,20 @@ void g() {}
 #pragma warning(default : 321)
 #pragma warning(pop)
 
+#pragma warning(push, 0)
+// FIXME: We could probably support pushing warning level 0.
+#pragma warning(pop)
+
 #pragma warning  // expected-warning {{expected '('}}
 #pragma warning(   // expected-warning {{expected 'push', 'pop', 'default', 'disable', 'error', 'once', 'suppress', 1, 2, 3, or 4}}
 #pragma warning()   // expected-warning {{expected 'push', 'pop', 'default', 'disable', 'error', 'once', 'suppress', 1, 2, 3, or 4}}
 #pragma warning(push 4)  // expected-warning {{expected ')'}}
 #pragma warning(push  // expected-warning {{expected ')'}}
-#pragma warning(push, 5)  // expected-warning {{requires a level between 1 and 4}}
+#pragma warning(push, 5)  // expected-warning {{requires a level between 0 and 4}}
 #pragma warning(pop, 1)  // expected-warning {{expected ')'}}
 #pragma warning(push, 1) asdf // expected-warning {{extra tokens at end of #pragma warning directive}}
 #pragma warning(disable 4705) // expected-warning {{expected ':'}}
 #pragma warning(disable : 0) // expected-warning {{expected a warning number}}
 #pragma warning(default 321) // expected-warning {{expected ':'}}
 #pragma warning(asdf : 321) // expected-warning {{expected 'push', 'pop'}}
+#pragma warning(push, -1) // expected-warning {{requires a level between 0 and 4}}
index 5bc1ccc4ce4b8feb3c524d066b1d617463862593..e097d69a208fa9729aea24527c08a3a08e04cdfa 100644 (file)
@@ -1,3 +1,3 @@
 // RUN: %clang_cc1 %s -fsyntax-only -std=c++11 -verify -fms-extensions
 
-#pragma warning(push, 4_D) // expected-warning {{requires a level between 1 and 4}}
+#pragma warning(push, 4_D) // expected-warning {{requires a level between 0 and 4}}