Use explicit locations for some warnings in c-pragma.c.
authorManuel López-Ibáñez <manu@gcc.gnu.org>
Fri, 18 Sep 2015 19:36:19 +0000 (19:36 +0000)
committerManuel López-Ibáñez <manu@gcc.gnu.org>
Fri, 18 Sep 2015 19:36:19 +0000 (19:36 +0000)
gcc/cp/ChangeLog:

2015-09-18  Manuel López-Ibáñez  <manu@gcc.gnu.org>

* parser.c (pragma_lex): Add loc argument. Rearrange the code to
make it more similar to the C version.

gcc/c-family/ChangeLog:

2015-09-18  Manuel López-Ibáñez  <manu@gcc.gnu.org>

* c-pragma.c (handle_pragma_diagnostic): Use explicit location
when warning.
* c-pragma.h (pragma_lex): Add optional loc argument.

gcc/c/ChangeLog:

2015-09-18  Manuel López-Ibáñez  <manu@gcc.gnu.org>

* c-parser.c (pragma_lex): Add loc argument.

gcc/testsuite/ChangeLog:

2015-09-18  Manuel López-Ibáñez  <manu@gcc.gnu.org>

* gcc.dg/pragma-diag-5.c: New test.

From-SVN: r227923

gcc/c-family/ChangeLog
gcc/c-family/c-pragma.c
gcc/c-family/c-pragma.h
gcc/c/ChangeLog
gcc/c/c-parser.c
gcc/cp/ChangeLog
gcc/cp/parser.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pragma-diag-5.c [new file with mode: 0644]

index 9a631698c1cdc646adb5d7b2d469d22e10d80bb0..49df8c9ed76345db62472c87b8350bbec61539a1 100644 (file)
@@ -1,3 +1,9 @@
+2015-09-18  Manuel López-Ibáñez  <manu@gcc.gnu.org>
+
+       * c-pragma.c (handle_pragma_diagnostic): Use explicit location
+       when warning.
+       * c-pragma.h (pragma_lex): Add optional loc argument.
+
 2015-09-16  Mikhail Maltsev  <maltsevm@gmail.com>
 
        * c-format.c (check_format_arg): Adjust to use common block size in all
index 5fb1fc270ebf3947b72ad4fe75da2f61e8e5f326..4679555ac298385d036bb5a72a0c73b3875d6ef4 100644 (file)
@@ -704,17 +704,19 @@ handle_pragma_visibility (cpp_reader *dummy ATTRIBUTE_UNUSED)
 static void
 handle_pragma_diagnostic(cpp_reader *ARG_UNUSED(dummy))
 {
-  const char *kind_string, *option_string;
-  unsigned int option_index;
-  enum cpp_ttype token;
-  diagnostic_t kind;
   tree x;
-  struct cl_option_handlers handlers;
-
-  token = pragma_lex (&x);
+  location_t loc;
+  enum cpp_ttype token = pragma_lex (&x, &loc);
   if (token != CPP_NAME)
-    GCC_BAD ("missing [error|warning|ignored] after %<#pragma GCC diagnostic%>");
-  kind_string = IDENTIFIER_POINTER (x);
+    {
+      warning_at (loc, OPT_Wpragmas,
+                 "missing [error|warning|ignored|push|pop]"
+                 " after %<#pragma GCC diagnostic%>");
+    }
+  return;
+
+  diagnostic_t kind;
+  const char *kind_string = IDENTIFIER_POINTER (x);
   if (strcmp (kind_string, "error") == 0)
     kind = DK_ERROR;
   else if (strcmp (kind_string, "warning") == 0)
@@ -732,13 +734,26 @@ handle_pragma_diagnostic(cpp_reader *ARG_UNUSED(dummy))
       return;
     }
   else
-    GCC_BAD ("expected [error|warning|ignored|push|pop] after %<#pragma GCC diagnostic%>");
+    {
+      warning_at (loc, OPT_Wpragmas,
+                 "expected [error|warning|ignored|push|pop]"
+                 " after %<#pragma GCC diagnostic%>");
+      return;
+    }
 
-  token = pragma_lex (&x);
+  token = pragma_lex (&x, &loc);
   if (token != CPP_STRING)
-    GCC_BAD ("missing option after %<#pragma GCC diagnostic%> kind");
-  option_string = TREE_STRING_POINTER (x);
+    {
+      warning_at (loc, OPT_Wpragmas,
+                 "missing option after %<#pragma GCC diagnostic%> kind");
+      return;
+    }
+
+  struct cl_option_handlers handlers;
   set_default_handlers (&handlers);
+
+  unsigned int option_index;
+  const char *option_string = TREE_STRING_POINTER (x);
   for (option_index = 0; option_index < cl_options_count; option_index++)
     if (strcmp (cl_options[option_index].opt_text, option_string) == 0)
       {
@@ -748,7 +763,8 @@ handle_pragma_diagnostic(cpp_reader *ARG_UNUSED(dummy))
                                global_dc);
        return;
       }
