re PR c/61405 (Not emitting "enumeration value not handled in switch" warning for...
authorMarek Polacek <polacek@redhat.com>
Wed, 24 Sep 2014 17:23:56 +0000 (17:23 +0000)
committerMarek Polacek <mpolacek@gcc.gnu.org>
Wed, 24 Sep 2014 17:23:56 +0000 (17:23 +0000)
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

20 files changed:
gcc/ChangeLog
gcc/asan.c
gcc/c-family/ChangeLog
gcc/c-family/c-common.h
gcc/c/ChangeLog
gcc/c/c-parser.c
gcc/c/c-tree.h
gcc/c/c-typeck.c
gcc/cp/ChangeLog
gcc/cp/parser.c
gcc/cp/semantics.c
gcc/cp/tree.c
gcc/ipa-pure-const.c
gcc/lto-streamer-out.c
gcc/predict.c
gcc/testsuite/ChangeLog
gcc/testsuite/c-c++-common/pr53874.c [new file with mode: 0644]
gcc/testsuite/c-c++-common/pr61405.c [new file with mode: 0644]
libcpp/ChangeLog
libcpp/include/cpplib.h

index f87abcb54beab7d5a1ba2942e1f4d2a5d1bf416d..30f713cd65d0784081a852bc351b661b3d6fd60e 100644 (file)
@@ -1,3 +1,12 @@
+2014-09-24  Marek Polacek  <polacek@redhat.com>
+
+       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  <kyrylo.tkachov@arm.com>
 
        * config/aarch64/arm_neon.h (vmuld_lane_f64): Use macro for getting
index fef4b733f1582add2785f2240d497c821303fbeb..f520eab4c547d70d43b98ab8514e01e0b4dbee73 100644 (file)
@@ -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);
index f8b4a14e4eac1265c6482ec911c888eb459fb9f7..2278e779441545d3205fc851b06104a9e24d726d 100644 (file)
@@ -1,3 +1,9 @@
+2014-09-24  Marek Polacek  <polacek@redhat.com>
+
+       PR c/61405
+       PR c/53874
+       * c-common.h (struct c_common_resword): Don't define CPP_KEYWORD.
+
 2014-09-23  Andi Kleen  <ak@linux.intel.com>
 
        * c-common.c (handle_no_reorder_attribute): New function.
index 993a97b5a665c4dae679aa4bed7d3d3c69818c05..5ec79a06e98edc7f306406094ba9e8da904363f4 100644 (file)
@@ -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
index af175a4a9146330282f680111b21a67f99260479..67099c1081a79f83fff1507d0a021e4a143e726b 100644 (file)
@@ -1,3 +1,13 @@
+2014-09-24  Marek Polacek  <polacek@redhat.com>
+
+       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  <polacek@redhat.com>
 
        PR c/62024
index 3f4a92ba8b46b52b10d1623ab601a9998471d8c5..71f40b7deaf30be562272cccee2f59f9c0c2e2f5 100644 (file)
@@ -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;
index 6004d506d9be2dea0a4ea70fd0d460ddd03e6d8e..fc145a856d288ba02146175614a027f6860db6b9 100644 (file)
@@ -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);
index da71ab263f9e3f6a69e09f32e058d186ee5a745a..f69c28bee077d25f0fed038aa58db69e37394fd6 100644 (file)
@@ -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.  */
index 8058348bc8ed9fee5bbfa64ebaf3c100898ba1fc..194f0606ba60323501efff6a5fa1caf0ed9844e5 100644 (file)
@@ -1,3 +1,13 @@
+2014-09-24  Marek Polacek  <polacek@redhat.com>
+
+       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  <paolo.carlini@oracle.com>
 
        PR c++/61857
index 33ad886524e76e27e84b5a03fe15a094a5bce746..45631455fa1a8738cd4bddf980c79860943de583 100644 (file)
@@ -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:
       {
index 6e04e5efd16ac076a3cb33d685dc4de2939ae239..2728f5887f119849b94d6fd66cedfc167453a75c 100644 (file)
@@ -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.  */
index d0e11806ef6eac7b933c2c5fd89d4aa8e5956917..a7bb38b97c1156dc7fefeda32c6596ec76c9a6ae 100644 (file)
@@ -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;
index 459d08db3b3a72c10d9b8fddb147d1df86a7b125..b5ded3e73ed5e998a989e5a23b4b9d97291df823 100644 (file)
@@ -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;
 }
index b516c7b14d7f1bc93e905b90c67bcf5bc7f5ae48..cff48eed6f697eb2fa7e101dd4a46901943b38e3 100644 (file)
@@ -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;
index 56e45d963c061260369f9928685eecc188f3e9ca..b5556db1839bf452a3bc179cf8266aedcb994c37 100644 (file)
@@ -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;
            }
        }
 
index a9e2849110d22f40453bc9cb35fc8f45852f8b48..2b4f867fe5db954cd2b69630ed222c1c28886187 100644 (file)
@@ -1,3 +1,10 @@
+2014-09-24  Marek Polacek  <polacek@redhat.com>
+
+       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  <kyrylo.tkachov@arm.com>
 
        * 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 (file)
index 0000000..153f997
--- /dev/null
@@ -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 (file)
index 0000000..9c05a84
--- /dev/null
@@ -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;
+    }
+}
index a1c117a02bf4bd7e89529cb3f2362c0cc28b5f67..463bb60e7614d57ef9c57bcde012e35422cd9862 100644 (file)
@@ -1,3 +1,9 @@
+2014-09-24  Marek Polacek  <polacek@redhat.com>
+
+       PR c/61405
+       PR c/53874
+       * include/cpplib.h (enum cpp_ttype): Define CPP_KEYWORD.
+
 2014-09-17  Jan Hubicka  <hubicka@ucw.cz>
 
        * charset.c (conversion): Rename to ...
index 62d271be41cac5049697450b9a790546a0b7a443..06d18d49ca7e0afffcde39ee9775fb5ca4d76a6a 100644 (file)
@@ -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,