From 083e891e69429f93b958f6c18e2d52f515bae572 Mon Sep 17 00:00:00 2001 From: Marek Polacek Date: Wed, 24 Sep 2014 17:23:56 +0000 Subject: [PATCH] re PR c/61405 (Not emitting "enumeration value not handled in switch" warning for bit-field enums) PR c/61405 PR c/53874 gcc/ * asan.c (maybe_instrument_call): Add default case. * ipa-pure-const.c (special_builtin_state): Likewise. * predict.c (expr_expected_value_1): Likewise. * lto-streamer-out.c (write_symbol): Initialize variable. gcc/c-family/ * c-common.h (struct c_common_resword): Don't define CPP_KEYWORD. gcc/c/ * c-parser.c: Don't define CPP_KEYWORD. (c_parser_switch_statement): Pass original type to c_finish_case. * c-tree.h (c_finish_case): Update declaration. * c-typeck.c (c_finish_case): Add TYPE parameter. Pass it conditionally to c_do_switch_warnings. gcc/cp/ * semantics.c (finish_switch_cond): Call unlowered_expr_type. * tree.c (bot_manip): Add default case. * parser.c (cp_parser_primary_expression): Cast the controlling expression of a switch to an int. (cp_parser_unqualified_id): Likewise. gcc/testsuite/ * c-c++-common/pr53874.c: New test. * c-c++-common/pr61405.c: New test. libcpp/ * include/cpplib.h (enum cpp_ttype): Define CPP_KEYWORD. From-SVN: r215559 --- gcc/ChangeLog | 9 +++++++ gcc/asan.c | 2 ++ gcc/c-family/ChangeLog | 6 +++++ gcc/c-family/c-common.h | 3 --- gcc/c/ChangeLog | 10 ++++++++ gcc/c/c-parser.c | 7 +----- gcc/c/c-tree.h | 2 +- gcc/c/c-typeck.c | 7 +++--- gcc/cp/ChangeLog | 10 ++++++++ gcc/cp/parser.c | 4 ++-- gcc/cp/semantics.c | 3 ++- gcc/cp/tree.c | 2 ++ gcc/ipa-pure-const.c | 2 ++ gcc/lto-streamer-out.c | 2 +- gcc/predict.c | 2 ++ gcc/testsuite/ChangeLog | 7 ++++++ gcc/testsuite/c-c++-common/pr53874.c | 35 ++++++++++++++++++++++++++++ gcc/testsuite/c-c++-common/pr61405.c | 31 ++++++++++++++++++++++++ libcpp/ChangeLog | 6 +++++ libcpp/include/cpplib.h | 3 +++ 20 files changed, 136 insertions(+), 17 deletions(-) create mode 100644 gcc/testsuite/c-c++-common/pr53874.c create mode 100644 gcc/testsuite/c-c++-common/pr61405.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index f87abcb54be..30f713cd65d 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2014-09-24 Marek Polacek + + PR c/61405 + PR c/53874 + * asan.c (maybe_instrument_call): Add default case. + * ipa-pure-const.c (special_builtin_state): Likewise. + * predict.c (expr_expected_value_1): Likewise. + * lto-streamer-out.c (write_symbol): Initialize variable. + 2014-09-24 Kyrylo Tkachov * config/aarch64/arm_neon.h (vmuld_lane_f64): Use macro for getting diff --git a/gcc/asan.c b/gcc/asan.c index fef4b733f15..f520eab4c54 100644 --- a/gcc/asan.c +++ b/gcc/asan.c @@ -2027,6 +2027,8 @@ maybe_instrument_call (gimple_stmt_iterator *iter) case BUILT_IN_TRAP: /* Don't instrument these. */ return false; + default: + break; } } tree decl = builtin_decl_implicit (BUILT_IN_ASAN_HANDLE_NO_RETURN); diff --git a/gcc/c-family/ChangeLog b/gcc/c-family/ChangeLog index f8b4a14e4ea..2278e779441 100644 --- a/gcc/c-family/ChangeLog +++ b/gcc/c-family/ChangeLog @@ -1,3 +1,9 @@ +2014-09-24 Marek Polacek + + PR c/61405 + PR c/53874 + * c-common.h (struct c_common_resword): Don't define CPP_KEYWORD. + 2014-09-23 Andi Kleen * c-common.c (handle_no_reorder_attribute): New function. diff --git a/gcc/c-family/c-common.h b/gcc/c-family/c-common.h index 993a97b5a66..5ec79a06e98 100644 --- a/gcc/c-family/c-common.h +++ b/gcc/c-family/c-common.h @@ -327,9 +327,6 @@ struct c_common_resword /* Extra cpp_ttype values for C++. */ -/* A token type for keywords, as opposed to ordinary identifiers. */ -#define CPP_KEYWORD ((enum cpp_ttype) (N_TTYPES + 1)) - /* A token type for template-ids. If a template-id is processed while parsing tentatively, it is replaced with a CPP_TEMPLATE_ID token; the value of the CPP_TEMPLATE_ID is whatever was returned by diff --git a/gcc/c/ChangeLog b/gcc/c/ChangeLog index af175a4a914..67099c1081a 100644 --- a/gcc/c/ChangeLog +++ b/gcc/c/ChangeLog @@ -1,3 +1,13 @@ +2014-09-24 Marek Polacek + + PR c/61405 + PR c/53874 + * c-parser.c: Don't define CPP_KEYWORD. + (c_parser_switch_statement): Pass original type to c_finish_case. + * c-tree.h (c_finish_case): Update declaration. + * c-typeck.c (c_finish_case): Add TYPE parameter. Pass it + conditionally to c_do_switch_warnings. + 2014-09-03 Marek Polacek PR c/62024 diff --git a/gcc/c/c-parser.c b/gcc/c/c-parser.c index 3f4a92ba8b4..71f40b7deaf 100644 --- a/gcc/c/c-parser.c +++ b/gcc/c/c-parser.c @@ -126,11 +126,6 @@ c_parse_init (void) C++). It would then be possible to share more of the C and C++ lexer code, if desired. */ -/* The following local token type is used. */ - -/* A keyword. */ -#define CPP_KEYWORD ((enum cpp_ttype) (N_TTYPES + 1)) - /* More information about the type of a CPP_NAME token. */ typedef enum c_id_kind { /* An ordinary identifier. */ @@ -5232,7 +5227,7 @@ c_parser_switch_statement (c_parser *parser) save_break = c_break_label; c_break_label = NULL_TREE; body = c_parser_c99_block_statement (parser); - c_finish_case (body); + c_finish_case (body, ce.original_type); if (c_break_label) { location_t here = c_parser_peek_token (parser)->location; diff --git a/gcc/c/c-tree.h b/gcc/c/c-tree.h index 6004d506d9b..fc145a856d2 100644 --- a/gcc/c/c-tree.h +++ b/gcc/c/c-tree.h @@ -618,7 +618,7 @@ extern void process_init_element (location_t, struct c_expr, bool, extern tree build_compound_literal (location_t, tree, tree, bool); extern void check_compound_literal_type (location_t, struct c_type_name *); extern tree c_start_case (location_t, location_t, tree, bool); -extern void c_finish_case (tree); +extern void c_finish_case (tree, tree); extern tree build_asm_expr (location_t, tree, tree, tree, tree, tree, bool); extern tree build_asm_stmt (tree, tree); extern int c_types_compatible_p (tree, tree); diff --git a/gcc/c/c-typeck.c b/gcc/c/c-typeck.c index da71ab263f9..f69c28bee07 100644 --- a/gcc/c/c-typeck.c +++ b/gcc/c/c-typeck.c @@ -9486,10 +9486,11 @@ do_case (location_t loc, tree low_value, tree high_value) return label; } -/* Finish the switch statement. */ +/* Finish the switch statement. TYPE is the original type of the + controlling expression of the switch, or NULL_TREE. */ void -c_finish_case (tree body) +c_finish_case (tree body, tree type) { struct c_switch *cs = c_switch_stack; location_t switch_location; @@ -9499,7 +9500,7 @@ c_finish_case (tree body) /* Emit warnings as needed. */ switch_location = EXPR_LOCATION (cs->switch_expr); c_do_switch_warnings (cs->cases, switch_location, - TREE_TYPE (cs->switch_expr), + type ? type : TREE_TYPE (cs->switch_expr), SWITCH_COND (cs->switch_expr)); /* Pop the stack. */ diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 8058348bc8e..194f0606ba6 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,13 @@ +2014-09-24 Marek Polacek + + PR c/61405 + PR c/53874 + * semantics.c (finish_switch_cond): Call unlowered_expr_type. + * tree.c (bot_manip): Add default case. + * parser.c (cp_parser_primary_expression): Cast the controlling + expression of a switch to an int. + (cp_parser_unqualified_id): Likewise. + 2014-09-23 Paolo Carlini PR c++/61857 diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index 33ad886524e..45631455fa1 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -4176,7 +4176,7 @@ cp_parser_primary_expression (cp_parser *parser, /* Peek at the next token. */ token = cp_lexer_peek_token (parser->lexer); - switch (token->type) + switch ((int) token->type) { /* literal: integer-literal @@ -4862,7 +4862,7 @@ cp_parser_unqualified_id (cp_parser* parser, /* Peek at the next token. */ token = cp_lexer_peek_token (parser->lexer); - switch (token->type) + switch ((int) token->type) { case CPP_NAME: { diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c index 6e04e5efd16..2728f5887f1 100644 --- a/gcc/cp/semantics.c +++ b/gcc/cp/semantics.c @@ -1127,7 +1127,8 @@ finish_switch_cond (tree cond, tree switch_stmt) error ("switch quantity not an integer"); cond = error_mark_node; } - orig_type = TREE_TYPE (cond); + /* We want unlowered type here to handle enum bit-fields. */ + orig_type = unlowered_expr_type (cond); if (cond != error_mark_node) { /* Warn if the condition has boolean value. */ diff --git a/gcc/cp/tree.c b/gcc/cp/tree.c index d0e11806ef6..a7bb38b97c1 100644 --- a/gcc/cp/tree.c +++ b/gcc/cp/tree.c @@ -2345,6 +2345,8 @@ bot_manip (tree* tp, int* walk_subtrees, void* data) case BUILT_IN_FILE: case BUILT_IN_LINE: SET_EXPR_LOCATION (*tp, input_location); + default: + break; } } return t; diff --git a/gcc/ipa-pure-const.c b/gcc/ipa-pure-const.c index 459d08db3b3..b5ded3e73ed 100644 --- a/gcc/ipa-pure-const.c +++ b/gcc/ipa-pure-const.c @@ -451,6 +451,8 @@ special_builtin_state (enum pure_const_state_e *state, bool *looping, *looping = true; *state = IPA_CONST; return true; + default: + break; } return false; } diff --git a/gcc/lto-streamer-out.c b/gcc/lto-streamer-out.c index b516c7b14d7..cff48eed6f6 100644 --- a/gcc/lto-streamer-out.c +++ b/gcc/lto-streamer-out.c @@ -2422,7 +2422,7 @@ write_symbol (struct streamer_tree_cache_d *cache, { const char *name; enum gcc_plugin_symbol_kind kind; - enum gcc_plugin_symbol_visibility visibility; + enum gcc_plugin_symbol_visibility visibility = GCCPV_DEFAULT; unsigned slot_num; uint64_t size; const char *comdat; diff --git a/gcc/predict.c b/gcc/predict.c index 56e45d963c0..b5556db1839 100644 --- a/gcc/predict.c +++ b/gcc/predict.c @@ -1902,6 +1902,8 @@ expr_expected_value_1 (tree type, tree op0, enum tree_code code, if (predictor) *predictor = PRED_COMPARE_AND_SWAP; return boolean_true_node; + default: + break; } } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index a9e2849110d..2b4f867fe5d 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2014-09-24 Marek Polacek + + PR c/61405 + PR c/53874 + * c-c++-common/pr53874.c: New test. + * c-c++-common/pr61405.c: New test. + 2014-09-24 Kyrylo Tkachov * gcc.target/aarch64/simd/vmul_lane_const_lane_1.c: New test. diff --git a/gcc/testsuite/c-c++-common/pr53874.c b/gcc/testsuite/c-c++-common/pr53874.c new file mode 100644 index 00000000000..153f997c6e9 --- /dev/null +++ b/gcc/testsuite/c-c++-common/pr53874.c @@ -0,0 +1,35 @@ +/* PR c/53874 */ +/* { dg-do compile } */ +/* { dg-options "-Wswitch-enum" } */ + +enum E { A, B, C }; +struct S { enum E e:2; }; +typedef struct S TS; + +int +fn0 (struct S *s) +{ + switch (s->e) /* { dg-warning "enumeration value .C. not handled in switch" } */ + { + case A: + return 1; + case B: + return 2; + default: + return 0; + } +} + +int +fn1 (TS *s) +{ + switch (s->e) /* { dg-warning "enumeration value .C. not handled in switch" } */ + { + case A: + return 1; + case B: + return 2; + default: + return 0; + } +} diff --git a/gcc/testsuite/c-c++-common/pr61405.c b/gcc/testsuite/c-c++-common/pr61405.c new file mode 100644 index 00000000000..9c05a84764a --- /dev/null +++ b/gcc/testsuite/c-c++-common/pr61405.c @@ -0,0 +1,31 @@ +/* PR c/61405 */ +/* { dg-do compile } */ +/* { dg-options "-Wswitch" } */ + +enum E { A, B, C }; +struct S { enum E e:2; }; +typedef struct S TS; + +int +fn0 (struct S *s) +{ + switch (s->e) /* { dg-warning "enumeration value .C. not handled in switch" } */ + { + case A: + return 1; + case B: + return 2; + } +} + +int +fn1 (TS *s) +{ + switch (s->e) /* { dg-warning "enumeration value .C. not handled in switch" } */ + { + case A: + return 1; + case B: + return 2; + } +} diff --git a/libcpp/ChangeLog b/libcpp/ChangeLog index a1c117a02bf..463bb60e761 100644 --- a/libcpp/ChangeLog +++ b/libcpp/ChangeLog @@ -1,3 +1,9 @@ +2014-09-24 Marek Polacek + + PR c/61405 + PR c/53874 + * include/cpplib.h (enum cpp_ttype): Define CPP_KEYWORD. + 2014-09-17 Jan Hubicka * charset.c (conversion): Rename to ... diff --git a/libcpp/include/cpplib.h b/libcpp/include/cpplib.h index 62d271be41c..06d18d49ca7 100644 --- a/libcpp/include/cpplib.h +++ b/libcpp/include/cpplib.h @@ -153,6 +153,9 @@ enum cpp_ttype TTYPE_TABLE N_TTYPES, + /* A token type for keywords, as opposed to ordinary identifiers. */ + CPP_KEYWORD, + /* Positions in the table. */ CPP_LAST_EQ = CPP_LSHIFT, CPP_FIRST_DIGRAPH = CPP_HASH, -- 2.30.2