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
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index f87abcb..30f713c 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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
diff --git a/gcc/asan.c b/gcc/asan.c
index fef4b73..f520eab 100644
--- a/gcc/asan.c
+++ b/gcc/asan.c
@@ -2027,6 +2027,8 @@
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 f8b4a14..2278e77 100644
--- a/gcc/c-family/ChangeLog
+++ b/gcc/c-family/ChangeLog
@@ -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.
diff --git a/gcc/c-family/c-common.h b/gcc/c-family/c-common.h
index 993a97b..5ec79a0 100644
--- a/gcc/c-family/c-common.h
+++ b/gcc/c-family/c-common.h
@@ -327,9 +327,6 @@
/* 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 af175a4..67099c1 100644
--- a/gcc/c/ChangeLog
+++ b/gcc/c/ChangeLog
@@ -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
diff --git a/gcc/c/c-parser.c b/gcc/c/c-parser.c
index 3f4a92b..71f40b7 100644
--- a/gcc/c/c-parser.c
+++ b/gcc/c/c-parser.c
@@ -126,11 +126,6 @@
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 @@
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 6004d50..fc145a85 100644
--- a/gcc/c/c-tree.h
+++ b/gcc/c/c-tree.h
@@ -618,7 +618,7 @@
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 da71ab2..f69c28b 100644
--- a/gcc/c/c-typeck.c
+++ b/gcc/c/c-typeck.c
@@ -9486,10 +9486,11 @@
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 @@
/* 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 8058348..194f060 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -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
diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c
index 33ad886..4563145 100644
--- a/gcc/cp/parser.c
+++ b/gcc/cp/parser.c
@@ -4176,7 +4176,7 @@
/* 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 @@
/* 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 6e04e5e..2728f58 100644
--- a/gcc/cp/semantics.c
+++ b/gcc/cp/semantics.c
@@ -1127,7 +1127,8 @@
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 d0e1180..a7bb38b 100644
--- a/gcc/cp/tree.c
+++ b/gcc/cp/tree.c
@@ -2345,6 +2345,8 @@
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 459d08d..b5ded3e 100644
--- a/gcc/ipa-pure-const.c
+++ b/gcc/ipa-pure-const.c
@@ -451,6 +451,8 @@
*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 b516c7b..cff48ee 100644
--- a/gcc/lto-streamer-out.c
+++ b/gcc/lto-streamer-out.c
@@ -2422,7 +2422,7 @@
{
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 56e45d9..b5556db 100644
--- a/gcc/predict.c
+++ b/gcc/predict.c
@@ -1902,6 +1902,8 @@
if (predictor)
*predictor = PRED_COMPARE_AND_SWAP;
return boolean_true_node;
+ default:
+ break;
}
}
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index a9e2849..2b4f867 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 0000000..153f997
--- /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 0000000..9c05a84
--- /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 a1c117a0..463bb60 100644
--- a/libcpp/ChangeLog
+++ b/libcpp/ChangeLog
@@ -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 ...
diff --git a/libcpp/include/cpplib.h b/libcpp/include/cpplib.h
index 62d271b..06d18d4 100644
--- a/libcpp/include/cpplib.h
+++ b/libcpp/include/cpplib.h
@@ -153,6 +153,9 @@
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,