re PR sanitizer/81275 (-fsanitize=thread produce incorrect -Wreturn-type warning)
authorJakub Jelinek <jakub@redhat.com>
Tue, 28 Nov 2017 21:24:32 +0000 (22:24 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Tue, 28 Nov 2017 21:24:32 +0000 (22:24 +0100)
commit1a2e970832f6076e76adc06b42c106bdb568a86c
treedc1f654cba4d0bcd4a20572243e7a1178be93750
parent058f0b9e5f073da9d1d98a91e482cbdead1561ee
re PR sanitizer/81275 (-fsanitize=thread produce incorrect -Wreturn-type warning)

PR sanitizer/81275
* cp-tree.h (SWITCH_STMT_ALL_CASES_P): Define.
(SWITCH_STMT_NO_BREAK_P): Define.
(note_break_stmt, note_iteration_stmt_body_start,
note_iteration_stmt_body_end): Declare.
* decl.c (struct cp_switch): Add has_default_p, break_stmt_seen_p
and in_loop_body_p fields.
(push_switch): Clear them.
(pop_switch): Set SWITCH_STMT_CANNOT_FALLTHRU_P if has_default_p
and !break_stmt_seen_p.  Assert in_loop_body_p is false.
(note_break_stmt, note_iteration_stmt_body_start,
note_iteration_stmt_body_end): New functions.
(finish_case_label): Set has_default_p when both low and high
are NULL_TREE.
* parser.c (cp_parser_iteration_statement): Use
note_iteration_stmt_body_start and note_iteration_stmt_body_end
around parsing iteration body.
* pt.c (tsubst_expr): Likewise.
* cp-objcp-common.c (cxx_block_may_fallthru): Return false for
SWITCH_STMT which contains no BREAK_STMTs, contains a default:
CASE_LABEL_EXPR and where SWITCH_STMT_BODY isn't empty and
can't fallthru.
* semantics.c (finish_break_stmt): Call note_break_stmt.
* cp-gimplify.c (genericize_switch_stmt): Copy SWITCH_STMT_ALL_CASES_P
bit to SWITCH_ALL_CASES_P.  Assert that if SWITCH_STMT_NO_BREAK_P then
the break label is not TREE_USED.

* g++.dg/warn/pr81275-1.C: New test.
* g++.dg/warn/pr81275-2.C: New test.
* g++.dg/warn/pr81275-3.C: New test.
* c-c++-common/tsan/pr81275.c: Skip for C++ and -O2.

From-SVN: r255218
13 files changed:
gcc/cp/ChangeLog
gcc/cp/cp-gimplify.c
gcc/cp/cp-objcp-common.c
gcc/cp/cp-tree.h
gcc/cp/decl.c
gcc/cp/parser.c
gcc/cp/pt.c
gcc/cp/semantics.c
gcc/testsuite/ChangeLog
gcc/testsuite/c-c++-common/tsan/pr81275.c
gcc/testsuite/g++.dg/warn/pr81275-1.C [new file with mode: 0644]
gcc/testsuite/g++.dg/warn/pr81275-2.C [new file with mode: 0644]
gcc/testsuite/g++.dg/warn/pr81275-3.C [new file with mode: 0644]