-  GCC_BAD ("unknown option after %<#pragma GCC diagnostic%> kind");
+  warning_at (loc, OPT_Wpragmas,
+             "unknown option after %<#pragma GCC diagnostic%> kind");
 }
 
 /*  Parse #pragma GCC target (xxx) to set target specific options.  */
index aa2b471757235c649920f01b986e2f687e80ad80..f6e10900a63e06e21e45d743ce6bc93982388813 100644 (file)
@@ -212,7 +212,7 @@ extern void maybe_apply_pending_pragma_weaks (void);
 extern tree maybe_apply_renaming_pragma (tree, tree);
 extern void add_to_renaming_pragma_list (tree, tree);
 
-extern enum cpp_ttype pragma_lex (tree *);
+extern enum cpp_ttype pragma_lex (tree *, location_t *loc = NULL);
 
 /* Flags for use with c_lex_with_flags.  The values here were picked
    so that 0 means to translate and join strings.  */
index 27659e231c34ede51a2ebc894be68d501435eeda..aa6d715288d84d041dd9d6d47403462eceeeb6f3 100644 (file)
@@ -1,3 +1,7 @@
+2015-09-18  Manuel López-Ibáñez  <manu@gcc.gnu.org>
+
+       * c-parser.c (pragma_lex): Add loc argument.
+
 2015-09-15  Marek Polacek  <polacek@redhat.com>
 
        PR c/67580
index d5de1028ddc7091fe158e660068ef4300d1f859e..2fab3f0ebe404f207f6d55b14a0d0d7dc110a2f4 100644 (file)
@@ -9846,12 +9846,15 @@ c_parser_pragma (c_parser *parser, enum pragma_context context)
 /* The interface the pragma parsers have to the lexer.  */
 
 enum cpp_ttype
-pragma_lex (tree *value)
+pragma_lex (tree *value, location_t *loc)
 {
   c_token *tok = c_parser_peek_token (the_parser);
   enum cpp_ttype ret = tok->type;
 
   *value = tok->value;
+  if (loc)
+    *loc = tok->location;
+
   if (ret == CPP_PRAGMA_EOL || ret == CPP_EOF)
     ret = CPP_EOF;
   else
index 0f0d07dae1795e7793e0fd97dbb5faf441a61a48..c72e913e1b3d17c8f7e21235d23f22d9048d141b 100644 (file)
@@ -1,3 +1,8 @@
+2015-09-18  Manuel López-Ibáñez  <manu@gcc.gnu.org>
+
+       * parser.c (pragma_lex): Add loc argument. Rearrange the code to
+       make it more similar to the C version.
+
 2015-09-17  Andrew Sutton  <andrew.n.sutton@gmail.com>
            Jason Merrill  <jason@redhat.com>
 
index 4f424b64f42c0e6dced71abd5d7b22c502c48ae8..637118c2b271c8ac0fdd754717afbdf99f2c3c5e 100644 (file)
@@ -34447,15 +34447,14 @@ cp_parser_pragma (cp_parser *parser, enum pragma_context context)
 /* The interface the pragma parsers have to the lexer.  */
 
 enum cpp_ttype
-pragma_lex (tree *value)
+pragma_lex (tree *value, location_t *loc)
 {
-  cp_token *tok;
-  enum cpp_ttype ret;
-
-  tok = cp_lexer_peek_token (the_parser->lexer);
+  cp_token *tok = cp_lexer_peek_token (the_parser->lexer);
+  enum cpp_ttype ret = tok->type;
 
-  ret = tok->type;
   *value = tok->u.value;
+  if (loc)
+    *loc = tok->location;
 
   if (ret == CPP_PRAGMA_EOL || ret == CPP_EOF)
     ret = CPP_EOF;
@@ -34463,9 +34462,9 @@ pragma_lex (tree *value)
     *value = cp_parser_string_literal (the_parser, false, false);
   else
     {
-      cp_lexer_consume_token (the_parser->lexer);
       if (ret == CPP_KEYWORD)
        ret = CPP_NAME;
+      cp_lexer_consume_token (the_parser->lexer);
     }
 
   return ret;
index f959a789f55ca53207737721885422e8f6d4407e..95a19a7818181513c06e232a2192d1795a467a32 100644 (file)
@@ -1,3 +1,7 @@
+2015-09-18  Manuel López-Ibáñez  <manu@gcc.gnu.org>
+
+       * gcc.dg/pragma-diag-5.c: New test.
+
 2015-09-18  Uros Bizjak  <ubizjak@gmail.com>
 
        PR middle-end/67619
diff --git a/gcc/testsuite/gcc.dg/pragma-diag-5.c b/gcc/testsuite/gcc.dg/pragma-diag-5.c
new file mode 100644 (file)
index 0000000..64fe97f
--- /dev/null
@@ -0,0 +1,6 @@
+/* { dg-do compile } */
+#pragma GCC diagnostic /* { dg-warning "24:missing" "missing" { xfail *-*-* } } */
+
+#pragma GCC diagnostic warn /* { dg-warning "24:expected" } */
+
+#pragma GCC diagnostic ignored "-Wfoo" /* { dg-warning "32:unknown" } */