https://gcc.gnu.org/g:7f4f1bb29a47fbe63a15dda8acfe247b2e934959

commit r15-3250-g7f4f1bb29a47fbe63a15dda8acfe247b2e934959
Author: Jason Merrill <ja...@redhat.com>
Date:   Tue Aug 27 13:14:45 2024 -0400

    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:
---
 gcc/c-family/c-lex.cc                          |  8 ++++----
 gcc/c-family/c-pragma.cc                       |  2 ++
 gcc/cp/parser.cc                               |  2 +-
 gcc/cp/pt.cc                                   |  8 ++++----
 gcc/testsuite/g++.dg/cpp0x/extern_template-7.C | 10 ++++++++++
 gcc/testsuite/g++.dg/cpp23/ext-floating19.C    | 20 ++++++++++++++++++++
 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 ff5ce2bf729a..d99d8ea2c0c5 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 ed2a7a00e9eb..bb867eb995aa 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 a722641be347..918072dbf637 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 24a6241d3a51..9e0f0486ffbc 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 000000000000..0a0431f604a8
--- /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 000000000000..dfbedb986990
--- /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 000000000000..ca2530872c86
--- /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) { }

Reply via email to