summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Cagney <ac131313@redhat.com>2002-03-23 16:33:44 +0000
committerAndrew Cagney <cagney@gcc.gnu.org>2002-03-23 16:33:44 +0000
commitd6961341dd0ef37d0c292d25f7e428a42e22b0c0 (patch)
tree40bde56f3c0f0b034afa8251d7b684434a00dddd
parentc677cd7f47af8d4c2ebc387e4a1d49321bb660a6 (diff)
downloadgcc-d6961341dd0ef37d0c292d25f7e428a42e22b0c0.tar.gz
[multiple changes]
2002-03-23 Andrew Cagney <ac131313@redhat.com> * doc/invoke.texi (Option Summary): Mention -Wswitch-default. (Warning Options): Document -Wswitch-default. * toplev.c (W_options): Add -Wswitch-default. Update comment on -Wswitch. (warn_switch_default): Define variable. (warn_switch): Update comment. * flags.h (warn_switch_default): Declare variable. (warn_switch): Update comment. * stmt.c (expand_end_case): Check for and, when warn_switch_no_default, warn of a missing default case. Index: f/ChangeLog Sat Mar 23 11:18:17 2002 Andrew Cagney <ac131313@redhat.com> * invoke.texi (Warning Options): Mention -Wswitch-default. Index: testsuite/ChangeLog 2002-03-23 Andrew Cagney <ac131313@redhat.com> * gcc.dg/Wswitch-default.c: New test. From-SVN: r51238
-rw-r--r--gcc/ChangeLog13
-rw-r--r--gcc/doc/invoke.texi7
-rw-r--r--gcc/f/ChangeLog4
-rw-r--r--gcc/f/invoke.texi3
-rw-r--r--gcc/flags.h7
-rw-r--r--gcc/stmt.c3
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gcc.dg/Wswitch-default.c62
-rw-r--r--gcc/toplev.c11
9 files changed, 110 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 21bc263f7db..123ec276011 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,16 @@
+2002-03-23 Andrew Cagney <ac131313@redhat.com>
+
+ * doc/invoke.texi (Option Summary): Mention -Wswitch-default.
+ (Warning Options): Document -Wswitch-default.
+ * toplev.c (W_options): Add -Wswitch-default. Update comment on
+ -Wswitch.
+ (warn_switch_default): Define variable.
+ (warn_switch): Update comment.
+ * flags.h (warn_switch_default): Declare variable.
+ (warn_switch): Update comment.
+ * stmt.c (expand_end_case): Check for and, when
+ warn_switch_no_default, warn of a missing default case.
+
2002-03-23 Alan Modra <amodra@bigpond.net.au>
* real.h (N): Special case 128 bit doubles.
diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi
index 7e6b714c9b5..321cda2d239 100644
--- a/gcc/doc/invoke.texi
+++ b/gcc/doc/invoke.texi
@@ -228,7 +228,7 @@ in the following sections.
-Wno-import -Wpacked -Wpadded @gol
-Wparentheses -Wpointer-arith -Wredundant-decls @gol
-Wreturn-type -Wsequence-point -Wshadow @gol
--Wsign-compare -Wswitch -Wsystem-headers @gol
+-Wsign-compare -Wswitch -Wswitch-default -Wsystem-headers @gol
-Wtrigraphs -Wundef -Wuninitialized @gol
-Wunknown-pragmas -Wunreachable-code @gol
-Wunused -Wunused-function -Wunused-label -Wunused-parameter @gol
@@ -2034,6 +2034,11 @@ enumeration. (The presence of a @code{default} label prevents this
warning.) @code{case} labels outside the enumeration range also
provoke warnings when this option is used.
+@item -Wswitch-default
+@opindex Wswitch-switch
+Warn whenever a @code{switch} statement does not have a @code{default}
+case.
+
@item -Wtrigraphs
@opindex Wtrigraphs
Warn if any trigraphs are encountered that might change the meaning of
diff --git a/gcc/f/ChangeLog b/gcc/f/ChangeLog
index 48888e2b8cd..9f2016c73f1 100644
--- a/gcc/f/ChangeLog
+++ b/gcc/f/ChangeLog
@@ -1,3 +1,7 @@
+Sat Mar 23 11:18:17 2002 Andrew Cagney <ac131313@redhat.com>
+
+ * invoke.texi (Warning Options): Mention -Wswitch-default.
+
Thu Mar 21 18:55:41 2002 Neil Booth <neil@daikokuya.demon.co.uk>
* cp-tree.h (pushdecl, pushlevel, poplevel, set_block,
diff --git a/gcc/f/invoke.texi b/gcc/f/invoke.texi
index 896064b4919..025fb9ed7d1 100644
--- a/gcc/f/invoke.texi
+++ b/gcc/f/invoke.texi
@@ -1356,6 +1356,9 @@ Some of these have no effect when compiling programs written in Fortran:
@cindex -Wswitch option
@cindex options, -Wswitch
@item -Wswitch
+@cindex -Wswitch-default option
+@cindex options, -Wswitch-default
+@item -Wswitch-default
@cindex -Wtraditional option
@cindex options, -Wtraditional
@item -Wtraditional
diff --git a/gcc/flags.h b/gcc/flags.h
index a3e4a043bf5..ee9753a943b 100644
--- a/gcc/flags.h
+++ b/gcc/flags.h
@@ -126,10 +126,15 @@ extern int warn_unknown_pragmas;
extern int warn_shadow;
-/* Warn if a switch on an enum fails to have a case for every enum value. */
+/* Warn if a switch on an enum, that does not have a default case,
+ fails to have a case for every enum value. */
extern int warn_switch;
+/* Warn if a switch does not have a default case. */
+
+extern int warn_switch_default;
+
/* Nonzero means warn about function definitions that default the return type
or that use a null return and have a return-type other than void. */
diff --git a/gcc/stmt.c b/gcc/stmt.c
index 559795df092..6da3fab27ce 100644
--- a/gcc/stmt.c
+++ b/gcc/stmt.c
@@ -5284,6 +5284,9 @@ expand_end_case_type (orig_index, orig_type)
&& TREE_CODE (index_expr) != INTEGER_CST)
check_for_full_enumeration_handling (orig_type);
+ if (warn_switch_default && !thiscase->data.case_stmt.default_label)
+ warning ("switch missing default case");
+
/* If we don't have a default-label, create one here,
after the body of the switch. */
if (thiscase->data.case_stmt.default_label == 0)
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 4583119a2f7..c6bfa0dd08f 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2002-03-23 Andrew Cagney <ac131313@redhat.com>
+
+ * gcc.dg/Wswitch-default.c: New test.
+
2002-03-23 Jakub Jelinek <jakub@redhat.com>
* g++.dg/other/enum1.C: New test.
diff --git a/gcc/testsuite/gcc.dg/Wswitch-default.c b/gcc/testsuite/gcc.dg/Wswitch-default.c
new file mode 100644
index 00000000000..3cc7f2ef091
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/Wswitch-default.c
@@ -0,0 +1,62 @@
+/* { dg-do compile } */
+/* { dg-options "-Wswitch-default" } */
+
+enum e { e1, e2 };
+
+int
+foo (int i, int j, enum e ei, enum e ej, enum e ek, enum e el,
+ enum e em, enum e en, enum e eo, enum e ep)
+{
+ switch (i)
+ {
+ case 1: return 1;
+ case 2: return 2;
+ } /* { dg-warning "switch missing default case" } */
+ switch (j)
+ {
+ case 3: return 4;
+ case 4: return 3;
+ default: break;
+ }
+ switch (ei)
+ { /* { dg-warning "switch missing default case" } */
+ }
+ switch (ej)
+ {
+ default: break;
+ }
+ switch (ek)
+ {
+ case e1: return 1;
+ } /* { dg-warning "switch missing default case" } */
+ switch (el)
+ {
+ case e1: return 1;
+ default: break;
+ }
+ switch (em)
+ {
+ case e1: return 1;
+ case e2: return 2;
+ } /* { dg-warning "switch missing default case" } */
+ switch (en)
+ {
+ case e1: return 1;
+ case e2: return 2;
+ default: break;
+ }
+ switch (eo)
+ {
+ case e1: return 1;
+ case e2: return 2;
+ case 3: return 3;
+ } /* { dg-warning "switch missing default case" } */
+ switch (ep)
+ {
+ case e1: return 1;
+ case e2: return 2;
+ case 3: return 3;
+ default: break;
+ }
+ return 0;
+}
diff --git a/gcc/toplev.c b/gcc/toplev.c
index ca26e7feb17..d09f58c0fac 100644
--- a/gcc/toplev.c
+++ b/gcc/toplev.c
@@ -1395,10 +1395,15 @@ int warn_uninitialized;
int warn_shadow;
-/* Warn if a switch on an enum fails to have a case for every enum value. */
+/* Warn if a switch on an enum, that does not have a default case,
+ fails to have a case for every enum value. */
int warn_switch;
+/* Warn if a switch does not have a default case. */
+
+int warn_switch_default;
+
/* Nonzero means warn about function definitions that default the return type
or that use a null return and have a return-type other than void. */
@@ -1468,7 +1473,9 @@ static const lang_independent_options W_options[] =
{"shadow", &warn_shadow, 1,
N_("Warn when one local variable shadows another") },
{"switch", &warn_switch, 1,
- N_("Warn about enumerated switches missing a specific case") },
+ N_("Warn about enumerated switches, with no default, missing a case") },
+ {"switch-default", &warn_switch_default, 1,
+ N_("Warn about enumerated switches missing a default case") },
{"aggregate-return", &warn_aggregate_return, 1,
N_("Warn about returning structures, unions or arrays") },
{"cast-align", &warn_cast_align, 1,