aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Malcolm <dmalcolm@redhat.com>2019-12-05 14:47:35 -0500
committerDavid Malcolm <dmalcolm@redhat.com>2020-04-27 15:02:57 -0400
commitfa29cf0c3f19b648e30b16fd2485c3c17a528a6e (patch)
tree887f4679b10686e6d407e49c3815f8f0c4666601
parent76458c912b0cdda59e094fa64b98aea9ffee214a (diff)
downloadgcc-fa29cf0c3f19b648e30b16fd2485c3c17a528a6e.zip
gcc-fa29cf0c3f19b648e30b16fd2485c3c17a528a6e.tar.gz
gcc-fa29cf0c3f19b648e30b16fd2485c3c17a528a6e.tar.bz2
Fix warning URLs for Fortran and analyzer [PR 92830]
PR 92830 reports that we always use "gcc/Warning-Options.html" when we emit escaped documentation URLs when printing "[-Wname-of-option]" for a warning. This page is wrong for most Fortran warnings, and for analyzer warnings. I considered various schemes involving adding extra tags to the .opt format to capture where options are documented, but for now this patch fixes the issue by introducing some special-casing logic. It only fixes the URLs for warning options, not for other command-line options, but those are the only options for which get_option_url is currently called. gcc/ChangeLog: PR 92830 * configure.ac (DOCUMENTATION_ROOT_URL): Drop trailing "gcc/" from default value, so that it can by supplied by get_option_html_page. * configure: Regenerate. * opts.c: Include "selftest.h". (get_option_html_page): New function. (get_option_url): Use it. Reformat to place comments next to the expressions they refer to. (selftest::test_get_option_html_page): New. (selftest::opts_c_tests): New. * selftest-run-tests.c (selftest::run_tests): Call selftest::opts_c_tests. * selftest.h (selftest::opts_c_tests): New decl.
-rwxr-xr-xgcc/configure2
-rw-r--r--gcc/configure.ac2
-rw-r--r--gcc/opts.c87
-rw-r--r--gcc/selftest-run-tests.c1
-rw-r--r--gcc/selftest.h1
5 files changed, 83 insertions, 10 deletions
diff --git a/gcc/configure b/gcc/configure
index dfdc5d8..9e22c5a 100755
--- a/gcc/configure
+++ b/gcc/configure
@@ -7851,7 +7851,7 @@ if test "${with_documentation_root_url+set}" = set; then :
;;
esac
else
- DOCUMENTATION_ROOT_URL="https://gcc.gnu.org/onlinedocs/gcc/"
+ DOCUMENTATION_ROOT_URL="https://gcc.gnu.org/onlinedocs/"
fi
diff --git a/gcc/configure.ac b/gcc/configure.ac
index fdee9ea..cd62312 100644
--- a/gcc/configure.ac
+++ b/gcc/configure.ac
@@ -982,7 +982,7 @@ AC_ARG_WITH(documentation-root-url,
*) DOCUMENTATION_ROOT_URL="$withval"
;;
esac],
- DOCUMENTATION_ROOT_URL="https://gcc.gnu.org/onlinedocs/gcc/"
+ DOCUMENTATION_ROOT_URL="https://gcc.gnu.org/onlinedocs/"
)
AC_SUBST(DOCUMENTATION_ROOT_URL)
diff --git a/gcc/opts.c b/gcc/opts.c
index d4df862..c212a1a 100644
--- a/gcc/opts.c
+++ b/gcc/opts.c
@@ -32,6 +32,7 @@ along with GCC; see the file COPYING3. If not see
#include "spellcheck.h"
#include "opt-suggestions.h"
#include "diagnostic-color.h"
+#include "selftest.h"
static void set_Wstrict_aliasing (struct gcc_options *opts, int onoff);
@@ -3128,6 +3129,42 @@ option_name (diagnostic_context *context, int option_index,
return NULL;
}
+/* Get the page within the documentation for this option. */
+
+static const char *
+get_option_html_page (int option_index)
+{
+ const cl_option *cl_opt = &cl_options[option_index];
+
+ /* Analyzer options are on their own page. */
+ if (strstr(cl_opt->opt_text, "analyzer-"))
+ return "gcc/Static-Analyzer-Options.html";
+
+#ifdef CL_Fortran
+ if (cl_opt->flags & CL_Fortran)
+ {
+ switch (option_index)
+ {
+ default:
+ /* Most Fortran warnings are documented on this page. */
+ return "gfortran/Error-and-Warning-Options.html";
+
+ case OPT_Wdate_time:
+ case OPT_Wconversion:
+ case OPT_Wconversion_extra:
+ case OPT_Wmissing_include_dirs:
+ case OPT_Wopenmp_simd:
+ /* These warnings are marked in fortran/lang.opt as
+ "Documented in C" and thus use the common
+ Warning-Options page below. */
+ break;
+ }
+ }
+#endif
+
+ return "gcc/Warning-Options.html";
+}
+
/* Return malloced memory for a URL describing the option OPTION_INDEX
which enabled a diagnostic (context CONTEXT). */
@@ -3135,16 +3172,50 @@ char *
get_option_url (diagnostic_context *, int option_index)
{
if (option_index)
- /* DOCUMENTATION_ROOT_URL should be supplied via -D by the Makefile
- (see --with-documentation-root-url).
-
- Expect an anchor of the form "index-Wfoo" e.g.
- <a name="index-Wformat"></a>, and thus an id within
- the URL of "#index-Wformat". */
- return concat (DOCUMENTATION_ROOT_URL,
- "Warning-Options.html",
+ return concat (/* DOCUMENTATION_ROOT_URL should be supplied via -D by
+ the Makefile (see --with-documentation-root-url), and
+ should have a trailing slash. */
+ DOCUMENTATION_ROOT_URL,
+
+ /* get_option_html_page will return something like
+ "gcc/Warning-Options.html". */
+ get_option_html_page (option_index),
+
+ /* Expect an anchor of the form "index-Wfoo" e.g.
+ <a name="index-Wformat"></a>, and thus an id within
+ the URL of "#index-Wformat". */
"#index", cl_options[option_index].opt_text,
NULL);
else
return NULL;
}
+
+#if CHECKING_P
+
+namespace selftest {
+
+/* Verify that get_option_html_page works as expected. */
+
+static void
+test_get_option_html_page ()
+{
+ ASSERT_STREQ (get_option_html_page (OPT_Wcpp), "gcc/Warning-Options.html");
+ ASSERT_STREQ (get_option_html_page (OPT_Wanalyzer_double_free),
+ "gcc/Static-Analyzer-Options.html");
+#ifdef CL_Fortran
+ ASSERT_STREQ (get_option_html_page (OPT_Wline_truncation),
+ "gfortran/Error-and-Warning-Options.html");
+#endif
+}
+
+/* Run all of the selftests within this file. */
+
+void
+opts_c_tests ()
+{
+ test_get_option_html_page ();
+}
+
+} // namespace selftest
+
+#endif /* #if CHECKING_P */
diff --git a/gcc/selftest-run-tests.c b/gcc/selftest-run-tests.c
index d47e928..f0a81d4 100644
--- a/gcc/selftest-run-tests.c
+++ b/gcc/selftest-run-tests.c
@@ -73,6 +73,7 @@ selftest::run_tests ()
typed_splay_tree_c_tests ();
unique_ptr_tests_cc_tests ();
opt_proposer_c_tests ();
+ opts_c_tests ();
json_cc_tests ();
cgraph_c_tests ();
optinfo_emit_json_cc_tests ();
diff --git a/gcc/selftest.h b/gcc/selftest.h
index df98e0b..5cffa13 100644
--- a/gcc/selftest.h
+++ b/gcc/selftest.h
@@ -243,6 +243,7 @@ extern void input_c_tests ();
extern void json_cc_tests ();
extern void opt_problem_cc_tests ();
extern void optinfo_emit_json_cc_tests ();
+extern void opts_c_tests ();
extern void ordered_hash_map_tests_cc_tests ();
extern void predict_c_tests ();
extern void pretty_print_c_tests ();