diff options
author | Jason Merrill <jason@redhat.com> | 2024-08-27 13:14:45 -0400 |
---|---|---|
committer | Jason Merrill <jason@redhat.com> | 2024-08-28 05:52:12 -0400 |
commit | 7f4f1bb29a47fbe63a15dda8acfe247b2e934959 (patch) | |
tree | f550f01e78364b28c43bbe79606bc108ec69f97b | |
parent | 0beac1db38855eae0f71fa982ed05069d3873a9c (diff) | |
download | gcc-7f4f1bb29a47fbe63a15dda8acfe247b2e934959.zip gcc-7f4f1bb29a47fbe63a15dda8acfe247b2e934959.tar.gz gcc-7f4f1bb29a47fbe63a15dda8acfe247b2e934959.tar.bz2 |
c++: add missing -Wc++??-extensions checks
The pedwarns for each of these features should be silenced by
the appropriate -Wno-c++??-extensions.
The handle_pragma_diagnostic_impl change is necessary so that we handle
-Wc++23-extensions early so it's available to interpret_float while lexing.
gcc/c-family/ChangeLog:
* c-pragma.cc (handle_pragma_diagnostic_impl): Also handle
-Wc++23-extensions early.
* c-lex.cc (interpret_float): Use -Wc++23-extensions for extended
floating point literal pedwarn.
gcc/cp/ChangeLog:
* parser.cc (cp_parser_simple_type_specifier): Use
-Wc++20-extensions for auto parameter pedwarn.
* pt.cc (do_decl_instantiation, do_type_instantiation): Use
-Wc++11-extensions for 'extern template'.
gcc/testsuite/ChangeLog:
* g++.dg/cpp0x/extern_template-7.C: New test.
* g++.dg/cpp23/ext-floating19.C: New test.
* g++.dg/cpp2a/abbrev-fn1.C: New test.
-rw-r--r-- | gcc/c-family/c-lex.cc | 8 | ||||
-rw-r--r-- | gcc/c-family/c-pragma.cc | 2 | ||||
-rw-r--r-- | gcc/cp/parser.cc | 2 | ||||
-rw-r--r-- | gcc/cp/pt.cc | 8 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/extern_template-7.C | 10 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp23/ext-floating19.C | 20 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp2a/abbrev-fn1.C | 6 |
7 files changed, 47 insertions, 9 deletions
diff --git a/gcc/c-family/c-lex.cc b/gcc/c-family/c-lex.cc index ff5ce2b..d99d8ea 100644 --- a/gcc/c-family/c-lex.cc +++ b/gcc/c-family/c-lex.cc @@ -1254,8 +1254,8 @@ interpret_float (const cpp_token *token, unsigned int flags, } else if (!extended) { - if (cxx_dialect < cxx23) - pedwarn (input_location, OPT_Wpedantic, + if (cxx_dialect < cxx23 && pedantic) + pedwarn (input_location, OPT_Wc__23_extensions, "%<f%d%> or %<F%d%> suffix on floating constant only " "available with %<-std=c++2b%> or %<-std=gnu++2b%>", n, n); @@ -1275,8 +1275,8 @@ interpret_float (const cpp_token *token, unsigned int flags, if (!c_dialect_cxx ()) pedwarn (input_location, OPT_Wpedantic, "non-standard suffix on floating constant"); - else if (cxx_dialect < cxx23) - pedwarn (input_location, OPT_Wpedantic, + else if (cxx_dialect < cxx23 && pedantic) + pedwarn (input_location, OPT_Wc__23_extensions, "%<bf16%> or %<BF16%> suffix on floating constant only " "available with %<-std=c++2b%> or %<-std=gnu++2b%>"); } diff --git a/gcc/c-family/c-pragma.cc b/gcc/c-family/c-pragma.cc index ed2a7a0..bb867eb 100644 --- a/gcc/c-family/c-pragma.cc +++ b/gcc/c-family/c-pragma.cc @@ -964,6 +964,8 @@ handle_pragma_diagnostic_impl () unsigned int option_index = find_opt (data.option_str + 1, lang_mask); if (early && !(c_option_is_from_cpp_diagnostics (option_index) + /* For interpret_float. */ + || option_index == OPT_Wc__23_extensions || option_index == OPT_Wunknown_pragmas)) return; diff --git a/gcc/cp/parser.cc b/gcc/cp/parser.cc index a722641..918072d 100644 --- a/gcc/cp/parser.cc +++ b/gcc/cp/parser.cc @@ -20527,7 +20527,7 @@ cp_parser_simple_type_specifier (cp_parser* parser, error_at (token->location, "use of %<auto%> in template argument"); else if (!flag_concepts) - pedwarn (token->location, 0, + pedwarn (token->location, OPT_Wc__20_extensions, "use of %<auto%> in parameter declaration " "only available with %<-std=c++20%> or %<-fconcepts%>"); else if (cxx_dialect < cxx14) diff --git a/gcc/cp/pt.cc b/gcc/cp/pt.cc index 24a6241d..9e0f048 100644 --- a/gcc/cp/pt.cc +++ b/gcc/cp/pt.cc @@ -26531,8 +26531,8 @@ do_decl_instantiation (tree decl, tree storage) ; else if (storage == ridpointers[(int) RID_EXTERN]) { - if (cxx_dialect == cxx98) - pedwarn (input_location, OPT_Wpedantic, + if (cxx_dialect == cxx98 && pedantic) + pedwarn (input_location, OPT_Wc__11_extensions, "ISO C++ 1998 forbids the use of %<extern%> on explicit " "instantiations"); extern_p = 1; @@ -26598,8 +26598,8 @@ do_type_instantiation (tree t, tree storage, tsubst_flags_t complain) { if (storage == ridpointers[(int) RID_EXTERN]) { - if (cxx_dialect == cxx98) - pedwarn (input_location, OPT_Wpedantic, + if (cxx_dialect == cxx98 && pedantic) + pedwarn (input_location, OPT_Wc__11_extensions, "ISO C++ 1998 forbids the use of %<extern%> on " "explicit instantiations"); } diff --git a/gcc/testsuite/g++.dg/cpp0x/extern_template-7.C b/gcc/testsuite/g++.dg/cpp0x/extern_template-7.C new file mode 100644 index 0000000..0a0431f --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/extern_template-7.C @@ -0,0 +1,10 @@ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wc++11-extensions" + +template <class T> struct A +{ + void f() { } +}; + +extern template class A<int>; +extern template void A<char>::f(); diff --git a/gcc/testsuite/g++.dg/cpp23/ext-floating19.C b/gcc/testsuite/g++.dg/cpp23/ext-floating19.C new file mode 100644 index 0000000..dfbedb9 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp23/ext-floating19.C @@ -0,0 +1,20 @@ +// { dg-do compile { target c++11 } } + +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wc++23-extensions" + +#ifdef __STDCPP_FLOAT16_T__ +auto x16 = 3.14f16; +#endif +#ifdef __STDCPP_FLOAT32_T__ +auto x32 = 3.14f32; +#endif +#ifdef __STDCPP_FLOAT64_T__ +auto x64 = 3.14f64; +#endif +#ifdef __STDCPP_FLOAT128_T__ +auto x128 = 3.14f128; +#endif +#ifdef __STDCPP_FLOAT16_T__ +auto xbf = 1.2bf16; +#endif diff --git a/gcc/testsuite/g++.dg/cpp2a/abbrev-fn1.C b/gcc/testsuite/g++.dg/cpp2a/abbrev-fn1.C new file mode 100644 index 0000000..ca25308 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp2a/abbrev-fn1.C @@ -0,0 +1,6 @@ +// { dg-do compile { target c++11 } } + +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wc++20-extensions" + +void f(auto p) { } |