This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH][c++] Do not warn about unused macros while processing #pragma GCC optimize


On 8/5/19 7:53 PM, Piotr H. Dabrowski wrote:
Fixes c++/91318.

libcpp/ChangeLog:

2019-08-06  Piotr Henryk Dabrowski  <phd@phd.re>

	PR c++/91318
	* include/cpplib.h: Added cpp_define_unused(), cpp_define_formatted_unused()
	* directives.c: Likewise.

gcc/c-family/ChangeLog:

2019-08-06  Piotr Henryk Dabrowski  <phd@phd.re>

	PR c++/91318
	* c-cppbuiltin.c: c_cpp_builtins_optimize_pragma(): use cpp_define_unused()

This isn't my area so I can't comment on the correctness of
the changes but I would recommend to also add a regression
test case to the test suite along with the fix.

It might be interesting to check whether the macros are defined
the same way in C and in C++, and if they correspond to the effect
of the options set by the pragmas (i.e., "later in the source file"
as documented).

Martin



diff --git a/gcc/c-family/c-cppbuiltin.c b/gcc/c-family/c-cppbuiltin.c
index d389f8ca4a0..47d0cefb85a 100644
--- a/gcc/c-family/c-cppbuiltin.c
+++ b/gcc/c-family/c-cppbuiltin.c
@@ -576,41 +576,41 @@ c_cpp_builtins_optimize_pragma (cpp_reader *pfile, tree prev_tree,
    /* Other target-independent built-ins determined by command-line
       options.  */
    if (!prev->x_optimize_size && cur->x_optimize_size)
-    cpp_define (pfile, "__OPTIMIZE_SIZE__");
+    cpp_define_unused (pfile, "__OPTIMIZE_SIZE__");
    else if (prev->x_optimize_size && !cur->x_optimize_size)
      cpp_undef (pfile, "__OPTIMIZE_SIZE__");
if (!prev->x_optimize && cur->x_optimize)
-    cpp_define (pfile, "__OPTIMIZE__");
+    cpp_define_unused (pfile, "__OPTIMIZE__");
    else if (prev->x_optimize && !cur->x_optimize)
      cpp_undef (pfile, "__OPTIMIZE__");
prev_fast_math = fast_math_flags_struct_set_p (prev);
    cur_fast_math  = fast_math_flags_struct_set_p (cur);
    if (!prev_fast_math && cur_fast_math)
-    cpp_define (pfile, "__FAST_MATH__");
+    cpp_define_unused (pfile, "__FAST_MATH__");
    else if (prev_fast_math && !cur_fast_math)
      cpp_undef (pfile, "__FAST_MATH__");
if (!prev->x_flag_signaling_nans && cur->x_flag_signaling_nans)
-    cpp_define (pfile, "__SUPPORT_SNAN__");
+    cpp_define_unused (pfile, "__SUPPORT_SNAN__");
    else if (prev->x_flag_signaling_nans && !cur->x_flag_signaling_nans)
      cpp_undef (pfile, "__SUPPORT_SNAN__");
if (!prev->x_flag_errno_math && cur->x_flag_errno_math)
      cpp_undef (pfile, "__NO_MATH_ERRNO__");
    else if (prev->x_flag_errno_math && !cur->x_flag_errno_math)
-    cpp_define (pfile, "__NO_MATH_ERRNO__");
+    cpp_define_unused (pfile, "__NO_MATH_ERRNO__");
if (!prev->x_flag_finite_math_only && cur->x_flag_finite_math_only)
      {
        cpp_undef (pfile, "__FINITE_MATH_ONLY__");
-      cpp_define (pfile, "__FINITE_MATH_ONLY__=1");
+      cpp_define_unused (pfile, "__FINITE_MATH_ONLY__=1");
      }
    else if (prev->x_flag_finite_math_only && !cur->x_flag_finite_math_only)
      {
        cpp_undef (pfile, "__FINITE_MATH_ONLY__");
-      cpp_define (pfile, "__FINITE_MATH_ONLY__=0");
+      cpp_define_unused (pfile, "__FINITE_MATH_ONLY__=0");
      }
  }
diff --git a/libcpp/directives.c b/libcpp/directives.c
index ddf8979d513..9a774c9ed04 100644
--- a/libcpp/directives.c
+++ b/libcpp/directives.c
@@ -2392,6 +2392,15 @@ cpp_define (cpp_reader *pfile, const char *str)
    run_directive (pfile, T_DEFINE, buf, count);
  }
+/* Like cpp_define, but does not warn about unused macro. */
+void
+cpp_define_unused (cpp_reader *pfile, const char *str)
+{
+    unsigned char warn_unused_macros = CPP_OPTION (pfile, warn_unused_macros);
+    CPP_OPTION (pfile, warn_unused_macros) = 0;
+    cpp_define (pfile, str);
+    CPP_OPTION (pfile, warn_unused_macros) = warn_unused_macros;
+}
/* Use to build macros to be run through cpp_define() as
     described above.
@@ -2411,6 +2420,20 @@ cpp_define_formatted (cpp_reader *pfile, const char *fmt, ...)
    free (ptr);
  }
+/* Like cpp_define_formatted, but does not warn about unused macro. */
+void
+cpp_define_formatted_unused (cpp_reader *pfile, const char *fmt, ...)
+{
+  char *ptr;
+
+  va_list ap;
+  va_start (ap, fmt);
+  ptr = xvasprintf (fmt, ap);
+  va_end (ap);
+
+  cpp_define_unused (pfile, ptr);
+  free (ptr);
+}
/* Slight variant of the above for use by initialize_builtins. */
  void
diff --git a/libcpp/include/cpplib.h b/libcpp/include/cpplib.h
index a645f8136a6..8d3f9082601 100644
--- a/libcpp/include/cpplib.h
+++ b/libcpp/include/cpplib.h
@@ -1052,8 +1052,12 @@ extern cppchar_t cpp_host_to_exec_charset (cpp_reader *, cppchar_t);
  /* Used to register macros and assertions, perhaps from the command line.
     The text is the same as the command line argument.  */
  extern void cpp_define (cpp_reader *, const char *);
+extern void cpp_define_unused (cpp_reader *, const char *);
  extern void cpp_define_formatted (cpp_reader *pfile,
  				  const char *fmt, ...) ATTRIBUTE_PRINTF_2;
+extern void cpp_define_formatted_unused (cpp_reader *pfile,
+					 const char *fmt,
+					 ...) ATTRIBUTE_PRINTF_2;
  extern void cpp_assert (cpp_reader *, const char *);
  extern void cpp_undef (cpp_reader *, const char *);
  extern void cpp_unassert (cpp_reader *, const char *);



Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]