diff options
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 12 | ||||
-rw-r--r-- | gcc/c-common.c | 36 | ||||
-rw-r--r-- | gcc/doc/invoke.texi | 8 | ||||
-rw-r--r-- | gcc/dwarf2.h | 8 | ||||
-rw-r--r-- | gcc/dwarf2out.c | 5 | ||||
-rw-r--r-- | gcc/java/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/java/jcf-parse.c | 8 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/warn/Wswitch-3.C | 37 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/Wswitch-enum-error.c | 2 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/Wswitch-error.c | 2 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/Wswitch.c | 4 |
12 files changed, 96 insertions, 38 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index a4f3d67..80751b5 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,15 @@ +2009-06-07 Ian Lance Taylor <iant@google.com> + + * dwarf2.h (enum dwarf_location_atom): Add + INTERNAL_DW_OP_tls_addr. + * dwarf2out.c (INTERNAL_DW_OP_tls_addr): Don't #define. + + * c-common.c (c_do_switch_warnings): Don't exit early for -Wswitch + with no default node. Change warning with %H to warning_at. + Don't clear warn_switch around case checking. + * doc/invoke.texi (Warning Options): Clarify distinction between + -Wswitch and -Wswitch-enum. + 2009-06-07 Bernhard Reutner-Fischer <aldot@gcc.gnu.org> * tree-pass.h (TODO_update_ssa_any): Document internal use only. diff --git a/gcc/c-common.c b/gcc/c-common.c index 45b4192..b26662d 100644 --- a/gcc/c-common.c +++ b/gcc/c-common.c @@ -5425,7 +5425,6 @@ c_do_switch_warnings (splay_tree cases, location_t switch_location, splay_tree_node default_node; splay_tree_node node; tree chain; - int saved_warn_switch; if (!warn_switch && !warn_switch_enum && !warn_switch_default) return; @@ -5439,15 +5438,15 @@ c_do_switch_warnings (splay_tree cases, location_t switch_location, if (!type || TREE_CODE (type) != ENUMERAL_TYPE) return; - /* If the switch expression was an enumerated type, check that - exactly all enumeration literals are covered by the cases. - The check is made when -Wswitch was specified and there is no - default case, or when -Wswitch-enum was specified. */ - - if (!warn_switch_enum - && !(warn_switch && !default_node)) + /* From here on, we only care about -Wswitch and -Wswitch-enum. */ + if (!warn_switch_enum && !warn_switch) return; + /* Check the cases. Warn about case values which are not members of + the enumerated type. For -Wswitch-enum, or for -Wswitch when + there is no default case, check that exactly all enumeration + literals are covered by the cases. */ + /* Clearing COND if it is not an integer constant simplifies the tests inside the loop below. */ if (TREE_CODE (cond) != INTEGER_CST) @@ -5498,13 +5497,15 @@ c_do_switch_warnings (splay_tree cases, location_t switch_location, continue; /* If there is a default_node, the only relevant option is - Wswitch-enum. Otherwise, if both are enabled then we prefer + Wswitch-enum. Otherwise, if both are enabled then we prefer to warn using -Wswitch because -Wswitch is enabled by -Wall while -Wswitch-enum is explicit. */ - warning ((default_node || !warn_switch) - ? OPT_Wswitch_enum : OPT_Wswitch, - "%Henumeration value %qE not handled in switch", - &switch_location, TREE_PURPOSE (chain)); + warning_at (switch_location, + (default_node || !warn_switch + ? OPT_Wswitch_enum + : OPT_Wswitch), + "enumeration value %qE not handled in switch", + TREE_PURPOSE (chain)); } /* Warn if there are case expressions that don't correspond to @@ -5516,16 +5517,7 @@ c_do_switch_warnings (splay_tree cases, location_t switch_location, every disjoint case label, with CASE_LOW_SEEN and CASE_HIGH_SEEN above. This scan also resets those fields. */ - /* If there is a default_node, the only relevant option is - Wswitch-enum. Otherwise, if both are enabled then we prefer - to warn using -Wswitch because -Wswitch is enabled by -Wall - while -Wswitch-enum is explicit. */ - saved_warn_switch = warn_switch; - if (default_node) - warn_switch = 0; splay_tree_foreach (cases, match_case_to_enum, type); - warn_switch = saved_warn_switch; - } /* Finish an expression taking the address of LABEL (an diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi index 9771eff..c669c21 100644 --- a/gcc/doc/invoke.texi +++ b/gcc/doc/invoke.texi @@ -3174,7 +3174,8 @@ Warn whenever a @code{switch} statement has an index of enumerated type and lacks a @code{case} for one or more of the named codes of that 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. +provoke warnings when this option is used (even if there is a +@code{default} label). This warning is enabled by @option{-Wall}. @item -Wswitch-default @@ -3189,7 +3190,10 @@ case. Warn whenever a @code{switch} statement has an index of enumerated type and lacks a @code{case} for one or more of the named codes of that enumeration. @code{case} labels outside the enumeration range also -provoke warnings when this option is used. +provoke warnings when this option is used. The only difference +between @option{-Wswitch} and this option is that this option gives a +warning about an omitted enumeration code even if there is a +@code{default} label. @item -Wsync-nand @r{(C and C++ only)} @opindex Wsync-nand diff --git a/gcc/dwarf2.h b/gcc/dwarf2.h index d0777a0..1b3a397 100644 --- a/gcc/dwarf2.h +++ b/gcc/dwarf2.h @@ -562,7 +562,13 @@ enum dwarf_location_atom DW_OP_HP_fltconst8 = 0xe3, DW_OP_HP_mod_range = 0xe4, DW_OP_HP_unmod_range = 0xe5, - DW_OP_HP_tls = 0xe6 + DW_OP_HP_tls = 0xe6, + + /* Used internally in dwarf2out.c to distinguish DW_OP_addr with a + direct symbol relocation from DW_OP_addr with a dtp-relative + symbol relocation. */ + INTERNAL_DW_OP_tls_addr = 0x103 + }; /* Type encodings. */ diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c index e78d334..617be80 100644 --- a/gcc/dwarf2out.c +++ b/gcc/dwarf2out.c @@ -3758,11 +3758,6 @@ struct GTY(()) dwarf_file_data { int emitted_number; }; -/* We need some way to distinguish DW_OP_addr with a direct symbol - relocation from DW_OP_addr with a dtp-relative symbol relocation. */ -#define INTERNAL_DW_OP_tls_addr (0x100 + DW_OP_addr) - - typedef struct dw_val_struct *dw_val_ref; typedef struct die_struct *dw_die_ref; typedef const struct die_struct *const_dw_die_ref; diff --git a/gcc/java/ChangeLog b/gcc/java/ChangeLog index 6754403..3c3a23f 100644 --- a/gcc/java/ChangeLog +++ b/gcc/java/ChangeLog @@ -1,3 +1,8 @@ +2009-06-07 Ian Lance Taylor <iant@google.com> + + * jcf-parse.c (handle_constant): Change local variable 'kind' to + unsigned int. + 2009-06-01 Ian Lance Taylor <iant@google.com> * jcf-io.c (find_class): Use CONST_CAST. diff --git a/gcc/java/jcf-parse.c b/gcc/java/jcf-parse.c index e3b9331..f28acb0 100644 --- a/gcc/java/jcf-parse.c +++ b/gcc/java/jcf-parse.c @@ -498,7 +498,7 @@ handle_long_constant (JCF *jcf, CPool *cpool, enum cpool_tag kind, static uint16 handle_constant (JCF *jcf, int index, enum cpool_tag purpose) { - enum cpool_tag kind; + unsigned int kind; CPool *cpool = cpool_for_class (output_class); if (index == 0) @@ -507,7 +507,7 @@ handle_constant (JCF *jcf, int index, enum cpool_tag purpose) if (! CPOOL_INDEX_IN_RANGE (&jcf->cpool, index)) error ("<constant pool index %d not in range>", index); - kind = (enum cpool_tag) JPOOL_TAG (jcf, index); + kind = JPOOL_TAG (jcf, index); if ((kind & ~CONSTANT_ResolvedFlag) != purpose) { @@ -555,12 +555,12 @@ handle_constant (JCF *jcf, int index, enum cpool_tag purpose) break; case CONSTANT_Long: - index = handle_long_constant (jcf, cpool, kind, index, + index = handle_long_constant (jcf, cpool, CONSTANT_Long, index, WORDS_BIG_ENDIAN); break; case CONSTANT_Double: - index = handle_long_constant (jcf, cpool, kind, index, + index = handle_long_constant (jcf, cpool, CONSTANT_Double, index, FLOAT_WORDS_BIG_ENDIAN); break; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index fead842..dbb97e1 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2009-06-07 Ian Lance Taylor <iant@google.com> + + * g++.dg/warn/Wswitch-3.C: New testcase. + * gcc.dg/Wswitch.c: Adjust for -Wswitch change. + * gcc.dg/Wswitch-enum-error.c: Likewise. + * gcc.dg/Wswitch-error.c: Likewise. + 2009-06-07 Jerry DeLisle <jvdelisle@gcc.gnu.org> PR fortran/40008 diff --git a/gcc/testsuite/g++.dg/warn/Wswitch-3.C b/gcc/testsuite/g++.dg/warn/Wswitch-3.C new file mode 100644 index 0000000..df1f895 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wswitch-3.C @@ -0,0 +1,37 @@ +/* { dg-do compile } */ +/* { dg-options "-Wswitch" } */ + +enum E { A, B, C, D, E, F }; + +int +f1 (enum E e) +{ + switch (e) + { + case A: return 1; + case B: return 2; + case C: return 3; + case D: return 4; + case E: return 5; + case F: return 6; + case 7: return 7; /* { dg-warning "not in enumerated type" } */ + } + return 0; +} + +int +f2 (enum E e) +{ + switch (e) + { + case A: return 1; + case B: return 2; + case C: return 3; + case D: return 4; + case E: return 5; + case F: return 6; + case 7: return 7; /* { dg-warning "not in enumerated type" } */ + default: return 8; + } + return 0; +} diff --git a/gcc/testsuite/gcc.dg/Wswitch-enum-error.c b/gcc/testsuite/gcc.dg/Wswitch-enum-error.c index ae9a2c7..383a29fb 100644 --- a/gcc/testsuite/gcc.dg/Wswitch-enum-error.c +++ b/gcc/testsuite/gcc.dg/Wswitch-enum-error.c @@ -56,7 +56,7 @@ foo (int i, int j, enum e ei, enum e ej, enum e ek, enum e el, { case e1: return 1; case e2: return 2; - case 3: return 3; /* { dg-error "case value '3' not in enumerated type 'enum e'" "excess 3" } */ + case 3: return 3; /* { dg-warning "case value '3' not in enumerated type 'enum e'" "excess 3" } */ default: break; } return 0; diff --git a/gcc/testsuite/gcc.dg/Wswitch-error.c b/gcc/testsuite/gcc.dg/Wswitch-error.c index 4aa0c2a1..31e3295 100644 --- a/gcc/testsuite/gcc.dg/Wswitch-error.c +++ b/gcc/testsuite/gcc.dg/Wswitch-error.c @@ -56,7 +56,7 @@ foo (int i, int j, enum e ei, enum e ej, enum e ek, enum e el, { case e1: return 1; case e2: return 2; - case 3: return 3; /* { dg-warning "case value '3' not in enumerated type 'enum e'" "excess 3" } */ + case 3: return 3; /* { dg-error "case value '3' not in enumerated type 'enum e'" "excess 3" } */ default: break; } return 0; diff --git a/gcc/testsuite/gcc.dg/Wswitch.c b/gcc/testsuite/gcc.dg/Wswitch.c index 686fd416..9b43ed4 100644 --- a/gcc/testsuite/gcc.dg/Wswitch.c +++ b/gcc/testsuite/gcc.dg/Wswitch.c @@ -56,8 +56,8 @@ foo (int i, int j, enum e ei, enum e ej, enum e ek, enum e el, { case e1: return 1; case e2: return 2; - case 3: return 3; + case 3: return 3; /* { dg-warning "case value '3' not in enumerated type 'enum e'" "excess 3" } */ default: break; - } /* Since there is a default, no warning about ``case 3'' */ + } return 0; } |