From: Jason Merrill Date: Tue, 27 Aug 2024 17:14:45 +0000 (-0400) Subject: c++: add missing -Wc++??-extensions checks X-Git-Tag: basepoints/gcc-16~6303 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7f4f1bb29a47fbe63a15dda8acfe247b2e934959;p=thirdparty%2Fgcc.git 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. --- diff --git a/gcc/c-family/c-lex.cc b/gcc/c-family/c-lex.cc index ff5ce2bf729..d99d8ea2c0c 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, "% or % 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, "% or % 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 ed2a7a00e9e..bb867eb995a 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 a722641be34..918072dbf63 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 % in template argument"); else if (!flag_concepts) - pedwarn (token->location, 0, + pedwarn (token->location, OPT_Wc__20_extensions, "use of % 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 24a6241d3a5..9e0f0486ffb 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 % 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 % 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 00000000000..0a0431f604a --- /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 struct A +{ + void f() { } +}; + +extern template class A; +extern template void A::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 00000000000..dfbedb98699 --- /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 00000000000..ca2530872c8 --- /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) { }