1 | /* Various diagnostic subroutines for the GNU C language. |
2 | Copyright (C) 2000-2023 Free Software Foundation, Inc. |
3 | Contributed by Gabriel Dos Reis <gdr@codesourcery.com> |
4 | |
5 | This file is part of GCC. |
6 | |
7 | GCC is free software; you can redistribute it and/or modify it under |
8 | the terms of the GNU General Public License as published by the Free |
9 | Software Foundation; either version 3, or (at your option) any later |
10 | version. |
11 | |
12 | GCC is distributed in the hope that it will be useful, but WITHOUT ANY |
13 | WARRANTY; without even the implied warranty of MERCHANTABILITY or |
14 | FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
15 | for more details. |
16 | |
17 | You should have received a copy of the GNU General Public License |
18 | along with GCC; see the file COPYING3. If not see |
19 | <http://www.gnu.org/licenses/>. */ |
20 | |
21 | #include "config.h" |
22 | #include "system.h" |
23 | #include "coretypes.h" |
24 | #include "tm.h" |
25 | #include "c-tree.h" |
26 | #include "opts.h" |
27 | |
28 | /* Issue an ISO C11 pedantic warning MSGID if -pedantic outside C23 mode, |
29 | otherwise issue warning MSGID if -Wc11-c23-compat is specified. |
30 | This function is supposed to be used for matters that are allowed in |
31 | ISO C23 but not supported in ISO C11, thus we explicitly don't pedwarn |
32 | when C23 is specified. */ |
33 | |
34 | bool |
35 | pedwarn_c11 (location_t location, int opt, const char *gmsgid, ...) |
36 | { |
37 | diagnostic_info diagnostic; |
38 | va_list ap; |
39 | bool warned = false; |
40 | rich_location richloc (line_table, location); |
41 | |
42 | va_start (ap, gmsgid); |
43 | /* If desired, issue the C11/C23 compat warning, which is more specific |
44 | than -pedantic. */ |
45 | if (warn_c11_c23_compat > 0) |
46 | { |
47 | diagnostic_set_info (&diagnostic, gmsgid, &ap, &richloc, |
48 | (pedantic && !flag_isoc23) |
49 | ? DK_PEDWARN : DK_WARNING); |
50 | diagnostic.option_index = OPT_Wc11_c23_compat; |
51 | warned = diagnostic_report_diagnostic (context: global_dc, diagnostic: &diagnostic); |
52 | } |
53 | /* -Wno-c11-c23-compat suppresses even the pedwarns. */ |
54 | else if (warn_c11_c23_compat == 0) |
55 | ; |
56 | /* For -pedantic outside C23, issue a pedwarn. */ |
57 | else if (pedantic && !flag_isoc23) |
58 | { |
59 | diagnostic_set_info (&diagnostic, gmsgid, &ap, &richloc, DK_PEDWARN); |
60 | diagnostic.option_index = opt; |
61 | warned = diagnostic_report_diagnostic (context: global_dc, diagnostic: &diagnostic); |
62 | } |
63 | va_end (ap); |
64 | return warned; |
65 | } |
66 | |
67 | /* Issue an ISO C99 pedantic warning MSGID if -pedantic outside C11 mode, |
68 | otherwise issue warning MSGID if -Wc99-c11-compat is specified. |
69 | This function is supposed to be used for matters that are allowed in |
70 | ISO C11 but not supported in ISO C99, thus we explicitly don't pedwarn |
71 | when C11 is specified. */ |
72 | |
73 | bool |
74 | pedwarn_c99 (location_t location, int opt, const char *gmsgid, ...) |
75 | { |
76 | diagnostic_info diagnostic; |
77 | va_list ap; |
78 | bool warned = false; |
79 | rich_location richloc (line_table, location); |
80 | |
81 | va_start (ap, gmsgid); |
82 | /* If desired, issue the C99/C11 compat warning, which is more specific |
83 | than -pedantic. */ |
84 | if (warn_c99_c11_compat > 0) |
85 | { |
86 | diagnostic_set_info (&diagnostic, gmsgid, &ap, &richloc, |
87 | (pedantic && !flag_isoc11) |
88 | ? DK_PEDWARN : DK_WARNING); |
89 | diagnostic.option_index = OPT_Wc99_c11_compat; |
90 | warned = diagnostic_report_diagnostic (context: global_dc, diagnostic: &diagnostic); |
91 | } |
92 | /* -Wno-c99-c11-compat suppresses even the pedwarns. */ |
93 | else if (warn_c99_c11_compat == 0) |
94 | ; |
95 | /* For -pedantic outside C11, issue a pedwarn. */ |
96 | else if (pedantic && !flag_isoc11) |
97 | { |
98 | diagnostic_set_info (&diagnostic, gmsgid, &ap, &richloc, DK_PEDWARN); |
99 | diagnostic.option_index = opt; |
100 | warned = diagnostic_report_diagnostic (context: global_dc, diagnostic: &diagnostic); |
101 | } |
102 | va_end (ap); |
103 | return warned; |
104 | } |
105 | |
106 | /* Issue an ISO C90 pedantic warning MSGID if -pedantic outside C99 mode, |
107 | otherwise issue warning MSGID if -Wc90-c99-compat is specified, or if |
108 | a specific option such as -Wlong-long is specified. |
109 | This function is supposed to be used for matters that are allowed in |
110 | ISO C99 but not supported in ISO C90, thus we explicitly don't pedwarn |
111 | when C99 is specified. (There is no flag_c90.) */ |
112 | |
113 | bool |
114 | pedwarn_c90 (location_t location, int opt, const char *gmsgid, ...) |
115 | { |
116 | diagnostic_info diagnostic; |
117 | va_list ap; |
118 | bool warned = false; |
119 | rich_location richloc (line_table, location); |
120 | |
121 | va_start (ap, gmsgid); |
122 | /* Warnings such as -Wvla are the most specific ones. */ |
123 | if (opt != OPT_Wpedantic) |
124 | { |
125 | int opt_var = *(int *) option_flag_var (opt_index: opt, opts: &global_options); |
126 | if (opt_var == 0) |
127 | goto out; |
128 | else if (opt_var > 0) |
129 | { |
130 | diagnostic_set_info (&diagnostic, gmsgid, &ap, &richloc, |
131 | (pedantic && !flag_isoc99) |
132 | ? DK_PEDWARN : DK_WARNING); |
133 | diagnostic.option_index = opt; |
134 | diagnostic_report_diagnostic (context: global_dc, diagnostic: &diagnostic); |
135 | warned = true; |
136 | goto out; |
137 | } |
138 | } |
139 | /* Maybe we want to issue the C90/C99 compat warning, which is more |
140 | specific than -pedantic. */ |
141 | if (warn_c90_c99_compat > 0) |
142 | { |
143 | diagnostic_set_info (&diagnostic, gmsgid, &ap, &richloc, |
144 | (pedantic && !flag_isoc99) |
145 | ? DK_PEDWARN : DK_WARNING); |
146 | diagnostic.option_index = OPT_Wc90_c99_compat; |
147 | diagnostic_report_diagnostic (context: global_dc, diagnostic: &diagnostic); |
148 | } |
149 | /* -Wno-c90-c99-compat suppresses the pedwarns. */ |
150 | else if (warn_c90_c99_compat == 0) |
151 | ; |
152 | /* For -pedantic outside C99, issue a pedwarn. */ |
153 | else if (pedantic && !flag_isoc99) |
154 | { |
155 | diagnostic_set_info (&diagnostic, gmsgid, &ap, &richloc, DK_PEDWARN); |
156 | diagnostic.option_index = opt; |
157 | diagnostic_report_diagnostic (context: global_dc, diagnostic: &diagnostic); |
158 | warned = true; |
159 | } |
160 | out: |
161 | va_end (ap); |
162 | return warned; |
163 | } |
164 | |