This shamelessly mimics what Manual implemented recently for the C family of 
compilers under PR c/49654 and PR c/49655.

Tested on x86_64-suse-linux, applied on the mainline.


2015-10-02  Eric Botcazou  <ebotca...@adacore.com>

        * gcc-interface/trans.c (Pragma_to_gnu) <Pragma_Warnings>: Replace
        linear search with call to find_opt and issue warnings if the -W
        switch is not appropriate.


2015-10-02  Eric Botcazou  <ebotca...@adacore.com>

        * gnat.dg/warn13.adb: New test.


-- 
Eric Botcazou
Index: gcc-interface/trans.c
===================================================================
--- gcc-interface/trans.c	(revision 228377)
+++ gcc-interface/trans.c	(working copy)
@@ -1442,21 +1442,28 @@ Pragma_to_gnu (Node_Id gnat_node)
 	  gcc_unreachable ();
 
 	/* This is the same implementation as in the C family of compilers.  */
+	const unsigned int lang_mask = CL_Ada | CL_COMMON;
 	if (Present (gnat_expr))
 	  {
 	    tree gnu_expr = gnat_to_gnu (gnat_expr);
-	    const char *opt_string = TREE_STRING_POINTER (gnu_expr);
+	    const char *option_string = TREE_STRING_POINTER (gnu_expr);
 	    const int len = TREE_STRING_LENGTH (gnu_expr);
-	    if (len < 3 || opt_string[0] != '-' || opt_string[1] != 'W')
+	    if (len < 3 || option_string[0] != '-' || option_string[1] != 'W')
 	      break;
-	    for (option_index = 0;
-		 option_index < cl_options_count;
-		 option_index++)
-	      if (strcmp (cl_options[option_index].opt_text, opt_string) == 0)
+	    option_index = find_opt (option_string + 1, lang_mask);
+	    if (option_index == OPT_SPECIAL_unknown)
+	      {
+		post_error ("?unknown -W switch", gnat_node);
 		break;
-	    if (option_index == cl_options_count)
+	      }
+	    else if (!(cl_options[option_index].flags & CL_WARNING))
+	      {
+		post_error ("?-W switch does not control warning", gnat_node);
+		break;
+	      }
+	    else if (!(cl_options[option_index].flags & lang_mask))
 	      {
-		post_error ("unknown -W switch", gnat_node);
+		post_error ("?-W switch not valid for Ada", gnat_node);
 		break;
 	      }
 	  }
@@ -1465,7 +1472,7 @@ Pragma_to_gnu (Node_Id gnat_node)
 
 	set_default_handlers (&handlers);
 	control_warning_option (option_index, (int) kind, imply, location,
-				CL_Ada, &handlers, &global_options,
+				lang_mask, &handlers, &global_options,
 				&global_options_set, global_dc);
       }
       break;
-- { dg-compile }

procedure Warn13 is

  pragma Warnings ("-Wbogus");  -- { dg-warning "unknown" }
  pragma Warnings ("-Werror");  -- { dg-warning "does not control warning" }
  pragma Warnings ("-Wformat"); -- { dg-warning "switch not valid for Ada" }

begin
  null;
end;

Reply via email to