@@ -2024,6 +2024,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);
@@ -327,22 +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
- cp_parser_template_id. */
-#define CPP_TEMPLATE_ID ((enum cpp_ttype) (CPP_KEYWORD + 1))
-
-/* A token type for nested-name-specifiers. If a
- nested-name-specifier is processed while parsing tentatively, it is
- replaced with a CPP_NESTED_NAME_SPECIFIER token; the value of the
- CPP_NESTED_NAME_SPECIFIER is whatever was returned by
- cp_parser_nested_name_specifier_opt. */
-#define CPP_NESTED_NAME_SPECIFIER ((enum cpp_ttype) (CPP_TEMPLATE_ID + 1))
-
/* A token type for pre-parsed C++0x decltype. */
#define CPP_DECLTYPE ((enum cpp_ttype) (CPP_NESTED_NAME_SPECIFIER + 1))
@@ -5232,7 +5232,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;
@@ -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);
@@ -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. */
@@ -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. */
@@ -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;
@@ -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;
}
@@ -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;
@@ -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;
}
}
@@ -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;
+ }
+}
@@ -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;
+ }
+}
@@ -153,6 +153,22 @@ enum cpp_ttype
TTYPE_TABLE
N_TTYPES,
+ /* A token type for keywords, as opposed to ordinary identifiers. */
+ CPP_KEYWORD = 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
+ cp_parser_template_id. */
+ CPP_TEMPLATE_ID = CPP_KEYWORD + 1,
+
+ /* A token type for nested-name-specifiers. If a
+ nested-name-specifier is processed while parsing tentatively, it is
+ replaced with a CPP_NESTED_NAME_SPECIFIER token; the value of the
+ CPP_NESTED_NAME_SPECIFIER is whatever was returned by
+ cp_parser_nested_name_specifier_opt. */
+ CPP_NESTED_NAME_SPECIFIER = CPP_TEMPLATE_ID + 1,
+
/* Positions in the table. */
CPP_LAST_EQ = CPP_LSHIFT,
CPP_FIRST_DIGRAPH = CPP_HASH,