aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2024-08-27 13:14:45 -0400
committerJason Merrill <jason@redhat.com>2024-08-28 05:52:12 -0400
commit7f4f1bb29a47fbe63a15dda8acfe247b2e934959 (patch)
treef550f01e78364b28c43bbe79606bc108ec69f97b /gcc
parent0beac1db38855eae0f71fa982ed05069d3873a9c (diff)
downloadgcc-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.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/c-family/c-lex.cc8
-rw-r--r--gcc/c-family/c-pragma.cc2
-rw-r--r--gcc/cp/parser.cc2
-rw-r--r--gcc/cp/pt.cc8
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/extern_template-7.C10
-rw-r--r--gcc/testsuite/g++.dg/cpp23/ext-floating19.C20
-rw-r--r--gcc/testsuite/g++.dg/cpp2a/abbrev-fn1.C6
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) { }