]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/c/c-errors.cc
Update copyright years.
[thirdparty/gcc.git] / gcc / c / c-errors.cc
CommitLineData
b9161f44 1/* Various diagnostic subroutines for the GNU C language.
a945c346 2 Copyright (C) 2000-2024 Free Software Foundation, Inc.
b9161f44
GDR
3 Contributed by Gabriel Dos Reis <gdr@codesourcery.com>
4
1322177d 5This file is part of GCC.
b9161f44 6
1322177d
LB
7GCC is free software; you can redistribute it and/or modify it under
8the terms of the GNU General Public License as published by the Free
9dcd6f09 9Software Foundation; either version 3, or (at your option) any later
1322177d 10version.
b9161f44 11
1322177d
LB
12GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13WARRANTY; without even the implied warranty of MERCHANTABILITY or
14FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15for more details.
b9161f44
GDR
16
17You should have received a copy of the GNU General Public License
9dcd6f09
NC
18along with GCC; see the file COPYING3. If not see
19<http://www.gnu.org/licenses/>. */
b9161f44
GDR
20
21#include "config.h"
22#include "system.h"
4977bab6
ZW
23#include "coretypes.h"
24#include "tm.h"
b9161f44 25#include "c-tree.h"
177cce46 26#include "opts.h"
b9161f44 27
094a609c
JM
28/* Issue an ISO C11 pedantic warning MSGID if -pedantic outside C23 mode,
29 otherwise issue warning MSGID if -Wc11-c23-compat is specified.
9f936c86 30 This function is supposed to be used for matters that are allowed in
094a609c
JM
31 ISO C23 but not supported in ISO C11, thus we explicitly don't pedwarn
32 when C23 is specified. */
9f936c86
JM
33
34bool
35pedwarn_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);
094a609c 43 /* If desired, issue the C11/C23 compat warning, which is more specific
9f936c86 44 than -pedantic. */
094a609c 45 if (warn_c11_c23_compat > 0)
9f936c86
JM
46 {
47 diagnostic_set_info (&diagnostic, gmsgid, &ap, &richloc,
094a609c 48 (pedantic && !flag_isoc23)
9f936c86 49 ? DK_PEDWARN : DK_WARNING);
fad61bf7 50 diagnostic.option_index = OPT_Wc11_c23_compat;
9f936c86
JM
51 warned = diagnostic_report_diagnostic (global_dc, &diagnostic);
52 }
094a609c
JM
53 /* -Wno-c11-c23-compat suppresses even the pedwarns. */
54 else if (warn_c11_c23_compat == 0)
9f936c86 55 ;
094a609c
JM
56 /* For -pedantic outside C23, issue a pedwarn. */
57 else if (pedantic && !flag_isoc23)
9f936c86
JM
58 {
59 diagnostic_set_info (&diagnostic, gmsgid, &ap, &richloc, DK_PEDWARN);
60 diagnostic.option_index = opt;
61 warned = diagnostic_report_diagnostic (global_dc, &diagnostic);
62 }
63 va_end (ap);
64 return warned;
65}
66
35aff4fb
MP
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. */
b9161f44 72
35aff4fb 73bool
509c9d60 74pedwarn_c99 (location_t location, int opt, const char *gmsgid, ...)
b9161f44 75{
47b69537 76 diagnostic_info diagnostic;
e34d07f2 77 va_list ap;
35aff4fb 78 bool warned = false;
ebedc9a3 79 rich_location richloc (line_table, location);
c22cacf3 80
4b794eaf 81 va_start (ap, gmsgid);
35aff4fb
MP
82 /* If desired, issue the C99/C11 compat warning, which is more specific
83 than -pedantic. */
84 if (warn_c99_c11_compat > 0)
85 {
8a645150 86 diagnostic_set_info (&diagnostic, gmsgid, &ap, &richloc,
35aff4fb
MP
87 (pedantic && !flag_isoc11)
88 ? DK_PEDWARN : DK_WARNING);
89 diagnostic.option_index = OPT_Wc99_c11_compat;
56d35585 90 warned = diagnostic_report_diagnostic (global_dc, &diagnostic);
35aff4fb
MP
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 {
8a645150 98 diagnostic_set_info (&diagnostic, gmsgid, &ap, &richloc, DK_PEDWARN);
35aff4fb 99 diagnostic.option_index = opt;
56d35585 100 warned = diagnostic_report_diagnostic (global_dc, &diagnostic);
35aff4fb 101 }
e34d07f2 102 va_end (ap);
35aff4fb 103 return warned;
b9161f44 104}
85617eba 105
f3bede71
MP
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.) */
85617eba 112
d6e83a8d 113bool
509c9d60 114pedwarn_c90 (location_t location, int opt, const char *gmsgid, ...)
85617eba
HPN
115{
116 diagnostic_info diagnostic;
117 va_list ap;
d6e83a8d 118 bool warned = false;
ebedc9a3 119 rich_location richloc (line_table, location);
85617eba 120
4b794eaf 121 va_start (ap, gmsgid);
177cce46
MP
122 /* Warnings such as -Wvla are the most specific ones. */
123 if (opt != OPT_Wpedantic)
f3bede71 124 {
177cce46
MP
125 int opt_var = *(int *) option_flag_var (opt, &global_options);
126 if (opt_var == 0)
127 goto out;
128 else if (opt_var > 0)
129 {
8a645150 130 diagnostic_set_info (&diagnostic, gmsgid, &ap, &richloc,
177cce46
MP
131 (pedantic && !flag_isoc99)
132 ? DK_PEDWARN : DK_WARNING);
133 diagnostic.option_index = opt;
56d35585 134 diagnostic_report_diagnostic (global_dc, &diagnostic);
d6e83a8d 135 warned = true;
177cce46
MP
136 goto out;
137 }
f3bede71 138 }
177cce46
MP
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)
f3bede71 142 {
8a645150 143 diagnostic_set_info (&diagnostic, gmsgid, &ap, &richloc,
177cce46
MP
144 (pedantic && !flag_isoc99)
145 ? DK_PEDWARN : DK_WARNING);
146 diagnostic.option_index = OPT_Wc90_c99_compat;
56d35585 147 diagnostic_report_diagnostic (global_dc, &diagnostic);
f3bede71 148 }
177cce46
MP
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)
f3bede71 154 {
8a645150 155 diagnostic_set_info (&diagnostic, gmsgid, &ap, &richloc, DK_PEDWARN);
177cce46 156 diagnostic.option_index = opt;
56d35585 157 diagnostic_report_diagnostic (global_dc, &diagnostic);
d6e83a8d 158 warned = true;
f3bede71 159 }
177cce46 160out:
85617eba 161 va_end (ap);
d6e83a8d 162 return warned;
85617eba 163}